diff options
Diffstat (limited to 'cisa/date_test.go')
-rw-r--r-- | cisa/date_test.go | 310 |
1 files changed, 310 insertions, 0 deletions
diff --git a/cisa/date_test.go b/cisa/date_test.go new file mode 100644 index 0000000..c64f618 --- /dev/null +++ b/cisa/date_test.go @@ -0,0 +1,310 @@ +package cisa + +import ( + "fmt" + "reflect" + "testing" +) + +func TestIsLeapYear(t *testing.T) { + tests := []struct { + val uint16 + exp bool + } { + { 1800, false }, + { 1900, false }, + { 1996, true }, + { 1997, false }, + { 1998, false }, + { 1999, false }, + { 2000, true }, + { 2001, false }, + { 2002, false }, + { 2003, false }, + { 2004, true }, + { 2005, false }, + { 2006, false }, + { 2007, false }, + { 2008, true }, + { 2009, false }, + { 2010, false }, + { 2011, false }, + { 2012, true }, + { 2013, false }, + { 2014, false }, + { 2015, false }, + { 2016, true }, + { 2017, false }, + { 2018, false }, + { 2019, false }, + { 2020, true }, + { 2021, false }, + { 2022, false }, + { 2023, false }, + { 2024, true }, + { 2100, false }, + { 2400, true }, + } + + for _, test := range(tests) { + t.Run(fmt.Sprintf("%d", test.val), func(t *testing.T) { + got := isLeapYear(test.val) + if got != test.exp { + t.Errorf("got %v, exp %v", got, test.exp) + } + }) + } +} + +func TestGetMaxMonthDay(t *testing.T) { + tests := []struct { + y uint16 + m uint16 + exp uint16 + } { + { 2000, 2, 29 }, // test leap year + { 2001, 2, 28 }, // test non-leap year + { 2022, 1, 31 }, // test full non-leap year + { 2022, 2, 28 }, + { 2022, 3, 31 }, + { 2022, 4, 30 }, + { 2022, 5, 31 }, + { 2022, 6, 30 }, + { 2022, 7, 31 }, + { 2022, 8, 31 }, + { 2022, 9, 30 }, + { 2022, 10, 31 }, + { 2022, 11, 30 }, + { 2022, 12, 31 }, + } + + for _, test := range(tests) { + t.Run(fmt.Sprintf("%04d-%02d", test.y, test.m), func(t *testing.T) { + got := getMaxMonthDay(test.y, test.m) + if got != test.exp { + t.Errorf("got %v, exp %v", got, test.exp) + } + }) + } +} + +func TestParseDateComponent(t *testing.T) { + tests := []struct { + name string + val string + min uint16 + max uint16 + exp bool + } { + { "bad-uint", "abcd", 2000, 2001, false }, + { "y-pass", "2000", 2000, 2001, true }, + { "y-fail-lo", "1999", 2000, 2001, false }, + { "y-fail-hi", "2002", 2000, 2001, false }, + { "m-pass-1", "1", 1, 12, true }, + { "m-pass-2", "2", 1, 12, true }, + { "m-pass-3", "3", 1, 12, true }, + { "m-pass-4", "4", 1, 12, true }, + { "m-pass-5", "5", 1, 12, true }, + { "m-pass-6", "6", 1, 12, true }, + { "m-pass-7", "7", 1, 12, true }, + { "m-pass-8", "8", 1, 12, true }, + { "m-pass-9", "9", 1, 12, true }, + { "m-pass-10", "10", 1, 12, true }, + { "m-pass-11", "11", 1, 12, true }, + { "m-pass-12", "12", 1, 12, true }, + { "m-fail-lo", "0", 1, 12, false }, + { "m-fail-hi", "13", 1, 12, false }, + { "d-pass-1", "1", 1, 31, true }, + { "d-pass-10", "10", 1, 31, true }, + { "d-pass-30", "10", 1, 31, true }, + { "d-fail-lo", "0", 1, 31, false }, + { "d-fail-hi", "32", 1, 31, false }, + } + + for _, test := range(tests) { + t.Run(test.name, func(t *testing.T) { + got, err := parseDateComponent("a", []byte(test.val), test.min, test.max) + if err != nil && test.exp == true { + t.Error(err) + } else if err == nil && test.exp == false { + t.Errorf("got %v, exp error", got) + } + }) + } +} + +func TestNewDate(t *testing.T) { + tests := []struct { + name string + val string + exp bool + } { + { "pass", "2000-01-03", true }, + { "pass-lo", "1999-01-01", true }, + { "pass-hi", "2126-12-31", true }, + { "fail", "asdf", false }, + { "fail-y-lo", "1998-01-03", false }, + { "fail-y-hi", "2128-01-03", false }, + { "fail-m-lo", "2126-00-03", false }, + { "fail-m-hi", "2126-13-03", false }, + { "fail-d-lo", "2126-01-00", false }, + { "fail-d-hi", "2126-01-32", false }, + { "fail-d-hi", "2126-02-29", false }, + { "fail-d-hi", "2126-03-32", false }, + { "fail-d-hi", "2126-04-31", false }, + { "fail-d-hi", "2126-05-32", false }, + { "fail-d-hi", "2126-06-31", false }, + } + + for _, test := range(tests) { + t.Run(test.name, func(t *testing.T) { + if got, err := NewDate([]byte(test.val)); err != nil && test.exp { + t.Error(err) + } else if err == nil && !test.exp { + t.Errorf("got %v, exp error", got) + } + }) + } +} + +func TestGetComponents(t *testing.T) { + type date struct { + y uint16 + m uint16 + d uint16 + } + + tests := []struct { + val string + exp date + } { + { "2022-10-31", date { 2022, 10, 31 } }, + } + + for _, test := range(tests) { + t.Run(test.val, func(t *testing.T) { + // create date + dt, err := NewDate([]byte(test.val)) + if err != nil { + t.Error(err) + return + } + + // get components + y, m, d := dt.GetComponents() + got := date { y, m, d } + + // check components + if !reflect.DeepEqual(got, test.exp) { + t.Errorf("got %v, exp %v", got, test.exp) + } + }) + } +} + +func TestYear(t *testing.T) { + tests := []struct { + val string + exp uint16 + } { + { "2022-10-31", 2022 }, + } + + for _, test := range(tests) { + t.Run(test.val, func(t *testing.T) { + // create date + dt, err := NewDate([]byte(test.val)) + if err != nil { + t.Error(err) + return + } + + // get year + got := dt.Year() + + // check components + if got != test.exp { + t.Errorf("got year %d, exp %d", got, test.exp) + } + }) + } +} + +func TestMonth(t *testing.T) { + tests := []struct { + val string + exp uint16 + } { + { "2022-10-31", 10 }, + } + + for _, test := range(tests) { + t.Run(test.val, func(t *testing.T) { + // create date + dt, err := NewDate([]byte(test.val)) + if err != nil { + t.Error(err) + return + } + + // get month + got := dt.Month() + + // check components + if got != test.exp { + t.Errorf("got month %d, exp %d", got, test.exp) + } + }) + } +} + +func TestDay(t *testing.T) { + tests := []struct { + val string + exp uint16 + } { + { "2022-10-31", 31 }, + } + + for _, test := range(tests) { + t.Run(test.val, func(t *testing.T) { + // create date + dt, err := NewDate([]byte(test.val)) + if err != nil { + t.Error(err) + return + } + + // get day + got := dt.Day() + + // check components + if got != test.exp { + t.Errorf("got day %d, exp %d", got, test.exp) + } + }) + } +} + +func TestString(t *testing.T) { + tests := []string { + "2022-10-31", + } + + for _, test := range(tests) { + t.Run(test, func(t *testing.T) { + // create date + dt, err := NewDate([]byte(test)) + if err != nil { + t.Error(err) + return + } + + // get/check string + got := dt.String() + if got != test { + t.Errorf("got %s, exp %s", got, test) + } + }) + } +} |