// 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", []string{"o1", "o2"}, []string{"e1", "e2"},
				[]string{"i1", "i2"}, []string{"oo1", "oo2"}))
		},
		output: "build o1 o2: 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", []string{"foo.o"}, []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

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())
		}
	}
}
