// 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 (
	"reflect"
	"testing"
)

var ninjaParseTestCases = []struct {
	input string
	vars  []string
	strs  []string
	err   string
}{
	{
		input: "abc def $ghi jkl",
		vars:  []string{"ghi"},
		strs:  []string{"abc def ", " jkl"},
	},
	{
		input: "abc def $ghi$jkl",
		vars:  []string{"ghi", "jkl"},
		strs:  []string{"abc def ", "", ""},
	},
	{
		input: "foo $012_-345xyz_! bar",
		vars:  []string{"012_-345xyz_"},
		strs:  []string{"foo ", "! bar"},
	},
	{
		input: "foo ${012_-345xyz_} bar",
		vars:  []string{"012_-345xyz_"},
		strs:  []string{"foo ", " bar"},
	},
	{
		input: "foo ${012_-345xyz_} bar",
		vars:  []string{"012_-345xyz_"},
		strs:  []string{"foo ", " bar"},
	},
	{
		input: "foo $$ bar",
		vars:  nil,
		strs:  []string{"foo $$ bar"},
	},
	{
		input: "$foo${bar}",
		vars:  []string{"foo", "bar"},
		strs:  []string{"", "", ""},
	},
	{
		input: "$foo$$",
		vars:  []string{"foo"},
		strs:  []string{"", "$$"},
	},
	{
		input: "foo bar",
		vars:  nil,
		strs:  []string{"foo bar"},
	},
	{
		input: " foo ",
		vars:  nil,
		strs:  []string{"$ foo "},
	},
	{
		input: "foo $ bar",
		err:   "invalid character after '$' at byte offset 5",
	},
	{
		input: "foo $",
		err:   "unexpected end of string after '$'",
	},
	{
		input: "foo ${} bar",
		err:   "empty variable name at byte offset 6",
	},
	{
		input: "foo ${abc!} bar",
		err:   "invalid character in variable name at byte offset 9",
	},
	{
		input: "foo ${abc",
		err:   "unexpected end of string in variable name",
	},
}

func TestParseNinjaString(t *testing.T) {
	for _, testCase := range ninjaParseTestCases {
		scope := newLocalScope(nil, "namespace")
		expectedVars := []Variable{}
		for _, varName := range testCase.vars {
			v, err := scope.LookupVariable(varName)
			if err != nil {
				v, err = scope.AddLocalVariable(varName, "")
				if err != nil {
					t.Fatalf("error creating scope: %s", err)
				}
			}
			expectedVars = append(expectedVars, v)
		}

		output, err := parseNinjaString(scope, testCase.input)
		if err == nil {
			if !reflect.DeepEqual(output.variables, expectedVars) {
				t.Errorf("incorrect variable list:")
				t.Errorf("     input: %q", testCase.input)
				t.Errorf("  expected: %#v", expectedVars)
				t.Errorf("       got: %#v", output.variables)
			}
			if !reflect.DeepEqual(output.strings, testCase.strs) {
				t.Errorf("incorrect string list:")
				t.Errorf("     input: %q", testCase.input)
				t.Errorf("  expected: %#v", testCase.strs)
				t.Errorf("       got: %#v", output.strings)
			}
		}
		var errStr string
		if err != nil {
			errStr = err.Error()
		}
		if err != nil && err.Error() != testCase.err {
			t.Errorf("unexpected error:")
			t.Errorf("     input: %q", testCase.input)
			t.Errorf("  expected: %q", testCase.err)
			t.Errorf("       got: %q", errStr)
		}
	}
}

func TestParseNinjaStringWithImportedVar(t *testing.T) {
	ImpVar := &staticVariable{name_: "ImpVar"}
	impScope := newScope(nil)
	impScope.AddVariable(ImpVar)
	scope := newScope(nil)
	scope.AddImport("impPkg", impScope)

	input := "abc def ${impPkg.ImpVar} ghi"
	output, err := parseNinjaString(scope, input)
	if err != nil {
		t.Fatalf("unexpected error: %s", err)
	}

	expect := []Variable{ImpVar}
	if !reflect.DeepEqual(output.variables, expect) {
		t.Errorf("incorrect output:")
		t.Errorf("     input: %q", input)
		t.Errorf("  expected: %#v", expect)
		t.Errorf("       got: %#v", output)
	}
}
