package jsonstream import ( "bytes" "encoding/json" "errors" "slices" "strings" "testing" ) func copyString(t *testing.T, in string, fn func(*Member) error) (string, error) { t.Helper() var out bytes.Buffer err := CopyObject(strings.NewReader(in), &out, fn) return out.String(), err } func TestCopyObjectKeepsValueBytes(t *testing.T) { in := `{"a": 1.50, "b" : {"x": "<&>", "y":[1, 2]}, "c":null, "d":"é"}` got, err := copyString(t, in, func(m *Member) error { return nil }) if err != nil { t.Fatal(err) } if want := `{"a":1.50,"b":{"x": "<&>", "y":[1, 2]},"c":null,"d":"é"}`; got != want { t.Errorf("got %s\nwant %s", got, want) } } func TestCopyObjectFiltersNested(t *testing.T) { in := `{"info":{"subdir":"noarch"},"packages":{"keep":{"n":1},"drop":{"n":2},"also":{"n":3}},"tail":[]}` got, err := copyString(t, in, func(m *Member) error { if m.Key != "packages" { return m.Copy() } return m.Object(func(entry *Member) error { raw, err := entry.Raw() if err != nil { return err } if entry.Key == "drop" { return nil } return entry.Write(raw) }) }) if err != nil { t.Fatal(err) } if want := `{"info":{"subdir":"noarch"},"packages":{"keep":{"n":1},"also":{"n":3}},"tail":[]}`; got != want { t.Errorf("got %s\nwant %s", got, want) } if !json.Valid([]byte(got)) { t.Error("output is not valid JSON") } } func TestCopyObjectSkipReplaceAndEmpty(t *testing.T) { got, err := copyString(t, `{"first":1,"secret":"x","n":2,"empty":{}}`, func(m *Member) error { switch m.Key { case "first", "secret": _, err := m.Raw() return err case "n": if _, err := m.Raw(); err != nil { return err } return m.Write([]byte(`3`)) case "empty": return m.Object(func(*Member) error { return nil }) } return nil }) if err != nil { t.Fatal(err) } if want := `{"n":3,"empty":{}}`; got != want { t.Errorf("got %s, want %s", got, want) } } func TestCopyObjectKeys(t *testing.T) { got, err := copyString(t, `{"a