package strslice

import (
	"encoding/json"
	"reflect"
	"testing"
)

func TestStrSliceMarshalJSON(t *testing.T) {
	for _, testcase := range []struct {
		input    StrSlice
		expected string
	}{
		// MADNESS(stevvooe): No clue why nil would be "" but empty would be
		// "null". Had to make a change here that may affect compatibility.
		{input: nil, expected: "null"},
		{StrSlice{}, "[]"},
		{StrSlice{"/bin/sh", "-c", "echo"}, `["/bin/sh","-c","echo"]`},
	} {
		data, err := json.Marshal(testcase.input)
		if err != nil {
			t.Fatal(err)
		}
		if string(data) != testcase.expected {
			t.Fatalf("%#v: expected %v, got %v", testcase.input, testcase.expected, string(data))
		}
	}
}

func TestStrSliceUnmarshalJSON(t *testing.T) {
	parts := map[string][]string{
		"":                        {"default", "values"},
		"[]":                      {},
		`["/bin/sh","-c","echo"]`: {"/bin/sh", "-c", "echo"},
	}
	for json, expectedParts := range parts {
		strs := StrSlice{"default", "values"}
		if err := strs.UnmarshalJSON([]byte(json)); err != nil {
			t.Fatal(err)
		}

		actualParts := []string(strs)
		if !reflect.DeepEqual(actualParts, expectedParts) {
			t.Fatalf("%#v: expected %v, got %v", json, expectedParts, actualParts)
		}

	}
}

func TestStrSliceUnmarshalString(t *testing.T) {
	var e StrSlice
	echo, err := json.Marshal("echo")
	if err != nil {
		t.Fatal(err)
	}
	if err := json.Unmarshal(echo, &e); err != nil {
		t.Fatal(err)
	}

	if len(e) != 1 {
		t.Fatalf("expected 1 element after unmarshal: %q", e)
	}

	if e[0] != "echo" {
		t.Fatalf("expected `echo`, got: %q", e[0])
	}
}

func TestStrSliceUnmarshalSlice(t *testing.T) {
	var e StrSlice
	echo, err := json.Marshal([]string{"echo"})
	if err != nil {
		t.Fatal(err)
	}
	if err := json.Unmarshal(echo, &e); err != nil {
		t.Fatal(err)
	}

	if len(e) != 1 {
		t.Fatalf("expected 1 element after unmarshal: %q", e)
	}

	if e[0] != "echo" {
		t.Fatalf("expected `echo`, got: %q", e[0])
	}
}
