// 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/cc"
)

func registerCcObjectModuleTypes(ctx android.RegistrationContext) {
	// Always register cc_defaults module factory
	ctx.RegisterModuleType("cc_defaults", func() android.Module { return cc.DefaultsFactory() })
}

func runCcObjectTestCase(t *testing.T, tc bp2buildTestCase) {
	t.Helper()
	runBp2BuildTestCase(t, registerCcObjectModuleTypes, tc)
}

func TestCcObjectSimple(t *testing.T) {
	runCcObjectTestCase(t, bp2buildTestCase{
		description:                        "simple cc_object generates cc_object with include header dep",
		moduleTypeUnderTest:                "cc_object",
		moduleTypeUnderTestFactory:         cc.ObjectFactory,
		moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
		filesystem: map[string]string{
			"a/b/foo.h":     "",
			"a/b/bar.h":     "",
			"a/b/exclude.c": "",
			"a/b/c.c":       "",
		},
		blueprint: `cc_object {
    name: "foo",
    local_include_dirs: ["include"],
    default_shared_libs: [],
    cflags: [
        "-Wno-gcc-compat",
        "-Wall",
        "-Werror",
    ],
    srcs: [
        "a/b/*.c"
    ],
    exclude_srcs: ["a/b/exclude.c"],
}
`,
		expectedBazelTargets: []string{`cc_object(
    name = "foo",
    copts = [
        "-fno-addrsig",
        "-Wno-gcc-compat",
        "-Wall",
        "-Werror",
        "-Iinclude",
        "-I$(BINDIR)/include",
        "-I.",
        "-I$(BINDIR)/.",
    ],
    srcs = ["a/b/c.c"],
)`,
		},
	})
}

func TestCcObjectDefaults(t *testing.T) {
	runCcObjectTestCase(t, bp2buildTestCase{
		description:                        "simple cc_object with defaults",
		moduleTypeUnderTest:                "cc_object",
		moduleTypeUnderTestFactory:         cc.ObjectFactory,
		moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
		blueprint: `cc_object {
    name: "foo",
    default_shared_libs: [],
    local_include_dirs: ["include"],
    srcs: [
        "a/b/*.h",
        "a/b/c.c"
    ],

    defaults: ["foo_defaults"],
}

cc_defaults {
    name: "foo_defaults",
    defaults: ["foo_bar_defaults"],
}

cc_defaults {
    name: "foo_bar_defaults",
    cflags: [
        "-Wno-gcc-compat",
        "-Wall",
        "-Werror",
    ],
}
`,
		expectedBazelTargets: []string{`cc_object(
    name = "foo",
    copts = [
        "-Wno-gcc-compat",
        "-Wall",
        "-Werror",
        "-fno-addrsig",
        "-Iinclude",
        "-I$(BINDIR)/include",
        "-I.",
        "-I$(BINDIR)/.",
    ],
    srcs = ["a/b/c.c"],
)`,
		}})
}

func TestCcObjectCcObjetDepsInObjs(t *testing.T) {
	runCcObjectTestCase(t, bp2buildTestCase{
		description:                        "cc_object with cc_object deps in objs props",
		moduleTypeUnderTest:                "cc_object",
		moduleTypeUnderTestFactory:         cc.ObjectFactory,
		moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
		filesystem: map[string]string{
			"a/b/c.c": "",
			"x/y/z.c": "",
		},
		blueprint: `cc_object {
    name: "foo",
    default_shared_libs: [],
    srcs: ["a/b/c.c"],
    objs: ["bar"],
}

cc_object {
    name: "bar",
    default_shared_libs: [],
    srcs: ["x/y/z.c"],
}
`,
		expectedBazelTargets: []string{`cc_object(
    name = "bar",
    copts = [
        "-fno-addrsig",
        "-I.",
        "-I$(BINDIR)/.",
    ],
    srcs = ["x/y/z.c"],
)`, `cc_object(
    name = "foo",
    copts = [
        "-fno-addrsig",
        "-I.",
        "-I$(BINDIR)/.",
    ],
    deps = [":bar"],
    srcs = ["a/b/c.c"],
)`,
		},
	})
}

func TestCcObjectIncludeBuildDirFalse(t *testing.T) {
	runCcObjectTestCase(t, bp2buildTestCase{
		description:                        "cc_object with include_build_dir: false",
		moduleTypeUnderTest:                "cc_object",
		moduleTypeUnderTestFactory:         cc.ObjectFactory,
		moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
		filesystem: map[string]string{
			"a/b/c.c": "",
			"x/y/z.c": "",
		},
		blueprint: `cc_object {
    name: "foo",
    default_shared_libs: [],
    srcs: ["a/b/c.c"],
    include_build_directory: false,
}
`,
		expectedBazelTargets: []string{`cc_object(
    name = "foo",
    copts = ["-fno-addrsig"],
    srcs = ["a/b/c.c"],
)`,
		},
	})
}

func TestCcObjectProductVariable(t *testing.T) {
	runCcObjectTestCase(t, bp2buildTestCase{
		description:                        "cc_object with product variable",
		moduleTypeUnderTest:                "cc_object",
		moduleTypeUnderTestFactory:         cc.ObjectFactory,
		moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
		blueprint: `cc_object {
    name: "foo",
    default_shared_libs: [],
    include_build_directory: false,
    product_variables: {
        platform_sdk_version: {
            asflags: ["-DPLATFORM_SDK_VERSION=%d"],
        },
    },
    srcs: ["src.S"],
}
`,
		expectedBazelTargets: []string{`cc_object(
    name = "foo",
    asflags = select({
        "//build/bazel/product_variables:platform_sdk_version": ["-DPLATFORM_SDK_VERSION=$(Platform_sdk_version)"],
        "//conditions:default": [],
    }),
    copts = ["-fno-addrsig"],
    srcs_as = ["src.S"],
)`,
		},
	})
}

func TestCcObjectCflagsOneArch(t *testing.T) {
	runCcObjectTestCase(t, bp2buildTestCase{
		description:                        "cc_object setting cflags for one arch",
		moduleTypeUnderTest:                "cc_object",
		moduleTypeUnderTestFactory:         cc.ObjectFactory,
		moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
		blueprint: `cc_object {
    name: "foo",
    default_shared_libs: [],
    srcs: ["a.cpp"],
    arch: {
        x86: {
            cflags: ["-fPIC"], // string list
        },
        arm: {
            srcs: ["arch/arm/file.cpp"], // label list
        },
    },
}
`,
		expectedBazelTargets: []string{
			`cc_object(
    name = "foo",
    copts = [
        "-fno-addrsig",
        "-I.",
        "-I$(BINDIR)/.",
    ] + select({
        "//build/bazel/platforms/arch:x86": ["-fPIC"],
        "//conditions:default": [],
    }),
    srcs = ["a.cpp"] + select({
        "//build/bazel/platforms/arch:arm": ["arch/arm/file.cpp"],
        "//conditions:default": [],
    }),
)`,
		},
	})
}

func TestCcObjectCflagsFourArch(t *testing.T) {
	runCcObjectTestCase(t, bp2buildTestCase{
		description:                        "cc_object setting cflags for 4 architectures",
		moduleTypeUnderTest:                "cc_object",
		moduleTypeUnderTestFactory:         cc.ObjectFactory,
		moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
		blueprint: `cc_object {
    name: "foo",
    default_shared_libs: [],
    srcs: ["base.cpp"],
    arch: {
        x86: {
            srcs: ["x86.cpp"],
            cflags: ["-fPIC"],
        },
        x86_64: {
            srcs: ["x86_64.cpp"],
            cflags: ["-fPIC"],
        },
        arm: {
            srcs: ["arm.cpp"],
            cflags: ["-Wall"],
        },
        arm64: {
            srcs: ["arm64.cpp"],
            cflags: ["-Wall"],
        },
    },
}
`,
		expectedBazelTargets: []string{
			`cc_object(
    name = "foo",
    copts = [
        "-fno-addrsig",
        "-I.",
        "-I$(BINDIR)/.",
    ] + select({
        "//build/bazel/platforms/arch:arm": ["-Wall"],
        "//build/bazel/platforms/arch:arm64": ["-Wall"],
        "//build/bazel/platforms/arch:x86": ["-fPIC"],
        "//build/bazel/platforms/arch:x86_64": ["-fPIC"],
        "//conditions:default": [],
    }),
    srcs = ["base.cpp"] + select({
        "//build/bazel/platforms/arch:arm": ["arm.cpp"],
        "//build/bazel/platforms/arch:arm64": ["arm64.cpp"],
        "//build/bazel/platforms/arch:x86": ["x86.cpp"],
        "//build/bazel/platforms/arch:x86_64": ["x86_64.cpp"],
        "//conditions:default": [],
    }),
)`,
		},
	})
}

func TestCcObjectCflagsMultiOs(t *testing.T) {
	runCcObjectTestCase(t, bp2buildTestCase{
		description:                        "cc_object setting cflags for multiple OSes",
		moduleTypeUnderTest:                "cc_object",
		moduleTypeUnderTestFactory:         cc.ObjectFactory,
		moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
		blueprint: `cc_object {
    name: "foo",
    default_shared_libs: [],
    srcs: ["base.cpp"],
    target: {
        android: {
            cflags: ["-fPIC"],
        },
        windows: {
            cflags: ["-fPIC"],
        },
        darwin: {
            cflags: ["-Wall"],
        },
    },
}
`,
		expectedBazelTargets: []string{
			`cc_object(
    name = "foo",
    copts = [
        "-fno-addrsig",
        "-I.",
        "-I$(BINDIR)/.",
    ] + select({
        "//build/bazel/platforms/os:android": ["-fPIC"],
        "//build/bazel/platforms/os:darwin": ["-Wall"],
        "//build/bazel/platforms/os:windows": ["-fPIC"],
        "//conditions:default": [],
    }),
    srcs = ["base.cpp"],
)`,
		},
	})
}
