github.com/astaxie/beego@v1.12.3/context/param/parsers_test.go (about) 1 package param 2 3 import ( 4 "reflect" 5 "testing" 6 "time" 7 ) 8 9 type testDefinition struct { 10 strValue string 11 expectedValue interface{} 12 expectedParser paramParser 13 } 14 15 func Test_Parsers(t *testing.T) { 16 17 //ints 18 checkParser(testDefinition{"1", 1, intParser{}}, t) 19 checkParser(testDefinition{"-1", int64(-1), intParser{}}, t) 20 checkParser(testDefinition{"1", uint64(1), intParser{}}, t) 21 22 //floats 23 checkParser(testDefinition{"1.0", float32(1.0), floatParser{}}, t) 24 checkParser(testDefinition{"-1.0", float64(-1.0), floatParser{}}, t) 25 26 //strings 27 checkParser(testDefinition{"AB", "AB", stringParser{}}, t) 28 checkParser(testDefinition{"AB", []byte{65, 66}, stringParser{}}, t) 29 30 //bools 31 checkParser(testDefinition{"true", true, boolParser{}}, t) 32 checkParser(testDefinition{"0", false, boolParser{}}, t) 33 34 //timeParser 35 checkParser(testDefinition{"2017-05-30T13:54:53Z", time.Date(2017, 5, 30, 13, 54, 53, 0, time.UTC), timeParser{}}, t) 36 checkParser(testDefinition{"2017-05-30", time.Date(2017, 5, 30, 0, 0, 0, 0, time.UTC), timeParser{}}, t) 37 38 //json 39 checkParser(testDefinition{`{"X": 5, "Y":"Z"}`, struct { 40 X int 41 Y string 42 }{5, "Z"}, jsonParser{}}, t) 43 44 //slice in query is parsed as comma delimited 45 checkParser(testDefinition{`1,2`, []int{1, 2}, sliceParser(intParser{})}, t) 46 47 //slice in body is parsed as json 48 checkParser(testDefinition{`["a","b"]`, []string{"a", "b"}, jsonParser{}}, t, MethodParam{in: body}) 49 50 //pointers 51 var someInt = 1 52 checkParser(testDefinition{`1`, &someInt, ptrParser(intParser{})}, t) 53 54 var someStruct = struct{ X int }{5} 55 checkParser(testDefinition{`{"X": 5}`, &someStruct, jsonParser{}}, t) 56 57 } 58 59 func checkParser(def testDefinition, t *testing.T, methodParam ...MethodParam) { 60 toType := reflect.TypeOf(def.expectedValue) 61 var mp MethodParam 62 if len(methodParam) == 0 { 63 mp = MethodParam{} 64 } else { 65 mp = methodParam[0] 66 } 67 parser := getParser(&mp, toType) 68 69 if reflect.TypeOf(parser) != reflect.TypeOf(def.expectedParser) { 70 t.Errorf("Invalid parser for value %v. Expected: %v, actual: %v", def.strValue, reflect.TypeOf(def.expectedParser).Name(), reflect.TypeOf(parser).Name()) 71 return 72 } 73 result, err := parser.parse(def.strValue, toType) 74 if err != nil { 75 t.Errorf("Parsing error for value %v. Expected result: %v, error: %v", def.strValue, def.expectedValue, err) 76 return 77 } 78 convResult, err := safeConvert(reflect.ValueOf(result), toType) 79 if err != nil { 80 t.Errorf("Conversion error for %v. from value: %v, toType: %v, error: %v", def.strValue, result, toType, err) 81 return 82 } 83 if !reflect.DeepEqual(convResult.Interface(), def.expectedValue) { 84 t.Errorf("Parsing error for value %v. Expected result: %v, actual: %v", def.strValue, def.expectedValue, result) 85 } 86 }