parsers_test.go 2.7 KB

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