package json import ( "encoding/json" "reflect" "testing" ) func TestYMLToJSON_V2Style(t *testing.T) { input := ` log: loglevel: debug inbounds: - port: 10800 listen: 127.0.0.1 protocol: socks settings: udp: true outbounds: - protocol: vmess settings: vnext: - address: example.com port: 443 users: - id: '98a15fa6-2eb1-edd5-50ea-cfc428aaab78' streamSettings: network: tcp security: tls ` expected := ` { "log": { "loglevel": "debug" }, "inbounds": [{ "port": 10800, "listen": "127.0.0.1", "protocol": "socks", "settings": { "udp": true } }], "outbounds": [{ "protocol": "vmess", "settings": { "vnext": [{ "port": 443, "address": "example.com", "users": [{ "id": "98a15fa6-2eb1-edd5-50ea-cfc428aaab78" }] }] }, "streamSettings": { "network": "tcp", "security": "tls" } }] } ` bs, err := FromYAML([]byte(input)) if err != nil { t.Error(err) } m := make(map[string]interface{}) json.Unmarshal(bs, &m) assertResult(t, m, expected) } func TestYMLToJSON_ValueTypes(t *testing.T) { input := ` boolean: - TRUE - FALSE - true - false float: - 3.14 - 6.8523015e+5 int: - 123 - 0b1010_0111_0100_1010_1110 null: nodeName: 'node' parent: ~ # ~ for null string: - 哈哈 - 'Hello world' - newline newline2 # multi-line string date: - 2018-02-17 # yyyy-MM-dd datetime: - 2018-02-17T15:02:31+08:00 # ISO 8601 time mixed: - true - false - 1 - 0 - null - hello # arbitrary keys 1: 0 true: false TRUE: TRUE "str": "hello" ` expected := ` { "boolean": [true, false, true, false], "float": [3.14, 685230.15], "int": [123, 685230], "null": { "nodeName": "node", "parent": null }, "string": ["哈哈", "Hello world", "newline newline2"], "date": ["2018-02-17"], "datetime": ["2018-02-17T15:02:31+08:00"], "mixed": [true,false,1,0,null,"hello"], "1": 0, "true": true, "str": "hello" } ` bs, err := FromYAML([]byte(input)) if err != nil { t.Error(err) } m := make(map[string]interface{}) json.Unmarshal(bs, &m) assertResult(t, m, expected) } func assertResult(t *testing.T, value map[string]interface{}, expected string) { e := make(map[string]interface{}) err := json.Unmarshal([]byte(expected), &e) if err != nil { t.Error(err) } if !reflect.DeepEqual(value, e) { bs, _ := json.Marshal(value) t.Fatalf("expected:\n%s\n\nactual:\n%s", expected, string(bs)) } }