| [25] | 1 | # This file is a Tcl script to test out the the procedures in file | 
|---|
 | 2 | # tkIndexObj.c, which implement indexed table lookups.  The tests here | 
|---|
 | 3 | # are organized in the standard fashion for Tcl tests. | 
|---|
 | 4 | # | 
|---|
 | 5 | # Copyright (c) 1997 Sun Microsystems, Inc. | 
|---|
 | 6 | # Copyright (c) 1998-1999 by Scriptics Corporation. | 
|---|
 | 7 | # | 
|---|
 | 8 | # See the file "license.terms" for information on usage and redistribution | 
|---|
 | 9 | # of this file, and for a DISCLAIMER OF ALL WARRANTIES. | 
|---|
 | 10 | # | 
|---|
 | 11 | # RCS: @(#) $Id: indexObj.test,v 1.15 2006/04/06 18:57:58 dgp Exp $ | 
|---|
 | 12 |  | 
|---|
 | 13 | if {[lsearch [namespace children] ::tcltest] == -1} { | 
|---|
 | 14 |     package require tcltest | 
|---|
 | 15 |     namespace import -force ::tcltest::* | 
|---|
 | 16 | } | 
|---|
 | 17 |  | 
|---|
 | 18 | testConstraint testindexobj [llength [info commands testindexobj]] | 
|---|
 | 19 |  | 
|---|
 | 20 | test indexObj-1.1 {exact match} testindexobj { | 
|---|
 | 21 |     testindexobj 1 1 xyz abc def xyz alm | 
|---|
 | 22 | } {2} | 
|---|
 | 23 | test indexObj-1.2 {exact match} testindexobj { | 
|---|
 | 24 |     testindexobj 1 1 abc abc def xyz alm | 
|---|
 | 25 | } {0} | 
|---|
 | 26 | test indexObj-1.3 {exact match} testindexobj { | 
|---|
 | 27 |     testindexobj 1 1 alm abc def xyz alm | 
|---|
 | 28 | } {3} | 
|---|
 | 29 | test indexObj-1.4 {unique abbreviation} testindexobj { | 
|---|
 | 30 |     testindexobj 1 1 xy abc def xalb xyz alm | 
|---|
 | 31 | } {3} | 
|---|
 | 32 | test indexObj-1.5 {multiple abbreviations and exact match} testindexobj { | 
|---|
 | 33 |     testindexobj 1 1 x abc def xalb xyz alm x | 
|---|
 | 34 | } {5} | 
|---|
 | 35 | test indexObj-1.6 {forced exact match} testindexobj { | 
|---|
 | 36 |     testindexobj 1 0 xy abc def xalb xy alm | 
|---|
 | 37 | } {3} | 
|---|
 | 38 | test indexObj-1.7 {forced exact match} testindexobj { | 
|---|
 | 39 |     testindexobj 1 0 x abc def xalb xyz alm x | 
|---|
 | 40 | } {5} | 
|---|
 | 41 | test indexObj-1.8 {exact match of empty values} testindexobj { | 
|---|
 | 42 |     testindexobj 1 1 {} a aa aaa {} b bb bbb | 
|---|
 | 43 | } 3 | 
|---|
 | 44 | test indexObj-1.9 {exact match of empty values} testindexobj { | 
|---|
 | 45 |     testindexobj 1 0 {} a aa aaa {} b bb bbb | 
|---|
 | 46 | } 3 | 
|---|
 | 47 |  | 
|---|
 | 48 | test indexObj-2.1 {no match} testindexobj { | 
|---|
 | 49 |     list [catch {testindexobj 1 1 dddd abc def xalb xyz alm x} msg] $msg | 
|---|
 | 50 | } {1 {bad token "dddd": must be abc, def, xalb, xyz, alm, or x}} | 
|---|
 | 51 | test indexObj-2.2 {no match} testindexobj { | 
|---|
 | 52 |     list [catch {testindexobj 1 1 dddd abc} msg] $msg | 
|---|
 | 53 | } {1 {bad token "dddd": must be abc}} | 
|---|
 | 54 | test indexObj-2.3 {no match: no abbreviations} testindexobj { | 
|---|
 | 55 |     list [catch {testindexobj 1 0 xy abc def xalb xyz alm} msg] $msg | 
|---|
 | 56 | } {1 {bad token "xy": must be abc, def, xalb, xyz, or alm}} | 
|---|
 | 57 | test indexObj-2.4 {ambiguous value} testindexobj { | 
|---|
 | 58 |     list [catch {testindexobj 1 1 d dumb daughter a c} msg] $msg | 
|---|
 | 59 | } {1 {ambiguous token "d": must be dumb, daughter, a, or c}} | 
|---|
 | 60 | test indexObj-2.5 {omit error message} testindexobj { | 
|---|
 | 61 |     list [catch {testindexobj 0 1 d x} msg] $msg | 
|---|
 | 62 | } {1 {}} | 
|---|
 | 63 | test indexObj-2.6 {TCL_EXACT => no "ambiguous" error message} testindexobj { | 
|---|
 | 64 |     list [catch {testindexobj 1 0 d dumb daughter a c} msg] $msg | 
|---|
 | 65 | } {1 {bad token "d": must be dumb, daughter, a, or c}} | 
|---|
 | 66 | test indexObj-2.7 {exact match of empty values} testindexobj { | 
|---|
 | 67 |     list [catch {testindexobj 1 1 {} a b c} msg] $msg | 
|---|
 | 68 | } {1 {ambiguous token "": must be a, b, or c}} | 
|---|
 | 69 | test indexObj-2.8 {exact match of empty values: singleton case} testindexobj { | 
|---|
 | 70 |     list [catch {testindexobj 1 0 {} a} msg] $msg | 
|---|
 | 71 | } {1 {bad token "": must be a}} | 
|---|
 | 72 | test indexObj-2.9 {non-exact match of empty values: singleton case} testindexobj { | 
|---|
 | 73 |     # NOTE this is a special case.  Although the empty string is a | 
|---|
 | 74 |     # unique prefix, we have an established history of rejecting | 
|---|
 | 75 |     # empty lookup keys, requiring any unique prefix match to have | 
|---|
 | 76 |     # at least one character. | 
|---|
 | 77 |     list [catch {testindexobj 1 1 {} a} msg] $msg | 
|---|
 | 78 | } {1 {bad token "": must be a}} | 
|---|
 | 79 |  | 
|---|
 | 80 | test indexObj-3.1 {cache result to skip next lookup} testindexobj { | 
|---|
 | 81 |     testindexobj check 42 | 
|---|
 | 82 | } {42} | 
|---|
 | 83 |  | 
|---|
 | 84 | test indexObj-4.1 {free old internal representation} testindexobj { | 
|---|
 | 85 |     set x {a b} | 
|---|
 | 86 |     lindex $x 1 | 
|---|
 | 87 |     testindexobj 1 1 $x abc def {a b} zzz | 
|---|
 | 88 | } {2} | 
|---|
 | 89 |  | 
|---|
 | 90 | test indexObj-5.1 {Tcl_WrongNumArgs} testindexobj { | 
|---|
 | 91 |     testwrongnumargs 1 "?option?" mycmd | 
|---|
 | 92 | } "wrong # args: should be \"mycmd ?option?\"" | 
|---|
 | 93 | test indexObj-5.2 {Tcl_WrongNumArgs} testindexobj { | 
|---|
 | 94 |     testwrongnumargs 2 "bar" mycmd foo | 
|---|
 | 95 | } "wrong # args: should be \"mycmd foo bar\"" | 
|---|
 | 96 | test indexObj-5.3 {Tcl_WrongNumArgs} testindexobj { | 
|---|
 | 97 |     testwrongnumargs 0 "bar" mycmd foo | 
|---|
 | 98 | } "wrong # args: should be \"bar\"" | 
|---|
 | 99 | test indexObj-5.4 {Tcl_WrongNumArgs} testindexobj { | 
|---|
 | 100 |     testwrongnumargs 0 "" mycmd foo | 
|---|
 | 101 | } "wrong # args: should be \"\"" | 
|---|
 | 102 | test indexObj-5.5 {Tcl_WrongNumArgs} testindexobj { | 
|---|
 | 103 |     testwrongnumargs 1 "" mycmd foo | 
|---|
 | 104 | } "wrong # args: should be \"mycmd\"" | 
|---|
 | 105 | test indexObj-5.6 {Tcl_WrongNumArgs} testindexobj { | 
|---|
 | 106 |     testwrongnumargs 2 "" mycmd foo | 
|---|
 | 107 | } "wrong # args: should be \"mycmd foo\"" | 
|---|
 | 108 | # Contrast this with test proc-3.6; they have to be like this because | 
|---|
 | 109 | # of [Bug 1066837] so Itcl won't break. | 
|---|
 | 110 | test indexObj-5.7 {Tcl_WrongNumArgs} testindexobj { | 
|---|
 | 111 |     testwrongnumargs 2 "fee fi" "fo fum" foo bar | 
|---|
 | 112 | } "wrong # args: should be \"fo fum foo fee fi\"" | 
|---|
 | 113 |  | 
|---|
 | 114 | test indexObj-6.1 {Tcl_GetIndexFromObjStruct} testindexobj { | 
|---|
 | 115 |     set x a | 
|---|
 | 116 |     testgetindexfromobjstruct $x 0 | 
|---|
 | 117 | } "wrong # args: should be \"testgetindexfromobjstruct a 0\"" | 
|---|
 | 118 | test indexObj-6.2 {Tcl_GetIndexFromObjStruct} testindexobj { | 
|---|
 | 119 |     set x a | 
|---|
 | 120 |     testgetindexfromobjstruct $x 0 | 
|---|
 | 121 |     testgetindexfromobjstruct $x 0 | 
|---|
 | 122 | } "wrong # args: should be \"testgetindexfromobjstruct a 0\"" | 
|---|
 | 123 | test indexObj-6.3 {Tcl_GetIndexFromObjStruct} testindexobj { | 
|---|
 | 124 |     set x c | 
|---|
 | 125 |     testgetindexfromobjstruct $x 1 | 
|---|
 | 126 | } "wrong # args: should be \"testgetindexfromobjstruct c 1\"" | 
|---|
 | 127 | test indexObj-6.4 {Tcl_GetIndexFromObjStruct} testindexobj { | 
|---|
 | 128 |     set x c | 
|---|
 | 129 |     testgetindexfromobjstruct $x 1 | 
|---|
 | 130 |     testgetindexfromobjstruct $x 1 | 
|---|
 | 131 | } "wrong # args: should be \"testgetindexfromobjstruct c 1\"" | 
|---|
 | 132 |  | 
|---|
 | 133 | # cleanup | 
|---|
 | 134 | ::tcltest::cleanupTests | 
|---|
 | 135 | return | 
|---|
 | 136 |  | 
|---|
 | 137 | # Local Variables: | 
|---|
 | 138 | # mode: tcl | 
|---|
 | 139 | # End: | 
|---|