# -*- tcl -*- # stack.test: tests for the stack package. # # This file contains a collection of tests for one or more of the Tcl # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # # Copyright (c) 1998-2000 by Ajuba Solutions. # All rights reserved. # # RCS: @(#) $Id: stack.test,v 1.6 2002/02/01 21:51:42 andreas_kupries Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest namespace import ::tcltest::* } source [file join [file dirname [info script]] stack.tcl] namespace import struct::stack::stack test stack-0.1 {stack errors} { stack mystack catch {stack mystack} msg mystack destroy set msg } "command \"mystack\" already exists, unable to create stack" test stack-0.2 {stack errors} {badTest} { stack mystack catch {mystack} msg mystack destroy set msg } "wrong # args: should be \"mystack option ?arg arg ...?\"" test stack-0.3 {stack errors} { stack mystack catch {mystack foo} msg mystack destroy set msg } "bad option \"foo\": must be clear, destroy, peek, pop, push, rotate, or size" test stack-0.4 {stack errors} { catch {stack set} msg set msg } "command \"set\" already exists, unable to create stack" test stack-1.1 {stack creation} { set foo [stack mystack] set cmd [info commands ::mystack] set size [mystack size] mystack destroy list $foo $cmd $size } {mystack ::mystack 0} test stack-1.2 {stack creation} { set foo [stack] set cmd [info commands ::$foo] set size [$foo size] $foo destroy list $foo $cmd $size } {stack1 ::stack1 0} test stack-2.1 {stack destroy} { stack mystack mystack destroy info commands ::mystack } {} test stack-3.2 {size operation} { stack mystack mystack push a b c d e f g set size [mystack size] mystack destroy set size } 7 test stack-3.3 {size operation} { stack mystack mystack push a b c d e f g mystack pop 3 set size [mystack size] mystack destroy set size } 4 test stack-3.4 {size operation} { stack mystack mystack push a b c d e f g mystack pop 3 mystack peek 3 set size [mystack size] mystack destroy set size } 4 test stack-4.1 {push operation} { stack mystack catch {mystack push} msg mystack destroy set msg } "wrong # args: should be \"mystack push item ?item ...?\"" test stack-4.2 {push operation, singleton items} { stack mystack mystack push a mystack push b mystack push c set result [list [mystack pop] [mystack pop] [mystack pop]] mystack destroy set result } "c b a" test stack-4.3 {push operation, multiple items} { stack mystack mystack push a b c set result [list [mystack pop] [mystack pop] [mystack pop]] mystack destroy set result } "c b a" test stack-4.4 {push operation, spaces in items} { stack mystack mystack push a b "foo bar" set result [list [mystack pop] [mystack pop] [mystack pop]] mystack destroy set result } [list "foo bar" b a] test stack-4.5 {push operation, bad chars in items} { stack mystack mystack push a b \{ set result [list [mystack pop] [mystack pop] [mystack pop]] mystack destroy set result } [list \{ b a] test stack-5.1 {pop operation} { stack mystack mystack push a mystack push b mystack push c set result [list [mystack pop] [mystack pop] [mystack pop]] mystack destroy set result } [list c b a] test stack-5.2 {pop operation, multiple items} { stack mystack mystack push a mystack push b mystack push c set result [mystack pop 3] mystack destroy set result } [list c b a] test stack-6.1 {peek operation} { stack mystack mystack push a mystack push b mystack push c set result [list [mystack peek] [mystack peek] [mystack peek]] mystack destroy set result } [list c c c] test stack-6.2 {peek operation} { stack mystack catch {mystack peek 0} msg mystack destroy set msg } {invalid item count 0} test stack-6.3 {peek operation} { stack mystack catch {mystack peek -1} msg mystack destroy set msg } {invalid item count -1} test stack-6.4 {peek operation} { stack mystack catch {mystack peek} msg mystack destroy set msg } {insufficient items on stack to fill request} test stack-6.5 {peek operation} { stack mystack mystack push a catch {mystack peek 2} msg mystack destroy set msg } {insufficient items on stack to fill request} test stack-6.6 {pop operation, multiple items} { stack mystack mystack push a mystack push b mystack push c set result [list [mystack peek 3] [mystack pop 3]] mystack destroy set result } [list [list c b a] [list c b a]] test stack-6.7 {pop operation} { stack mystack catch {mystack pop 0} msg mystack destroy set msg } {invalid item count 0} test stack-6.8 {pop operation} { stack mystack catch {mystack pop -1} msg mystack destroy set msg } {invalid item count -1} test stack-6.9 {pop operation} { stack mystack catch {mystack pop} msg mystack destroy set msg } {insufficient items on stack to fill request} test stack-6.10 {pop operation} { stack mystack mystack push a catch {mystack pop 2} msg mystack destroy set msg } {insufficient items on stack to fill request} test stack-7.1 {clear operation} { stack mystack mystack push a mystack push b mystack push c set result [list [mystack peek 3]] mystack clear lappend result [mystack size] mystack destroy set result } [list [list c b a] 0] test stack-8.1 {rotate operation} { stack mystack mystack push a b c d e f g h mystack rotate 3 1 set result [mystack peek [mystack size]] mystack destroy set result } [list g f h e d c b a] test stack-8.2 {rotate operation} { stack mystack mystack push a b c d e f g h mystack rotate 3 2 set result [mystack peek [mystack size]] mystack destroy set result } [list f h g e d c b a] test stack-8.3 {rotate operation} { stack mystack mystack push a b c d e f g h mystack rotate 3 5 set result [mystack peek [mystack size]] mystack destroy set result } [list f h g e d c b a] test stack-8.4 {rotate operation} { stack mystack mystack push a b c d e f g h mystack rotate 8 1 set result [mystack peek [mystack size]] mystack destroy set result } [list g f e d c b a h] test stack-8.4 {rotate operation} { stack mystack mystack push a b c d e f g h mystack rotate 8 -1 set result [mystack peek [mystack size]] mystack destroy set result } [list a h g f e d c b] test stack-8.5 {rotate operation} { stack mystack catch {mystack rotate 8 -1} msg mystack destroy set msg } {insufficient items on stack to fill request} test stack-8.6 {rotate operation} { stack mystack mystack push a b c d catch {mystack rotate 8 -1} msg mystack destroy set msg } {insufficient items on stack to fill request} ::tcltest::cleanupTests