テストを書くとき、値はどうでも良いが、キーだけちゃんとチェックしたい。要はmapなんだけどものによって期待する構造が微妙に違うんじゃ????ってときがあったのでやってみる。 ふわっとした形をがんばって扱うのGo言語っぽくない気がするーーー、うーーーーーーんんんん。。
package hoge_test
import (
"testing"
"sort"
"reflect"
)
func checkMapStructure(t *testing.T, expectMap map[string]interface{}, actualMap map[string]interface{}) {
var expectKeys []string
var actualKeys []string
for expectKey, expectVal := range expectMap {
expectKeys = append(expectKeys, expectKey)
if expectChildMap, ok := expectVal.(map[string]interface{}); ok {
actualVal, ok := actualMap[expectKey]
if !ok {
t.Fatalf("wants actualMap[%+v], but not found", expectKey)
}
actualChildMap, ok := actualVal.(map[string]interface{})
if !ok {
t.Fatalf("wants actualMap[%+v] is map, but not map", expectKey)
}
checkMapStructure(t, expectChildMap, actualChildMap)
}
}
for actualKey := range actualMap {
actualKeys = append(actualKeys, actualKey)
}
sort.Strings(expectKeys)
sort.Strings(actualKeys)
if !reflect.DeepEqual(expectKeys, actualKeys) {
t.Fatalf("expectKeys = %s, actualKeys = %s", expectKeys, actualKeys)
}
}
func TestHoge(t *testing.T) {
x := map[string]interface{}{}
ex := map[string]interface{}{}
x["1"] = 111
x["huga"] = map[string]interface{}{
"a": 1,
"b": 1,
"c": 1,
}
ex["1"] = "hoge"
ex["huga"] = map[string]interface{}{
"a": "1234",
"b": "1234",
"c": "1234",
}
checkMapStructure(t, ex, x)
t.Fail()
}
とりあえず string なキーだけやっているけれど reflect.DeepEqual で検証しているので string じゃなくてもなんでもできると思う。 逆に string 以外のキーを持った map って需要あるんかな、わからん。