// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package main

import (
	"testing"

	buildbucketpb "go.chromium.org/luci/buildbucket/proto"
)

func mockBuild(revision string) *buildbucketpb.Build {
	return &buildbucketpb.Build{
		Input: &buildbucketpb.Build_Input{
			GitilesCommit: &buildbucketpb.GitilesCommit{
				Id: revision,
			},
		},
	}
}

func revisionAccessor(build *buildbucketpb.Build) any {
	return build.Input.GitilesCommit.Id
}

func TestGetLastKnownGoodRevision(t *testing.T) {
	t.Parallel()
	tests := []struct {
		builds      [][]*buildbucketpb.Build
		gitilesRef  string
		f           accessorFunc
		expected    any
		expectedErr bool
	}{
		{
			builds:      [][]*buildbucketpb.Build{},
			gitilesRef:  "",
			f:           revisionAccessor,
			expected:    nil,
			expectedErr: true,
		},
		{
			builds: [][]*buildbucketpb.Build{
				{
					mockBuild("b"),
					mockBuild("c"),
					mockBuild("d"),
					mockBuild("e"),
				},
			},
			gitilesRef:  "",
			f:           revisionAccessor,
			expected:    "b",
			expectedErr: false,
		},
		{
			builds: [][]*buildbucketpb.Build{
				{
					mockBuild("b"),
					mockBuild("c"),
					mockBuild("d"),
					mockBuild("e"),
					mockBuild("f"),
					mockBuild("h"),
				},
				{
					mockBuild("a"),
					mockBuild("b"),
					mockBuild("c"),
					mockBuild("e"),
					mockBuild("f"),
				},
				{
					mockBuild("c"),
					mockBuild("e"),
					mockBuild("f"),
					mockBuild("i"),
				},
				{
					mockBuild("b"),
					mockBuild("e"),
					mockBuild("f"),
					mockBuild("g"),
					mockBuild("i"),
				},
			},
			gitilesRef:  "",
			f:           revisionAccessor,
			expected:    "e",
			expectedErr: false,
		},
		{
			builds: [][]*buildbucketpb.Build{
				{
					mockBuild("b"),
					mockBuild("c"),
					mockBuild("d"),
				},
				{
					mockBuild("a"),
					mockBuild("b"),
					mockBuild("c"),
				},
				{
					mockBuild("c"),
					mockBuild("i"),
				},
				{
					mockBuild("e"),
					mockBuild("f"),
					mockBuild("h"),
				},
			},
			gitilesRef:  "",
			f:           revisionAccessor,
			expected:    nil,
			expectedErr: true,
		},
	}
	for _, test := range tests {
		resp, err := getLastKnownGood(test.builds, test.gitilesRef, test.f)
		if err == nil {
			if test.expectedErr {
				t.Errorf("expected error, got nil")
			}
		} else if !test.expectedErr {
			t.Errorf("got unexpected error: %s", err)
		}
		if resp != test.expected {
			t.Fatalf("got %s, expected %s", resp, test.expected)
		}
	}
}
