package structs

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

func Test_GenerateOverLayAlertRuleEXPR(t *testing.T) {
	testCases := []struct {
		expr     string
		expected OverLayAlertRuleEXPR
	}{
		{
			expr: "1 - avg (irate(node_cpu_seconds_total[2m])) by (tidb_cluster_id) > 10.5",
			expected: OverLayAlertRuleEXPR{
				Expr:     "1 - avg (irate(node_cpu_seconds_total[2m])) by (tidb_cluster_id) ",
				Operator: ">",
				Value:    10.5,
			},
		},
		{
			expr: "quantity <= -100",
			expected: OverLayAlertRuleEXPR{
				Expr:     "quantity ",
				Operator: "<=",
				Value:    -100,
			},
		},
		{
			expr: "status == 0",
			expected: OverLayAlertRuleEXPR{
				Expr:     "status ",
				Operator: "==",
				Value:    0,
			},
		},
		{
			expr: "status == 0 and quantity <= -100.123",
			expected: OverLayAlertRuleEXPR{
				Expr:     "status == 0 and quantity ",
				Operator: "<=",
				Value:    -100.123,
			},
		},
		{
			expr:     "status == 0 and quantity <= ",
			expected: OverLayAlertRuleEXPR{}, // error case
		},
	}

	for _, tc := range testCases {
		result := GenerateOverLayAlertRuleEXPR(tc.expr)
		assert.Equal(t, tc.expected, result, "Expected result not obtained for input expression: %s", tc.expr)
	}
}
