package assertions

import (
	"fmt"
	"time"
)

func (this *AssertionsFixture) TestShouldContainKey() {
	this.fail(so(map[int]int{}, ShouldContainKey), "This assertion requires exactly 1 comparison values (you provided 0).")
	this.fail(so(map[int]int{}, ShouldContainKey, 1, 2, 3), "This assertion requires exactly 1 comparison values (you provided 3).")

	this.fail(so(Thing1{}, ShouldContainKey, 1), "You must provide a valid map type (was assertions.Thing1)!")
	this.fail(so(nil, ShouldContainKey, 1), "You must provide a valid map type (was <nil>)!")
	this.fail(so(map[int]int{1: 41}, ShouldContainKey, 2), "Expected the map[int]int to contain the key: [2] (but it didn't)!")

	this.pass(so(map[int]int{1: 41}, ShouldContainKey, 1))
	this.pass(so(map[int]int{1: 41, 2: 42, 3: 43}, ShouldContainKey, 2))
}

func (this *AssertionsFixture) TestShouldNotContainKey() {
	this.fail(so(map[int]int{}, ShouldNotContainKey), "This assertion requires exactly 1 comparison values (you provided 0).")
	this.fail(so(map[int]int{}, ShouldNotContainKey, 1, 2, 3), "This assertion requires exactly 1 comparison values (you provided 3).")

	this.fail(so(Thing1{}, ShouldNotContainKey, 1), "You must provide a valid map type (was assertions.Thing1)!")
	this.fail(so(nil, ShouldNotContainKey, 1), "You must provide a valid map type (was <nil>)!")
	this.fail(so(map[int]int{1: 41}, ShouldNotContainKey, 1), "Expected the map[int]int NOT to contain the key: [1] (but it did)!")
	this.pass(so(map[int]int{1: 41}, ShouldNotContainKey, 2))
}

func (this *AssertionsFixture) TestShouldContain() {
	this.fail(so([]int{}, ShouldContain), "This assertion requires exactly 1 comparison values (you provided 0).")
	this.fail(so([]int{}, ShouldContain, 1, 2, 3), "This assertion requires exactly 1 comparison values (you provided 3).")

	this.fail(so(Thing1{}, ShouldContain, 1), "You must provide a valid container (was assertions.Thing1)!")
	this.fail(so(nil, ShouldContain, 1), "You must provide a valid container (was <nil>)!")
	this.fail(so([]int{1}, ShouldContain, 2), "Expected the container ([]int) to contain: '2' (but it didn't)!")
	this.fail(so([][]int{{1}}, ShouldContain, []int{2}), "Expected the container ([][]int) to contain: '[2]' (but it didn't)!")

	this.pass(so([]int{1}, ShouldContain, 1))
	this.pass(so([]int{1, 2, 3}, ShouldContain, 2))
	this.pass(so([][]int{{1}, {2}, {3}}, ShouldContain, []int{2}))
}

func (this *AssertionsFixture) TestShouldNotContain() {
	this.fail(so([]int{}, ShouldNotContain), "This assertion requires exactly 1 comparison values (you provided 0).")
	this.fail(so([]int{}, ShouldNotContain, 1, 2, 3), "This assertion requires exactly 1 comparison values (you provided 3).")

	this.fail(so(Thing1{}, ShouldNotContain, 1), "You must provide a valid container (was assertions.Thing1)!")
	this.fail(so(nil, ShouldNotContain, 1), "You must provide a valid container (was <nil>)!")

	this.fail(so([]int{1}, ShouldNotContain, 1), "Expected the container ([]int) NOT to contain: '1' (but it did)!")
	this.fail(so([]int{1, 2, 3}, ShouldNotContain, 2), "Expected the container ([]int) NOT to contain: '2' (but it did)!")
	this.fail(so([][]int{{1}, {2}, {3}}, ShouldNotContain, []int{2}), "Expected the container ([][]int) NOT to contain: '[2]' (but it did)!")

	this.pass(so([]int{1}, ShouldNotContain, 2))
	this.pass(so([][]int{{1}, {2}, {3}}, ShouldNotContain, []int{4}))
}

func (this *AssertionsFixture) TestShouldBeIn() {
	this.fail(so(4, ShouldBeIn), needNonEmptyCollection)

	container := []int{1, 2, 3, 4}
	this.pass(so(4, ShouldBeIn, container))
	this.pass(so(4, ShouldBeIn, 1, 2, 3, 4))
	this.pass(so([]int{4}, ShouldBeIn, [][]int{{1}, {2}, {3}, {4}}))
	this.pass(so([]int{4}, ShouldBeIn, []int{1}, []int{2}, []int{3}, []int{4}))

	this.fail(so(4, ShouldBeIn, 1, 2, 3), "Expected '4' to be in the container ([]interface {}), but it wasn't!")
	this.fail(so(4, ShouldBeIn, []int{1, 2, 3}), "Expected '4' to be in the container ([]int), but it wasn't!")
	this.fail(so([]int{4}, ShouldBeIn, []int{1}, []int{2}, []int{3}), "Expected '[4]' to be in the container ([]interface {}), but it wasn't!")
	this.fail(so([]int{4}, ShouldBeIn, [][]int{{1}, {2}, {3}}), "Expected '[4]' to be in the container ([][]int), but it wasn't!")
}

func (this *AssertionsFixture) TestShouldNotBeIn() {
	this.fail(so(4, ShouldNotBeIn), needNonEmptyCollection)

	container := []int{1, 2, 3, 4}
	this.pass(so(42, ShouldNotBeIn, container))
	this.pass(so(42, ShouldNotBeIn, 1, 2, 3, 4))
	this.pass(so([]int{42}, ShouldNotBeIn, []int{1}, []int{2}, []int{3}, []int{4}))
	this.pass(so([]int{42}, ShouldNotBeIn, [][]int{{1}, {2}, {3}, {4}}))

	this.fail(so(2, ShouldNotBeIn, 1, 2, 3), "Expected '2' NOT to be in the container ([]interface {}), but it was!")
	this.fail(so(2, ShouldNotBeIn, []int{1, 2, 3}), "Expected '2' NOT to be in the container ([]int), but it was!")
	this.fail(so([]int{2}, ShouldNotBeIn, []int{1}, []int{2}, []int{3}), "Expected '[2]' NOT to be in the container ([]interface {}), but it was!")
	this.fail(so([]int{2}, ShouldNotBeIn, [][]int{{1}, {2}, {3}}), "Expected '[2]' NOT to be in the container ([][]int), but it was!")
}

func (this *AssertionsFixture) TestShouldBeEmpty() {
	this.fail(so(1, ShouldBeEmpty, 2, 3), "This assertion requires exactly 0 comparison values (you provided 2).")

	this.pass(so([]int{}, ShouldBeEmpty))           // empty slice
	this.pass(so([][]int{}, ShouldBeEmpty))         // empty slice
	this.pass(so([]interface{}{}, ShouldBeEmpty))   // empty slice
	this.pass(so(map[string]int{}, ShouldBeEmpty))  // empty map
	this.pass(so("", ShouldBeEmpty))                // empty string
	this.pass(so(&[]int{}, ShouldBeEmpty))          // pointer to empty slice
	this.pass(so(&[0]int{}, ShouldBeEmpty))         // pointer to empty array
	this.pass(so(nil, ShouldBeEmpty))               // nil
	this.pass(so(make(chan string), ShouldBeEmpty)) // empty channel

	this.fail(so([]int{1}, ShouldBeEmpty), "Expected [1] to be empty (but it wasn't)!")                      // non-empty slice
	this.fail(so([][]int{{1}}, ShouldBeEmpty), "Expected [[1]] to be empty (but it wasn't)!")                // non-empty slice
	this.fail(so([]interface{}{1}, ShouldBeEmpty), "Expected [1] to be empty (but it wasn't)!")              // non-empty slice
	this.fail(so(map[string]int{"hi": 0}, ShouldBeEmpty), "Expected map[hi:0] to be empty (but it wasn't)!") // non-empty map
	this.fail(so("hi", ShouldBeEmpty), "Expected hi to be empty (but it wasn't)!")                           // non-empty string
	this.fail(so(&[]int{1}, ShouldBeEmpty), "Expected &[1] to be empty (but it wasn't)!")                    // pointer to non-empty slice
	this.fail(so(&[1]int{1}, ShouldBeEmpty), "Expected &[1] to be empty (but it wasn't)!")                   // pointer to non-empty array
	c := make(chan int, 1)                                                                                   // non-empty channel
	go func() { c <- 1 }()
	time.Sleep(time.Millisecond)
	this.fail(so(c, ShouldBeEmpty), fmt.Sprintf("Expected %+v to be empty (but it wasn't)!", c))
}

func (this *AssertionsFixture) TestShouldNotBeEmpty() {
	this.fail(so(1, ShouldNotBeEmpty, 2, 3), "This assertion requires exactly 0 comparison values (you provided 2).")

	this.fail(so([]int{}, ShouldNotBeEmpty), "Expected [] to NOT be empty (but it was)!")             // empty slice
	this.fail(so([]interface{}{}, ShouldNotBeEmpty), "Expected [] to NOT be empty (but it was)!")     // empty slice
	this.fail(so(map[string]int{}, ShouldNotBeEmpty), "Expected map[] to NOT be empty (but it was)!") // empty map
	this.fail(so("", ShouldNotBeEmpty), "Expected  to NOT be empty (but it was)!")                    // empty string
	this.fail(so(&[]int{}, ShouldNotBeEmpty), "Expected &[] to NOT be empty (but it was)!")           // pointer to empty slice
	this.fail(so(&[0]int{}, ShouldNotBeEmpty), "Expected &[] to NOT be empty (but it was)!")          // pointer to empty array
	this.fail(so(nil, ShouldNotBeEmpty), "Expected <nil> to NOT be empty (but it was)!")              // nil
	c := make(chan int, 0)                                                                            // non-empty channel
	this.fail(so(c, ShouldNotBeEmpty), fmt.Sprintf("Expected %+v to NOT be empty (but it was)!", c))  // empty channel

	this.pass(so([]int{1}, ShouldNotBeEmpty))                // non-empty slice
	this.pass(so([]interface{}{1}, ShouldNotBeEmpty))        // non-empty slice
	this.pass(so(map[string]int{"hi": 0}, ShouldNotBeEmpty)) // non-empty map
	this.pass(so("hi", ShouldNotBeEmpty))                    // non-empty string
	this.pass(so(&[]int{1}, ShouldNotBeEmpty))               // pointer to non-empty slice
	this.pass(so(&[1]int{1}, ShouldNotBeEmpty))              // pointer to non-empty array
	c = make(chan int, 1)
	go func() { c <- 1 }()
	time.Sleep(time.Millisecond)
	this.pass(so(c, ShouldNotBeEmpty))
}

func (this *AssertionsFixture) TestShouldHaveLength() {
	this.fail(so(1, ShouldHaveLength, 2), "You must provide a valid container (was int)!")
	this.fail(so(nil, ShouldHaveLength, 1), "You must provide a valid container (was <nil>)!")
	this.fail(so("hi", ShouldHaveLength, float64(1.0)), "You must provide a valid integer (was float64)!")
	this.fail(so([]string{}, ShouldHaveLength), "This assertion requires exactly 1 comparison values (you provided 0).")
	this.fail(so([]string{}, ShouldHaveLength, 1, 2), "This assertion requires exactly 1 comparison values (you provided 2).")
	this.fail(so([]string{}, ShouldHaveLength, -10), "You must provide a valid positive integer (was -10)!")

	this.fail(so([]int{}, ShouldHaveLength, 1), // empty slice
		"Expected collection to have length equal to [1], but its length was [0] instead! contents: []")

	this.fail(so([]interface{}{}, ShouldHaveLength, 1), // empty slice
		"Expected collection to have length equal to [1], but its length was [0] instead! contents: []")

	this.fail(so(map[string]int{}, ShouldHaveLength, 1), // empty map
		"Expected collection to have length equal to [1], but its length was [0] instead! contents: map[]")

	this.fail(so("", ShouldHaveLength, 1), // empty string
		"Expected collection to have length equal to [1], but its length was [0] instead! contents: ")

	this.fail(so(&[]int{}, ShouldHaveLength, 1), // pointer to empty slice
		"Expected collection to have length equal to [1], but its length was [0] instead! contents: &[]")

	this.fail(so(&[0]int{}, ShouldHaveLength, 1), // pointer to empty array
		"Expected collection to have length equal to [1], but its length was [0] instead! contents: &[]")

	c := make(chan int, 0) // non-empty channel
	this.fail(so(c, ShouldHaveLength, 1), fmt.Sprintf(
		"Expected collection to have length equal to [1], but its length was [0] instead! contents: %+v", c))

	c = make(chan int) // empty channel
	this.fail(so(c, ShouldHaveLength, 1), fmt.Sprintf(
		"Expected collection to have length equal to [1], but its length was [0] instead! contents: %+v", c))

	this.pass(so([]int{1}, ShouldHaveLength, 1))                // non-empty slice
	this.pass(so([]interface{}{1}, ShouldHaveLength, 1))        // non-empty slice
	this.pass(so(map[string]int{"hi": 0}, ShouldHaveLength, 1)) // non-empty map
	this.pass(so("hi", ShouldHaveLength, 2))                    // non-empty string
	this.pass(so(&[]int{1}, ShouldHaveLength, 1))               // pointer to non-empty slice
	this.pass(so(&[1]int{1}, ShouldHaveLength, 1))              // pointer to non-empty array
	c = make(chan int, 1)
	go func() { c <- 1 }()
	time.Sleep(time.Millisecond)
	this.pass(so(c, ShouldHaveLength, 1))
	this.pass(so(c, ShouldHaveLength, uint(1)))
}
