package ansiterm

import (
	"testing"
)

func createTestParser(s string) (*AnsiParser, *TestAnsiEventHandler) {
	evtHandler := CreateTestAnsiEventHandler()
	parser := CreateParser(s, evtHandler)

	return parser, evtHandler
}

func validateState(t *testing.T, actualState state, expectedStateName string) {
	actualName := "Nil"

	if actualState != nil {
		actualName = actualState.Name()
	}

	if actualName != expectedStateName {
		t.Errorf("Invalid state: '%s' != '%s'", actualName, expectedStateName)
	}
}

func validateFuncCalls(t *testing.T, actualCalls []string, expectedCalls []string) {
	actualCount := len(actualCalls)
	expectedCount := len(expectedCalls)

	if actualCount != expectedCount {
		t.Errorf("Actual   calls: %v", actualCalls)
		t.Errorf("Expected calls: %v", expectedCalls)
		t.Errorf("Call count error: %d != %d", actualCount, expectedCount)
		return
	}

	for i, v := range actualCalls {
		if v != expectedCalls[i] {
			t.Errorf("Actual   calls: %v", actualCalls)
			t.Errorf("Expected calls: %v", expectedCalls)
			t.Errorf("Mismatched calls: %s != %s with lengths %d and %d", v, expectedCalls[i], len(v), len(expectedCalls[i]))
		}
	}
}

func fillContext(context *ansiContext) {
	context.currentChar = 'A'
	context.paramBuffer = []byte{'C', 'D', 'E'}
	context.interBuffer = []byte{'F', 'G', 'H'}
}

func validateEmptyContext(t *testing.T, context *ansiContext) {
	var expectedCurrChar byte = 0x0
	if context.currentChar != expectedCurrChar {
		t.Errorf("Currentchar mismatch '%#x' != '%#x'", context.currentChar, expectedCurrChar)
	}

	if len(context.paramBuffer) != 0 {
		t.Errorf("Non-empty parameter buffer: %v", context.paramBuffer)
	}

	if len(context.paramBuffer) != 0 {
		t.Errorf("Non-empty intermediate buffer: %v", context.interBuffer)
	}

}
