diff --git a/isoweek.go b/isoweek.go index 2defc48..cde5b47 100644 --- a/isoweek.go +++ b/isoweek.go @@ -93,3 +93,11 @@ func Validate(wyear, week int) (ok bool) { return wyear == wyear2 && week == week2 } + +// WeeksInYear returns the number of ISO 8601 weeks in a year (52 or 53). +func WeeksInYear(year int) (weeks int) { + if Validate(year, 53) { + return 53 + } + return 52 +} diff --git a/isoweek_test.go b/isoweek_test.go index 104be22..0b04241 100644 --- a/isoweek_test.go +++ b/isoweek_test.go @@ -100,3 +100,28 @@ func ExampleValidate() { // true true false false true // true false false false true } + +// TestWeeksInYear tests all years from 1 to 4000. +// Ensures that WeeksInYear is consistent with Validate. +func TestWeeksInYear(test *testing.T) { + for year := 1; year < 4000; year++ { + weeks := isoweek.WeeksInYear(year) + if weeks != 52 && weeks != 53 { + test.Errorf("year %d: expected 52 or 53, got %d", year, weeks) + } + if weeks == 53 && !isoweek.Validate(year, 53) { + test.Errorf("year %d: WeeksInYear=53 but Validate(year,53)=false", year) + } + if weeks == 52 && isoweek.Validate(year, 53) { + test.Errorf("year %d: WeeksInYear=52 but Validate(year,53)=true", year) + } + } +} + +func ExampleWeeksInYear() { + fmt.Println(isoweek.WeeksInYear(2015)) + fmt.Println(isoweek.WeeksInYear(2016)) + // Output: + // 53 + // 52 +}