diff options
Diffstat (limited to 'usr/dsymonds/iterable/iterable_test.go')
-rw-r--r-- | usr/dsymonds/iterable/iterable_test.go | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/usr/dsymonds/iterable/iterable_test.go b/usr/dsymonds/iterable/iterable_test.go new file mode 100644 index 000000000..9a772c2c4 --- /dev/null +++ b/usr/dsymonds/iterable/iterable_test.go @@ -0,0 +1,129 @@ +// 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 iterable + +import ( + "iterable"; + "testing"; +) + +type IntArray []int; + +func (arr IntArray) Iter() <-chan interface {} { + ch := make(chan interface {}); + go func() { + for i, x := range arr { + ch <- x + } + close(ch) + }(); + return ch +} + +var oneToFive IntArray = []int{ 1, 2, 3, 4, 5 }; + +func isNegative(n interface {}) bool { + return n.(int) < 0 +} +func isPositive(n interface {}) bool { + return n.(int) > 0 +} +func isAbove3(n interface {}) bool { + return n.(int) > 3 +} +func isEven(n interface {}) bool { + return n.(int) % 2 == 0 +} +func doubler(n interface {}) interface {} { + return n.(int) * 2 +} +func addOne(n interface {}) interface {} { + return n.(int) + 1 +} +func adder(acc interface {}, n interface {}) interface {} { + return acc.(int) + n.(int) +} + +// A stream of the natural numbers: 0, 1, 2, 3, ... +type integerStream struct {} +func (i integerStream) Iter() <-chan interface {} { + ch := make(chan interface {}); + go func() { + for i := 0; ; i++ { + ch <- i + } + }(); + return ch +} + +func TestAll(t *testing.T) { + if !All(oneToFive, isPositive) { + t.Error("All(oneToFive, isPositive) == false") + } + if All(oneToFive, isAbove3) { + t.Error("All(oneToFive, isAbove3) == true") + } +} + +func TestAny(t *testing.T) { + if Any(oneToFive, isNegative) { + t.Error("Any(oneToFive, isNegative) == true") + } + if !Any(oneToFive, isEven) { + t.Error("Any(oneToFive, isEven) == false") + } +} + +func assertArraysAreEqual(t *testing.T, res []interface {}, expected []int) { + if len(res) != len(expected) { + t.Errorf("len(res) = %v, want %v", len(res), len(expected)); + goto missing + } + for i := range res { + if v := res[i].(int); v != expected[i] { + t.Errorf("res[%v] = %v, want %v", i, v, expected[i]); + goto missing + } + } + return; +missing: + t.Errorf("res = %v\nwant %v", res, expected); +} + +func TestFilter(t *testing.T) { + ints := integerStream{}; + moreInts := Filter(ints, isAbove3).Iter(); + res := make([]interface {}, 3); + for i := 0; i < 3; i++ { + res[i] = <-moreInts; + } + assertArraysAreEqual(t, res, []int{ 4, 5, 6 }) +} + +func TestFind(t *testing.T) { + ints := integerStream{}; + first := Find(ints, isAbove3); + if first.(int) != 4 { + t.Errorf("Find(ints, isAbove3) = %v, want 4", first) + } +} + +func TestInject(t *testing.T) { + res := Inject(oneToFive, 0, adder); + if res.(int) != 15 { + t.Errorf("Inject(oneToFive, 0, adder) = %v, want 15", res) + } +} + +func TestMap(t *testing.T) { + res := Data(Map(Map(oneToFive, doubler), addOne)); + assertArraysAreEqual(t, res, []int{ 3, 5, 7, 9, 11 }) +} + +func TestPartition(t *testing.T) { + ti, fi := Partition(oneToFive, isEven); + assertArraysAreEqual(t, Data(ti), []int{ 2, 4 }); + assertArraysAreEqual(t, Data(fi), []int{ 1, 3, 5 }) +} |