@@ -12,214 +12,227 @@ import Testing
1212struct TimeZoneUtilitiesTests {
1313 @Test ( " Test time zone conversion " )
1414 func testTimeZoneConversion( ) throws {
15- let date = Date ( timeIntervalSince1970: 1705881600 ) // Jan 22, 2024 00:00:00 UTC
15+ let date = Date ( timeIntervalSince1970: 1_705_881_600 ) // Jan 22, 2024 00:00:00 UTC
1616 guard let utc = TimeZone ( identifier: " UTC " ) ,
1717 let ny = TimeZone ( identifier: " America/New_York " ) ,
18- let tokyo = TimeZone ( identifier: " Asia/Tokyo " ) else {
18+ let tokyo = TimeZone ( identifier: " Asia/Tokyo " )
19+ else {
1920 throw TestError ( " Failed to create time zones " )
2021 }
21-
22+
2223 // Test UTC to NY conversion
2324 let nyTime = TimeZoneUtilities . convert ( date: date, from: utc, to: ny)
2425 let nyOffset = ny. secondsFromGMT ( for: date)
25- #expect( nyTime. timeIntervalSince1970 == date. timeIntervalSince1970 + Double( nyOffset - utc. secondsFromGMT ( for: date) ) )
26-
26+ #expect(
27+ nyTime. timeIntervalSince1970 == date
28+ . timeIntervalSince1970 + Double( nyOffset - utc. secondsFromGMT ( for: date) ) )
29+
2730 // Test UTC to Tokyo conversion
2831 let tokyoTime = TimeZoneUtilities . convert ( date: date, from: utc, to: tokyo)
2932 let tokyoOffset = tokyo. secondsFromGMT ( for: date)
30- #expect( tokyoTime. timeIntervalSince1970 == date. timeIntervalSince1970 + Double( tokyoOffset - utc. secondsFromGMT ( for: date) ) )
31-
33+ #expect(
34+ tokyoTime. timeIntervalSince1970 == date
35+ . timeIntervalSince1970 + Double( tokyoOffset - utc. secondsFromGMT ( for: date) ) )
36+
3237 // Test conversion during DST transition
33- let dstDate = Date ( timeIntervalSince1970: 1710061200 ) // March 10, 2024 07:00:00 UTC (DST start in US)
38+ let dstDate = Date ( timeIntervalSince1970: 1_710_061_200 ) // March 10, 2024 07:00:00 UTC (DST start in US)
3439 let beforeDST = TimeZoneUtilities . convert ( date: dstDate, from: utc, to: ny)
3540 let afterDST = TimeZoneUtilities . convert ( date: dstDate. addingTimeInterval ( 7200 ) , from: utc, to: ny)
3641 #expect( afterDST. timeIntervalSince1970 - beforeDST. timeIntervalSince1970 == 7200 )
3742 }
38-
43+
3944 @Test ( " Test date formatting with time zones " )
4045 func testDateFormatting( ) throws {
41- let date = Date ( timeIntervalSince1970: 1705881600 ) // Jan 22, 2024 00:00:00 UTC
46+ let date = Date ( timeIntervalSince1970: 1_705_881_600 ) // Jan 22, 2024 00:00:00 UTC
4247 guard let tokyo = TimeZone ( identifier: " Asia/Tokyo " ) ,
43- let ny = TimeZone ( identifier: " America/New_York " ) else {
48+ let ny = TimeZone ( identifier: " America/New_York " )
49+ else {
4450 throw TestError ( " Failed to create time zones " )
4551 }
4652 let enUS = Locale ( identifier: " en_US " )
47-
53+
4854 // Test different format styles
4955 let dateOnly = TimeZoneUtilities . format ( date: date, timeZone: tokyo, style: . dateOnly, locale: enUS)
5056 #expect( dateOnly. contains ( " Jan " ) )
5157 #expect( dateOnly. contains ( " 2024 " ) )
5258 #expect( !dateOnly. contains ( " : " ) ) // Should not contain time
53-
59+
5460 let timeOnly = TimeZoneUtilities . format ( date: date, timeZone: tokyo, style: . timeOnly, locale: enUS)
5561 #expect( timeOnly. contains ( " : " ) )
5662 #expect( !timeOnly. contains ( " 2024 " ) ) // Should not contain date
57-
63+
5864 let full = TimeZoneUtilities . format ( date: date, timeZone: tokyo, style: . full, locale: enUS)
5965 #expect( full. contains ( " Jan " ) )
6066 #expect( full. contains ( " 2024 " ) )
6167 #expect( full. contains ( " : " ) )
62-
68+
6369 // Test with Japanese locale
6470 let jaJP = Locale ( identifier: " ja_JP " )
6571 let jpFormat = TimeZoneUtilities . format ( date: date, timeZone: tokyo, style: . full, locale: jaJP)
6672 #expect( jpFormat. contains ( " 2024 " ) )
67-
73+
6874 // Test formatting during DST transition
69- let dstDate = Date ( timeIntervalSince1970: 1710061200 ) // March 10, 2024 07:00:00 UTC (DST start in US)
75+ let dstDate = Date ( timeIntervalSince1970: 1_710_061_200 ) // March 10, 2024 07:00:00 UTC (DST start in US)
7076 let beforeDST = TimeZoneUtilities . format ( date: dstDate, timeZone: ny, style: . full, locale: enUS)
71- let afterDST = TimeZoneUtilities . format ( date: dstDate. addingTimeInterval ( 7200 ) , timeZone: ny, style: . full, locale: enUS)
77+ let afterDST = TimeZoneUtilities . format (
78+ date: dstDate. addingTimeInterval ( 7200 ) ,
79+ timeZone: ny,
80+ style: . full,
81+ locale: enUS)
7282 #expect( beforeDST != afterDST)
7383 }
74-
84+
7585 @Test ( " Test GMT offset formatting " )
7686 func testOffsetFormatting( ) throws {
7787 guard let tokyo = TimeZone ( identifier: " Asia/Tokyo " ) ,
7888 let ny = TimeZone ( identifier: " America/New_York " ) ,
79- let utc = TimeZone ( identifier: " UTC " ) else {
89+ let utc = TimeZone ( identifier: " UTC " )
90+ else {
8091 throw TestError ( " Failed to create time zones " )
8192 }
82-
93+
8394 // Test positive offset
8495 let tokyoOffset = TimeZoneUtilities . currentOffset ( for: tokyo)
8596 #expect( tokyoOffset. hasPrefix ( " + " ) )
8697 #expect( tokyoOffset. contains ( " : " ) )
87-
98+
8899 // Test negative offset
89100 let nyOffset = TimeZoneUtilities . currentOffset ( for: ny)
90101 #expect( nyOffset. contains ( " : " ) )
91-
102+
92103 // Test zero offset
93104 let utcOffset = TimeZoneUtilities . currentOffset ( for: utc)
94105 #expect( utcOffset == " +00:00 " )
95-
106+
96107 // Test offset during DST
97108 // March 10, 2024 01:59:00 EST (before DST)
98- let beforeDSTDate = Date ( timeIntervalSince1970: 1710050340 )
109+ let beforeDSTDate = Date ( timeIntervalSince1970: 1_710_050_340 )
99110 // March 10, 2024 03:01:00 EDT (after DST)
100- let afterDSTDate = Date ( timeIntervalSince1970: 1710054060 )
101-
111+ let afterDSTDate = Date ( timeIntervalSince1970: 1_710_054_060 )
112+
102113 let beforeDST = TimeZoneUtilities . currentOffset ( for: ny, at: beforeDSTDate)
103114 let afterDST = TimeZoneUtilities . currentOffset ( for: ny, at: afterDSTDate)
104115 #expect( beforeDST == " -05:00 " ) // EST offset
105116 #expect( afterDST == " -04:00 " ) // EDT offset
106117 }
107-
118+
108119 @Test ( " Test DST detection " )
109120 func testDSTDetection( ) throws {
110121 guard let ny = TimeZone ( identifier: " America/New_York " ) ,
111122 let tokyo = TimeZone ( identifier: " Asia/Tokyo " ) ,
112- let utc = TimeZone ( identifier: " UTC " ) else {
123+ let utc = TimeZone ( identifier: " UTC " )
124+ else {
113125 throw TestError ( " Failed to create time zones " )
114126 }
115-
127+
116128 // Test DST observation
117129 let isDSTNY = TimeZoneUtilities . isDaylightSavingTime ( in: ny)
118130 #expect( isDSTNY == ny. isDaylightSavingTime ( for: Date ( ) ) )
119-
131+
120132 // Test non-DST zones
121133 let isDSTTokyo = TimeZoneUtilities . isDaylightSavingTime ( in: tokyo)
122134 #expect( !isDSTTokyo) // Tokyo doesn't observe DST
123-
135+
124136 let isDSTUTC = TimeZoneUtilities . isDaylightSavingTime ( in: utc)
125137 #expect( !isDSTUTC) // UTC never observes DST
126138 }
127-
139+
128140 @Test ( " Test next DST transition " )
129141 func testNextDSTTransition( ) throws {
130142 guard let ny = TimeZone ( identifier: " America/New_York " ) ,
131143 let tokyo = TimeZone ( identifier: " Asia/Tokyo " ) ,
132- let utc = TimeZone ( identifier: " UTC " ) else {
144+ let utc = TimeZone ( identifier: " UTC " )
145+ else {
133146 throw TestError ( " Failed to create time zones " )
134147 }
135-
148+
136149 // Test zones with DST
137150 let nyTransition = TimeZoneUtilities . nextDSTTransition ( in: ny)
138151 #expect( nyTransition != nil )
139-
152+
140153 // Test zones without DST
141154 let tokyoTransition = TimeZoneUtilities . nextDSTTransition ( in: tokyo)
142155 #expect( tokyoTransition == nil )
143-
156+
144157 let utcTransition = TimeZoneUtilities . nextDSTTransition ( in: utc)
145158 #expect( utcTransition == nil )
146159 }
147-
160+
148161 @Test ( " Test all time zones " )
149162 func testAllTimeZones( ) throws {
150163 let zones = TimeZoneUtilities . allTimeZones ( )
151-
164+
152165 // Test structure
153166 #expect( !zones. isEmpty)
154167 #expect( zones. keys. contains ( " America " ) )
155168 #expect( zones. keys. contains ( " Europe " ) )
156169 #expect( zones. keys. contains ( " Asia " ) )
157170 #expect( zones. keys. contains ( " Pacific " ) )
158171 #expect( zones. keys. contains ( " Africa " ) )
159-
172+
160173 // Test completeness
161174 let allSystemZones = Set ( TimeZone . knownTimeZoneIdentifiers)
162175 var allReturnedZones = Set < String > ( )
163176 for (_, identifiers) in zones {
164177 allReturnedZones. formUnion ( identifiers)
165178 }
166179 #expect( allReturnedZones == allSystemZones)
167-
180+
168181 // Test validity of identifiers
169182 for (_, identifiers) in zones {
170183 for identifier in identifiers {
171184 #expect( TimeZone ( identifier: identifier) != nil )
172185 }
173186 }
174187 }
175-
188+
176189 @Test ( " Test common time zones " )
177190 func testCommonTimeZones( ) throws {
178191 let zones = TimeZoneUtilities . commonTimeZones ( )
179-
192+
180193 // Test structure
181194 #expect( zones. keys. contains ( " America " ) )
182195 #expect( zones. keys. contains ( " Europe " ) )
183196 #expect( zones. keys. contains ( " Asia " ) )
184197 #expect( zones. keys. contains ( " Pacific " ) )
185198 #expect( zones. keys. contains ( " Africa " ) )
186-
199+
187200 // Test content
188201 #expect( zones [ " America " ] ? . contains ( " America/New_York " ) == true )
189202 #expect( zones [ " Europe " ] ? . contains ( " Europe/London " ) == true )
190203 #expect( zones [ " Asia " ] ? . contains ( " Asia/Tokyo " ) == true )
191204 #expect( zones [ " Pacific " ] ? . contains ( " Australia/Sydney " ) == true )
192205 #expect( zones [ " Africa " ] ? . contains ( " Africa/Cairo " ) == true )
193-
206+
194207 // Test validity of identifiers
195208 for (_, identifiers) in zones {
196209 for identifier in identifiers {
197210 let timeZone = TimeZone ( identifier: identifier)
198211 #expect( timeZone != nil , " Invalid timezone identifier: \( identifier) " )
199212 }
200213 }
201-
214+
202215 // Test that common zones are a subset of all zones
203216 let allZones = TimeZoneUtilities . allTimeZones ( )
204217 for (region, identifiers) in zones {
205218 let commonSet = Set ( identifiers)
206219 var allSet = Set < String > ( )
207-
220+
208221 // Handle special cases for regions
209222 switch region {
210- case " Pacific " :
211- allSet. formUnion ( allZones [ " Pacific " ] ?? [ ] )
212- allSet. formUnion ( allZones [ " Australia " ] ?? [ ] )
213- case " Asia " :
214- allSet. formUnion ( allZones [ " Asia " ] ?? [ ] )
215- // Handle special case for Kolkata (formerly Calcutta)
216- if allSet. contains ( " Asia/Calcutta " ) {
217- allSet. insert ( " Asia/Kolkata " )
218- }
219- default :
220- allSet. formUnion ( allZones [ region] ?? [ ] )
223+ case " Pacific " :
224+ allSet. formUnion ( allZones [ " Pacific " ] ?? [ ] )
225+ allSet. formUnion ( allZones [ " Australia " ] ?? [ ] )
226+ case " Asia " :
227+ allSet. formUnion ( allZones [ " Asia " ] ?? [ ] )
228+ // Handle special case for Kolkata (formerly Calcutta)
229+ if allSet. contains ( " Asia/Calcutta " ) {
230+ allSet. insert ( " Asia/Kolkata " )
231+ }
232+ default :
233+ allSet. formUnion ( allZones [ region] ?? [ ] )
221234 }
222-
235+
223236 #expect( allSet. isSuperset ( of: commonSet) , " Common zones for \( region) are not a subset of all zones " )
224237 }
225238 }
0 commit comments