package tokenize import ( "testing" ) func TestMakeSplitOutput_SplitsOutputAtActiveCursorPosition(t *testing.T) { // Create input, accept the first rune. tokenAPI := NewAPI("Testing") r, _, _ := tokenAPI.Input.Rune.Peek(0) tokenAPI.Input.Rune.Accept(r) // T AssertEqual(t, "T", tokenAPI.Output.String(), "accepted rune in input") // Split split := tokenAPI.SplitOutput() AssertEqual(t, 1, tokenAPI.pointers.offset, "parent offset") AssertEqual(t, 1, tokenAPI.pointers.offset, "child offset") // Accept two runes via fork. r, _, _ = tokenAPI.Input.Rune.Peek(0) tokenAPI.Input.Rune.Accept(r) // e r, _, _ = tokenAPI.Input.Rune.Peek(0) tokenAPI.Input.Rune.Accept(r) // s AssertEqual(t, "es", tokenAPI.Output.String(), "result runes in split output") AssertEqual(t, 3, tokenAPI.pointers.offset, "offset in split output") // Merge split output back into main output. tokenAPI.MergeSplitOutput(split) AssertEqual(t, "Tes", tokenAPI.Output.String(), "result runes in parent Input after Merge()") AssertEqual(t, 3, tokenAPI.pointers.offset, "parent offset") } // func TestGivenForkedChildWhichAcceptedRune_AfterMerging_RuneEndsUpInParentResult(t *testing.T) { // tokenAPI := NewAPI("Testing") // r, _, _ := tokenAPI.Input.Rune.Peek(0) // tokenAPI.Input.Rune.Accept(r) // T // f1 := tokenAPI.Fork() // r, _, _ = tokenAPI.Input.Rune.Peek(0) // tokenAPI.Input.Rune.Accept(r) // e // f2 := tokenAPI.Fork() // r, _, _ = tokenAPI.Input.Rune.Peek(0) // tokenAPI.Input.Rune.Accept(r) // s // AssertEqual(t, "s", tokenAPI.Output.String(), "f2 String()") // AssertEqual(t, 3, tokenAPI.stackFrame.offset, "f2.offset A") // tokenAPI.Merge(f2) // tokenAPI.Dispose(f2) // AssertEqual(t, "es", tokenAPI.Output.String(), "f1 String()") // AssertEqual(t, 3, tokenAPI.stackFrame.offset, "f1.offset A") // tokenAPI.Merge(f1) // tokenAPI.Dispose(f1) // AssertEqual(t, "Tes", tokenAPI.Output.String(), "top-level API String()") // AssertEqual(t, 3, tokenAPI.stackFrame.offset, "f1.offset A") // } // func TestFlushInput(t *testing.T) { // tokenAPI := NewAPI("cool") // // Flushing without any read data is okay. FlushInput() will return // // false in this case, and nothing else happens. // AssertTrue(t, tokenAPI.Input.Flush() == false, "flush input at start") // r, _, _ := tokenAPI.Input.Rune.Peek(0) // tokenAPI.Input.Rune.Accept(r) // c // r, _, _ = tokenAPI.Input.Rune.Peek(0) // tokenAPI.Input.Rune.Accept(r) // o // AssertTrue(t, tokenAPI.Input.Flush() == true, "flush input after reading some data") // AssertEqual(t, 0, tokenAPI.stackFrame.offset, "offset after flush input") // AssertTrue(t, tokenAPI.Input.Flush() == false, "flush input after flush input") // // Read offset is now zero, but reading should continue after "co". // // The output so far isn't modified, so the following accept calls // // will add their runes to the already accepted string "co". // r, _, _ = tokenAPI.Input.Rune.Peek(0) // tokenAPI.Input.Rune.Accept(r) // o // r, _, _ = tokenAPI.Input.Rune.Peek(0) // tokenAPI.Input.Rune.Accept(r) // o // AssertEqual(t, "cool", tokenAPI.Output.String(), "end result") // } // func TestInputFlusherWrapper(t *testing.T) { // runeA := A.Rune('a') // flushB := C.FlushInput(A.Rune('b')) // tokenAPI := NewAPI("abaab") // runeA(tokenAPI) // AssertEqual(t, 1, tokenAPI.stackFrame.offset, "offset after 1 read") // AssertEqual(t, "a", tokenAPI.Output.String(), "runes after 1 read") // flushB(tokenAPI) // AssertEqual(t, 0, tokenAPI.stackFrame.offset, "offset after 2 reads + input flush") // AssertEqual(t, "ab", tokenAPI.Output.String(), "runes after 2 reads") // runeA(tokenAPI) // AssertEqual(t, 1, tokenAPI.stackFrame.offset, "offset after 3 reads") // AssertEqual(t, "aba", tokenAPI.Output.String(), "runes after 3 reads") // runeA(tokenAPI) // AssertEqual(t, 2, tokenAPI.stackFrame.offset, "offset after 4 reads") // AssertEqual(t, "abaa", tokenAPI.Output.String(), "runes after 4 reads") // flushB(tokenAPI) // AssertEqual(t, 0, tokenAPI.stackFrame.offset, "offset after 5 reads + input flush") // AssertEqual(t, "abaab", tokenAPI.Output.String(), "runes after 5 reads") // } func AssertEqual(t *testing.T, expected interface{}, actual interface{}, forWhat string) { if expected != actual { t.Errorf( "Unexpected value for %s:\nexpected: %q\nactual: %q", forWhat, expected, actual) } } func AssertTrue(t *testing.T, b bool, assertion string) { if !b { t.Errorf("Assertion %s is false", assertion) } }