github.com/code-reading/golang@v0.0.0-20220303082512-ba5bc0e589a3/go/src/container/ring/ring_test.go (about) 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. 4 5 package ring 6 7 import ( 8 "fmt" 9 "testing" 10 ) 11 12 // For debugging - keep around. 13 func dump(r *Ring) { 14 if r == nil { 15 fmt.Println("empty") 16 return 17 } 18 i, n := 0, r.Len() 19 for p := r; i < n; p = p.next { 20 fmt.Printf("%4d: %p = {<- %p | %p ->}\n", i, p, p.prev, p.next) 21 i++ 22 } 23 fmt.Println() 24 } 25 26 // verfiy 验证函数 27 // r ring 指针 28 // N ring 环长度 29 // sum ring的内容之和 30 func verify(t *testing.T, r *Ring, N int, sum int) { 31 // Len 32 n := r.Len() 33 if n != N { 34 t.Errorf("r.Len() == %d; expected %d", n, N) 35 } 36 37 // iteration 38 n = 0 39 s := 0 40 r.Do(func(p interface{}) { 41 n++ 42 if p != nil { 43 s += p.(int) 44 } 45 }) 46 if n != N { 47 t.Errorf("number of forward iterations == %d; expected %d", n, N) 48 } 49 if sum >= 0 && s != sum { 50 t.Errorf("forward ring sum = %d; expected %d", s, sum) 51 } 52 53 if r == nil { 54 return 55 } 56 57 // connections 58 if r.next != nil { 59 var p *Ring // previous element 60 for q := r; p == nil || q != r; q = q.next { 61 if p != nil && p != q.prev { 62 t.Errorf("prev = %p, expected q.prev = %p\n", p, q.prev) 63 } 64 p = q 65 } 66 if p != r.prev { 67 t.Errorf("prev = %p, expected r.prev = %p\n", p, r.prev) 68 } 69 } 70 71 // Next, Prev 72 if r.Next() != r.next { 73 t.Errorf("r.Next() != r.next") 74 } 75 if r.Prev() != r.prev { 76 t.Errorf("r.Prev() != r.prev") 77 } 78 79 // Move 80 if r.Move(0) != r { 81 t.Errorf("r.Move(0) != r") 82 } 83 if r.Move(N) != r { 84 t.Errorf("r.Move(%d) != r", N) 85 } 86 if r.Move(-N) != r { 87 t.Errorf("r.Move(%d) != r", -N) 88 } 89 for i := 0; i < 10; i++ { 90 ni := N + i 91 mi := ni % N 92 if r.Move(ni) != r.Move(mi) { 93 t.Errorf("r.Move(%d) != r.Move(%d)", ni, mi) 94 } 95 if r.Move(-ni) != r.Move(-mi) { 96 t.Errorf("r.Move(%d) != r.Move(%d)", -ni, -mi) 97 } 98 } 99 } 100 101 func TestCornerCases(t *testing.T) { 102 var ( 103 r0 *Ring 104 r1 Ring 105 ) 106 // Basics 107 verify(t, r0, 0, 0) 108 verify(t, &r1, 1, 0) 109 // Insert 110 r1.Link(r0) 111 verify(t, r0, 0, 0) 112 verify(t, &r1, 1, 0) 113 // Insert 114 r1.Link(r0) 115 verify(t, r0, 0, 0) 116 verify(t, &r1, 1, 0) 117 // Unlink 118 r1.Unlink(0) 119 verify(t, &r1, 1, 0) 120 } 121 122 func makeN(n int) *Ring { 123 r := New(n) 124 for i := 1; i <= n; i++ { 125 r.Value = i 126 r = r.Next() 127 } 128 return r 129 } 130 131 func sumN(n int) int { return (n*n + n) / 2 } 132 133 func TestNew(t *testing.T) { 134 for i := 0; i < 10; i++ { 135 r := New(i) 136 verify(t, r, i, -1) 137 } 138 for i := 0; i < 10; i++ { 139 r := makeN(i) 140 verify(t, r, i, sumN(i)) 141 } 142 } 143 144 func TestLink1(t *testing.T) { 145 r1a := makeN(1) 146 var r1b Ring 147 r2a := r1a.Link(&r1b) 148 verify(t, r2a, 2, 1) 149 if r2a != r1a { 150 t.Errorf("a) 2-element link failed") 151 } 152 153 r2b := r2a.Link(r2a.Next()) 154 verify(t, r2b, 2, 1) 155 if r2b != r2a.Next() { 156 t.Errorf("b) 2-element link failed") 157 } 158 159 r1c := r2b.Link(r2b) 160 verify(t, r1c, 1, 1) 161 verify(t, r2b, 1, 0) 162 } 163 164 func TestLink2(t *testing.T) { 165 var r0 *Ring 166 r1a := &Ring{Value: 42} 167 r1b := &Ring{Value: 77} 168 r10 := makeN(10) 169 170 // 注意link 的ring 不能是空的, 但是被link的可以是空的 171 r1a.Link(r0) // 一个非空ring link另外一个非nil ring 172 verify(t, r1a, 1, 42) 173 174 r1a.Link(r1b) 175 verify(t, r1a, 2, 42+77) 176 177 r10.Link(r0) // link 一个nil ring 不发生变化 178 verify(t, r10, 10, sumN(10)) 179 180 r10.Link(r1a) 181 verify(t, r10, 12, sumN(10)+42+77) 182 } 183 184 func TestLink3(t *testing.T) { 185 var r Ring 186 n := 1 187 for i := 1; i < 10; i++ { 188 n += i 189 verify(t, r.Link(New(i)), n, -1) 190 } 191 } 192 193 func TestUnlink(t *testing.T) { 194 r10 := makeN(10) 195 s10 := r10.Move(6) 196 197 sum10 := sumN(10) 198 199 verify(t, r10, 10, sum10) 200 verify(t, s10, 10, sum10) 201 202 r0 := r10.Unlink(0) 203 verify(t, r0, 0, 0) 204 205 r1 := r10.Unlink(1) 206 verify(t, r1, 1, 2) 207 verify(t, r10, 9, sum10-2) 208 209 r9 := r10.Unlink(9) 210 verify(t, r9, 9, sum10-2) 211 verify(t, r10, 9, sum10-2) 212 } 213 214 func TestLinkUnlink(t *testing.T) { 215 for i := 1; i < 4; i++ { 216 ri := New(i) 217 for j := 0; j < i; j++ { 218 rj := ri.Unlink(j) 219 verify(t, rj, j, -1) 220 verify(t, ri, i-j, -1) 221 ri.Link(rj) 222 verify(t, ri, i, -1) 223 } 224 } 225 } 226 227 // Test that calling Move() on an empty Ring initializes it. 228 func TestMoveEmptyRing(t *testing.T) { 229 var r Ring 230 // 因为r 是nil ring 所以 r.Move(1) 只会返回一个init()之后的ring 231 // init()之后的ring 长度位1 , 值为nil, 因为Value 是interface{} 232 r.Move(1) 233 verify(t, &r, 1, 0) 234 }