package schema import ( "reflect" "testing" ) func TestMapFieldReader_impl(t *testing.T) { var _ FieldReader = new(MapFieldReader) } func TestMapFieldReader(t *testing.T) { testFieldReader(t, func(s map[string]*Schema) FieldReader { return &MapFieldReader{ Schema: s, Map: BasicMapReader(map[string]string{ "bool": "true", "int": "42", "float": "3.1415", "string": "string", "list.#": "2", "list.0": "foo", "list.1": "bar", "listInt.#": "2", "listInt.0": "21", "listInt.1": "42", "map.%": "2", "map.foo": "bar", "map.bar": "baz", "set.#": "2", "set.10": "10", "set.50": "50", "setDeep.#": "2", "setDeep.10.index": "10", "setDeep.10.value": "foo", "setDeep.50.index": "50", "setDeep.50.value": "bar", "mapInt.%": "2", "mapInt.one": "1", "mapInt.two": "2", "mapIntNestedSchema.%": "2", "mapIntNestedSchema.one": "1", "mapIntNestedSchema.two": "2", "mapFloat.%": "1", "mapFloat.oneDotTwo": "1.2", "mapBool.%": "2", "mapBool.True": "true", "mapBool.False": "false", }), } }) } func TestMapFieldReader_extra(t *testing.T) { r := &MapFieldReader{ Schema: map[string]*Schema{ "mapDel": &Schema{Type: TypeMap}, "mapEmpty": &Schema{Type: TypeMap}, }, Map: BasicMapReader(map[string]string{ "mapDel": "", "mapEmpty.%": "0", }), } cases := map[string]struct { Addr []string Out interface{} OutOk bool OutComputed bool OutErr bool }{ "mapDel": { []string{"mapDel"}, map[string]interface{}{}, true, false, false, }, "mapEmpty": { []string{"mapEmpty"}, map[string]interface{}{}, true, false, false, }, } for name, tc := range cases { out, err := r.ReadField(tc.Addr) if err != nil != tc.OutErr { t.Fatalf("%s: err: %s", name, err) } if out.Computed != tc.OutComputed { t.Fatalf("%s: err: %#v", name, out.Computed) } if s, ok := out.Value.(*Set); ok { // If it is a set, convert to a list so its more easily checked. out.Value = s.List() } if !reflect.DeepEqual(out.Value, tc.Out) { t.Fatalf("%s: out: %#v", name, out.Value) } if out.Exists != tc.OutOk { t.Fatalf("%s: outOk: %#v", name, out.Exists) } } }