66#nullable enable
77using System ;
88using Ical . Net . DataTypes ;
9+ using Ical . Net . Evaluation ;
910using NUnit . Framework ;
1011
1112namespace Ical . Net . Tests ;
@@ -17,21 +18,29 @@ public class PeriodTests
1718 public void CreatePeriodWithArguments ( )
1819 {
1920 var period = new Period ( new CalDateTime ( 2025 , 1 , 1 , 0 , 0 , 0 , "America/New_York" ) ) ;
20- var periodWithEndTime = new Period ( new CalDateTime ( 2025 , 1 , 1 , 0 , 0 , 0 , "America/New_York" ) , new CalDateTime ( 2025 , 1 , 1 , 1 , 0 , 0 , "America/New_York" ) ) ;
21- var periodWithDuration = new Period ( new CalDateTime ( 2025 , 1 , 1 , 0 , 0 , 0 , "America/New_York" ) , Duration . FromHours ( 1 ) ) ;
21+ var periodWithEndTime = new Period ( new CalDateTime ( 2025 , 1 , 1 , 0 , 0 , 0 , "America/New_York" ) ,
22+ new CalDateTime ( 2025 , 1 , 1 , 1 , 0 , 0 , "America/New_York" ) ) ;
23+ var periodWithDuration =
24+ new Period ( new CalDateTime ( 2025 , 1 , 1 , 0 , 0 , 0 , "America/New_York" ) , Duration . FromHours ( 1 ) ) ;
2225
2326 Assert . Multiple ( ( ) =>
2427 {
2528 Assert . That ( period . StartTime , Is . EqualTo ( new CalDateTime ( 2025 , 1 , 1 , 0 , 0 , 0 , "America/New_York" ) ) ) ;
2629 Assert . That ( period . EndTime , Is . Null ) ;
2730 Assert . That ( period . Duration , Is . Null ) ;
28-
29- Assert . That ( periodWithEndTime . StartTime , Is . EqualTo ( new CalDateTime ( 2025 , 1 , 1 , 0 , 0 , 0 , "America/New_York" ) ) ) ;
30- Assert . That ( periodWithEndTime . EffectiveEndTime , Is . EqualTo ( new CalDateTime ( 2025 , 1 , 1 , 1 , 0 , 0 , "America/New_York" ) ) ) ;
31+ Assert . That ( period . EffectiveEndTime , Is . Null ) ;
32+ Assert . That ( period . EffectiveDuration , Is . Null ) ;
33+
34+ Assert . That ( periodWithEndTime . StartTime ,
35+ Is . EqualTo ( new CalDateTime ( 2025 , 1 , 1 , 0 , 0 , 0 , "America/New_York" ) ) ) ;
36+ Assert . That ( periodWithEndTime . EffectiveEndTime ,
37+ Is . EqualTo ( new CalDateTime ( 2025 , 1 , 1 , 1 , 0 , 0 , "America/New_York" ) ) ) ;
3138 Assert . That ( periodWithEndTime . EffectiveDuration , Is . EqualTo ( Duration . FromHours ( 1 ) ) ) ;
3239
33- Assert . That ( periodWithDuration . StartTime , Is . EqualTo ( new CalDateTime ( 2025 , 1 , 1 , 0 , 0 , 0 , "America/New_York" ) ) ) ;
34- Assert . That ( periodWithDuration . EffectiveEndTime , Is . EqualTo ( new CalDateTime ( 2025 , 1 , 1 , 1 , 0 , 0 , "America/New_York" ) ) ) ;
40+ Assert . That ( periodWithDuration . StartTime ,
41+ Is . EqualTo ( new CalDateTime ( 2025 , 1 , 1 , 0 , 0 , 0 , "America/New_York" ) ) ) ;
42+ Assert . That ( periodWithDuration . EffectiveEndTime ,
43+ Is . EqualTo ( new CalDateTime ( 2025 , 1 , 1 , 1 , 0 , 0 , "America/New_York" ) ) ) ;
3544 Assert . That ( periodWithDuration . EffectiveDuration , Is . EqualTo ( Duration . FromHours ( 1 ) ) ) ;
3645
3746 Assert . That ( Period . Create ( period . StartTime ) . Duration , Is . Null ) ;
@@ -42,6 +51,7 @@ public void CreatePeriodWithArguments()
4251 [ Test ]
4352 public void CreatePeriodWithInvalidArgumentsShouldThrow ( )
4453 {
54+ // Test with CalDateTime
4555 Assert . Multiple ( ( ) =>
4656 {
4757 // EndTime is before StartTime
@@ -62,6 +72,28 @@ public void CreatePeriodWithInvalidArgumentsShouldThrow()
6272 Assert . Throws < ArgumentException > ( ( ) => _ = new Period ( new CalDateTime ( 2025 , 1 , 2 , 0 , 0 , 0 ) ,
6373 new CalDateTime ( 2025 , 1 , 1 ) ) ) ;
6474 } ) ;
75+
76+ // Test with CalDateTimeZoned
77+ Assert . Multiple ( ( ) =>
78+ {
79+ // EndTime is before StartTime
80+ Assert . Throws < ArgumentException > ( ( ) => _ = new Period (
81+ new CalDateTime ( 2025 , 1 , 2 , 0 , 0 , 0 , "America/New_York" ) . AsZoned ( ) ,
82+ new CalDateTime ( 2025 , 1 , 1 , 0 , 0 , 0 , "America/New_York" ) . AsZoned ( ) ) ) ;
83+
84+ // Duration is negative
85+ Assert . Throws < ArgumentException > ( ( ) =>
86+ _ = new Period ( new CalDateTime ( 2025 , 1 , 1 , 0 , 0 , 0 , "America/New_York" ) . AsZoned ( ) , Duration . FromHours ( - 1 ) ) ) ;
87+
88+ // Timezones are different
89+ Assert . Throws < ArgumentException > ( ( ) => _ = new Period (
90+ new CalDateTime ( 2025 , 1 , 2 , 0 , 0 , 0 , "America/New_York" ) . AsZoned ( ) ,
91+ new CalDateTime ( 2025 , 1 , 1 , 0 , 0 , 0 , "Europe/Vienna" ) . AsZoned ( ) ) ) ;
92+
93+ // StartTime is date-only while EndTime has time
94+ Assert . Throws < ArgumentException > ( ( ) => _ = new Period ( new CalDateTime ( 2025 , 1 , 2 , 0 , 0 , 0 ) . AsZoned ( ) ,
95+ new CalDateTime ( 2025 , 1 , 1 ) . AsZoned ( ) ) ) ;
96+ } ) ;
6597 }
6698
6799 [ Test ]
@@ -82,6 +114,7 @@ public void Timezones_StartTime_EndTime_MustBeEqual()
82114 foreach ( var p in periods )
83115 {
84116 Assert . Throws < ArgumentException > ( ( ) => _ = new Period ( p . Item1 , p . Item2 ) ) ;
117+ Assert . Throws < ArgumentException > ( ( ) => _ = new Period ( p . Item1 . AsZoned ( ) , p . Item2 . AsZoned ( ) ) ) ;
85118 }
86119 } ) ;
87120 }
@@ -100,4 +133,95 @@ public void CollidesWithPeriod()
100133 Assert . That ( period2 . CollidesWith ( period3 ) , Is . True ) ;
101134 } ) ;
102135 }
136+
137+ [ Test ]
138+ public void CreatePeriodWith_StartTime_and_Duration ( )
139+ {
140+ var dt = new CalDateTime ( 2025 , 7 , 1 , 10 , 0 , 0 , "Europe/London" ) ;
141+ var periodCal = new Period ( dt , Duration . FromHours ( 1 ) ) ;
142+ var periodZoned = new Period ( dt . AsZoned ( ) , Duration . FromHours ( 1 ) ) ;
143+
144+ Assert . Multiple ( ( ) =>
145+ {
146+ Assert . That ( periodCal . StartTime , Is . EqualTo ( dt ) ) ;
147+ Assert . That ( periodCal . EffectiveEndTime , Is . EqualTo ( new CalDateTime ( 2025 , 7 , 1 , 11 , 0 , 0 , "Europe/London" ) ) ) ;
148+ Assert . That ( periodZoned . StartTime , Is . EqualTo ( dt ) ) ;
149+ Assert . That ( periodZoned . EffectiveEndTime ,
150+ Is . EqualTo ( new CalDateTime ( 2025 , 7 , 1 , 11 , 0 , 0 , "Europe/London" ) ) ) ;
151+ } ) ;
152+ }
153+
154+ [ Test ]
155+ public void CreatePeriodWith_StartTime_and_EndTime ( )
156+ {
157+ var dt1 = new CalDateTime ( 2025 , 7 , 1 , 10 , 0 , 0 , "Europe/London" ) ;
158+ var dt2 = new CalDateTime ( 2025 , 7 , 1 , 11 , 0 , 0 , "Europe/London" ) ;
159+ var periodCal = new Period ( dt1 , dt2 ) ;
160+ var periodZoned = new Period ( dt1 . AsZoned ( ) , dt2 . AsZoned ( ) ) ;
161+
162+ Assert . Multiple ( ( ) =>
163+ {
164+ Assert . That ( periodCal . StartTime , Is . EqualTo ( dt1 ) ) ;
165+ Assert . That ( periodCal . EndTime , Is . EqualTo ( dt2 ) ) ;
166+ Assert . That ( periodCal . EffectiveEndTime ,
167+ Is . EqualTo ( new CalDateTime ( 2025 , 7 , 1 , 11 , 0 , 0 , "Europe/London" ) ) ) ;
168+
169+ Assert . That ( periodZoned . StartTime , Is . EqualTo ( dt1 ) ) ;
170+ Assert . That ( periodZoned . EndTime , Is . EqualTo ( dt2 ) ) ;
171+ Assert . That ( periodZoned . EffectiveEndTime ,
172+ Is . EqualTo ( new CalDateTime ( 2025 , 7 , 1 , 11 , 0 , 0 , "Europe/London" ) ) ) ;
173+ } ) ;
174+ }
175+
176+ [ Test ]
177+ public void CreatePeriodWith_StartTime_Only ( )
178+ {
179+ var dt = new CalDateTime ( 2025 , 7 , 1 , 10 , 0 , 0 , "Europe/London" ) ;
180+ var periodCal = new Period ( dt ) ;
181+ var periodZoned = new Period ( dt . AsZoned ( ) ) ;
182+
183+ Assert . Multiple ( ( ) =>
184+ {
185+ Assert . That ( periodCal . StartTime , Is . EqualTo ( dt ) ) ;
186+ Assert . That ( periodCal . EndTime , Is . Null ) ;
187+ Assert . That ( periodCal . Duration , Is . Null ) ;
188+ Assert . That ( periodCal . EffectiveEndTime , Is . Null ) ;
189+
190+ Assert . That ( periodZoned . StartTime , Is . EqualTo ( dt ) ) ;
191+ Assert . That ( periodZoned . EndTime , Is . Null ) ;
192+ Assert . That ( periodZoned . Duration , Is . Null ) ;
193+ Assert . That ( periodZoned . EffectiveEndTime , Is . Null ) ;
194+ } ) ;
195+ }
196+
197+ [ Test ]
198+ public void PeriodCompareToNull_ShouldReturnOne ( )
199+ {
200+ var dt = new CalDateTime ( 2025 , 7 , 1 , 10 , 0 , 0 , "Europe/London" ) ;
201+ var period = new Period ( dt , Duration . FromHours ( 1 ) ) ;
202+
203+ Assert . That ( period . CompareTo ( null ) , Is . EqualTo ( 1 ) ) ;
204+ }
205+
206+ [ Test ]
207+ public void PeriodCopyFrom_ShouldBeEquivalentToOriginal ( )
208+ {
209+ var original = new Period ( new CalDateTime ( 2025 , 1 , 1 , 0 , 0 , 0 , "America/New_York" ) , Duration . FromHours ( 10 ) ) ;
210+ var copy = new Period ( ) ;
211+ copy . CopyFrom ( original ) ;
212+
213+ var copyEmpty = new Period ( ) ; // internal CTOR
214+ // another ICopyable instance which is not a Period
215+ copyEmpty . CopyFrom ( new PeriodList ( ) ) ;
216+
217+ Assert . Multiple ( ( ) =>
218+ {
219+ Assert . That ( copy . StartTime , Is . EqualTo ( original . StartTime ) ) ;
220+ Assert . That ( copy . Duration , Is . EqualTo ( original . Duration ) ) ;
221+
222+ Assert . That ( copyEmpty . StartTime , Is . Null ) ;
223+ Assert . That ( copyEmpty . EndTime , Is . Null ) ;
224+ Assert . That ( copyEmpty . Duration , Is . Null ) ;
225+ } ) ;
226+ }
103227}
0 commit comments