summaryrefslogtreecommitdiffstats
path: root/tcllib/modules/struct/prioqueue.test
diff options
context:
space:
mode:
Diffstat (limited to 'tcllib/modules/struct/prioqueue.test')
-rw-r--r--tcllib/modules/struct/prioqueue.test511
1 files changed, 511 insertions, 0 deletions
diff --git a/tcllib/modules/struct/prioqueue.test b/tcllib/modules/struct/prioqueue.test
new file mode 100644
index 0000000..30359ea
--- /dev/null
+++ b/tcllib/modules/struct/prioqueue.test
@@ -0,0 +1,511 @@
+# -*- tcl -*-
+# prioqueue.test: tests for the prioqueue 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.
+# Copyright (c) 2002 Michael Schlenker
+# All rights reserved.
+#
+# RCS: @(#) $Id: prioqueue.test,v 1.10 2008/09/04 04:35:02 andreas_kupries Exp $
+
+# -------------------------------------------------------------------------
+
+source [file join \
+ [file dirname [file dirname [file join [pwd] [info script]]]] \
+ devtools testutilities.tcl]
+
+testsNeedTcl 8.2
+testsNeedTcltest 1.0
+
+testing {
+ useLocal prioqueue.tcl struct::prioqueue
+}
+
+# -------------------------------------------------------------------------
+
+namespace import -force struct::prioqueue
+
+#----------------------------------------------------------------------
+
+test prioqueue-0.1 {prioqueue errors} {
+ prioqueue -integer myprioqueue
+ catch {prioqueue myprioqueue} msg
+ myprioqueue destroy
+ set msg
+} "command \"myprioqueue\" already exists, unable to create prioqueue"
+test prioqueue-0.2 {prioqueue errors} {
+ prioqueue myprioqueue
+ catch {myprioqueue} msg
+ myprioqueue destroy
+ set msg
+} "wrong # args: should be \"myprioqueue option ?arg arg ...?\""
+test prioqueue-0.3 {prioqueue errors} {
+ prioqueue myprioqueue
+ catch {myprioqueue foo} msg
+ myprioqueue destroy
+ set msg
+} "bad option \"foo\": must be clear, destroy, get, peek, put, remove, size, or peekpriority"
+test prioqueue-0.4 {prioqueue errors} {
+ catch {prioqueue set} msg
+ set msg
+} "command \"set\" already exists, unable to create prioqueue"
+
+test prioqueue-0.5 {prioqueue errors} {
+ catch {prioqueue -foo myprioqueue} msg
+ set msg
+} "unknown sort option \"-foo\""
+
+test prioqueue-0.6 {prioqueue errors} {
+ catch {prioqueue -foo} msg
+ set msg
+} "unknown sort option \"-foo\""
+
+test prioqueue-0.7 {prioqueue errors} {
+ catch {prioqueue -integer myprioqueue foo} msg
+ set msg
+} "wrong # args: should be \"prioqueue ?-ascii|-dictionary|-integer|-real? ?name?\""
+
+test prioqueue-0.8 {prioqueue errors} {
+ catch {prioqueue myprioqueue -integer} msg
+ set msg
+} "wrong argument position: should be \"prioqueue ?-ascii|-dictionary|-integer|-real? ?name?\""
+
+test prioqueue-1.1 {prioqueue creation} {
+ set foo [prioqueue myprioqueue]
+ set cmd [info commands ::myprioqueue]
+ set size [myprioqueue size]
+ myprioqueue destroy
+ list $foo $cmd $size
+} {myprioqueue ::myprioqueue 0}
+
+test prioqueue-1.2 {prioqueue creation} {
+ set foo [prioqueue]
+ set cmd [info commands ::$foo]
+ set size [$foo size]
+ $foo destroy
+ list $foo $cmd $size
+} {prioqueue1 ::prioqueue1 0}
+
+test prioqueue-1.3 {prioqueue creation} {
+ set foo [prioqueue -ascii]
+ set cmd [info commands ::$foo]
+ set size [$foo size]
+ $foo destroy
+ list $foo $cmd $size
+} {prioqueue2 ::prioqueue2 0}
+
+test prioqueue-1.5 {prioqueue creation} {
+ set foo [prioqueue -dictionary]
+ set cmd [info commands ::$foo]
+ set size [$foo size]
+ $foo destroy
+ list $foo $cmd $size
+} {prioqueue3 ::prioqueue3 0}
+
+test prioqueue-1.6 {prioqueue creation} {
+ set foo [prioqueue -integer]
+ set cmd [info commands ::$foo]
+ set size [$foo size]
+ $foo destroy
+ list $foo $cmd $size
+} {prioqueue4 ::prioqueue4 0}
+
+test prioqueue-1.7 {prioqueue creation} {
+ set foo [prioqueue -real]
+ set cmd [info commands ::$foo]
+ set size [$foo size]
+ $foo destroy
+ list $foo $cmd $size
+} {prioqueue5 ::prioqueue5 0}
+
+
+test prioqueue-2.1 {prioqueue destroy} {
+ prioqueue myprioqueue
+ myprioqueue destroy
+ info commands ::myprioqueue
+} {}
+
+test prioqueue-3.2 {size operation} {
+ prioqueue myprioqueue
+ myprioqueue put a 1 b 1 c 1 d 1 e 1 f 1 g 1
+ set size [myprioqueue size]
+ myprioqueue destroy
+ set size
+} 7
+test prioqueue-3.3 {size operation} {
+ prioqueue myprioqueue
+ myprioqueue put a 1 b 1 c 1 d 1 e 1 f 1 g 1
+ myprioqueue get 3
+ set size [myprioqueue size]
+ myprioqueue destroy
+ set size
+} 4
+test prioqueue-3.4 {size operation} {
+ prioqueue myprioqueue
+ myprioqueue put a 1 b 1 c 1 d 1 e 1 f 1 g 1
+ myprioqueue get 3
+ myprioqueue peek 3
+ set size [myprioqueue size]
+ myprioqueue destroy
+ set size
+} 4
+
+test prioqueue-4.1 {put operation} {
+ prioqueue myprioqueue
+ catch {myprioqueue put} msg
+ myprioqueue destroy
+ set msg
+} "wrong # args: should be \"myprioqueue put item prio ?item prio ...?\""
+
+test prioqueue-4.1a {put operation} {
+ prioqueue myprioqueue
+ catch {myprioqueue put a} msg
+ myprioqueue destroy
+ set msg
+} "wrong # args: should be \"myprioqueue put item prio ?item prio ...?\""
+
+test prioqueue-4.2 {put operation, singleton items} {
+ prioqueue myprioqueue
+ myprioqueue put a 1
+ myprioqueue put b 1
+ myprioqueue put c 1
+ set result [list [myprioqueue get] [myprioqueue get] [myprioqueue get]]
+ myprioqueue destroy
+ set result
+} "a b c"
+
+test prioqueue-4.3 {put operation, singleton items} {
+ prioqueue myprioqueue
+ myprioqueue put a 1
+ myprioqueue put b 2
+ myprioqueue put c 3
+ set result [list [myprioqueue get] [myprioqueue get] [myprioqueue get]]
+ myprioqueue destroy
+ set result
+} "c b a"
+
+test prioqueue-4.4 {put operation, singleton items} {
+ prioqueue myprioqueue
+ myprioqueue put a 3
+ myprioqueue put b 2
+ myprioqueue put c 1
+ set result [list [myprioqueue get] [myprioqueue get] [myprioqueue get]]
+ myprioqueue destroy
+ set result
+} "a b c"
+
+test prioqueue-4.5 {put operation, singleton items} {
+ prioqueue myprioqueue
+ myprioqueue put a 3
+ myprioqueue put b 1
+ myprioqueue put c 2
+ set result [list [myprioqueue get] [myprioqueue get] [myprioqueue get]]
+ myprioqueue destroy
+ set result
+} "a c b"
+
+test prioqueue-4.6 {put operation, singleton items} {
+ prioqueue -ascii myprioqueue
+ myprioqueue put a a
+ myprioqueue put b b
+ myprioqueue put c c
+ set result [list [myprioqueue get] [myprioqueue get] [myprioqueue get]]
+ myprioqueue destroy
+ set result
+} "a b c"
+
+test prioqueue-4.7 {put operation, singleton items} {
+ prioqueue -dictionary myprioqueue
+ myprioqueue put a a
+ myprioqueue put b b
+ myprioqueue put c c
+ set result [list [myprioqueue get] [myprioqueue get] [myprioqueue get]]
+ myprioqueue destroy
+ set result
+} "a b c"
+
+test prioqueue-4.8 {put operation, singleton items} {
+ prioqueue -real myprioqueue
+ myprioqueue put a 1.0
+ myprioqueue put b 2.0
+ myprioqueue put c 3.0
+ set result [list [myprioqueue get] [myprioqueue get] [myprioqueue get]]
+ myprioqueue destroy
+ set result
+} "c b a"
+
+test prioqueue-4.9 {put operation, multiple items} {
+ prioqueue myprioqueue
+ myprioqueue put a 1 b 1 c 1
+ set result [list [myprioqueue get] [myprioqueue get] [myprioqueue get]]
+ myprioqueue destroy
+ set result
+} "a b c"
+
+test prioqueue-4.10 {put operation, spaces in items} {
+ prioqueue myprioqueue
+ myprioqueue put a 1 b 1 "foo bar" 1
+ set result [list [myprioqueue get] [myprioqueue get] [myprioqueue get]]
+ myprioqueue destroy
+ set result
+} [list a b "foo bar"]
+
+test prioqueue-4.11 {put operation, bad chars in items} {
+ prioqueue myprioqueue
+ myprioqueue put a 1 b 1 \{ 1
+ set result [list [myprioqueue get] [myprioqueue get] [myprioqueue get]]
+ myprioqueue destroy
+ set result
+} [list a b \{]
+
+test prioqueue-4.12 {put operation, bad priorities} {
+ prioqueue myprioqueue
+ catch {myprioqueue put a a} msg
+ myprioqueue destroy
+ set msg
+} {priority "a" is not an integer type value}
+
+test prioqueue-4.13 {put operation, bad priorities} {
+ prioqueue myprioqueue
+ catch {myprioqueue put a 1.01} msg
+ myprioqueue destroy
+ set msg
+} {priority "1.01" is not an integer type value}
+
+test prioqueue-4.14 {put operation, bad priorities} {
+ prioqueue -real myprioqueue
+ catch {myprioqueue put a 1a} msg
+ myprioqueue destroy
+ set msg
+} {priority "1a" is not a real type value}
+
+test prioqueue-4.15 {put operation, bad priorities} {
+ prioqueue -real myprioqueue
+ catch {myprioqueue put a a} msg
+ myprioqueue destroy
+ set msg
+} {priority "a" is not a real type value}
+
+test prioqueue-4.16 {put operation, checking priorities} {
+ prioqueue -ascii myprioqueue
+ catch {myprioqueue put a 1.0} msg
+ myprioqueue destroy
+ set msg
+} {}
+
+test prioqueue-4.17 {put operation, checking priorities} {
+ prioqueue -dictionary myprioqueue
+ catch {myprioqueue put a "1.0 +1"} msg
+ myprioqueue destroy
+ set msg
+} {}
+
+
+test prioqueue-5.1 {get operation} {
+ prioqueue myprioqueue
+ myprioqueue put a 1
+ myprioqueue put b 1
+ myprioqueue put c 1
+ set result [list [myprioqueue get] [myprioqueue get] [myprioqueue get]]
+ myprioqueue destroy
+ set result
+} [list a b c]
+
+test prioqueue-5.2 {get operation, multiple items} {
+ prioqueue myprioqueue
+ myprioqueue put a 1
+ myprioqueue put b 1
+ myprioqueue put c 1
+ set result [myprioqueue get 3]
+ myprioqueue destroy
+ set result
+} [list a b c]
+
+test prioqueue-6.1 {peek operation} {
+ prioqueue myprioqueue
+ myprioqueue put a 1
+ myprioqueue put b 1
+ myprioqueue put c 1
+ set result [list [myprioqueue peek] [myprioqueue peek] [myprioqueue peek]]
+ myprioqueue destroy
+ set result
+} [list a a a]
+
+test prioqueue-6.2 {peek operation} {
+ prioqueue myprioqueue
+ catch {myprioqueue peek 0} msg
+ myprioqueue destroy
+ set msg
+} {invalid item count 0}
+
+test prioqueue-6.3 {peek operation} {
+ prioqueue myprioqueue
+ catch {myprioqueue peek -1} msg
+ myprioqueue destroy
+ set msg
+} {invalid item count -1}
+
+test prioqueue-6.4 {peek operation} {
+ prioqueue myprioqueue
+ catch {myprioqueue peek} msg
+ myprioqueue destroy
+ set msg
+} {insufficient items in prioqueue to fill request}
+
+test prioqueue-6.5 {peek operation} {
+ prioqueue myprioqueue
+ myprioqueue put a 1
+ catch {myprioqueue peek 2} msg
+ myprioqueue destroy
+ set msg
+} {insufficient items in prioqueue to fill request}
+
+test prioqueue-6.6 {get operation, multiple items} {
+ prioqueue myprioqueue
+ myprioqueue put a 1
+ myprioqueue put b 1
+ myprioqueue put c 1
+ set result [list [myprioqueue peek 3] [myprioqueue get 3]]
+ myprioqueue destroy
+ set result
+} [list [list a b c] [list a b c]]
+
+test prioqueue-6.7 {get operation} {
+ prioqueue myprioqueue
+ catch {myprioqueue get 0} msg
+ myprioqueue destroy
+ set msg
+} {invalid item count 0}
+
+test prioqueue-6.8 {get operation} {
+ prioqueue myprioqueue
+ catch {myprioqueue get -1} msg
+ myprioqueue destroy
+ set msg
+} {invalid item count -1}
+
+test prioqueue-6.9 {get operation} {
+ prioqueue myprioqueue
+ catch {myprioqueue get} msg
+ myprioqueue destroy
+ set msg
+} {insufficient items in prioqueue to fill request}
+
+test prioqueue-6.10 {get operation} {
+ prioqueue myprioqueue
+ myprioqueue put a 1
+ catch {myprioqueue get 2} msg
+ myprioqueue destroy
+ set msg
+} {insufficient items in prioqueue to fill request}
+
+test prioqueue-7.1 {clear operation} {
+ prioqueue myprioqueue
+ myprioqueue put a 1
+ myprioqueue put b 1
+ myprioqueue put c 1
+ set result [list [myprioqueue peek 3]]
+ myprioqueue clear
+ lappend result [myprioqueue size]
+ myprioqueue destroy
+ set result
+} [list [list a b c] 0]
+
+test prioqueue-8.1 {peekpriority operation} {
+ prioqueue myprioqueue
+ myprioqueue put a 1
+ myprioqueue put b 2
+ myprioqueue put c 3
+ set result [list [myprioqueue peekpriority] [myprioqueue peekpriority] [myprioqueue peekpriority]]
+ myprioqueue destroy
+ set result
+} [list 3 3 3]
+
+test prioqueue-8.2 {peekpriority operation, multiple items} {
+ prioqueue myprioqueue
+ myprioqueue put a 1
+ myprioqueue put b 2
+ myprioqueue put c 3
+ set result [myprioqueue peekpriority 3]
+ myprioqueue destroy
+ set result
+} [list 3 2 1]
+
+
+test prioqueue-9.1 {stable ordering if inserting} {
+ prioqueue myprioqueue
+ myprioqueue put a 1
+ myprioqueue put b 2
+ myprioqueue put c 1
+ set result [myprioqueue peek 3]
+ myprioqueue destroy
+ set result
+} [list b a c ]
+
+test prioqueue-9.2 {stable ordering if inserting} {
+ prioqueue -real myprioqueue
+ myprioqueue put a 1.0
+ myprioqueue put b 2.0
+ myprioqueue put c 1.0
+ set result [myprioqueue peek 3]
+ myprioqueue destroy
+ set result
+} [list b a c ]
+
+test prioqueue-9.3 {stable ordering if inserting} {
+ prioqueue -dictionary myprioqueue
+ myprioqueue put a a
+ myprioqueue put b b
+ myprioqueue put c a
+ set result [myprioqueue peek 3]
+ myprioqueue destroy
+ set result
+} [list a c b]
+
+test prioqueue-9.4 {stable ordering if inserting} {
+ prioqueue -ascii myprioqueue
+ myprioqueue put a a
+ myprioqueue put b b
+ myprioqueue put c a
+ set result [myprioqueue peek 3]
+ myprioqueue destroy
+ set result
+} [list a c b]
+
+test prioqueue-10.1 {test inserting} {
+ prioqueue -integer myprioqueue
+ myprioqueue put 1 1
+ myprioqueue put 2 5
+ myprioqueue put 3 7
+ myprioqueue put 4 6
+ myprioqueue put 5 0
+ set result [myprioqueue get 5]
+ myprioqueue destroy
+ set result
+} [list 3 4 2 1 5]
+
+test prioqueue-10.2 {test deleting} {
+ prioqueue -integer myprioqueue
+ myprioqueue put 1 1
+ myprioqueue put 2 2
+ myprioqueue put 3 3
+ myprioqueue put 4 4
+ set sizep [myprioqueue size]
+ myprioqueue remove 2
+ set sizen [myprioqueue size]
+ set result1 [expr {$sizep > $sizen}]
+ set result2 0
+ while {[myprioqueue size] > 0} {
+ set last [myprioqueue get]
+ if {$last == 2} {
+ set result2 1
+ }
+ }
+ myprioqueue destroy
+ set result "$result1 $result2"
+} {1 0}
+
+testsuiteCleanup