package ansiterm import ( "fmt" "testing" ) func TestStateTransitions(t *testing.T) { stateTransitionHelper(t, "CsiEntry", "Ground", alphabetics) stateTransitionHelper(t, "CsiEntry", "CsiParam", csiCollectables) stateTransitionHelper(t, "Escape", "CsiEntry", []byte{ANSI_ESCAPE_SECONDARY}) stateTransitionHelper(t, "Escape", "OscString", []byte{0x5D}) stateTransitionHelper(t, "Escape", "Ground", escapeToGroundBytes) stateTransitionHelper(t, "Escape", "EscapeIntermediate", intermeds) stateTransitionHelper(t, "EscapeIntermediate", "EscapeIntermediate", intermeds) stateTransitionHelper(t, "EscapeIntermediate", "EscapeIntermediate", executors) stateTransitionHelper(t, "EscapeIntermediate", "Ground", escapeIntermediateToGroundBytes) stateTransitionHelper(t, "OscString", "Ground", []byte{ANSI_BEL}) stateTransitionHelper(t, "OscString", "Ground", []byte{0x5C}) stateTransitionHelper(t, "Ground", "Ground", executors) } func TestAnyToX(t *testing.T) { anyToXHelper(t, []byte{ANSI_ESCAPE_PRIMARY}, "Escape") anyToXHelper(t, []byte{DCS_ENTRY}, "DcsEntry") anyToXHelper(t, []byte{OSC_STRING}, "OscString") anyToXHelper(t, []byte{CSI_ENTRY}, "CsiEntry") anyToXHelper(t, toGroundBytes, "Ground") } func TestCollectCsiParams(t *testing.T) { parser, _ := createTestParser("CsiEntry") parser.Parse(csiCollectables) buffer := parser.context.paramBuffer bufferCount := len(buffer) if bufferCount != len(csiCollectables) { t.Errorf("Buffer: %v", buffer) t.Errorf("CsiParams: %v", csiCollectables) t.Errorf("Buffer count failure: %d != %d", bufferCount, len(csiParams)) return } for i, v := range csiCollectables { if v != buffer[i] { t.Errorf("Buffer: %v", buffer) t.Errorf("CsiParams: %v", csiParams) t.Errorf("Mismatch at buffer[%d] = %d", i, buffer[i]) } } } func TestParseParams(t *testing.T) { parseParamsHelper(t, []byte{}, []string{}) parseParamsHelper(t, []byte{';'}, []string{}) parseParamsHelper(t, []byte{';', ';'}, []string{}) parseParamsHelper(t, []byte{'7'}, []string{"7"}) parseParamsHelper(t, []byte{'7', ';'}, []string{"7"}) parseParamsHelper(t, []byte{'7', ';', ';'}, []string{"7"}) parseParamsHelper(t, []byte{'7', ';', ';', '8'}, []string{"7", "8"}) parseParamsHelper(t, []byte{'7', ';', '8', ';'}, []string{"7", "8"}) parseParamsHelper(t, []byte{'7', ';', ';', '8', ';', ';'}, []string{"7", "8"}) parseParamsHelper(t, []byte{'7', '8'}, []string{"78"}) parseParamsHelper(t, []byte{'7', '8', ';'}, []string{"78"}) parseParamsHelper(t, []byte{'7', '8', ';', '9', '0'}, []string{"78", "90"}) parseParamsHelper(t, []byte{'7', '8', ';', ';', '9', '0'}, []string{"78", "90"}) parseParamsHelper(t, []byte{'7', '8', ';', '9', '0', ';'}, []string{"78", "90"}) parseParamsHelper(t, []byte{'7', '8', ';', '9', '0', ';', ';'}, []string{"78", "90"}) } func TestCursor(t *testing.T) { cursorSingleParamHelper(t, 'A', "CUU") cursorSingleParamHelper(t, 'B', "CUD") cursorSingleParamHelper(t, 'C', "CUF") cursorSingleParamHelper(t, 'D', "CUB") cursorSingleParamHelper(t, 'E', "CNL") cursorSingleParamHelper(t, 'F', "CPL") cursorSingleParamHelper(t, 'G', "CHA") cursorTwoParamHelper(t, 'H', "CUP") cursorTwoParamHelper(t, 'f', "HVP") funcCallParamHelper(t, []byte{'?', '2', '5', 'h'}, "CsiEntry", "Ground", []string{"DECTCEM([true])"}) funcCallParamHelper(t, []byte{'?', '2', '5', 'l'}, "CsiEntry", "Ground", []string{"DECTCEM([false])"}) } func TestErase(t *testing.T) { // Erase in Display eraseHelper(t, 'J', "ED") // Erase in Line eraseHelper(t, 'K', "EL") } func TestSelectGraphicRendition(t *testing.T) { funcCallParamHelper(t, []byte{'m'}, "CsiEntry", "Ground", []string{"SGR([0])"}) funcCallParamHelper(t, []byte{'0', 'm'}, "CsiEntry", "Ground", []string{"SGR([0])"}) funcCallParamHelper(t, []byte{'0', ';', '1', 'm'}, "CsiEntry", "Ground", []string{"SGR([0 1])"}) funcCallParamHelper(t, []byte{'0', ';', '1', ';', '2', 'm'}, "CsiEntry", "Ground", []string{"SGR([0 1 2])"}) } func TestScroll(t *testing.T) { scrollHelper(t, 'S', "SU") scrollHelper(t, 'T', "SD") } func TestPrint(t *testing.T) { parser, evtHandler := createTestParser("Ground") parser.Parse(printables) validateState(t, parser.currState, "Ground") for i, v := range printables { expectedCall := fmt.Sprintf("Print([%s])", string(v)) actualCall := evtHandler.FunctionCalls[i] if actualCall != expectedCall { t.Errorf("Actual != Expected: %v != %v at %d", actualCall, expectedCall, i) } } } func TestClear(t *testing.T) { p, _ := createTestParser("Ground") fillContext(p.context) p.clear() validateEmptyContext(t, p.context) } func TestClearOnStateChange(t *testing.T) { clearOnStateChangeHelper(t, "Ground", "Escape", []byte{ANSI_ESCAPE_PRIMARY}) clearOnStateChangeHelper(t, "Ground", "CsiEntry", []byte{CSI_ENTRY}) } func TestC0(t *testing.T) { expectedCall := "Execute([" + string(ANSI_LINE_FEED) + "])" c0Helper(t, []byte{ANSI_LINE_FEED}, "Ground", []string{expectedCall}) expectedCall = "Execute([" + string(ANSI_CARRIAGE_RETURN) + "])" c0Helper(t, []byte{ANSI_CARRIAGE_RETURN}, "Ground", []string{expectedCall}) } func TestEscDispatch(t *testing.T) { funcCallParamHelper(t, []byte{'M'}, "Escape", "Ground", []string{"RI([])"}) }