1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
11 func checkListPointers(t *testing.T, l *List, es []*Element) {
13 if l.front != nil || l.back != nil {
14 t.Errorf("l.front/l.back = %v/%v should be nil/nil", l.front, l.back)
20 t.Errorf("l.front = %v, want %v", l.front, es[0])
22 if last := es[len(es)-1]; l.back != last {
23 t.Errorf("l.back = %v, want %v", l.back, last)
26 for i, e := range es {
27 var e_prev, e_next *Element = nil, nil
35 t.Errorf("elt #%d (%v) has prev=%v, want %v", i, e, e.prev, e_prev)
38 t.Errorf("elt #%d (%v) has next=%v, want %v", i, e, e.next, e_next)
43 func checkListLen(t *testing.T, l *List, n int) {
44 if an := l.Len(); an != n {
45 t.Errorf("l.Len() = %d, want %d", an, n)
49 func TestList(t *testing.T) {
51 checkListPointers(t, l, []*Element{})
54 // Single element list
57 checkListPointers(t, l, []*Element{e})
59 checkListPointers(t, l, []*Element{e})
61 checkListPointers(t, l, []*Element{e})
64 checkListPointers(t, l, []*Element{})
71 e4 := l.PushBack("banana")
72 checkListPointers(t, l, []*Element{e1, e2, e3, e4})
76 checkListPointers(t, l, []*Element{e1, e3, e4})
79 l.MoveToFront(e3) // move from middle
80 checkListPointers(t, l, []*Element{e3, e1, e4})
83 l.MoveToBack(e3) // move from middle
84 checkListPointers(t, l, []*Element{e1, e4, e3})
86 l.MoveToFront(e3) // move from back
87 checkListPointers(t, l, []*Element{e3, e1, e4})
88 l.MoveToFront(e3) // should be no-op
89 checkListPointers(t, l, []*Element{e3, e1, e4})
91 l.MoveToBack(e3) // move from front
92 checkListPointers(t, l, []*Element{e1, e4, e3})
93 l.MoveToBack(e3) // should be no-op
94 checkListPointers(t, l, []*Element{e1, e4, e3})
96 e2 = l.InsertBefore(2, e1) // insert before front
97 checkListPointers(t, l, []*Element{e2, e1, e4, e3})
99 e2 = l.InsertBefore(2, e4) // insert before middle
100 checkListPointers(t, l, []*Element{e1, e2, e4, e3})
102 e2 = l.InsertBefore(2, e3) // insert before back
103 checkListPointers(t, l, []*Element{e1, e4, e2, e3})
106 e2 = l.InsertAfter(2, e1) // insert after front
107 checkListPointers(t, l, []*Element{e1, e2, e4, e3})
109 e2 = l.InsertAfter(2, e4) // insert after middle
110 checkListPointers(t, l, []*Element{e1, e4, e2, e3})
112 e2 = l.InsertAfter(2, e3) // insert after back
113 checkListPointers(t, l, []*Element{e1, e4, e3, e2})
116 // Check standard iteration.
118 for e := l.Front(); e != nil; e = e.Next() {
119 if i, ok := e.Value.(int); ok {
124 t.Errorf("sum over l.Iter() = %d, want 4", sum)
127 // Clear all elements by iterating
129 for e := l.Front(); e != nil; e = next {
133 checkListPointers(t, l, []*Element{})
134 checkListLen(t, l, 0)
137 func checkList(t *testing.T, l *List, es []interface{}) {
138 if l.Len() != len(es) {
139 t.Errorf("list has len=%v, want %v", l.Len(), len(es))
143 for e := l.Front(); e != nil; e = e.Next() {
146 t.Errorf("elt #%d has value=%v, want %v", i, le, es[i])
152 func TestExtending(t *testing.T) {
165 checkList(t, l3, []interface{}{1, 2, 3})
167 checkList(t, l3, []interface{}{1, 2, 3, 4, 5})
171 checkList(t, l3, []interface{}{4, 5})
173 checkList(t, l3, []interface{}{1, 2, 3, 4, 5})
175 checkList(t, l1, []interface{}{1, 2, 3})
176 checkList(t, l2, []interface{}{4, 5})
180 checkList(t, l3, []interface{}{1, 2, 3})
182 checkList(t, l3, []interface{}{1, 2, 3, 1, 2, 3})
186 checkList(t, l3, []interface{}{1, 2, 3})
188 checkList(t, l3, []interface{}{1, 2, 3, 1, 2, 3})
192 checkList(t, l1, []interface{}{1, 2, 3})
194 checkList(t, l1, []interface{}{1, 2, 3})
197 func TestRemove(t *testing.T) {
201 checkListPointers(t, l, []*Element{e1, e2})
204 checkListPointers(t, l, []*Element{e2})
205 checkListLen(t, l, 1)
207 checkListPointers(t, l, []*Element{e2})
208 checkListLen(t, l, 1)