@@ -332,6 +332,161 @@ public async Task DeserializeTimer_Ttl_Iso8601Times()
332332 }
333333
334334 private interface ITestActor : IActor { }
335+ [ Fact ]
336+ public async Task DeserializeTimer_Period_Iso8601_Time ( )
337+ {
338+ const string timerJson = "{\" callback\" : \" TimerCallback\" , \" period\" : \" 0h0m7s10ms\" }" ;
339+ await using var stream = new MemoryStream ( Encoding . UTF8 . GetBytes ( timerJson ) ) ;
340+ var result = await ActorManager . DeserializeAsync ( stream ) ;
341+
342+ Assert . Equal ( "TimerCallback" , result . Callback ) ;
343+ Assert . Equal ( Array . Empty < byte > ( ) , result . Data ) ;
344+ Assert . Null ( result . Ttl ) ;
345+ Assert . Equal ( TimeSpan . Zero , result . DueTime ) ;
346+ Assert . Equal ( TimeSpan . FromSeconds ( 7 ) . Add ( TimeSpan . FromMilliseconds ( 10 ) ) , result . Period ) ;
347+ }
348+
349+ [ Fact ]
350+ public async Task DeserializeTimer_Period_DaprFormat_Every ( )
351+ {
352+ const string timerJson = "{\" callback\" : \" TimerCallback\" , \" period\" : \" @every 15s\" }" ;
353+ await using var stream = new MemoryStream ( Encoding . UTF8 . GetBytes ( timerJson ) ) ;
354+ var result = await ActorManager . DeserializeAsync ( stream ) ;
355+
356+ Assert . Equal ( "TimerCallback" , result . Callback ) ;
357+ Assert . Equal ( Array . Empty < byte > ( ) , result . Data ) ;
358+ Assert . Null ( result . Ttl ) ;
359+ Assert . Equal ( TimeSpan . Zero , result . DueTime ) ;
360+ Assert . Equal ( TimeSpan . FromSeconds ( 15 ) , result . Period ) ;
361+ }
362+
363+ [ Fact ]
364+ public async Task DeserializeTimer_Period_DaprFormat_Every2 ( )
365+ {
366+ const string timerJson = "{\" callback\" : \" TimerCallback\" , \" period\" : \" @every 3h2m15s\" }" ;
367+ await using var stream = new MemoryStream ( Encoding . UTF8 . GetBytes ( timerJson ) ) ;
368+ var result = await ActorManager . DeserializeAsync ( stream ) ;
369+
370+ Assert . Equal ( "TimerCallback" , result . Callback ) ;
371+ Assert . Equal ( Array . Empty < byte > ( ) , result . Data ) ;
372+ Assert . Null ( result . Ttl ) ;
373+ Assert . Equal ( TimeSpan . Zero , result . DueTime ) ;
374+ Assert . Equal ( TimeSpan . FromHours ( 3 ) . Add ( TimeSpan . FromMinutes ( 2 ) ) . Add ( TimeSpan . FromSeconds ( 15 ) ) , result . Period ) ;
375+ }
376+
377+ [ Fact ]
378+ public async Task DeserializeTimer_Period_DaprFormat_Monthly ( )
379+ {
380+ const string timerJson = "{\" callback\" : \" TimerCallback\" , \" period\" : \" @monthly\" }" ;
381+ await using var stream = new MemoryStream ( Encoding . UTF8 . GetBytes ( timerJson ) ) ;
382+ var result = await ActorManager . DeserializeAsync ( stream ) ;
383+
384+ Assert . Equal ( "TimerCallback" , result . Callback ) ;
385+ Assert . Equal ( Array . Empty < byte > ( ) , result . Data ) ;
386+ Assert . Null ( result . Ttl ) ;
387+ Assert . Equal ( TimeSpan . Zero , result . DueTime ) ;
388+ Assert . Equal ( TimeSpan . FromDays ( 30 ) , result . Period ) ;
389+ }
390+
391+ [ Fact ]
392+ public async Task DeserializeTimer_Period_DaprFormat_Weekly ( )
393+ {
394+ const string timerJson = "{\" callback\" : \" TimerCallback\" , \" period\" : \" @weekly\" }" ;
395+ await using var stream = new MemoryStream ( Encoding . UTF8 . GetBytes ( timerJson ) ) ;
396+ var result = await ActorManager . DeserializeAsync ( stream ) ;
397+
398+ Assert . Equal ( "TimerCallback" , result . Callback ) ;
399+ Assert . Equal ( Array . Empty < byte > ( ) , result . Data ) ;
400+ Assert . Null ( result . Ttl ) ;
401+ Assert . Equal ( TimeSpan . Zero , result . DueTime ) ;
402+ Assert . Equal ( TimeSpan . FromDays ( 7 ) , result . Period ) ;
403+ }
404+
405+ [ Fact ]
406+ public async Task DeserializeTimer_Period_DaprFormat_Daily ( )
407+ {
408+ const string timerJson = "{\" callback\" : \" TimerCallback\" , \" period\" : \" @daily\" }" ;
409+ await using var stream = new MemoryStream ( Encoding . UTF8 . GetBytes ( timerJson ) ) ;
410+ var result = await ActorManager . DeserializeAsync ( stream ) ;
411+
412+ Assert . Equal ( "TimerCallback" , result . Callback ) ;
413+ Assert . Equal ( Array . Empty < byte > ( ) , result . Data ) ;
414+ Assert . Null ( result . Ttl ) ;
415+ Assert . Equal ( TimeSpan . Zero , result . DueTime ) ;
416+ Assert . Equal ( TimeSpan . FromDays ( 1 ) , result . Period ) ;
417+ }
418+
419+ [ Fact ]
420+ public async Task DeserializeTimer_Period_DaprFormat_Hourly ( )
421+ {
422+ const string timerJson = "{\" callback\" : \" TimerCallback\" , \" period\" : \" @hourly\" }" ;
423+ await using var stream = new MemoryStream ( Encoding . UTF8 . GetBytes ( timerJson ) ) ;
424+ var result = await ActorManager . DeserializeAsync ( stream ) ;
425+
426+ Assert . Equal ( "TimerCallback" , result . Callback ) ;
427+ Assert . Equal ( Array . Empty < byte > ( ) , result . Data ) ;
428+ Assert . Null ( result . Ttl ) ;
429+ Assert . Equal ( TimeSpan . Zero , result . DueTime ) ;
430+ Assert . Equal ( TimeSpan . FromHours ( 1 ) , result . Period ) ;
431+ }
432+
433+ [ Fact ]
434+ public async Task DeserializeTimer_DueTime_DaprFormat_Hourly ( )
435+ {
436+ const string timerJson = "{\" callback\" : \" TimerCallback\" , \" dueTime\" : \" @hourly\" }" ;
437+ await using var stream = new MemoryStream ( Encoding . UTF8 . GetBytes ( timerJson ) ) ;
438+ var result = await ActorManager . DeserializeAsync ( stream ) ;
439+
440+ Assert . Equal ( "TimerCallback" , result . Callback ) ;
441+ Assert . Equal ( Array . Empty < byte > ( ) , result . Data ) ;
442+ Assert . Null ( result . Ttl ) ;
443+ Assert . Equal ( TimeSpan . FromHours ( 1 ) , result . DueTime ) ;
444+ Assert . Equal ( TimeSpan . Zero , result . Period ) ;
445+ }
446+
447+ [ Fact ]
448+ public async Task DeserializeTimer_DueTime_Iso8601Times ( )
449+ {
450+ const string timerJson = "{\" callback\" : \" TimerCallback\" , \" dueTime\" : \" 0h0m7s10ms\" }" ;
451+ await using var stream = new MemoryStream ( Encoding . UTF8 . GetBytes ( timerJson ) ) ;
452+ var result = await ActorManager . DeserializeAsync ( stream ) ;
453+
454+ Assert . Equal ( "TimerCallback" , result . Callback ) ;
455+ Assert . Equal ( Array . Empty < byte > ( ) , result . Data ) ;
456+ Assert . Null ( result . Ttl ) ;
457+ Assert . Equal ( TimeSpan . Zero , result . Period ) ;
458+ Assert . Equal ( TimeSpan . FromSeconds ( 7 ) . Add ( TimeSpan . FromMilliseconds ( 10 ) ) , result . DueTime ) ;
459+ }
460+
461+ [ Fact ]
462+ public async Task DeserializeTimer_Ttl_DaprFormat_Hourly ( )
463+ {
464+ const string timerJson = "{\" callback\" : \" TimerCallback\" , \" ttl\" : \" @hourly\" }" ;
465+ await using var stream = new MemoryStream ( Encoding . UTF8 . GetBytes ( timerJson ) ) ;
466+ var result = await ActorManager . DeserializeAsync ( stream ) ;
467+
468+ Assert . Equal ( "TimerCallback" , result . Callback ) ;
469+ Assert . Equal ( Array . Empty < byte > ( ) , result . Data ) ;
470+ Assert . Equal ( TimeSpan . Zero , result . DueTime ) ;
471+ Assert . Equal ( TimeSpan . Zero , result . Period ) ;
472+ Assert . Equal ( TimeSpan . FromHours ( 1 ) , result . Ttl ) ;
473+ }
474+
475+ [ Fact ]
476+ public async Task DeserializeTimer_Ttl_Iso8601Times ( )
477+ {
478+ const string timerJson = "{\" callback\" : \" TimerCallback\" , \" ttl\" : \" 0h0m7s10ms\" }" ;
479+ await using var stream = new MemoryStream ( Encoding . UTF8 . GetBytes ( timerJson ) ) ;
480+ var result = await ActorManager . DeserializeAsync ( stream ) ;
481+
482+ Assert . Equal ( "TimerCallback" , result . Callback ) ;
483+ Assert . Equal ( Array . Empty < byte > ( ) , result . Data ) ;
484+ Assert . Equal ( TimeSpan . Zero , result . DueTime ) ;
485+ Assert . Equal ( TimeSpan . Zero , result . Period ) ;
486+ Assert . Equal ( TimeSpan . FromSeconds ( 7 ) . Add ( TimeSpan . FromMilliseconds ( 10 ) ) , result . Ttl ) ;
487+ }
488+
489+ private interface ITestActor : IActor { }
335490
336491 private class TestActor : Actor , ITestActor , IDisposable
337492 {
0 commit comments