ring_test.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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. package ring
  5. import (
  6. "fmt"
  7. "testing"
  8. )
  9. // For debugging - keep around.
  10. func dump(r *Ring) {
  11. if r == nil {
  12. fmt.Println("empty")
  13. return
  14. }
  15. i, n := 0, r.Len()
  16. for p := r; i < n; p = p.next {
  17. fmt.Printf("%4d: %p = {<- %p | %p ->}\n", i, p, p.prev, p.next)
  18. i++
  19. }
  20. fmt.Println()
  21. }
  22. func verify(t *testing.T, r *Ring, N int, sum int) {
  23. // Len
  24. n := r.Len()
  25. if n != N {
  26. t.Errorf("r.Len() == %d; expected %d", n, N)
  27. }
  28. // iteration
  29. n = 0
  30. s := 0
  31. r.Do(func(p any) {
  32. n++
  33. if p != nil {
  34. s += p.(int)
  35. }
  36. })
  37. if n != N {
  38. t.Errorf("number of forward iterations == %d; expected %d", n, N)
  39. }
  40. if sum >= 0 && s != sum {
  41. t.Errorf("forward ring sum = %d; expected %d", s, sum)
  42. }
  43. if r == nil {
  44. return
  45. }
  46. // connections
  47. if r.next != nil {
  48. var p *Ring // previous element
  49. for q := r; p == nil || q != r; q = q.next {
  50. if p != nil && p != q.prev {
  51. t.Errorf("prev = %p, expected q.prev = %p\n", p, q.prev)
  52. }
  53. p = q
  54. }
  55. if p != r.prev {
  56. t.Errorf("prev = %p, expected r.prev = %p\n", p, r.prev)
  57. }
  58. }
  59. // Next, Prev
  60. if r.Next() != r.next {
  61. t.Errorf("r.Next() != r.next")
  62. }
  63. if r.Prev() != r.prev {
  64. t.Errorf("r.Prev() != r.prev")
  65. }
  66. // Move
  67. if r.Move(0) != r {
  68. t.Errorf("r.Move(0) != r")
  69. }
  70. if r.Move(N) != r {
  71. t.Errorf("r.Move(%d) != r", N)
  72. }
  73. if r.Move(-N) != r {
  74. t.Errorf("r.Move(%d) != r", -N)
  75. }
  76. for i := 0; i < 10; i++ {
  77. ni := N + i
  78. mi := ni % N
  79. if r.Move(ni) != r.Move(mi) {
  80. t.Errorf("r.Move(%d) != r.Move(%d)", ni, mi)
  81. }
  82. if r.Move(-ni) != r.Move(-mi) {
  83. t.Errorf("r.Move(%d) != r.Move(%d)", -ni, -mi)
  84. }
  85. }
  86. }
  87. func TestCornerCases(t *testing.T) {
  88. var (
  89. r0 *Ring
  90. r1 Ring
  91. )
  92. // Basics
  93. verify(t, r0, 0, 0)
  94. verify(t, &r1, 1, 0)
  95. // Insert
  96. r1.Link(r0)
  97. verify(t, r0, 0, 0)
  98. verify(t, &r1, 1, 0)
  99. // Insert
  100. r1.Link(r0)
  101. verify(t, r0, 0, 0)
  102. verify(t, &r1, 1, 0)
  103. // Unlink
  104. r1.Unlink(0)
  105. verify(t, &r1, 1, 0)
  106. }
  107. func makeN(n int) *Ring {
  108. r := New(n)
  109. for i := 1; i <= n; i++ {
  110. r.Value = i
  111. r = r.Next()
  112. }
  113. return r
  114. }
  115. func sumN(n int) int { return (n*n + n) / 2 }
  116. func TestNew(t *testing.T) {
  117. for i := 0; i < 10; i++ {
  118. r := New(i)
  119. verify(t, r, i, -1)
  120. }
  121. for i := 0; i < 10; i++ {
  122. r := makeN(i)
  123. verify(t, r, i, sumN(i))
  124. }
  125. }
  126. func TestLink1(t *testing.T) {
  127. r1a := makeN(1)
  128. var r1b Ring
  129. r2a := r1a.Link(&r1b)
  130. verify(t, r2a, 2, 1)
  131. if r2a != r1a {
  132. t.Errorf("a) 2-element link failed")
  133. }
  134. r2b := r2a.Link(r2a.Next())
  135. verify(t, r2b, 2, 1)
  136. if r2b != r2a.Next() {
  137. t.Errorf("b) 2-element link failed")
  138. }
  139. r1c := r2b.Link(r2b)
  140. verify(t, r1c, 1, 1)
  141. verify(t, r2b, 1, 0)
  142. }
  143. func TestLink2(t *testing.T) {
  144. var r0 *Ring
  145. r1a := &Ring{Value: 42}
  146. r1b := &Ring{Value: 77}
  147. r10 := makeN(10)
  148. r1a.Link(r0)
  149. verify(t, r1a, 1, 42)
  150. r1a.Link(r1b)
  151. verify(t, r1a, 2, 42+77)
  152. r10.Link(r0)
  153. verify(t, r10, 10, sumN(10))
  154. r10.Link(r1a)
  155. verify(t, r10, 12, sumN(10)+42+77)
  156. }
  157. func TestLink3(t *testing.T) {
  158. var r Ring
  159. n := 1
  160. for i := 1; i < 10; i++ {
  161. n += i
  162. verify(t, r.Link(New(i)), n, -1)
  163. }
  164. }
  165. func TestUnlink(t *testing.T) {
  166. r10 := makeN(10)
  167. s10 := r10.Move(6)
  168. sum10 := sumN(10)
  169. verify(t, r10, 10, sum10)
  170. verify(t, s10, 10, sum10)
  171. r0 := r10.Unlink(0)
  172. verify(t, r0, 0, 0)
  173. r1 := r10.Unlink(1)
  174. verify(t, r1, 1, 2)
  175. verify(t, r10, 9, sum10-2)
  176. r9 := r10.Unlink(9)
  177. verify(t, r9, 9, sum10-2)
  178. verify(t, r10, 9, sum10-2)
  179. }
  180. func TestLinkUnlink(t *testing.T) {
  181. for i := 1; i < 4; i++ {
  182. ri := New(i)
  183. for j := 0; j < i; j++ {
  184. rj := ri.Unlink(j)
  185. verify(t, rj, j, -1)
  186. verify(t, ri, i-j, -1)
  187. ri.Link(rj)
  188. verify(t, ri, i, -1)
  189. }
  190. }
  191. }
  192. // Test that calling Move() on an empty Ring initializes it.
  193. func TestMoveEmptyRing(t *testing.T) {
  194. var r Ring
  195. r.Move(1)
  196. verify(t, &r, 1, 0)
  197. }