package main

import (
	"testing"
	"strings"
	"bytes"
	"os"
	"io/ioutil"
)

func expectBufferEquality(t *testing.T, name string, buffer *bytes.Buffer, expected string) {
	output := buffer.String()
	if output != expected {
		t.Errorf("incorrect %s:\n%s\n\nexpected %s:\n%s", name, output, name, expected)
		t.Log([]rune(output))
		t.Log([]rune(expected))
	}
}

func expectProcessMainResults(t *testing.T, input string, args []string, exitCode int, expectedOutput string, expectedError string) {
	inputReader := strings.NewReader(input)
	outputBuffer := new(bytes.Buffer)
	errorBuffer := new(bytes.Buffer)

	returnCode := processMain(args, inputReader, outputBuffer, errorBuffer)

	expectBufferEquality(t, "output", outputBuffer, expectedOutput)
	expectBufferEquality(t, "error", errorBuffer, expectedError)

	if returnCode != exitCode {
		t.Error("incorrect return code:", returnCode, "expected", exitCode)
	}
}


func TestProcessMainReadFromStdin(t *testing.T) {
	input := `
		[mytoml]
		a = 42`
	expectedOutput := `{
  "mytoml": {
    "a": 42
  }
}
`
	expectedError := ``
	expectedExitCode := 0

	expectProcessMainResults(t, input, []string{}, expectedExitCode, expectedOutput, expectedError)
}

func TestProcessMainReadFromFile(t *testing.T) {
	input := `
		[mytoml]
		a = 42`


	tmpfile, err := ioutil.TempFile("", "example.toml")
	if err != nil {
		t.Fatal(err)
	}
	if _, err := tmpfile.Write([]byte(input)); err != nil {
		t.Fatal(err)
	}

	defer os.Remove(tmpfile.Name())

	expectedOutput := `{
  "mytoml": {
    "a": 42
  }
}
`
	expectedError := ``
	expectedExitCode := 0

	expectProcessMainResults(t, ``, []string{tmpfile.Name()}, expectedExitCode, expectedOutput, expectedError)
}

func TestProcessMainReadFromMissingFile(t *testing.T) {
	expectedError := `open /this/file/does/not/exist: no such file or directory
`
	expectProcessMainResults(t, ``, []string{"/this/file/does/not/exist"}, -1, ``, expectedError)
}