go-parsekit/tokenize/tokenizer_whitebox_test.go

135 lines
5.4 KiB
Go

package tokenize
import (
"testing"
)
func TestFork_CreatesForkOfInputAtSameCursorPosition(t *testing.T) {
// TODO FIXME Speed change
// Create input, accept the first rune.
i := NewAPI("Testing")
i.NextRune()
i.Accept() // T
AssertEqual(t, "T", i.Result().String(), "accepted rune in input")
// Fork
f := i.Fork()
AssertEqual(t, 1, i.state.stack[i.stackLevel].cursor.Byte, "parent cursor.Byte")
AssertEqual(t, 1, i.state.stack[i.stackLevel].offset, "parent offset")
AssertEqual(t, 1, f.state.stack[f.stackLevel].cursor.Byte, "child cursor.Byte")
AssertEqual(t, 1, f.state.stack[f.stackLevel].offset, "child offset")
// Accept two runes via fork.
f.NextRune()
f.Accept() // e
f.NextRune()
f.Accept() // s
AssertEqual(t, "es", f.Result().String(), "result runes in fork")
AssertEqual(t, 1, i.state.stack[i.stackLevel].cursor.Byte, "parent cursor.Byte")
AssertEqual(t, 1, i.state.stack[i.stackLevel].offset, "parent offset")
AssertEqual(t, 3, f.state.stack[f.stackLevel].cursor.Byte, "child cursor.Byte")
AssertEqual(t, 3, f.state.stack[f.stackLevel].offset, "child offset")
// Merge fork back into parent
f.Merge()
AssertEqual(t, "Tes", i.Result().String(), "result runes in parent Input after Merge()")
AssertEqual(t, 3, i.state.stack[i.stackLevel].cursor.Byte, "parent cursor.Byte")
AssertEqual(t, 3, i.state.stack[i.stackLevel].offset, "parent offset")
}
func TestGivenForkedChildWhichAcceptedRune_AfterMerging_RuneEndsUpInParentResult(t *testing.T) {
i := NewAPI("Testing")
i.NextRune()
i.Accept()
f1 := i.Fork()
f1.NextRune()
f1.Accept()
f2 := f1.Fork()
f2.NextRune()
f2.Accept()
// TODO FIXME Speed changes
// AssertEqual(t, "T", i.Result().String(), "i.Result().String()")
// AssertEqual(t, 1, i.result.offset, "i.offset A")
// AssertEqual(t, "e", f1.Result().String(), "f1.Result().String()")
// AssertEqual(t, 2, f1.result.offset, "f1.offset A")
// AssertEqual(t, "s", f2.Result().String(), "f2.Result().String()")
// AssertEqual(t, 3, f2.result.offset, "f2.offset A")
// f2.Merge()
// AssertEqual(t, "T", i.Result().String(), "i.Result().String()")
// AssertEqual(t, 1, i.result.offset, "i.offset B")
// AssertEqual(t, "es", f1.Result().String(), "f1.Result().String()")
// AssertEqual(t, 3, f1.result.offset, "f1.offset B")
// AssertEqual(t, "", f2.Result().String(), "f2.Result().String()")
// AssertEqual(t, 3, f2.result.offset, "f2.offset B")
// f1.Merge()
// AssertEqual(t, "Tes", i.Result().String(), "i.Result().String()")
// AssertEqual(t, 3, i.result.offset, "i.offset C")
// AssertEqual(t, "", f1.Result().String(), "f1.Result().String()")
// AssertEqual(t, 3, f1.result.offset, "f1.offset C")
// AssertEqual(t, "", f2.Result().String(), "f2.Result().String()")
// AssertEqual(t, 3, f2.result.offset, "f2.offset C")
}
func TestGivenMultipleLevelsOfForks_WhenReturningToRootInput_ForksAreDetached(t *testing.T) {
i := NewAPI("Testing")
f1 := i.Fork()
f2 := f1.Fork()
//f3 := f2.Fork()
f2.Fork()
f4 := f1.Fork() // secret subtest: this Fork() detaches both forks f2 and f3
//f5 := f4.Fork()
f4.Fork()
// TODO FIXME Speed changes
// AssertEqual(t, true, i.parent == nil, "i.parent == nil")
// AssertEqual(t, true, i.child == &f1, "i.child == f1")
// AssertEqual(t, true, f1.parent == &i, "f1.parent == i")
// AssertEqual(t, true, f1.child == &f4, "f1.child == f4")
// AssertEqual(t, true, f2.child == nil, "f2.child == nil")
// AssertEqual(t, true, f2.parent == nil, "f2.parent == nil")
// AssertEqual(t, true, f3.child == nil, "f3.child == nil")
// AssertEqual(t, true, f3.parent == nil, "f3.parent == nil")
// AssertEqual(t, true, f4.parent == &f1, "f4.parent == f1")
// AssertEqual(t, true, f4.child == &f5, "f4.child == f5")
// AssertEqual(t, true, f5.parent == &f4, "f5.parent == f4")
// AssertEqual(t, true, f5.child == nil, "f5.child == nil")
i.NextRune()
// AssertEqual(t, true, i.parent == nil, "i.parent == nil")
// AssertEqual(t, true, i.child == nil, "i.child == nil")
// AssertEqual(t, true, f1.parent == nil, "f1.parent == nil")
// AssertEqual(t, true, f1.child == nil, "f1.child == nil")
// AssertEqual(t, true, f2.child == nil, "f2.child == nil")
// AssertEqual(t, true, f2.parent == nil, "f2.parent == nil")
// AssertEqual(t, true, f3.child == nil, "f3.child == nil")
// AssertEqual(t, true, f3.parent == nil, "f3.parent == nil")
// AssertEqual(t, true, f4.parent == nil, "f4.parent == nil")
// AssertEqual(t, true, f4.child == nil, "f4.child == nil")
// AssertEqual(t, true, f5.parent == nil, "f5.parent == nil")
// AssertEqual(t, true, f5.child == nil, "f5.child == nil")
}
func TestCallingAcceptAfterNextRune_AcceptsRuneAndMovesReadOffsetForward(t *testing.T) {
// TODO FIXME Speed changes
i := NewAPI("Testing")
r, _ := i.NextRune()
AssertEqual(t, 'T', r, "result from 1st call to NextRune()")
// AssertTrue(t, i.result.lastRune != nil, "API.result.lastRune after NextRune() is not nil")
i.Accept()
// AssertTrue(t, i.result.lastRune == nil, "API.result.lastRune after Accept() is nil")
// AssertEqual(t, 1, i.result.offset, "API.result.offset")
r, _ = i.NextRune()
AssertEqual(t, 'e', r, "result from 2nd call to NextRune()")
}
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)
}
}