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  }