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 "" }