// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package txtar

import (
	"bytes"
	"fmt"
	"reflect"
	"testing"
)

func TestParse(t *testing.T) {
	var tests = []struct {
		name   string
		text   string
		parsed *Archive
	}{
		{
			name: "basic",
			text: `comment1
comment2
-- file1 --
File 1 text.
-- foo ---
More file 1 text.
-- file 2 --
File 2 text.
-- empty --
-- noNL --
hello world
-- empty filename line --
some content
-- --`,
			parsed: &Archive{
				Comment: []byte("comment1\ncomment2\n"),
				Files: []File{
					{"file1", []byte("File 1 text.\n-- foo ---\nMore file 1 text.\n")},
					{"file 2", []byte("File 2 text.\n")},
					{"empty", []byte{}},
					{"noNL", []byte("hello world\n")},
					{"empty filename line", []byte("some content\n-- --\n")},
				},
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			a := Parse([]byte(tt.text))
			if !reflect.DeepEqual(a, tt.parsed) {
				t.Fatalf("Parse: wrong output:\nhave:\n%s\nwant:\n%s", shortArchive(a), shortArchive(tt.parsed))
			}
			text := Format(a)
			a = Parse(text)
			if !reflect.DeepEqual(a, tt.parsed) {
				t.Fatalf("Parse after Format: wrong output:\nhave:\n%s\nwant:\n%s", shortArchive(a), shortArchive(tt.parsed))
			}
		})
	}
}

func TestFormat(t *testing.T) {
	var tests = []struct {
		name   string
		input  *Archive
		wanted string
	}{
		{
			name: "basic",
			input: &Archive{
				Comment: []byte("comment1\ncomment2\n"),
				Files: []File{
					{"file1", []byte("File 1 text.\n-- foo ---\nMore file 1 text.\n")},
					{"file 2", []byte("File 2 text.\n")},
					{"empty", []byte{}},
					{"noNL", []byte("hello world")},
				},
			},
			wanted: `comment1
comment2
-- file1 --
File 1 text.
-- foo ---
More file 1 text.
-- file 2 --
File 2 text.
-- empty --
-- noNL --
hello world
`,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			result := Format(tt.input)
			if string(result) != tt.wanted {
				t.Errorf("Wrong output. \nGot:\n%s\nWant:\n%s\n", string(result), tt.wanted)
			}
		})
	}
}

func shortArchive(a *Archive) string {
	var buf bytes.Buffer
	fmt.Fprintf(&buf, "comment: %q\n", a.Comment)
	for _, f := range a.Files {
		fmt.Fprintf(&buf, "file %q: %q\n", f.Name, f.Data)
	}
	return buf.String()
}
