// Copyright 2022 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"

	gerritpb "go.chromium.org/luci/common/proto/gerrit"
)

func TestScoreChangedFileProximity(t *testing.T) {
	tests := []struct {
		name         string
		gnLabel      string
		changedFiles []string
		project      string
		min          int
		max          int
	}{
		{
			name:    "no nearby files",
			gnLabel: "//src/foo/bar:test(toolchain)",
			changedFiles: []string{
				"tools/quux/main.cc",
				"tools/othertool/main.cc",
			},
			min: 0,
			max: 0,
		},
		{
			name:    "file in parent directory",
			gnLabel: "//src/foo/bar:test(toolchain)",
			changedFiles: []string{
				"src/foo/main.cc",
			},
			min: 50,
			max: 70,
		},
		{
			name:    "one nearby file",
			gnLabel: "//src/foo:test(toolchain)",
			changedFiles: []string{
				"src/foo/main.cc",
				"tools/quux/main.cc",
			},
			min: 70,
			max: 90,
		},
		{
			name:    "many nearby files",
			gnLabel: "//src/foo/bar:test(asfd)",
			changedFiles: []string{
				"src/foo/bar/main.h",
				"src/foo/bar/main.cc",
				"src/foo/bar/lib.cc",
				"src/foo/bar/tests/test_something.cc",
				"src/blah/lib.cc",
			},
			min: 90,
			max: 100,
		},
		{
			name:    "one nearby file among many unrelated",
			gnLabel: "//src/foo/subdir/tests:foo_test(asdf)",
			changedFiles: []string{
				"src/foo/subdir/tests/file01.cc",
				"tools/blah/file02.cc",
				"tools/blah/file03.cc",
				"tools/blah/file04.cc",
				"tools/blah/file05.cc",
			},
			min: 40,
			max: 60,
		},
		{
			// Based on https://fxrev.dev/680582, which broke a test under
			// `src/media/stream_processors/test`.
			name:    "moderately close files",
			gnLabel: "//src/foo/subdir/tests:foo_test(asdf)",
			changedFiles: []string{
				"src/foo/quux/file01.cc",
				"src/foo/quux/file02.cc",
				"src/foo/quux/file03.cc",
				"src/foo/quux/file04.cc",
				"src/foo/quux/file05.cc",
			},
			min: 40,
			max: 60,
		},
		{
			// Based on https://fxrev.dev/678982, which broke a test under
			// `src/proc/tests/chromiumos`.
			name:    "most files have fully shared prefix",
			gnLabel: "//src/foo/tests/bar:bar_tests(toolchain)",
			changedFiles: []string{
				"src/foo/bin/main.cc",
				"src/foo/tests/bar/BUILD.gn",
				"src/foo/tests/bar/file1.cc",
				"src/foo/tests/bar/file2.cc",
				"src/foo/tests/bar/file3.cc",
				"src/foo/tests/bar/file4.cc",
				"src/foo/tests/bar/file5.cc",
				"src/foo/tests/bar/file6.cc",
			},
			min: 90,
			max: 100,
		},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			if test.project == "" {
				test.project = "fuchsia"
			}
			files := make(map[string]*gerritpb.FileInfo)
			for _, f := range test.changedFiles {
				files[f] = nil
			}

			got := scoreChangedFileProximity(test.changedFiles, test.gnLabel)
			if got < test.min || got > test.max {
				t.Errorf("scoreGNLabelDistance = %d is outside range [%d, %d]",
					got, test.min, test.max,
				)
			}
		})
	}
}

func TestSharedPrefixLength(t *testing.T) {
	tests := []struct {
		name string
		p1   []string
		p2   []string
		want int
	}{
		{
			name: "empty lists",
			p1:   nil,
			p2:   nil,
			want: 0,
		},
		{
			name: "one empty list",
			p1:   nil,
			p2:   []string{"foo"},
			want: 0,
		},
		{
			name: "lists equal",
			p1:   []string{"foo"},
			p2:   []string{"foo"},
			want: 1,
		},
		{
			name: "no shared prefix",
			p1:   []string{"bar", "foo"},
			p2:   []string{"foo"},
			want: 0,
		},
		{
			name: "shared prefix",
			p1:   []string{"foo", "bar"},
			p2:   []string{"foo", "bar", "baz"},
			want: 2,
		},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			got := sharedPrefixLength(test.p1, test.p2)
			if got != test.want {
				t.Errorf("Wrong prefix length: got %d, wanted %d", got, test.want)
			}
		})
	}
}
