URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libgo/] [go/] [container/] [ring/] [ring_test.go] - Rev 747
Compare with Previous | Blame | View Log
// Copyright 2009 The Go Authors. All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file.package ringimport ("fmt""testing")// For debugging - keep around.func dump(r *Ring) {if r == nil {fmt.Println("empty")return}i, n := 0, r.Len()for p := r; i < n; p = p.next {fmt.Printf("%4d: %p = {<- %p | %p ->}\n", i, p, p.prev, p.next)i++}fmt.Println()}func verify(t *testing.T, r *Ring, N int, sum int) {// Lenn := r.Len()if n != N {t.Errorf("r.Len() == %d; expected %d", n, N)}// iterationn = 0s := 0r.Do(func(p interface{}) {n++if p != nil {s += p.(int)}})if n != N {t.Errorf("number of forward iterations == %d; expected %d", n, N)}if sum >= 0 && s != sum {t.Errorf("forward ring sum = %d; expected %d", s, sum)}if r == nil {return}// connectionsif r.next != nil {var p *Ring // previous elementfor q := r; p == nil || q != r; q = q.next {if p != nil && p != q.prev {t.Errorf("prev = %p, expected q.prev = %p\n", p, q.prev)}p = q}if p != r.prev {t.Errorf("prev = %p, expected r.prev = %p\n", p, r.prev)}}// Next, Previf r.Next() != r.next {t.Errorf("r.Next() != r.next")}if r.Prev() != r.prev {t.Errorf("r.Prev() != r.prev")}// Moveif r.Move(0) != r {t.Errorf("r.Move(0) != r")}if r.Move(N) != r {t.Errorf("r.Move(%d) != r", N)}if r.Move(-N) != r {t.Errorf("r.Move(%d) != r", -N)}for i := 0; i < 10; i++ {ni := N + imi := ni % Nif r.Move(ni) != r.Move(mi) {t.Errorf("r.Move(%d) != r.Move(%d)", ni, mi)}if r.Move(-ni) != r.Move(-mi) {t.Errorf("r.Move(%d) != r.Move(%d)", -ni, -mi)}}}func TestCornerCases(t *testing.T) {var (r0 *Ringr1 Ring)// Basicsverify(t, r0, 0, 0)verify(t, &r1, 1, 0)// Insertr1.Link(r0)verify(t, r0, 0, 0)verify(t, &r1, 1, 0)// Insertr1.Link(r0)verify(t, r0, 0, 0)verify(t, &r1, 1, 0)// Unlinkr1.Unlink(0)verify(t, &r1, 1, 0)}func makeN(n int) *Ring {r := New(n)for i := 1; i <= n; i++ {r.Value = ir = r.Next()}return r}func sumN(n int) int { return (n*n + n) / 2 }func TestNew(t *testing.T) {for i := 0; i < 10; i++ {r := New(i)verify(t, r, i, -1)}for i := 0; i < 10; i++ {r := makeN(i)verify(t, r, i, sumN(i))}}func TestLink1(t *testing.T) {r1a := makeN(1)var r1b Ringr2a := r1a.Link(&r1b)verify(t, r2a, 2, 1)if r2a != r1a {t.Errorf("a) 2-element link failed")}r2b := r2a.Link(r2a.Next())verify(t, r2b, 2, 1)if r2b != r2a.Next() {t.Errorf("b) 2-element link failed")}r1c := r2b.Link(r2b)verify(t, r1c, 1, 1)verify(t, r2b, 1, 0)}func TestLink2(t *testing.T) {var r0 *Ringr1a := &Ring{Value: 42}r1b := &Ring{Value: 77}r10 := makeN(10)r1a.Link(r0)verify(t, r1a, 1, 42)r1a.Link(r1b)verify(t, r1a, 2, 42+77)r10.Link(r0)verify(t, r10, 10, sumN(10))r10.Link(r1a)verify(t, r10, 12, sumN(10)+42+77)}func TestLink3(t *testing.T) {var r Ringn := 1for i := 1; i < 100; i++ {n += iverify(t, r.Link(New(i)), n, -1)}}func TestUnlink(t *testing.T) {r10 := makeN(10)s10 := r10.Move(6)sum10 := sumN(10)verify(t, r10, 10, sum10)verify(t, s10, 10, sum10)r0 := r10.Unlink(0)verify(t, r0, 0, 0)r1 := r10.Unlink(1)verify(t, r1, 1, 2)verify(t, r10, 9, sum10-2)r9 := r10.Unlink(9)verify(t, r9, 9, sum10-2)verify(t, r10, 9, sum10-2)}func TestLinkUnlink(t *testing.T) {for i := 1; i < 4; i++ {ri := New(i)for j := 0; j < i; j++ {rj := ri.Unlink(j)verify(t, rj, j, -1)verify(t, ri, i-j, -1)ri.Link(rj)verify(t, ri, i, -1)}}}
