| // Copyright 2024 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package time | |
| type testingT interface { | |
| Error(args ...any) | |
| Errorf(format string, args ...any) | |
| Fail() | |
| FailNow() | |
| Failed() bool | |
| Fatal(args ...any) | |
| Fatalf(format string, args ...any) | |
| Helper() | |
| Log(args ...any) | |
| Logf(format string, args ...any) | |
| Skip(args ...any) | |
| SkipNow() | |
| Skipf(format string, args ...any) | |
| } | |
| var InternalTests = []struct { | |
| Name string | |
| Test func(testingT) | |
| }{ | |
| {"AbsDaysSplit", testAbsDaysSplit}, | |
| {"AbsYdaySplit", testAbsYdaySplit}, | |
| {"AbsDate", testAbsDate}, | |
| {"DateToAbsDays", testDateToAbsDays}, | |
| {"DaysIn", testDaysIn}, | |
| {"DaysBefore", testDaysBefore}, | |
| } | |
| func testAbsDaysSplit(t testingT) { | |
| isLeap := func(year uint64) bool { | |
| return year%4 == 0 && (year%100 != 0 || year%400 == 0) | |
| } | |
| bad := 0 | |
| wantYear := uint64(0) | |
| wantYday := absYday(0) | |
| for days := range absDays(1e6) { | |
| century, cyear, yday := days.split() | |
| if century != absCentury(wantYear/100) || cyear != absCyear(wantYear%100) || yday != wantYday { | |
| t.Errorf("absDays(%d).split() = %d, %d, %d, want %d, %d, %d", | |
| days, century, cyear, yday, | |
| wantYear/100, wantYear%100, wantYday) | |
| if bad++; bad >= 20 { | |
| t.Fatalf("too many errors") | |
| } | |
| } | |
| end := absYday(365) | |
| if isLeap(wantYear + 1) { | |
| end = 366 | |
| } | |
| if wantYday++; wantYday == end { | |
| wantYear++ | |
| wantYday = 0 | |
| } | |
| } | |
| } | |
| func testAbsYdaySplit(t testingT) { | |
| ends := []int{31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 29} | |
| bad := 0 | |
| wantMonth := absMonth(3) | |
| wantDay := 1 | |
| for yday := range absYday(366) { | |
| month, day := yday.split() | |
| if month != wantMonth || day != wantDay { | |
| t.Errorf("absYday(%d).split() = %d, %d, want %d, %d", yday, month, day, wantMonth, wantDay) | |
| if bad++; bad >= 20 { | |
| t.Fatalf("too many errors") | |
| } | |
| } | |
| if wantDay++; wantDay > ends[wantMonth-3] { | |
| wantMonth++ | |
| wantDay = 1 | |
| } | |
| } | |
| } | |
| func testAbsDate(t testingT) { | |
| ends := []int{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} | |
| isLeap := func(year int) bool { | |
| y := uint64(year) + absoluteYears | |
| return y%4 == 0 && (y%100 != 0 || y%400 == 0) | |
| } | |
| wantYear := 0 | |
| wantMonth := March | |
| wantMday := 1 | |
| wantYday := 31 + 29 + 1 | |
| bad := 0 | |
| absoluteYears := int64(absoluteYears) | |
| for days := range absDays(1e6) { | |
| year, month, mday := days.date() | |
| year += int(absoluteYears) | |
| if year != wantYear || month != wantMonth || mday != wantMday { | |
| t.Errorf("days(%d).date() = %v, %v, %v, want %v, %v, %v", days, | |
| year, month, mday, | |
| wantYear, wantMonth, wantMday) | |
| if bad++; bad >= 20 { | |
| t.Fatalf("too many errors") | |
| } | |
| } | |
| year, yday := days.yearYday() | |
| year += int(absoluteYears) | |
| if year != wantYear || yday != wantYday { | |
| t.Errorf("days(%d).yearYday() = %v, %v, want %v, %v, ", days, | |
| year, yday, | |
| wantYear, wantYday) | |
| if bad++; bad >= 20 { | |
| t.Fatalf("too many errors") | |
| } | |
| } | |
| if wantMday++; wantMday == ends[wantMonth-1]+1 || wantMonth == February && wantMday == 29 && !isLeap(year) { | |
| wantMonth++ | |
| wantMday = 1 | |
| } | |
| wantYday++ | |
| if wantMonth == December+1 { | |
| wantYear++ | |
| wantMonth = January | |
| wantMday = 1 | |
| wantYday = 1 | |
| } | |
| } | |
| } | |
| func testDateToAbsDays(t testingT) { | |
| isLeap := func(year int64) bool { | |
| return year%4 == 0 && (year%100 != 0 || year%400 == 0) | |
| } | |
| wantDays := absDays(marchThruDecember) | |
| bad := 0 | |
| for year := int64(1); year < 10000; year++ { | |
| days := dateToAbsDays(year-absoluteYears, January, 1) | |
| if days != wantDays { | |
| t.Errorf("dateToAbsDays(abs %d, Jan, 1) = %d, want %d", year, days, wantDays) | |
| if bad++; bad >= 20 { | |
| t.Fatalf("too many errors") | |
| } | |
| } | |
| wantDays += 365 | |
| if isLeap(year) { | |
| wantDays++ | |
| } | |
| } | |
| } | |
| func testDaysIn(t testingT) { | |
| isLeap := func(year int) bool { | |
| return year%4 == 0 && (year%100 != 0 || year%400 == 0) | |
| } | |
| want := []int{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} | |
| bad := 0 | |
| for year := 0; year <= 1600; year++ { | |
| for m := January; m <= December; m++ { | |
| w := want[m] | |
| if m == February && isLeap(year) { | |
| w++ | |
| } | |
| d := daysIn(m, year-800) | |
| if d != w { | |
| t.Errorf("daysIn(%v, %d) = %d, want %d", m, year-800, d, w) | |
| if bad++; bad >= 20 { | |
| t.Fatalf("too many errors") | |
| } | |
| } | |
| } | |
| } | |
| } | |
| func testDaysBefore(t testingT) { | |
| for m, want := range []int{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365} { | |
| d := daysBefore(Month(m + 1)) | |
| if d != want { | |
| t.Errorf("daysBefore(%d) = %d, want %d", m, d, want) | |
| } | |
| } | |
| } |