// Copyright 2024 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 android

import (
	"testing"
)

type fakeModuleForTests struct {
	ModuleBase
}

func fakeModuleFactory() Module {
	module := &fakeModuleForTests{}
	InitAndroidModule(module)
	return module
}

var prepareForTestWithTeamAndFakeBuildComponents = GroupFixturePreparers(
	FixtureRegisterWithContext(RegisterTeamBuildComponents),
	FixtureRegisterWithContext(func(ctx RegistrationContext) {
		ctx.RegisterModuleType("fake", fakeModuleFactory)
	}),
)

func (*fakeModuleForTests) GenerateAndroidBuildActions(ModuleContext) {}

func TestTeam(t *testing.T) {
	t.Parallel()
	ctx := prepareForTestWithTeamAndFakeBuildComponents.
		RunTestWithBp(t, `
		fake {
			name: "main_test",
			team: "someteam",
		}
		team {
			name: "someteam",
			trendy_team_id: "cool_team",
		}

		team {
			name: "team2",
			trendy_team_id: "22222",
		}

		fake {
			name: "tool",
			team: "team2",
		}
	`)

	// Assert the rule from GenerateAndroidBuildActions exists.
	m := ctx.ModuleForTests("main_test", "")
	AssertStringEquals(t, "msg", m.Module().base().Team(), "someteam")
	m = ctx.ModuleForTests("tool", "")
	AssertStringEquals(t, "msg", m.Module().base().Team(), "team2")
}

func TestMissingTeamFails(t *testing.T) {
	t.Parallel()
	prepareForTestWithTeamAndFakeBuildComponents.
		ExtendWithErrorHandler(FixtureExpectsAtLeastOneErrorMatchingPattern("depends on undefined module \"ring-bearer")).
		RunTestWithBp(t, `
		fake {
			name: "you_cannot_pass",
			team: "ring-bearer",
		}
	`)
}

func TestPackageBadTeamNameFails(t *testing.T) {
	t.Parallel()
	GroupFixturePreparers(
		PrepareForTestWithTeamBuildComponents,
		PrepareForTestWithPackageModule,
	).
		ExtendWithErrorHandler(FixtureExpectsAtLeastOneErrorMatchingPattern("depends on undefined module \"ring-bearer")).
		RunTestWithBp(t, `
		package {
			default_team: "ring-bearer",
		}
	`)
}
