package util

import (
	"fmt"
	"path/filepath"
	"strings"
	"testing"

	assert "github.com/stretchr/testify/require"
	"go.skia.org/infra/go/testutils"
)

const (
	TEST_FILE_NAME          = "testingtesting"
	GS_TEST_TIMESTAMP_VALUE = "123"
)

func TestGetStartRange(t *testing.T) {
	testutils.SmallTest(t)
	assert.Equal(t, 1, GetStartRange(1, 1000))
	assert.Equal(t, 2001, GetStartRange(3, 1000))
	assert.Equal(t, 41, GetStartRange(3, 20))
}

func TestGetPathToPyFiles(t *testing.T) {
	testutils.SmallTest(t)
	expectedLocalPathSuffix := filepath.Join("src", "go.skia.org", "infra", "ct", "py")
	expectedMasterPath := filepath.Join("/", "usr", "local", "share", "ct-master", "py")
	expectedSwarmingPathSuffix := "py"

	// Test local path.
	pathToPyFiles := GetPathToPyFiles(true /* local */, false /* runOnMaster */)
	assert.True(t, strings.HasSuffix(pathToPyFiles, expectedLocalPathSuffix))
	pathToPyFiles = GetPathToPyFiles(true /* local */, true /* runOnMaster */)
	assert.True(t, strings.HasSuffix(pathToPyFiles, expectedLocalPathSuffix))

	// Test master path.
	pathToPyFiles = GetPathToPyFiles(false /* local */, true /* runOnMaster */)
	assert.Equal(t, pathToPyFiles, expectedMasterPath)

	// Test swarming path.
	pathToPyFiles = GetPathToPyFiles(false /* local */, false /* runOnMaster */)
	assert.True(t, strings.HasSuffix(pathToPyFiles, expectedSwarmingPathSuffix))
}

func TestGetIntFlagValue(t *testing.T) {
	testutils.SmallTest(t)
	assert.Equal(t, 4, GetIntFlagValue("--pageset-repeat=4", PAGESET_REPEAT_FLAG, 1))
	assert.Equal(t, 4, GetIntFlagValue("--pageset-repeat 4", PAGESET_REPEAT_FLAG, 1))
	// Use first value if multiple are specified.
	assert.Equal(t, 4, GetIntFlagValue("--pageset-repeat=4 --pageset-repeat=3", PAGESET_REPEAT_FLAG, 1))
	// Test that default value gets returned.
	assert.Equal(t, 2, GetIntFlagValue("", PAGESET_REPEAT_FLAG, 2))
	assert.Equal(t, 2, GetIntFlagValue("--pageset-repeatsssss=4", PAGESET_REPEAT_FLAG, 2))
	assert.Equal(t, 2, GetIntFlagValue("--somethingelse", PAGESET_REPEAT_FLAG, 2))
}

func TestGetBasePixelDiffRemoteDir(t *testing.T) {
	testutils.SmallTest(t)
	// Test valid runID.
	remoteDir, err := GetBasePixelDiffRemoteDir("rmistry-20170510163703")
	assert.NoError(t, err)
	assert.Equal(t, fmt.Sprintf("%s/2017/05/10/16/rmistry-20170510163703", PixelDiffRunsDir), remoteDir)
	// Test invalid runID.
	remoteDir, err = GetBasePixelDiffRemoteDir("blahblahblah")
	assert.Error(t, err)
	assert.Equal(t, "", remoteDir)
}

func TestRemoveFlagsFromArgs(t *testing.T) {
	testutils.SmallTest(t)
	assert.Equal(t, "", RemoveFlagsFromArgs("--pageset-repeat=4", PAGESET_REPEAT_FLAG))
	assert.Equal(t, "", RemoveFlagsFromArgs("--pageset-repeat=4 --run-benchmark-timeout=400", PAGESET_REPEAT_FLAG, RUN_BENCHMARK_TIMEOUT_FLAG))
	assert.Equal(t, "--abc", RemoveFlagsFromArgs("--pageset-repeat=4 --pageset-repeat=abc --pageset-repeat --abc", PAGESET_REPEAT_FLAG))
	assert.Equal(t, "", RemoveFlagsFromArgs("", PAGESET_REPEAT_FLAG))
	assert.Equal(t, "--abc", RemoveFlagsFromArgs("--abc", PAGESET_REPEAT_FLAG))
	assert.Equal(t, "--output-format=csv --traffic-setting=Regular-3G", RemoveFlagsFromArgs("--output-format=csv --run-benchmark-timeout=900 --traffic-setting=Regular-3G", RUN_BENCHMARK_TIMEOUT_FLAG))
}
