@@ -1022,6 +1022,74 @@ final class CalendarTests : XCTestCase {
1022
1022
// Month is ignored
1023
1023
test ( . init( month: 3 , weekOfYear: 1 , yearForWeekOfYear: 2000 ) , Date ( timeIntervalSinceReferenceDate: - 32140800.0 ) ) // 1999-12-26
1024
1024
test ( . init( month: 1 , weekOfYear: 53 , yearForWeekOfYear: 1998 ) , Date ( timeIntervalSinceReferenceDate: - 63590400.0 ) ) // 1998-12-27
1025
+
1026
+ // year and yearForWeekOfYear
1027
+ test ( . init( year: 2024 , weekOfYear: 30 , yearForWeekOfYear: 2024 ) , Date ( timeIntervalSinceReferenceDate: 743212800.0 ) ) // 2024-07-21 00:00:00 UTC
1028
+ test ( . init( year: 2023 , weekOfYear: 1 , yearForWeekOfYear: 2023 ) , Date ( timeIntervalSinceReferenceDate: 694224000.0 ) ) // 2023-01-01T00:00:00Z
1029
+ test ( . init( year: 2023 , weekOfYear: 52 , yearForWeekOfYear: 2023 ) , Date ( timeIntervalSinceReferenceDate: 725068800.0 ) ) // 2023-12-24T00:00:00Z
1030
+ test ( . init( year: 2023 , weekOfYear: 53 , yearForWeekOfYear: 2023 ) , Date ( timeIntervalSinceReferenceDate: 725673600.0 ) ) // 2023-12-31T00:00:00Z
1031
+ test ( . init( year: 2024 , weekOfYear: 30 , yearForWeekOfYear: 2024 ) , Date ( timeIntervalSinceReferenceDate: 743212800.0 ) ) // 2024-07-21T00:00:00Z
1032
+ test ( . init( year: 2024 , weekOfYear: 53 , yearForWeekOfYear: 2024 ) , Date ( timeIntervalSinceReferenceDate: 757123200.0 ) ) // 2024-12-29T00:00:00Z
1033
+ test ( . init( year: 2025 , weekOfYear: 1 , yearForWeekOfYear: 2025 ) , Date ( timeIntervalSinceReferenceDate: 757123200.0 ) ) // 2024-12-29T00:00:00Z
1034
+ test ( . init( year: 2024 , weekOfYear: 1 , yearForWeekOfYear: 2025 ) , Date ( timeIntervalSinceReferenceDate: 757123200.0 ) ) // 2024-12-29T00:00:00Z
1035
+ test ( . init( year: 2025 , weekOfYear: 1 , yearForWeekOfYear: 2024 ) , Date ( timeIntervalSinceReferenceDate: 725673600.0 ) ) // 2023-12-31T00:00:00Z
1036
+ test ( . init( year: 2024 , weekOfYear: 52 , yearForWeekOfYear: 2025 ) , Date ( timeIntervalSinceReferenceDate: 787968000.0 ) ) // 2025-12-21T00:00:00Z
1037
+ test ( . init( year: 2025 , weekOfYear: 52 , yearForWeekOfYear: 2024 ) , Date ( timeIntervalSinceReferenceDate: 756518400.0 ) ) // 2024-12-22T00:00:00Z
1038
+ test ( . init( year: 2024 , weekOfYear: 53 , yearForWeekOfYear: 2025 ) , Date ( timeIntervalSinceReferenceDate: 788572800.0 ) ) // 2025-12-28T00:00:00Z
1039
+ test ( . init( year: 2025 , weekOfYear: 53 , yearForWeekOfYear: 2024 ) , Date ( timeIntervalSinceReferenceDate: 757123200.0 ) ) // 2024-12-29T00:00:00Z
1040
+
1041
+ // year and weekOfYear, not valid setting so the result is just the first day of the year
1042
+ test ( . init( year: 2023 , weekOfYear: 1 ) , Date ( timeIntervalSinceReferenceDate: 694224000.0 ) ) // 2023-01-01T00:00:00Z
1043
+ test ( . init( year: 2023 , weekOfYear: 30 ) , Date ( timeIntervalSinceReferenceDate: 694224000.0 ) ) // 2023-01-01T00:00:00Z
1044
+ test ( . init( year: 2023 , weekOfYear: 52 ) , Date ( timeIntervalSinceReferenceDate: 694224000.0 ) ) // 2023-01-01T00:00:00Z
1045
+ test ( . init( year: 2023 , weekOfYear: 53 ) , Date ( timeIntervalSinceReferenceDate: 694224000.0 ) ) // 2023-01-01T00:00:00Z
1046
+
1047
+ // weekOfYear and yearForWeekOfYear
1048
+ test ( . init( weekOfYear: 1 , yearForWeekOfYear: 2025 ) , Date ( timeIntervalSinceReferenceDate: 757123200.0 ) ) // 2024-12-29T00:00:00Z
1049
+ test ( . init( weekOfYear: 52 , yearForWeekOfYear: 2025 ) , Date ( timeIntervalSinceReferenceDate: 787968000.0 ) ) // 2025-12-21T00:00:00Z
1050
+ test ( . init( weekOfYear: 53 , yearForWeekOfYear: 2025 ) , Date ( timeIntervalSinceReferenceDate: 788572800.0 ) ) // 2025-12-28T00:00:00Z
1051
+
1052
+ test ( . init( weekOfYear: 1 , yearForWeekOfYear: 2024 ) , Date ( timeIntervalSinceReferenceDate: 725673600.0 ) ) // 2023-12-31T00:00:00Z
1053
+ test ( . init( weekOfYear: 52 , yearForWeekOfYear: 2024 ) , Date ( timeIntervalSinceReferenceDate: 756518400.0 ) ) // 2024-12-22T00:00:00Z
1054
+ test ( . init( weekOfYear: 53 , yearForWeekOfYear: 2024 ) , Date ( timeIntervalSinceReferenceDate: 757123200.0 ) ) // 2024-12-29T00:00:00Z
1055
+
1056
+ // weekday ordinal
1057
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 3 ) , Date ( timeIntervalSinceReferenceDate: - 156124800.0 ) ) // 1996-01-21T00:00:00Z
1058
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 3 , weekOfMonth: 2 ) , Date ( timeIntervalSinceReferenceDate: - 156124800.0 ) ) // 1996-01-21T00:00:00Z
1059
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 3 , weekOfYear: 2 ) , Date ( timeIntervalSinceReferenceDate: - 156124800.0 ) ) // 1996-01-21T00:00:00Z
1060
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 3 , weekOfMonth: 2 , weekOfYear: 4 ) , Date ( timeIntervalSinceReferenceDate: - 156124800.0 ) ) // 1996-01-21T00:00:00Z
1061
+
1062
+ // yearForWeekOfYear takes precedence over year
1063
+ test ( . init( year: 1994 , weekday: 1 , weekdayOrdinal: 3 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 188179200.0 ) ) // 1995-01-15T00:00:00Z
1064
+ test ( . init( year: 1994 , weekday: 1 , weekdayOrdinal: 3 , weekOfMonth: 2 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 188179200.0 ) ) // 1995-01-15T00:00:00Z
1065
+ test ( . init( year: 1994 , weekday: 1 , weekdayOrdinal: 3 , weekOfYear: 2 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 188179200.0 ) ) // 1995-01-15T00:00:00Z
1066
+ test ( . init( year: 1994 , weekday: 1 , weekdayOrdinal: 3 , weekOfMonth: 2 , weekOfYear: 4 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 188179200.0 ) ) // 1995-01-15T00:00:00Z
1067
+
1068
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 1 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 189388800.0 ) ) // 1995-01-01T00:00:00Z
1069
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 1 , weekOfMonth: 2 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 189388800.0 ) ) // 1995-01-01T00:00:00Z
1070
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 1 , weekOfYear: 2 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 189388800.0 ) ) // 1995-01-01T00:00:00Z
1071
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 1 , weekOfMonth: 2 , weekOfYear: 4 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 189388800.0 ) ) // 1995-01-01T00:00:00Z
1072
+
1073
+ test ( . init( year: 1994 , weekday: 1 , weekdayOrdinal: 1 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 189388800.0 ) ) // 1995-01-01T00:00:00Z
1074
+ test ( . init( year: 1994 , weekday: 1 , weekdayOrdinal: 1 , weekOfMonth: 2 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 189388800.0 ) ) // 1995-01-01T00:00:00Z
1075
+ test ( . init( year: 1994 , weekday: 1 , weekdayOrdinal: 1 , weekOfYear: 2 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 189388800.0 ) ) // 1995-01-01T00:00:00Z
1076
+ test ( . init( year: 1994 , weekday: 1 , weekdayOrdinal: 1 , weekOfMonth: 2 , weekOfYear: 4 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 189388800.0 ) ) // 1995-01-01T00:00:00Z
1077
+
1078
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 3 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 188179200.0 ) ) // 1995-01-15T00:00:00Z
1079
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 3 , weekOfMonth: 2 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 188179200.0 ) ) // 1995-01-15T00:00:00Z
1080
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 3 , weekOfYear: 2 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 188179200.0 ) ) // 1995-01-15T00:00:00Z
1081
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 3 , weekOfMonth: 2 , weekOfYear: 4 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 188179200.0 ) ) // 1995-01-15T00:00:00Z
1082
+
1083
+ // weekdayOrdinal takes precedence over other week fields when weekday is set
1084
+ test ( . init( year: 1995 , weekday: 1 , weekdayOrdinal: 1 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 189388800.0 ) ) // 1995-01-01T00:00:00Z
1085
+ test ( . init( year: 1995 , weekday: 1 , weekdayOrdinal: 1 , weekOfMonth: 2 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 189388800.0 ) ) // 1995-01-01T00:00:00Z
1086
+ test ( . init( year: 1995 , weekday: 1 , weekdayOrdinal: 1 , weekOfYear: 2 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 189388800.0 ) ) // 1995-01-01T00:00:00Z
1087
+ test ( . init( year: 1995 , weekday: 1 , weekdayOrdinal: 1 , weekOfMonth: 2 , weekOfYear: 4 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 189388800.0 ) ) // 1995-01-01T00:00:00Z
1088
+
1089
+ test ( . init( year: 1995 , weekday: 1 , weekdayOrdinal: 3 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 188179200.0 ) ) // 1995-01-15T00:00:00Z
1090
+ test ( . init( year: 1995 , weekday: 1 , weekdayOrdinal: 3 , weekOfMonth: 2 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 188179200.0 ) ) // 1995-01-15T00:00:00Z
1091
+ test ( . init( year: 1995 , weekday: 1 , weekdayOrdinal: 3 , weekOfYear: 2 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 188179200.0 ) ) // 1995-01-15T00:00:00Z
1092
+ test ( . init( year: 1995 , weekday: 1 , weekdayOrdinal: 3 , weekOfMonth: 2 , weekOfYear: 4 , yearForWeekOfYear: 1995 ) , Date ( timeIntervalSinceReferenceDate: - 188179200.0 ) ) // 1995-01-15T00:00:00Z
1025
1093
}
1026
1094
1027
1095
func test_firstWeekday( ) {
@@ -1217,6 +1285,77 @@ final class GregorianCalendarCompatibilityTests: XCTestCase {
1217
1285
test ( . init( ) )
1218
1286
test ( . init( month: 1 , day: 1 ) )
1219
1287
test ( . init( month: 1 , day: 1 , hour: 1 ) )
1288
+
1289
+ // both year and yearForWeekOfYear are set
1290
+ test ( . init( year: 2023 , weekOfYear: 1 , yearForWeekOfYear: 2023 ) )
1291
+ test ( . init( year: 2023 , weekOfYear: 52 , yearForWeekOfYear: 2023 ) )
1292
+ test ( . init( year: 2023 , weekOfYear: 53 , yearForWeekOfYear: 2023 ) )
1293
+
1294
+ test ( . init( year: 2024 , weekOfYear: 30 , yearForWeekOfYear: 2024 ) )
1295
+ test ( . init( year: 2024 , weekOfYear: 53 , yearForWeekOfYear: 2024 ) )
1296
+
1297
+ test ( . init( year: 2025 , weekOfYear: 1 , yearForWeekOfYear: 2025 ) )
1298
+
1299
+ // Conflicting setting of year and yearForWeekOfYear
1300
+ test ( . init( year: 2024 , weekOfYear: 1 , yearForWeekOfYear: 2025 ) )
1301
+ test ( . init( year: 2025 , weekOfYear: 1 , yearForWeekOfYear: 2024 ) )
1302
+ test ( . init( year: 2024 , weekOfYear: 52 , yearForWeekOfYear: 2025 ) )
1303
+ test ( . init( year: 2025 , weekOfYear: 52 , yearForWeekOfYear: 2024 ) )
1304
+ test ( . init( year: 2024 , weekOfYear: 53 , yearForWeekOfYear: 2025 ) )
1305
+ test ( . init( year: 2025 , weekOfYear: 53 , yearForWeekOfYear: 2024 ) )
1306
+
1307
+ test ( . init( year: 2023 , weekOfYear: 1 ) )
1308
+ test ( . init( year: 2023 , weekOfYear: 30 ) )
1309
+ test ( . init( year: 2023 , weekOfYear: 52 ) )
1310
+ test ( . init( year: 2023 , weekOfYear: 53 ) )
1311
+
1312
+ test ( . init( weekOfYear: 1 , yearForWeekOfYear: 2025 ) )
1313
+ test ( . init( weekOfYear: 1 , yearForWeekOfYear: 2024 ) )
1314
+ test ( . init( weekOfYear: 52 , yearForWeekOfYear: 2025 ) )
1315
+ test ( . init( weekOfYear: 52 , yearForWeekOfYear: 2024 ) )
1316
+ test ( . init( weekOfYear: 53 , yearForWeekOfYear: 2025 ) )
1317
+ test ( . init( weekOfYear: 53 , yearForWeekOfYear: 2024 ) )
1318
+
1319
+ // weekOfMonth and weekOfYear
1320
+ test ( . init( year: 1996 , weekOfMonth: 2 , weekOfYear: 10 ) )
1321
+ test ( . init( year: 1996 , weekday: 3 , weekOfMonth: 2 , weekOfYear: 10 ) )
1322
+
1323
+ // weekday ordinal
1324
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 3 ) )
1325
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 3 , weekOfMonth: 2 ) )
1326
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 3 , weekOfYear: 2 ) )
1327
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 3 , weekOfMonth: 2 , weekOfYear: 4 ) )
1328
+
1329
+ // weekday ordinal, year, and WOY
1330
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 1 , yearForWeekOfYear: 1995 ) )
1331
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 1 , weekOfMonth: 2 , yearForWeekOfYear: 1995 ) )
1332
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 1 , weekOfYear: 2 , yearForWeekOfYear: 1995 ) )
1333
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 1 , weekOfMonth: 2 , weekOfYear: 4 , yearForWeekOfYear: 1995 ) )
1334
+
1335
+ test ( . init( year: 1995 , weekday: 1 , weekdayOrdinal: 1 , yearForWeekOfYear: 1995 ) )
1336
+ test ( . init( year: 1995 , weekday: 1 , weekdayOrdinal: 1 , weekOfMonth: 2 , yearForWeekOfYear: 1995 ) )
1337
+ test ( . init( year: 1995 , weekday: 1 , weekdayOrdinal: 1 , weekOfYear: 2 , yearForWeekOfYear: 1995 ) )
1338
+ test ( . init( year: 1995 , weekday: 1 , weekdayOrdinal: 1 , weekOfMonth: 2 , weekOfYear: 4 , yearForWeekOfYear: 1995 ) )
1339
+
1340
+ test ( . init( year: 1994 , weekday: 1 , weekdayOrdinal: 1 , yearForWeekOfYear: 1995 ) )
1341
+ test ( . init( year: 1994 , weekday: 1 , weekdayOrdinal: 1 , weekOfMonth: 2 , yearForWeekOfYear: 1995 ) )
1342
+ test ( . init( year: 1994 , weekday: 1 , weekdayOrdinal: 1 , weekOfYear: 2 , yearForWeekOfYear: 1995 ) )
1343
+ test ( . init( year: 1994 , weekday: 1 , weekdayOrdinal: 1 , weekOfMonth: 2 , weekOfYear: 4 , yearForWeekOfYear: 1995 ) )
1344
+
1345
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 3 , yearForWeekOfYear: 1995 ) )
1346
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 3 , weekOfMonth: 2 , yearForWeekOfYear: 1995 ) )
1347
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 3 , weekOfYear: 2 , yearForWeekOfYear: 1995 ) )
1348
+ test ( . init( year: 1996 , weekday: 1 , weekdayOrdinal: 3 , weekOfMonth: 2 , weekOfYear: 4 , yearForWeekOfYear: 1995 ) )
1349
+
1350
+ test ( . init( year: 1995 , weekday: 1 , weekdayOrdinal: 3 , yearForWeekOfYear: 1995 ) )
1351
+ test ( . init( year: 1995 , weekday: 1 , weekdayOrdinal: 3 , weekOfMonth: 2 , yearForWeekOfYear: 1995 ) )
1352
+ test ( . init( year: 1995 , weekday: 1 , weekdayOrdinal: 3 , weekOfYear: 2 , yearForWeekOfYear: 1995 ) )
1353
+ test ( . init( year: 1995 , weekday: 1 , weekdayOrdinal: 3 , weekOfMonth: 2 , weekOfYear: 4 , yearForWeekOfYear: 1995 ) )
1354
+
1355
+ test ( . init( year: 1994 , weekday: 1 , weekdayOrdinal: 3 , yearForWeekOfYear: 1995 ) )
1356
+ test ( . init( year: 1994 , weekday: 1 , weekdayOrdinal: 3 , weekOfMonth: 2 , yearForWeekOfYear: 1995 ) )
1357
+ test ( . init( year: 1994 , weekday: 1 , weekdayOrdinal: 3 , weekOfYear: 2 , yearForWeekOfYear: 1995 ) )
1358
+ test ( . init( year: 1994 , weekday: 1 , weekdayOrdinal: 3 , weekOfMonth: 2 , weekOfYear: 4 , yearForWeekOfYear: 1995 ) )
1220
1359
}
1221
1360
1222
1361
0 commit comments