// Your solution must include the following definitions: // // func ParseHex(string) (int64, error) // func HandleErrors([]string) []string // // HandleErrors takes a list of inputs for ParseHex and returns a matching list // of error cases. It must call ParseHex on each input, handle the error result, // and put one of three strings, "none", "syntax", or "range" in the result list // according to the error. package hexadecimal import ( "testing" ) var testCases = []struct { in string out int64 errCase string }{ {"1", 1, "none"}, {"10", 0x10, "none"}, {"2d", 0x2d, "none"}, {"012", 0x12, "none"}, {"cfcfcf", 0xcfcfcf, "none"}, {"CFCFCF", 0xcfcfcf, "none"}, {"", 0, "syntax"}, {"peanut", 0, "syntax"}, {"2cg134", 0, "syntax"}, {"8000000000000000", 0, "range"}, {"9223372036854775809", 0, "range"}, {"70000000000000000", 0, "range"}, } func TestParseHex(t *testing.T) { for _, test := range testCases { switch out, err := ParseHex(test.in); { case err != nil: if test.errCase == "none" { t.Errorf("ParseHex(%q) returned error %q. Error not expected.", test.in, err) } case test.errCase != "none": t.Errorf("ParseHex(%q) = %d, %v. Expected error.", test.in, out, err) case out != test.out: t.Errorf("ParseHex(%q) = %d. Expected %d.", test.in, out, test.out) } } } func TestHandleErrors(t *testing.T) { tests := make([]string, len(testCases)) for i, test := range testCases { tests[i] = test.in } er := HandleErrors(tests) if len(er) != len(tests) { t.Fatalf("For %d tests, HandleErrors returned %d results, want %d", len(tests), len(er), len(tests)) } for i, e := range er { if e != testCases[i].errCase { t.Errorf("For ParseHex(%q), HandleErrors reports %q, want %q", tests[i], e, testCases[i].errCase) } } } func BenchmarkParseHex(b *testing.B) { for i := 0; i < b.N; i++ { for _, test := range testCases { ParseHex(test.in) } } }