// Copyright (C) 2022-2023  Luke Shumaker <lukeshu@lukeshu.com>
//
// SPDX-License-Identifier: GPL-2.0-or-later

package lowmemjson

import (
	"strings"
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestReEncode(t *testing.T) {
	t.Parallel()
	type testcase struct {
		enc ReEncoder
		in  any
		exp string
	}
	testcases := map[string]testcase{
		"basic": {
			enc: ReEncoder{
				Indent:         "\t",
				CompactIfUnder: 10,
			},
			in: map[string][]string{
				"a": {"b", "c"},
				"d": {"eeeeeeeeeeeeeee"},
			},
			exp: `{
	"a": ["b","c"],
	"d": [
		"eeeeeeeeeeeeeee"
	]
}`,
		},
		"arrays1": {
			enc: ReEncoder{
				Indent:                "\t",
				CompactIfUnder:        10,
				ForceTrailingNewlines: true,
			},
			in: []any{
				map[string]any{
					"generation": 123456,
				},
				map[string]any{
					"a": 1,
				},
				map[string]any{
					"generation": 7891011213,
				},
			},
			exp: `[
	{
		"generation": 123456
	},
	{"a":1},
	{
		"generation": 7891011213
	}
]
`,
		},
		"arrays2": {
			enc: ReEncoder{
				Indent:                "\t",
				CompactIfUnder:        10,
				ForceTrailingNewlines: true,
			},
			in: []any{
				map[string]any{
					"a": 1,
				},
				map[string]any{
					"generation": 123456,
				},
				map[string]any{
					"generation": 7891011213,
				},
			},
			exp: `[
	{"a":1},
	{
		"generation": 123456
	},
	{
		"generation": 7891011213
	}
]
`,
		},
		"arrays3": {
			enc: ReEncoder{
				Indent:                "\t",
				ForceTrailingNewlines: true,
			},
			in: []any{
				map[string]any{
					"a": 1,
				},
				map[string]any{
					"generation": 123456,
				},
				map[string]any{
					"generation": 7891011213,
				},
			},
			exp: `[
	{
		"a": 1
	},
	{
		"generation": 123456
	},
	{
		"generation": 7891011213
	}
]
`,
		},
	}
	for tcName, tc := range testcases {
		tc := tc
		t.Run(tcName, func(t *testing.T) {
			t.Parallel()
			var out strings.Builder
			fmter := tc.enc
			fmter.Out = &out
			enc := NewEncoder(&fmter)
			assert.NoError(t, enc.Encode(tc.in))
			assert.Equal(t, tc.exp, out.String())
		})
	}
}