| // 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 | |
| } | |
| // 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 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 }) | |
| } |