1 using System;
2 using System.IO;
3 using System.Linq;
4 using NUnit.Framework;
5 
6 namespace MonoTests.System
7 {
8 	[TestFixture]
9 	public class SerializedStringTests
10 	{
11 		[Test]
SerializeUtc()12 		public void SerializeUtc ()
13 		{
14 			Assert.AreEqual ("UTC;0;UTC;UTC;UTC;;", TimeZoneInfo.Utc.ToSerializedString ());
15 		}
16 
17 		[Test]
DeserializeUtc()18 		public void DeserializeUtc ()
19 		{
20 			var utc = TimeZoneInfo.FromSerializedString ("UTC;0;UTC;UTC;UTC;;");
21 			Assert.AreEqual ("UTC", utc.Id);
22 			Assert.AreEqual ("UTC", utc.DisplayName);
23 			Assert.AreEqual ("UTC", utc.StandardName);
24 			Assert.IsFalse (utc.SupportsDaylightSavingTime);
25 			Assert.AreEqual (0, utc.GetAdjustmentRules ().Length);
26 		}
27 
28 		[Test] // Bug-44255
SystemTimeZoneSerializationTests()29 		public void SystemTimeZoneSerializationTests ()
30 		{
31 			foreach (var tmz in TimeZoneInfo.GetSystemTimeZones ())
32 			{
33 				var tmzClone = TimeZoneInfo.FromSerializedString (tmz.ToSerializedString ());
34 				Assert.AreEqual (tmz, tmzClone);
35 				Assert.AreEqual (tmz.DisplayName, tmzClone.DisplayName);
36 				Assert.AreEqual (tmz.StandardName, tmzClone.StandardName);
37 				Assert.AreEqual (tmz.SupportsDaylightSavingTime, tmzClone.SupportsDaylightSavingTime);
38 				Assert.AreEqual (tmz.DaylightName, tmzClone.DaylightName);
39 			}
40 		}
41 
42 		[Test]
SerializeCustomUtcZoneWithOddNaming()43 		public void SerializeCustomUtcZoneWithOddNaming ()
44 		{
45 			var tz1 = TimeZoneInfo.CreateCustomTimeZone (@"My\; Zone, @1!.", TimeSpan.FromMinutes (0), @"My\\; Zone 1 Name", "My; Zone 1 Standard Time");
46 			Assert.AreEqual (@"My\\\; Zone, @1!.;0;My\\\\\; Zone 1 Name;My\; Zone 1 Standard Time;My\; Zone 1 Standard Time;;", tz1.ToSerializedString ());
47 		}
48 
49 		[Test]
SerializeCustomZoneWithOddOffset()50 		public void SerializeCustomZoneWithOddOffset ()
51 		{
52 			var tz2 = TimeZoneInfo.CreateCustomTimeZone ("My Zone 2", TimeSpan.FromHours (1.25), "My Zone 2 Name", "My Zone 2 Standard Time");
53 			Assert.AreEqual ("My Zone 2;75;My Zone 2 Name;My Zone 2 Standard Time;My Zone 2 Standard Time;;", tz2.ToSerializedString ());
54 		}
55 
56 		[Test]
SerializeCustomZoneWithFloatingDaylightTransitions()57 		public void SerializeCustomZoneWithFloatingDaylightTransitions ()
58 		{
59 			var tz3rules = new TimeZoneInfo.AdjustmentRule[] { TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule (new DateTime (1, 1, 1), new DateTime (9999, 12, 31), TimeSpan.FromMinutes (23), TimeZoneInfo.TransitionTime.CreateFloatingDateRule (new DateTime (1, 1, 1, 2, 15, 58, 0), 3, 2, DayOfWeek.Tuesday), TimeZoneInfo.TransitionTime.CreateFloatingDateRule (new DateTime (1, 1, 1, 2, 15, 59, 999), 6, 2, DayOfWeek.Tuesday)) };
60 			var tz3 = TimeZoneInfo.CreateCustomTimeZone ("My Zone 3", TimeSpan.FromHours (-4), "My Zone 3 Name", "My Zone 3 Standard Time", "My Zone 3 Daylight Time", tz3rules);
61 			Assert.AreEqual ("My Zone 3;-240;My Zone 3 Name;My Zone 3 Standard Time;My Zone 3 Daylight Time;[01:01:0001;12:31:9999;23;[0;02:15:58;3;2;2;];[0;02:15:59.999;6;2;2;];];", tz3.ToSerializedString ());
62 		}
63 
64 		[Test]
SerializeCustomZoneWithFixedDaylightTransitions()65 		public void SerializeCustomZoneWithFixedDaylightTransitions ()
66 		{
67 			var tz4rules = new TimeZoneInfo.AdjustmentRule[] { TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule (new DateTime (1, 1, 1), new DateTime (9999, 12, 31), TimeSpan.FromMinutes (23), TimeZoneInfo.TransitionTime.CreateFixedDateRule (new DateTime (1, 1, 1, 2, 15, 59, 48), 3, 2), TimeZoneInfo.TransitionTime.CreateFixedDateRule (new DateTime (1, 1, 1, 2, 15, 59, 999), 6, 2)) };
68 			var tz4 = TimeZoneInfo.CreateCustomTimeZone ("My Zone 4", TimeSpan.FromHours (-4), "My Zone 4 Name", "My Zone 4 Standard Time", "My Zone 4 Daylight Time", tz4rules);
69 			Assert.AreEqual ("My Zone 4;-240;My Zone 4 Name;My Zone 4 Standard Time;My Zone 4 Daylight Time;[01:01:0001;12:31:9999;23;[1;02:15:59.048;3;2;];[1;02:15:59.999;6;2;];];", tz4.ToSerializedString ());
70 		}
71 
72 		[Test]
SerializeCustomZoneWithMultipleDaylightRules()73 		public void SerializeCustomZoneWithMultipleDaylightRules ()
74 		{
75 			var tz5rules = new TimeZoneInfo.AdjustmentRule[] {
76 				TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule (new DateTime (1, 1, 1), new DateTime (2012, 12, 31), TimeSpan.FromMinutes (23), TimeZoneInfo.TransitionTime.CreateFloatingDateRule (new DateTime (1, 1, 1, 2, 15, 59, 999), 3, 2, DayOfWeek.Tuesday), TimeZoneInfo.TransitionTime.CreateFloatingDateRule (new DateTime (1, 1, 1, 2, 15, 59, 999), 6, 2, DayOfWeek.Tuesday)),
77 				TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule (new DateTime (2013, 1, 1), new DateTime (9999, 12, 31), TimeSpan.FromMinutes (48), TimeZoneInfo.TransitionTime.CreateFloatingDateRule (new DateTime (1, 1, 1, 2, 15, 59, 999), 3, 2, DayOfWeek.Tuesday), TimeZoneInfo.TransitionTime.CreateFloatingDateRule (new DateTime (1, 1, 1, 2, 15, 59, 999), 6, 2, DayOfWeek.Tuesday))
78 			};
79 			var tz5 = TimeZoneInfo.CreateCustomTimeZone ("My Zone 5", TimeSpan.FromHours (-6.75), "My Zone 5 Name", "My Zone 5 Standard Time", "My Zone 5 Daylight Time", tz5rules);
80 			Assert.AreEqual ("My Zone 5;-405;My Zone 5 Name;My Zone 5 Standard Time;My Zone 5 Daylight Time;[01:01:0001;12:31:2012;23;[0;02:15:59.999;3;2;2;];[0;02:15:59.999;6;2;2;];][01:01:2013;12:31:9999;48;[0;02:15:59.999;3;2;2;];[0;02:15:59.999;6;2;2;];];", tz5.ToSerializedString ());
81 		}
82 
83 		[Test]
DeserializeCustomZoneWithOddNamingAndMultipleDaylightRules()84 		public void DeserializeCustomZoneWithOddNamingAndMultipleDaylightRules ()
85 		{
86 			var rule1 = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule (new DateTime (1, 1, 1), new DateTime (2012, 12, 31), TimeSpan.FromMinutes (23), TimeZoneInfo.TransitionTime.CreateFloatingDateRule (new DateTime (1, 1, 1, 2, 15, 59, 999), 3, 2, DayOfWeek.Tuesday), TimeZoneInfo.TransitionTime.CreateFloatingDateRule (new DateTime (1, 1, 1, 2, 15, 59, 999), 6, 2, DayOfWeek.Tuesday));
87 			var rule2 = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule (new DateTime (2013, 1, 1), new DateTime (9999, 12, 31), TimeSpan.FromMinutes (48), TimeZoneInfo.TransitionTime.CreateFloatingDateRule (new DateTime (1, 1, 1, 2, 15, 59, 999), 3, 2, DayOfWeek.Tuesday), TimeZoneInfo.TransitionTime.CreateFloatingDateRule (new DateTime (1, 1, 1, 2, 15, 59, 999), 6, 2, DayOfWeek.Tuesday));
88 
89 			var tz1 = TimeZoneInfo.FromSerializedString ("My\\; Zone 5;-405;My Zone\\; 5 Name;My Zone 5\\; Standard Time;My Zone 5 Daylight\\; Time;[01:01:0001;12:31:2012;23;[0;02:15:59.999;3;2;2;];[0;02:15:59.999;6;2;2;];][01:01:2013;12:31:9999;48;[0;02:15:59.999;3;2;2;];[0;02:15:59.999;6;2;2;];];");
90 			Assert.AreEqual ("My; Zone 5", tz1.Id);
91 			Assert.AreEqual ("My Zone; 5 Name", tz1.DisplayName);
92 			Assert.AreEqual ("My Zone 5; Standard Time", tz1.StandardName);
93 			Assert.AreEqual ("My Zone 5 Daylight; Time", tz1.DaylightName);
94 			Assert.AreEqual (TimeSpan.FromMinutes (-405), tz1.BaseUtcOffset);
95 			Assert.IsTrue (tz1.SupportsDaylightSavingTime);
96 
97 			var deserializedRules = tz1.GetAdjustmentRules ();
98 			Assert.AreEqual (2, deserializedRules.Length);
99 			Assert.IsFalse (deserializedRules [0].Equals (deserializedRules [1]));
100 			Assert.IsTrue (rule1.Equals (deserializedRules [0]));
101 			Assert.IsTrue (rule2.Equals (deserializedRules [1]));
102 		}
103 
104 		[Test]
DeserializeAndUseEasternTimeZone()105 		public void DeserializeAndUseEasternTimeZone ()
106 		{
107 			var et = TimeZoneInfo.FromSerializedString (@"Eastern Standard Time;-300;(UTC-05:00) Eastern Time (US & Canada);Eastern Standard Time;Eastern Daylight Time;[01:01:0001;12:31:2006;60;[0;02:00:00;4;1;0;];[0;02:00:00;10;5;0;];][01:01:2007;12:31:9999;60;[0;02:00:00;3;2;0;];[0;02:00:00;11;1;0;];];");
108 			var testDate = new DateTime (2014, 8, 1, 6, 0, 0, DateTimeKind.Unspecified);
109 			Assert.AreEqual (TimeSpan.FromHours (-4), et.GetUtcOffset (testDate));
110 		}
111 	}
112 }
113