// Copyright 2017 The Go 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"

	"golang.org/x/build/dashboard"
)

func TestBuildersExist(t *testing.T) {
	for _, b := range builds {
		_, ok := dashboard.Builders[b.Builder]
		if !ok {
			t.Errorf("missing builder: %q", b.Builder)
		}
	}
}

func TestAllQueriesSupported(t *testing.T) {
	for _, b := range builds {
		t.Run(b.String(), func(t *testing.T) {
			defer func() {
				if err := recover(); err != nil {
					t.Errorf("build %v uses an unsupported version query:\n%v", b, err)
				}
			}()
			match(b.GoQuery, "go1.14.6") // Shouldn't panic for any b.GoQuery.
		})
	}
}

func TestTestOnlyBuildsDontSkipTests(t *testing.T) {
	for _, b := range builds {
		if b.TestOnly && b.SkipTests {
			t.Errorf("build %s is configured to run tests only, but also to skip tests; is that intentional?", b)
		}
	}
}

func TestMinSupportedMacOSVersion(t *testing.T) {
	testCases := []struct {
		goVer     string
		wantMacOS string
	}{
		{"go1.14", "10.11"},
		{"go1.14.14", "10.11"},
		{"go1.15", "10.12"},
		{"go1.15.7", "10.12"},
		{"go1.16beta1", "10.12"},
		{"go1.16rc1", "10.12"},
		{"go1.16", "10.12"},
		{"go1.16.1", "10.12"},
	}
	for _, tc := range testCases {
		t.Run(tc.goVer, func(t *testing.T) {
			got := minSupportedMacOSVersion(tc.goVer)
			if got != tc.wantMacOS {
				t.Errorf("got %s; want %s", got, tc.wantMacOS)
			}
		})
	}
}

func TestBuilderSelectionPerGoVersion(t *testing.T) {
	matchBuilds := func(target, goVer string) (matched []*Build) {
		for _, b := range builds {
			if b.String() != target || !match(b.GoQuery, goVer) {
				continue
			}
			matched = append(matched, b)
		}
		return matched
	}

	testCases := []struct {
		goVer       string
		target      string
		wantBuilder string
	}{
		// Go 1.15.x and 1.14.x still use the Jessie builders.
		{"go1.14.55", "linux-amd64", "linux-amd64-jessie"},
		{"go1.15.55", "linux-386", "linux-386-jessie"},
		// Go 1.16 starts to use the the Stretch builders.
		{"go1.16", "linux-amd64", "linux-amd64-stretch"},
		{"go1.16", "linux-386", "linux-386-stretch"},

		// Go 1.15.x and 1.14.x still use the Packet and Scaleway builders.
		{"go1.14.55", "linux-arm64", "linux-arm64-packet"},
		{"go1.15.55", "linux-armv6l", "linux-arm"},
		// Go 1.16 starts to use the the AWS builders.
		{"go1.16", "linux-arm64", "linux-arm64-aws"},
		{"go1.16", "linux-armv6l", "linux-arm-aws"},

		// Go 1.14.x still use the FreeBSD 11.1 builder.
		{"go1.14.55", "freebsd-amd64", "freebsd-amd64-11_1"},
		{"go1.14.55", "freebsd-386", "freebsd-386-11_1"},
		// Go 1.15 RC 2+ starts to use the the FreeBSD 11.2 builder.
		{"go1.15rc2", "freebsd-amd64", "freebsd-amd64-11_2"},
		{"go1.15rc2", "freebsd-386", "freebsd-386-11_2"},
		{"go1.15", "freebsd-amd64", "freebsd-amd64-11_2"},
		{"go1.15", "freebsd-386", "freebsd-386-11_2"},
		{"go1.15.1", "freebsd-amd64", "freebsd-amd64-11_2"},
		{"go1.15.1", "freebsd-386", "freebsd-386-11_2"},
		// Go 1.16 continues to use the the FreeBSD 11.2 builder.
		{"go1.16", "freebsd-amd64", "freebsd-amd64-11_2"},
		{"go1.16", "freebsd-386", "freebsd-386-11_2"},
	}
	for _, tc := range testCases {
		t.Run(tc.target+"@"+tc.goVer, func(t *testing.T) {
			builds := matchBuilds(tc.target, tc.goVer)
			if len(builds) != 1 {
				t.Fatalf("got %d matching builds; want 1", len(builds))
			}
			if got, want := builds[0].Builder, tc.wantBuilder; got != want {
				t.Errorf("got %s; want %s", got, want)
			}
		})
	}
}
