package moon import ( "testing" ) type person struct { Name string Age int } var valueTests = []struct { in interface{} out string }{ {nil, "null"}, {true, "true"}, {false, "false"}, {0, "0"}, {1, "1"}, {12345, "12345"}, {.1, "0.1"}, {1.0, "1.0"}, {1.0e9, "1000000000.0"}, // this is kinda gross, but it's the only way I've figured out how to // prevent 1.0 printing out as 1 and thus having its type changed from // float to int. Sometimes having obnoxious string representations is // better than something having things change type. {"a string", `"a string"`}, {`it's got "quotes"`, `"it's got \"quotes\""`}, {person{"jordan", 28}, `{Name: "jordan" Age: 28}`}, {[]int{1, 2, 3}, `[1 2 3]`}, {[]float32{1.0, 2.2, 3.3}, `[1.0 2.2 3.3]`}, {[]float64{1.0, 2.2, 3.3}, `[1.0 2.2 3.3]`}, {[]string{"one", "two", "three"}, `["one" "two" "three"]`}, { map[string]int{"one": 1, "two": 2, "three": 3}, `{one: 1 two: 2 three: 3}`, }, { map[string]interface{}{ "one": 1, "two": 2.0, "pi": 3.14, }, `{one: 1 two: 2.0 pi: 3.14}`, }, } func TestWriteValues(t *testing.T) { for _, test := range valueTests { out, err := Encode(test.in) if err != nil { t.Error(err) continue } if string(out) != test.out { t.Errorf("expected '%s', saw '%s'", test.out, string(out)) } } }