package main

import (
	"testing"

	. "github.com/onsi/gomega"
	"github.com/pkg/errors"
)

func TestExpressionValidation(t *testing.T) {
	cases := map[string]struct {
		input     string
		expectErr error
	}{
		"TestMissingBrackets": {
			input:     "{TiKV.CPU.Memory *3",
			expectErr: errors.New("expression has malformed format"),
		},
		"TestInbalancedParenthesis": {
			input:     "{((TiKV.CPU.Memory *3) + 300}",
			expectErr: errors.New("expression has inbalanced parenthesis"),
		},
		"TestInvalidValues01": {
			input:     "{TiDB.IOPS *3 + 300}",
			expectErr: errors.New("expression has invalid values"),
		},
		"TestInvalidValues02": {
			input:     "{TiDB.Throughput /200 + 300}",
			expectErr: errors.New("expression has invalid values"),
		},
		"TestRedudantBrackets": {
			input:     "{{TiKV.Throughput /200 + 300}",
			expectErr: errors.New("expression has malformed format"),
		},
		"TestMalformed01": {
			input:     "({TiKV.Throughput /200 + 300}",
			expectErr: errors.New("expression has malformed format"),
		},
		"TestCorrectExpression": {
			input:     "{TiKV.Throughput /200 + 300}",
			expectErr: nil,
		},
		"TestWithoutExpression": {
			input:     "300",
			expectErr: nil,
		},
	}

	for name, tc := range cases {
		t.Run(name, func(t *testing.T) {
			g := NewGomegaWithT(t)
			err := CheckLegalExpression(tc.input)
			if tc.expectErr == nil {
				g.Expect(err).To(BeNil())
			} else {
				g.Expect(err).Should(HaveOccurred())
				g.Expect(err.Error()).Should(ContainSubstring(tc.expectErr.Error()))
			}
		})
	}
}

func TestValidateVersion(t *testing.T) {

	err := validateVersion("v7.1.0-rc.0")
	if err != nil {
		t.Fatal(err)
	}

	err = validateVersion("v7.2.0-rc.0")
	if err != nil {
		t.Fatal(err)
	}

	err = validateVersion("v7.1.0-rc.1")
	if err != nil {
		t.Fatal(err)
	}

	err = validateVersion("v6.1.0-rc.0")
	if err == nil {
		t.Fatal("should not be nil")
	}

	err = validateVersion("v7.1.0")
	if err != nil {
		t.Fatal(err)
	}
}
