// 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 (
	"testing";
)

type IntArray []int;

func (arr IntArray) Iter() <-chan interface {} {
	ch := make(chan interface {});
	go func() {
		for _, x := range arr {
			ch <- x
		}
		close(ch)
	}();
	return ch
}

var oneToFive = IntArray{ 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 })
}
