go-parsekit/tokenize/tokenizer_whitebox_test.go

121 lines
4.4 KiB
Go

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)
}
}