1 using System;
2 using System.IO;
3 using System.Runtime.Serialization.Formatters.Binary;
4 using NUnit.Framework;
5 
6 namespace MonoTests.System
7 {
8 	public class TimeZoneInfo_AdjustmentRuleTest
9 	{
10 		[TestFixture]
11 		public class CreateAdjustmentRuleException
12 		{
13 			[Test]
14 			[ExpectedException (typeof (ArgumentException))]
DateTimeKindNotUnspecified()15 			public void DateTimeKindNotUnspecified ()
16 			{
17 				DateTime dateStart = new DateTime (2007,01,01, 0,0,0,DateTimeKind.Utc);
18 				DateTime dateEnd = new DateTime (2008,01,01);
19 				TimeZoneInfo.TransitionTime daylightTransitionStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule (new DateTime (1,1,1,2,0,0), 03, 11);
20 				TimeZoneInfo.TransitionTime daylightTransitionEnd = TimeZoneInfo.TransitionTime.CreateFixedDateRule (new DateTime (1,1,1,2,0,0), 10, 11);
21 				TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule (dateStart, dateEnd, new TimeSpan (1,0,0), daylightTransitionStart, daylightTransitionEnd);
22 			}
23 
24 			[Test]
25 			[ExpectedException (typeof (ArgumentException))]
TransitionEndEqualStart()26 			public void TransitionEndEqualStart ()
27 			{
28 				DateTime dateStart = new DateTime (2007,01,01);
29 				DateTime dateEnd = new DateTime (2008,01,01);
30 				TimeZoneInfo.TransitionTime daylightTransition = TimeZoneInfo.TransitionTime.CreateFixedDateRule (new DateTime (1,1,1,2,0,0), 03, 11);
31 				TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule (dateStart, dateEnd, new TimeSpan (1,0,0), daylightTransition, daylightTransition);
32 			}
33 
34 			[Test]
35 			[ExpectedException (typeof (ArgumentException))]
DateIncludesTimeOfDay()36 			public void DateIncludesTimeOfDay ()
37 			{
38 				DateTime dateStart = new DateTime (2007,01,01, 0,1,0);
39 				DateTime dateEnd = new DateTime (2008,01,01);
40 				TimeZoneInfo.TransitionTime daylightTransitionStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule (new DateTime (1,1,1,2,0,0), 03, 11);
41 				TimeZoneInfo.TransitionTime daylightTransitionEnd = TimeZoneInfo.TransitionTime.CreateFixedDateRule (new DateTime (1,1,1,2,0,0), 10, 11);
42 				TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule (dateStart, dateEnd, new TimeSpan (1,0,0), daylightTransitionStart, daylightTransitionEnd);
43 			}
44 
45 			[Test]
DatesMaxMinValid()46 			public void DatesMaxMinValid ()
47 			{
48 				try {
49 					TimeZoneInfo.TransitionTime daylightTransitionStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule (new DateTime (1,1,1,2,0,0), 03, 11);
50 					TimeZoneInfo.TransitionTime daylightTransitionEnd = TimeZoneInfo.TransitionTime.CreateFixedDateRule (new DateTime (1,1,1,2,0,0), 10, 11);
51 					TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule (DateTime.MinValue.Date, DateTime.MaxValue.Date, new TimeSpan (1,0,0), daylightTransitionStart, daylightTransitionEnd);
52 				} catch {
53 					Assert.Fail ("DateTime.MinValue and MaxValue are not valid...");
54 				}
55 			}
56 
57 			[Test]
EndBeforeStart()58 			public void EndBeforeStart ()
59 			{
60 				DateTime dateStart = new DateTime (2007,01,01);
61 				DateTime dateEnd = new DateTime (2006,01,01);
62 				TimeZoneInfo.TransitionTime daylightTransitionStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule (new DateTime (1,1,1,2,0,0), 03, 11);
63 				TimeZoneInfo.TransitionTime daylightTransitionEnd = TimeZoneInfo.TransitionTime.CreateFixedDateRule (new DateTime (1,1,1,2,0,0), 10, 11);
64 				try {
65 					TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule (dateStart, dateEnd, new TimeSpan (1,0,0), daylightTransitionStart, daylightTransitionEnd);
66 					Assert.Fail ();
67 				} catch (ArgumentException) {
68 				}
69 			}
70 
71 			[Test]
72 			[ExpectedException (typeof (ArgumentOutOfRangeException))]
DeltaOutOfRange()73 			public void DeltaOutOfRange ()
74 			{
75 				DateTime dateStart = new DateTime (2007,01,01);
76 				DateTime dateEnd = new DateTime (2008,01,01);
77 				TimeZoneInfo.TransitionTime daylightTransitionStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule (new DateTime (1,1,1,2,0,0), 03, 11);
78 				TimeZoneInfo.TransitionTime daylightTransitionEnd = TimeZoneInfo.TransitionTime.CreateFixedDateRule (new DateTime (1,1,1,2,0,0), 10, 11);
79 				TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule (dateStart, dateEnd, new TimeSpan (14,1,0), daylightTransitionStart, daylightTransitionEnd);
80 			}
81 
82 			[Test]
DeltaNotInSeconds()83 			public void DeltaNotInSeconds ()
84 			{
85 				DateTime dateStart = new DateTime (2007,01,01);
86 				DateTime dateEnd = new DateTime (2008,01,01);
87 				TimeZoneInfo.TransitionTime daylightTransitionStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule (new DateTime (1,1,1,2,0,0), 03, 11);
88 				TimeZoneInfo.TransitionTime daylightTransitionEnd = TimeZoneInfo.TransitionTime.CreateFixedDateRule (new DateTime (1,1,1,2,0,0), 10, 11);
89 				try {
90 					TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule (dateStart, dateEnd, new TimeSpan (55), daylightTransitionStart, daylightTransitionEnd);
91 					Assert.Fail ();
92 				} catch (ArgumentException) {
93 				}
94 			}
95 		}
96 
97 		[TestFixture]
98 		public class NonExceptional
99 		{
100 			[Test]
Serialization_Deserialization()101 			public void Serialization_Deserialization ()
102 			{
103 				TimeZoneInfo.TransitionTime start = TimeZoneInfo.TransitionTime.CreateFloatingDateRule (new DateTime (1,1,1,1,0,0), 3, 5, DayOfWeek.Sunday);
104 				TimeZoneInfo.TransitionTime end = TimeZoneInfo.TransitionTime.CreateFloatingDateRule (new DateTime (1,1,1,2,0,0), 10, 5, DayOfWeek.Sunday);
105 				TimeZoneInfo.AdjustmentRule rule = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule (DateTime.MinValue.Date, DateTime.MaxValue.Date, new TimeSpan (1,0,0), start, end);
106 				MemoryStream stream = new MemoryStream ();
107 				BinaryFormatter formatter = new BinaryFormatter ();
108 				formatter.Serialize (stream, rule);
109 				stream.Position = 0;
110 				TimeZoneInfo.AdjustmentRule deserialized = (TimeZoneInfo.AdjustmentRule) formatter.Deserialize (stream);
111 				stream.Close ();
112 				stream.Dispose ();
113 
114 				Assert.IsTrue (rule.Equals (deserialized));
115 			}
116 		}
117 	}
118 }
119