1package main
2
3import (
4	"bytes"
5	"io/ioutil"
6	"os"
7	"strings"
8	"testing"
9)
10
11func expectBufferEquality(t *testing.T, name string, buffer *bytes.Buffer, expected string) {
12	output := buffer.String()
13	if output != expected {
14		t.Errorf("incorrect %s:\n%s\n\nexpected %s:\n%s", name, output, name, expected)
15		t.Log([]rune(output))
16		t.Log([]rune(expected))
17	}
18}
19
20func expectProcessMainResults(t *testing.T, input string, args []string, exitCode int, expectedOutput string, expectedError string) {
21	inputReader := strings.NewReader(input)
22	outputBuffer := new(bytes.Buffer)
23	errorBuffer := new(bytes.Buffer)
24
25	returnCode := processMain(args, inputReader, outputBuffer, errorBuffer)
26
27	expectBufferEquality(t, "output", outputBuffer, expectedOutput)
28	expectBufferEquality(t, "error", errorBuffer, expectedError)
29
30	if returnCode != exitCode {
31		t.Error("incorrect return code:", returnCode, "expected", exitCode)
32	}
33}
34
35func TestProcessMainReadFromStdin(t *testing.T) {
36	input := `
37		[mytoml]
38		a = 42`
39	expectedOutput := `{
40  "mytoml": {
41    "a": 42
42  }
43}
44`
45	expectedError := ``
46	expectedExitCode := 0
47
48	expectProcessMainResults(t, input, []string{}, expectedExitCode, expectedOutput, expectedError)
49}
50
51func TestProcessMainReadFromFile(t *testing.T) {
52	input := `
53		[mytoml]
54		a = 42`
55
56	tmpfile, err := ioutil.TempFile("", "example.toml")
57	if err != nil {
58		t.Fatal(err)
59	}
60	if _, err := tmpfile.Write([]byte(input)); err != nil {
61		t.Fatal(err)
62	}
63
64	defer os.Remove(tmpfile.Name())
65
66	expectedOutput := `{
67  "mytoml": {
68    "a": 42
69  }
70}
71`
72	expectedError := ``
73	expectedExitCode := 0
74
75	expectProcessMainResults(t, ``, []string{tmpfile.Name()}, expectedExitCode, expectedOutput, expectedError)
76}
77
78func TestProcessMainReadFromMissingFile(t *testing.T) {
79	expectedError := `open /this/file/does/not/exist: no such file or directory
80`
81	expectProcessMainResults(t, ``, []string{"/this/file/does/not/exist"}, -1, ``, expectedError)
82}
83