package main

import (
	"slices"
	"testing"
)

var reTests = []struct {
	re     string
	str    string
	result []matchIndex
}{
	{"a", "abc", []matchIndex{{0, 1}}},
	{"a", "bca", []matchIndex{{2, 3}}},
	{"l", "ggllgg", []matchIndex{{2, 3}, {3, 4}}},
	{"(b|c)", "abdceb", []matchIndex{{1, 2}, {3, 4}, {5, 6}}},
	{"a+", "brerereraaaaabbbbb", []matchIndex{{8, 13}}},
	{"ab+", "qweqweqweaqweqweabbbbbr", []matchIndex{{16, 22}}},
	{"(b|c|A)", "ooaoobocA", []matchIndex{{5, 6}, {7, 8}, {8, 9}}},
	{"ab*", "a", []matchIndex{{0, 1}}},
	{"ab*", "abb", []matchIndex{{0, 3}}},
	{"(abc)*", "abcabcabc", []matchIndex{{0, 9}}},
	{"((abc)|(def))*", "abcdef", []matchIndex{{0, 6}}},
	{"(abc)*|(def)*", "abcdef", []matchIndex{{0, 3}, {3, 3}, {3, 6}, {6, 6}}},
	{"b*a*a", "bba", []matchIndex{{0, 3}}},
	{"(ab)+", "ababddd", []matchIndex{{0, 2}, {2, 4}}},
}

func TestFindAllMatches(t *testing.T) {
	for _, test := range reTests {
		t.Run(test.re+"	"+test.str, func(t *testing.T) {
			re_postfix := shuntingYard(test.re)
			startState := thompson(re_postfix)
			matchIndices := findAllMatches(startState, test.str)
			if !slices.Equal(test.result, matchIndices) {
				t.Errorf("Wanted %v	Got %v\n", test.result, matchIndices)
			}
		})
	}
}