// Copyright 2019 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 config

import (
	"regexp"
	"testing"

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

func TestValidateAppVersion(t *testing.T) {
	for _, tc := range []struct {
		in      string
		wantErr bool
	}{
		{"", true},
		{"20190912t130708", false},
		{"20190912t130708x", true},
		{"2019-09-12t13-07-0400", false},
		{"2019-09-12t13070400", true},
		{"2019-09-11t22-14-0400-2f4680648b319545c55c6149536f0a74527901f6", false},
	} {
		err := ValidateAppVersion(tc.in)
		if (err != nil) != tc.wantErr {
			t.Errorf("ValidateAppVersion(%q) = %v, want error = %t", tc.in, err, tc.wantErr)
		}
	}
}

func TestChooseOne(t *testing.T) {
	tests := []struct {
		configVar   string
		wantMatches string
	}{
		{"foo", "foo"},
		{"foo1 \n foo2", "^foo[12]$"},
		{"foo1\nfoo2", "^foo[12]$"},
		{"foo1 foo2", "^foo[12]$"},
	}
	for _, test := range tests {
		got := chooseOne(test.configVar)
		matched, err := regexp.MatchString(test.wantMatches, got)
		if err != nil {
			t.Fatal(err)
		}
		if !matched {
			t.Errorf("chooseOne(%q) = %q, _, want matches %q", test.configVar, got, test.wantMatches)
		}
	}
}

func TestProcessOverrides(t *testing.T) {
	tr := true
	f := false
	cfg := Config{
		DBHost: "origHost",
		DBName: "origName",
		Quota:  QuotaSettings{QPS: 1, Burst: 2, MaxEntries: 3, RecordOnly: &tr},
	}
	ov := `
        DBHost: newHost
        Quota:
           MaxEntries: 17
           RecordOnly: false
    `
	processOverrides(&cfg, []byte(ov))
	got := cfg
	want := Config{
		DBHost: "newHost",
		DBName: "origName",
		Quota:  QuotaSettings{QPS: 1, Burst: 2, MaxEntries: 17, RecordOnly: &f},
	}
	if diff := cmp.Diff(want, got); diff != "" {
		t.Errorf("mismatch (-want, +got):\n%s", diff)
	}
}

func TestParseCommaList(t *testing.T) {
	for _, test := range []struct {
		in   string
		want []string
	}{
		{"", nil},
		{"foo", []string{"foo"}},
		{"foo,bar", []string{"foo", "bar"}},
		{" foo, bar ", []string{"foo", "bar"}},
		{",, ,foo ,  , bar,,,", []string{"foo", "bar"}},
	} {
		got := parseCommaList(test.in)
		if !cmp.Equal(got, test.want) {
			t.Errorf("%q: got %#v, want %#v", test.in, got, test.want)
		}
	}
}
