// Copyright 2021 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 bp2build

import (
	"testing"

	"android/soong/android"
	"android/soong/sh"
)

func TestShBinaryLoadStatement(t *testing.T) {
	testCases := []struct {
		bazelTargets           BazelTargets
		expectedLoadStatements string
	}{
		{
			bazelTargets: BazelTargets{
				BazelTarget{
					name:      "sh_binary_target",
					ruleClass: "sh_binary",
					// Note: no bzlLoadLocation for native rules
					// TODO(ruperts): Could open source the existing, experimental Starlark sh_ rules?
				},
			},
			expectedLoadStatements: ``,
		},
	}

	for _, testCase := range testCases {
		actual := testCase.bazelTargets.LoadStatements()
		expected := testCase.expectedLoadStatements
		if actual != expected {
			t.Fatalf("Expected load statements to be %s, got %s", expected, actual)
		}
	}
}

func runShBinaryTestCase(t *testing.T, tc bp2buildTestCase) {
	t.Helper()
	runBp2BuildTestCase(t, func(ctx android.RegistrationContext) {}, tc)
}

func TestShBinarySimple(t *testing.T) {
	runShBinaryTestCase(t, bp2buildTestCase{
		description:                "sh_binary test",
		moduleTypeUnderTest:        "sh_binary",
		moduleTypeUnderTestFactory: sh.ShBinaryFactory,
		blueprint: `sh_binary {
    name: "foo",
    src: "foo.sh",
    filename: "foo.exe",
    sub_dir: "sub",
    bazel_module: { bp2build_available: true },
}`,
		expectedBazelTargets: []string{
			makeBazelTarget("sh_binary", "foo", attrNameToString{
				"srcs":     `["foo.sh"]`,
				"filename": `"foo.exe"`,
				"sub_dir":  `"sub"`,
			})},
	})
}

func TestShBinaryDefaults(t *testing.T) {
	runShBinaryTestCase(t, bp2buildTestCase{
		description:                "sh_binary test",
		moduleTypeUnderTest:        "sh_binary",
		moduleTypeUnderTestFactory: sh.ShBinaryFactory,
		blueprint: `sh_binary {
    name: "foo",
    src: "foo.sh",
    bazel_module: { bp2build_available: true },
}`,
		expectedBazelTargets: []string{
			makeBazelTarget("sh_binary", "foo", attrNameToString{
				"srcs": `["foo.sh"]`,
			})},
	})
}
