diff --git a/mapstructure_bugs_test.go b/mapstructure_bugs_test.go index 0c2a9cd..1f53cb9 100644 --- a/mapstructure_bugs_test.go +++ b/mapstructure_bugs_test.go @@ -638,3 +638,110 @@ func TestDecode_nonComparableType(t *testing.T) { t.Fatalf("fail: %#v", decodeTo.NonComparableType) } } + +// GH-347: Decoding maps with multiple indirection results in an error +func TestDecodeToMapWithMultipleIndirection(t *testing.T) { + t.Run("Struct", func(t *testing.T) { + type Struct struct { + Foo string `mapstructure:"foo"` + } + + v := Struct{ + Foo: "bar", + } + + i := &v + ii := &i + iii := &ii + + var actual map[string]interface{} + + if err := Decode(iii, &actual); err != nil { + t.Fatal(err) + } + + expected := map[string]interface{}{ + "foo": "bar", + } + + if !reflect.DeepEqual(actual, expected) { + t.Fatalf("expected: %#v, got: %#v", expected, actual) + } + }) + + t.Run("Map", func(t *testing.T) { + v := map[string]interface{}{ + "foo": "bar", + } + + i := &v + ii := &i + iii := &ii + + var actual map[string]interface{} + + if err := Decode(iii, &actual); err != nil { + t.Fatal(err) + } + + expected := map[string]interface{}{ + "foo": "bar", + } + + if !reflect.DeepEqual(actual, expected) { + t.Fatalf("expected: %#v, got: %#v", expected, actual) + } + }) + + t.Run("Array", func(t *testing.T) { + v := [1]map[string]interface{}{ + { + "foo": "bar", + }, + } + + i := &v + ii := &i + iii := &ii + + var actual map[string]interface{} + + if err := WeakDecode(iii, &actual); err != nil { + t.Fatal(err) + } + + expected := map[string]interface{}{ + "foo": "bar", + } + + if !reflect.DeepEqual(actual, expected) { + t.Fatalf("expected: %#v, got: %#v", expected, actual) + } + }) + + t.Run("Slice", func(t *testing.T) { + v := []map[string]interface{}{ + { + "foo": "bar", + }, + } + + i := &v + ii := &i + iii := &ii + + var actual map[string]interface{} + + if err := WeakDecode(iii, &actual); err != nil { + t.Fatal(err) + } + + expected := map[string]interface{}{ + "foo": "bar", + } + + if !reflect.DeepEqual(actual, expected) { + t.Fatalf("expected: %#v, got: %#v", expected, actual) + } + }) +}