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.
13 // For debugging - keep around.
20 for p := r; i < n; p = p.next {
21 fmt.Printf("%4d: %p = {<- %p | %p ->}\n", i, p, p.prev, p.next)
28 func verify(t *testing.T, r *Ring, N int, sum int) {
32 t.Errorf("r.Len() == %d; expected %d", n, N)
38 for p := range r.Iter() {
45 t.Errorf("number of forward iterations == %d; expected %d", n, N)
47 if sum >= 0 && s != sum {
48 t.Errorf("forward ring sum = %d; expected %d", s, sum)
57 var p *Ring // previous element
58 for q := r; p == nil || q != r; q = q.next {
59 if p != nil && p != q.prev {
60 t.Errorf("prev = %p, expected q.prev = %p\n", p, q.prev)
65 t.Errorf("prev = %p, expected r.prev = %p\n", p, r.prev)
70 if r.Next() != r.next {
71 t.Errorf("r.Next() != r.next")
73 if r.Prev() != r.prev {
74 t.Errorf("r.Prev() != r.prev")
79 t.Errorf("r.Move(0) != r")
82 t.Errorf("r.Move(%d) != r", N)
85 t.Errorf("r.Move(%d) != r", -N)
87 for i := 0; i < 10; i++ {
90 if r.Move(ni) != r.Move(mi) {
91 t.Errorf("r.Move(%d) != r.Move(%d)", ni, mi)
93 if r.Move(-ni) != r.Move(-mi) {
94 t.Errorf("r.Move(%d) != r.Move(%d)", -ni, -mi)
100 func TestCornerCases(t *testing.T) {
122 func makeN(n int) *Ring {
124 for i := 1; i <= n; i++ {
132 func sum(r *Ring) int {
134 for p := range r.Iter() {
141 func sumN(n int) int { return (n*n + n) / 2 }
144 func TestNew(t *testing.T) {
145 for i := 0; i < 10; i++ {
149 for i := 0; i < 10; i++ {
151 verify(t, r, i, sumN(i))
156 func TestLink1(t *testing.T) {
159 r2a := r1a.Link(&r1b)
162 t.Errorf("a) 2-element link failed")
165 r2b := r2a.Link(r2a.Next())
167 if r2b != r2a.Next() {
168 t.Errorf("b) 2-element link failed")
177 func TestLink2(t *testing.T) {
179 r1a := &Ring{Value: 42}
180 r1b := &Ring{Value: 77}
184 verify(t, r1a, 1, 42)
187 verify(t, r1a, 2, 42+77)
190 verify(t, r10, 10, sumN(10))
193 verify(t, r10, 12, sumN(10)+42+77)
197 func TestLink3(t *testing.T) {
200 for i := 1; i < 100; i++ {
202 verify(t, r.Link(New(i)), n, -1)
207 func TestUnlink(t *testing.T) {
213 verify(t, r10, 10, sum10)
214 verify(t, s10, 10, sum10)
221 verify(t, r10, 9, sum10-2)
224 verify(t, r9, 9, sum10-2)
225 verify(t, r10, 9, sum10-2)
229 func TestLinkUnlink(t *testing.T) {
230 for i := 1; i < 4; i++ {
232 for j := 0; j < i; j++ {
235 verify(t, ri, i-j, -1)