// Copyright 2014 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package blueprint

import (
	"bytes"
	"testing"
)

func ck(err error) {
	if err != nil {
		panic(err)
	}
}

var ninjaWriterTestCases = []struct {
	input  func(w *ninjaWriter)
	output string
}{
	{
		input: func(w *ninjaWriter) {
			ck(w.Comment("foo"))
		},
		output: "# foo\n",
	},
	{
		input: func(w *ninjaWriter) {
			ck(w.Pool("foo"))
		},
		output: "pool foo\n",
	},
	{
		input: func(w *ninjaWriter) {
			ck(w.Rule("foo"))
		},
		output: "rule foo\n",
	},
	{
		input: func(w *ninjaWriter) {
			ck(w.Build("foo comment", "foo", []string{"o1", "o2"}, []string{"io1", "io2"},
				[]string{"e1", "e2"}, []string{"i1", "i2"}, []string{"oo1", "oo2"}))
		},
		output: "# foo comment\nbuild o1 o2 | io1 io2: foo e1 e2 | i1 i2 || oo1 oo2\n",
	},
	{
		input: func(w *ninjaWriter) {
			ck(w.Default("foo"))
		},
		output: "default foo\n",
	},
	{
		input: func(w *ninjaWriter) {
			ck(w.Assign("foo", "bar"))
		},
		output: "foo = bar\n",
	},
	{
		input: func(w *ninjaWriter) {
			ck(w.ScopedAssign("foo", "bar"))
		},
		output: "    foo = bar\n",
	},
	{
		input: func(w *ninjaWriter) {
			ck(w.BlankLine())
		},
		output: "\n",
	},
	{
		input: func(w *ninjaWriter) {
			ck(w.Pool("p"))
			ck(w.ScopedAssign("depth", "3"))
			ck(w.BlankLine())
			ck(w.Comment("here comes a rule"))
			ck(w.Rule("r"))
			ck(w.ScopedAssign("command", "echo out: $out in: $in _arg: $_arg"))
			ck(w.ScopedAssign("pool", "p"))
			ck(w.BlankLine())
			ck(w.Build("r comment", "r", []string{"foo.o"}, nil, []string{"foo.in"}, nil, nil))
			ck(w.ScopedAssign("_arg", "arg value"))
		},
		output: `pool p
    depth = 3

# here comes a rule
rule r
    command = echo out: $out in: $in _arg: $_arg
    pool = p

# r comment
build foo.o: r foo.in
    _arg = arg value
`,
	},
}

func TestNinjaWriter(t *testing.T) {
	for i, testCase := range ninjaWriterTestCases {
		buf := bytes.NewBuffer(nil)
		w := newNinjaWriter(buf)
		testCase.input(w)
		if buf.String() != testCase.output {
			t.Errorf("incorrect output for test case %d", i)
			t.Errorf("  expected: %q", testCase.output)
			t.Errorf("       got: %q", buf.String())
		}
	}
}
