Example #1
0
func Deque(deck *deque.Deque, data ...interface{}) string {
	deck.CheckInvariant()
	if deck.Count() != len(data) {
		return fmt.Sprintf("Count() is %v but should be %v", deck.Count(), len(data))
	}
	if deck.IsEmpty() != (len(data) == 0) {
		return fmt.Sprintf("IsEmpty() should be %v", (len(data) == 0))
	}
	if deck.IsFull() != (len(data) == deck.Capacity()) {
		return fmt.Sprintf("IsFull() should be %v", (len(data) == deck.Capacity()))
	}
	for i := range data {
		if deck.At(i) != data[i] {
			return fmt.Sprintf("At(%v) is %v but should be %v", i, deck.At(i), data[i])
		}
		if deck.Peek(i) != data[len(data)-1-i] {
			return fmt.Sprintf("Peek(%v) is %v but should be %v", i, deck.Peek(i), data[len(data)-1-i])
		}

		p := deck.Put(i, "x")
		if p != data[i] {
			return fmt.Sprintf("Put(%v,x) is %v but should be %v", i, p, data[i])
		}
		if deck.Put(i, p).(string) != "x" {
			return fmt.Sprintf("Put is broken")
		}
		p = deck.Poke(i, "x")
		if p != data[len(data)-1-i] {
			return fmt.Sprintf("Poke(%v,x) is %v but should be %v", i, p, data[len(data)-1-i])
		}
		if deck.Poke(i, p).(string) != "x" {
			return fmt.Sprintf("Poke is broken")
		}

		if deck.At(i) != data[i] {
			return fmt.Sprintf("After Put/Poke At(%v) is %v but should be %v", i, deck.At(i), data[i])
		}
		if deck.Peek(i) != data[len(data)-1-i] {
			return fmt.Sprintf("After Put/Poke Peek(%v) is %v but should be %v", i, deck.Peek(i), data[len(data)-1-i])
		}
	}
	var zero interface{}
	if deck.Peek(-1) != zero {
		return fmt.Sprintf("Peek(-1) returns %v", deck.Peek(-1))
	}
	if deck.Peek(-1) != nil {
		return fmt.Sprintf("Peek(-1) returns %v", deck.Peek(-1))
	}
	if deck.Poke(-1, "foo") != zero {
		return fmt.Sprintf("Poke(-1,foo) returns not nil")
	}
	if deck.Poke(-1, "foo") != nil {
		return fmt.Sprintf("Poke(-1,foo) returns not nil")
	}

	if deck.At(-1) != zero {
		return fmt.Sprintf("At(-1) returns %v", deck.At(-1))
	}
	if deck.At(-1) != nil {
		return fmt.Sprintf("At(-1) returns %v", deck.At(-1))
	}
	if deck.Put(-1, "foo") != zero {
		return fmt.Sprintf("Put(-1,foo) returns not nil")
	}
	if deck.Put(-1, "foo") != nil {
		return fmt.Sprintf("Put(-1,foo) returns not nil")
	}

	if deck.Peek(len(data)) != zero {
		return fmt.Sprintf("Peek(len(data)) returns %v", deck.Peek(len(data)))
	}
	if deck.Peek(len(data)) != nil {
		return fmt.Sprintf("Peek(len(data)) returns %v", deck.Peek(len(data)))
	}
	if deck.Poke(len(data), "foo") != zero {
		return fmt.Sprintf("Poke(len(data),foo) returns not nil")
	}
	if deck.Poke(len(data), "foo") != nil {
		return fmt.Sprintf("Poke(len(data),foo) returns not nil")
	}

	if deck.At(len(data)) != zero {
		return fmt.Sprintf("At(len(data)) returns %v", deck.At(len(data)))
	}
	if deck.At(len(data)) != nil {
		return fmt.Sprintf("At(len(data)) returns %v", deck.At(len(data)))
	}
	if deck.Put(len(data), "foo") != zero {
		return fmt.Sprintf("Put(len(data),foo) returns not nil")
	}
	if deck.Put(len(data), "foo") != nil {
		return fmt.Sprintf("Put(len(data),foo) returns not nil")
	}

	if deck.String() != "Deque"+fmt.Sprintf("%v", data) {
		return fmt.Sprintf("String() returns \"%v\" instead of \"%v\"", deck.String(), "Deque"+fmt.Sprintf("%v", data))
	}

	return ""
}