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

	"github.com/google/go-cmp/cmp"
)

func TestTargetSelectionPerGoVersion(t *testing.T) {
	targetNames := func(targets []Target) (names []string) {
		for _, t := range targets {
			names = append(names, t.Name)
		}
		return names
	}

	for _, tc := range []struct {
		goVer []string // Go versions to test.
		want  []string // Expected release targets.
	}{
		{
			goVer: []string{
				"go1.17beta1", "go1.17rc1", "go1.17", "go1.17.1",
			},
			want: []string{
				"src",
				"linux-386",
				"linux-armv6l",
				"linux-amd64",
				"linux-arm64",
				"freebsd-386",
				"freebsd-amd64",
				"windows-386",
				"windows-amd64",
				"windows-arm64", // New to Go 1.17.
				"darwin-amd64",
				"darwin-arm64",
				"linux-s390x",
				"linux-ppc64le",
				"linux-386-longtest",
				"linux-amd64-longtest",
				"windows-amd64-longtest",
			},
		},
		{
			goVer: []string{
				"go1.16.3",
			},
			want: []string{
				"src",
				"linux-386",
				"linux-armv6l",
				"linux-amd64",
				"linux-arm64",
				"freebsd-386",
				"freebsd-amd64",
				"windows-386",
				"windows-amd64",
				"darwin-amd64",
				"darwin-arm64", // New to Go 1.16.
				"linux-s390x",
				"linux-ppc64le",
				"linux-386-longtest",
				"linux-amd64-longtest",
				"windows-amd64-longtest",
			},
		},
		{
			goVer: []string{"go1.15.11"},
			want: []string{
				"src",
				"linux-386",
				"linux-armv6l",
				"linux-amd64",
				"linux-arm64",
				"freebsd-386",
				"freebsd-amd64",
				"windows-386",
				"windows-amd64",
				"darwin-amd64",
				"linux-s390x",
				"linux-ppc64le",
				"linux-386-longtest",
				"linux-amd64-longtest",
				"windows-amd64-longtest",
			},
		},
	} {
		for _, goVer := range tc.goVer {
			t.Run(goVer, func(t *testing.T) {
				got := matchTargets(goVer)
				if diff := cmp.Diff(tc.want, targetNames(got)); diff != "" {
					t.Errorf("release target mismatch (-want +got):\n%s", diff)
				}
			})
		}
	}
}

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

func TestSplitLogMessage(t *testing.T) {
	testCases := []struct {
		desc   string
		str    string
		maxLen int
		want   []string
	}{
		{
			desc:   "string matches max size",
			str:    "the quicks",
			maxLen: 10,
			want:   []string{"the quicks"},
		},
		{
			desc:   "string greater than max size",
			str:    "the quick brown fox",
			maxLen: 10,
			want:   []string{"the quick ", "brown fox"},
		},
		{
			desc:   "string smaller than max size",
			str:    "the quick",
			maxLen: 20,
			want:   []string{"the quick"},
		},
		{
			desc:   "string matches max size with return",
			str:    "the quick\n",
			maxLen: 10,
			want:   []string{"the quick\n"},
		},
		{
			desc:   "string greater than max size with return",
			str:    "the quick\n brown fox",
			maxLen: 10,
			want:   []string{"the quick", " brown fox"},
		},
		{
			desc:   "string smaller than max size with return",
			str:    "the \nquick",
			maxLen: 20,
			want:   []string{"the \nquick"},
		},
		{
			desc:   "string is multiples of max size",
			str:    "000000000011111111112222222222",
			maxLen: 10,
			want:   []string{"0000000000", "1111111111", "2222222222"},
		},
		{
			desc:   "string is multiples of max size with return",
			str:    "000000000\n111111111\n222222222\n",
			maxLen: 10,
			want:   []string{"000000000", "111111111", "222222222\n"},
		},
		{
			desc:   "string is multiples of max size with extra return",
			str:    "000000000\n111111111\n222222222\n\n",
			maxLen: 10,
			want:   []string{"000000000", "111111111", "222222222", "\n"},
		},
	}
	for _, tc := range testCases {
		t.Run(tc.desc, func(t *testing.T) {
			got := splitLogMessage(tc.str, tc.maxLen)
			if !cmp.Equal(tc.want, got) {
				t.Errorf("splitStringToSlice(%q, %d) =\ngot  \t %#v\nwant \t %#v", tc.str, tc.maxLen, got, tc.want)
			}
		})
	}
}
