package cfg import ( "testing" "github.com/matryer/is" "go.jolheiser.com/nixfig" ) type TestData struct { Foo string Baz bool Bux int Qux TestSubData } type TestSubData struct { Honk string Chonk int Gonk bool } func TestEncoding(t *testing.T) { final := TestData{ Foo: "bar", Baz: true, Bux: 10, Qux: TestSubData{ Honk: "bonk", Chonk: 50, Gonk: false, }, } // Each decode-only [Encoding] tt := []struct { Name string Input string Encoding Encoding }{ { Name: "dhall", Input: ` { Foo = "bar" , Baz = True , Bux = 10 , Qux = { Honk = "bonk" , Chonk = 50 , Gonk = False } } `, Encoding: DHALL, }, { Name: "jsonnet", Input: ` { Foo: "bar", Baz: true, Bux: 10, Qux: { Honk: "bonk", Chonk: 50, Gonk: false, } } `, Encoding: JSONNET, }, } encoders := []Encoding{JSON, JSONC, YAML, TOML, KDL} // Only test nix if it's available if nixfig.Nix != "" { encoders = append(encoders, NIX) } for _, tc := range tt { t.Run(tc.Name, func(t *testing.T) { assert := is.New(t) var data TestData err := tc.Encoding.Unmarshal([]byte(tc.Input), &data) assert.NoErr(err) // Should be able to unmarshal for _, e := range encoders { out, err := e.Marshal(data) assert.NoErr(err) // Should be able to marshal err = e.Unmarshal(out, &data) assert.NoErr(err) // Should be able to unmarshal } assert.Equal(data, final) // Final structs should be equal }) } }