package param import ( "reflect" "testing" ) type Fruity struct { A bool B int `json:"banana"` C uint `param:"cherry"` D float64 `json:"durian" param:"dragonfruit"` E int `json:"elderberry" param:"-"` F map[string]int `json:"-" param:"fig"` G *int `json:"grape,omitempty"` H []int `param:"honeydew" json:"huckleberry"` I string `foobar:"iyokan"` J Cheesy `param:"jackfruit" cheese:"jarlsberg"` } type Cheesy struct { A int `param:"affinois"` B int `param:"brie"` C int `param:"camembert"` D int `param:"delice d'argental"` } type Private struct { Public, private int } var fruityType = reflect.TypeOf(Fruity{}) var cheesyType = reflect.TypeOf(Cheesy{}) var privateType = reflect.TypeOf(Private{}) var fruityNames = []string{ "A", "banana", "cherry", "dragonfruit", "-", "fig", "grape", "honeydew", "I", "jackfruit", } var fruityCache = map[string]cacheLine{ "A": {0, parseBool}, "banana": {1, parseInt}, "cherry": {2, parseUint}, "dragonfruit": {3, parseFloat}, "fig": {5, parseMap}, "grape": {6, parsePtr}, "honeydew": {7, parseSlice}, "I": {8, parseString}, "jackfruit": {9, parseStruct}, } func assertEqual(t *testing.T, what string, e, a interface{}) { if !reflect.DeepEqual(e, a) { t.Errorf("Expected %s to be %v, was actually %v", what, e, a) } } func TestNames(t *testing.T) { t.Parallel() for i, val := range fruityNames { name := extractName(fruityType.Field(i)) assertEqual(t, "tag", val, name) } } func TestCacheStruct(t *testing.T) { t.Parallel() sc := cacheStruct(fruityType) if len(sc) != len(fruityCache) { t.Errorf("Cache has %d keys, but expected %d", len(sc), len(fruityCache)) } for k, v := range fruityCache { sck, ok := sc[k] if !ok { t.Errorf("Could not find key %q in cache", k) continue } if sck.offset != v.offset { t.Errorf("Cache for %q: expected offset %d but got %d", k, sck.offset, v.offset) } // We want to compare function pointer equality, and this // appears to be the only way a := reflect.ValueOf(sck.parse) b := reflect.ValueOf(v.parse) if a.Pointer() != b.Pointer() { t.Errorf("Parse mismatch for %q: %v, expected %v", k, a, b) } } } func TestPrivate(t *testing.T) { t.Parallel() sc := cacheStruct(privateType) if len(sc) != 1 { t.Error("Expected Private{} to have one cachable field") } }