summaryrefslogtreecommitdiff
path: root/itcl/iwidgets3.0.0/tests/defs
blob: 09dd45b6f23d63ba5050f54313f883350bd35de9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
# This file contains support code for the Tcl test suite.  It is
# normally sourced by the individual files in the test suite before
# they run their tests.  This improved approach to testing was designed
# and initially implemented by Mary Ann May-Pumphrey of Sun Microsystems.
#
# Copyright (c) 1994 Sun Microsystems, Inc.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
# @(#) defs 1.7 94/12/17 15:53:52

package require Iwidgets

if ![info exists VERBOSE] {
    set VERBOSE 0
}
if ![info exists DELAY] {
    set DELAY 0
}
if ![info exists TESTS] {
    set TESTS {}
}

# Some of the tests don't work on some system configurations due to
# configuration quirks, not due to Tk problems;  in order to prevent
# false alarms, these tests are only run in the master development
# directory for Tk.  The presence of a file "doAllTests" in this
# directory is used to indicate that these tests should be run.

set doNonPortableTests [file exists doAllTests]

proc print_verbose {test_name test_description contents_of_test code answer} {
    puts stdout "\n"
    puts stdout "==== $test_name $test_description"
    puts stdout "==== Contents of test case:"
    puts stdout "$contents_of_test"
    if {$code != 0} {
	if {$code == 1} {
	    puts stdout "==== Test generated error:"
	    puts stdout $answer
	} elseif {$code == 2} {
	    puts stdout "==== Test generated return exception;  result was:"
	    puts stdout $answer
	} elseif {$code == 3} {
	    puts stdout "==== Test generated break exception"
	} elseif {$code == 4} {
	    puts stdout "==== Test generated continue exception"
	} else {
	    puts stdout "==== Test generated exception $code;  message was:"
	    puts stdout $answer
	}
    } else {
	puts stdout "==== Result was:"
	puts stdout "$answer"
    }
}

proc test {test_name test_description contents_of_test passing_results} {
    global VERBOSE
    global TESTS
    global DELAY
    if {[string compare $TESTS ""] != 0} then {
	set ok 0
	foreach test $TESTS {
	    if [string match $test $test_name] then {
		set ok 1
		break
	    }
        }
	if !$ok then return
    }
    set code [catch {uplevel $contents_of_test} answer]
    if {$code != 0} {
	print_verbose $test_name $test_description $contents_of_test \
		$code $answer
    } elseif {[string compare $answer $passing_results] == 0} then { 
	if $VERBOSE then {
	    print_verbose $test_name $test_description $contents_of_test \
		    $code $answer
	    puts stdout "++++ $test_name PASSED"
	}
    } else { 
	print_verbose $test_name $test_description $contents_of_test \
		$code $answer 
	puts stdout "---- Result should have been:"
	puts stdout "$passing_results"
	puts stdout "---- $test_name FAILED" 
    }
    after $DELAY
}

#
# Like test, but does reg expr check on the results.
# Useful when the result must follow a pattern but some exact details
# are not necessary, like an internal number appended to a frame, etc.
#
proc test_pattern {test_name test_description contents_of_test passing_results} {
	global VERBOSE
	global TESTS
	if {[string compare $TESTS ""] != 0} then {
		set ok 0
		foreach test $TESTS {
			if [string match $test $test_name] then {
			set ok 1
			break
			}
		}
		if !$ok then return
	}

	set code [catch {uplevel $contents_of_test} answer]

	if {$code != 0} {
		print_verbose $test_name $test_description $contents_of_test \
			$code $answer
	} elseif {[regexp -- [lindex $passing_results 1] [lindex $answer 1]] == 1 } { 
		if $VERBOSE then {
			print_verbose $test_name $test_description $contents_of_test \
				$code $answer
			puts stdout "++++ $test_name PASSED"
		}
	} else { 
		print_verbose $test_name $test_description $contents_of_test \
			$code $answer 
		puts stdout "---- Result should have been:"
		puts stdout "$passing_results"
		puts stdout "**** $test_name FAILED ****" 
	}
}

proc dotests {file args} {
    global TESTS
    set savedTests $TESTS
    set TESTS $args
    source $file
    set TESTS $savedTests
}

# If the main window isn't already mapped (e.g. because the tests are
# being run automatically) , specify a precise size for it so that the
# user won't have to position it manually.

if {![winfo ismapped .]} {
    wm geometry . +0+0
    update
}

# The following code can be used to perform tests involving a second
# process running in the background.

# Locate tktest executable
global argv0
if {0} {
puts "file executable $argv0...[file executable $argv0]"
if { [file executable $argv0] } {
    if { [string index $argv0 0] == "/" } {
	set tktest $argv0
    } else {
	set tktest "[pwd]/$argv0"
    }
} elseif { [file executable ../$argv0] } {
    set tktest "[pwd]/../$argv0"
} else {
    set tktest {}
    puts "Unable to find tktest executable, skipping multiple process tests."
}
} else {set tktest ../tktest}

# Create background process
proc setupbg {{args ""}} {
    global tktest fd bgData
    set fd [open "|$tktest -geometry +0+0 $args" r+]
    puts $fd "puts foo; flush stdout"
    flush $fd
    gets $fd
    fileevent $fd readable bgReady
}

# Send a command to the background process, catching errors and
# flushing I/O channels
proc dobg {command} {
    global fd bgData bgDone
    puts $fd "catch {$command} msg; update; puts \$msg; puts **DONE**; flush stdout"
    flush $fd
    set bgDone 0
    set bgData {}
    tkwait variable bgDone
    set bgData
}

# Data arrived from background process.  Check for special marker
# indicating end of data for this command, and make data available
# to dobg procedure.
proc bgReady {} {
    global fd bgData bgDone
    set x [gets $fd]
    if [eof $fd] {
	fileevent $fd readable {}
	set bgDone 1
    } elseif {$x == "**DONE**"} {
	set bgDone 1
    } else {
	append bgData $x
    }
}

# Exit the background process, and close the pipes
proc cleanupbg {} {
    global fd
    catch {
	puts $fd "exit"
	close $fd
    }
}