func TestViewMergesInTheOrderOfTheRollbackPush(t *testing.T) {
tree := ViewBuiltTree{}
+
view := newView(0, 0)
+
var states *ViewPushEntry
+
for tick := range 20001 {
states = viewPush(tick, states)
starts := states.starts()
func TestViewMergesInOneBatchFromHighToLow(t *testing.T) {
tree := ViewBuiltTree{}
+
view := newView(10, 5)
sizes := make([]int, 0, 20)
for range 20 {
_, err := view.Append(tree)
require.NoError(t, err)
+
sizes = append(sizes, view.Size())
}
// ViewBuiltTree is a tree with each node built, with 1 byte of text.
type ViewBuiltTree struct{}
-func (ViewBuiltTree) Built(level, index int) (bool, error) {
+func (v ViewBuiltTree) Built(_, _ int) (bool, error) {
return true, nil
}
// starts returns the states of the list, oldest first.
func (e *ViewPushEntry) starts() []int {
var starts []int
+
for entry := e; entry != nil; entry = entry.older {
starts = append(starts, entry.state)
}
return treeTestNode(level, index, text), true, nil
}
-// viewPush is the push of rollback_state_list.js.
+// viewPush adds state to the newest end of states and returns the new list. An
+// empty list gets one entry. When the newest entry is not kept, it becomes kept
+// with its own state, and state is dropped. When it is kept, state becomes a
+// new newest entry, and the state of the old newest entry goes to the older
+// entries by the same push.
func viewPush(state int, states *ViewPushEntry) *ViewPushEntry {
if states == nil {
return &ViewPushEntry{