-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexpect_debug.exp
More file actions
executable file
·245 lines (205 loc) · 8.4 KB
/
expect_debug.exp
File metadata and controls
executable file
·245 lines (205 loc) · 8.4 KB
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
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
#!/usr/bin/env expect
###[ TEST PROCS ]################################
proc test_level_parsing {ldata_name} {
set CLR_FMT "\033\[0;0m"
set FMT_RED "\033\[0;31m"
set FMT_GRN "\033\[0;32m"
set FMT_BLUE "\033\[0;34m"
set FMT_PURP "\033\[0;35m"
set parsing_list ""
set num_tests_failed 0
set num_tests_per_level 3
set LDATA_NAME_FQ [format {::%s} $ldata_name]
set level_regex { *([[:alpha:]]+) *([[:digit:]]+) *}
foreach {lname} [lsort [array names $LDATA_NAME_FQ]] {
set test_failure_present 0
for {set i 0} {$i < $num_tests_per_level} {incr i} {
set lmax [lindex [lindex [array get $LDATA_NAME_FQ $lname] 1] 1]
set randnum [expr {int(rand() * $lmax)}]
if {$i == 1} {set randnum [expr {$randnum + 40}]}
set testlevel "$lname$randnum"
if {[regexp $level_regex $testlevel -> sub1 sub2]} {
set levelname [string tolower $sub1]
# Strip leading zeroes that can cause unintended octal interpretation
scan $sub2 {%d} levelnum
lappend parsing_list "$testlevel|$levelname|$levelnum"
} else {
set test_failure_present 1
incr num_tests_failed
lappend parsing_list "${FMT_RED}$testlevel|FAILED${CLR_FMT}"
}
}
puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
puts "\[${FMT_PURP}\+${CLR_FMT}] ${FMT_BLUE}TEST LEVEL PARSING${CLR_FMT}"
puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
if {$test_failure_present} {
puts "\[${FMT_RED}FAILED${CLR_FMT}] [join $parsing_list " "]"
} else {
puts "\[${FMT_GRN}PASSED${CLR_FMT}] [join $parsing_list " "]"
}
set parsing_list ""
}
if {$num_tests_failed != 0} {
set tst_word [expr {$num_tests_failed == 1 ? "TEST" : "TESTS"}]
puts "\[${FMT_RED}$num_tests_failed $tst_word FAILED${CLR_FMT}\]"
} else {
puts "\[${FMT_GRN}ALL TESTS PASSED${CLR_FMT}\]"
}
}
proc get_var_info {varLabel varValue labelLen} {
set CLR_FMT "\033\[0;0m"
set FMT_LRED "\033\[0;91m"
set FMT_LGRN "\033\[0;92m"
set FMT_LPURP "\033\[0;95m"
set FMT_LCYAN "\033\[0;96m"
set defaultValLen 48
set defaultLabelLen 40
set type_RE {value is a (.+) with a refcount}
if {$labelLen > $defaultLabelLen} {set labelLen $defaultLabelLen}
set type_str [::tcl::unsupported::representation $varValue]
if {! [regexp $type_RE $type_str -> type]} {
return [format "%-${labelLen}s ${FMT_LRED}%9s${CLR_FMT} %s" $varLabel "unknown" $varValue]
}
if {$type eq "pure string" && [string length $varValue] == 0} {
return [format "%-${labelLen}s ${FMT_LPURP}%9s${CLR_FMT} \"\"" $varLabel "string"]
} elseif {($type eq "pure string" && [string is integer $varValue]) ||
$type eq "integer" ||
$type eq "int"} {
return [format "%-${labelLen}s ${FMT_LGRN}%9s${CLR_FMT} %d" $varLabel "integer" $varValue]
} elseif {($type eq "pure string" && [string is double $varValue]) ||
$type eq "double"} {
return [format "%-${labelLen}s ${FMT_LCYAN}%9s${CLR_FMT} %.2f" $varLabel "double" $varValue]
} elseif {($type eq "pure string" || $type eq "string" || $type eq "path") &&
[string length $varValue] > $defaultValLen} {
set strItem [format "%s..." [string range $varValue 0 [expr {$defaultValLen - 4}]]]
return [format "%-${labelLen}s ${FMT_LPURP}%9s${CLR_FMT} %s" $varLabel "string" $strItem]
} elseif {$type eq "pure string" || $type eq "string" || $type eq "path"} {
return [format "%-${labelLen}s ${FMT_LPURP}%9s${CLR_FMT} %s" $varLabel "string" $varValue]
} elseif {[string length $varValue] > ${defaultValLen}} {
set strItem [format "%s..." [string range $varValue 0 [expr {$defaultValLen - 4}]]]
return [format "%-${labelLen}s %9s %s" $varLabel $type $strItem]
}
set newlist ""
if {$type eq "list" && [llength $varValue] > 1} {
set idx 0
foreach {lst_item} [lrange $varValue 0 end] {
lappend newlist [get_var_info "$varLabel\[$idx\]" $lst_item $labelLen]
incr idx
}
return $newlist
} elseif {$type eq "list" && [llength $varValue] == 1} {
return [get_var_info "$varLabel\[0\]" [lindex $varValue 0] $labelLen]
}
return [format "%-${labelLen}s %9s %s" $varLabel $type $varValue]
}
proc get_max_field_widths {{ns ::}} {
set pat [set ns]::*
set arrVarsList ""
set lstVarsList ""
set genVarsList ""
set maxLensList ""
set arrMaxLabelLen 0
set lstMaxLabelLen 0
set genMaxLabelLen 0
set defaultLabelLen 40
set type_RE {value is a (.+) with a refcount}
foreach {var} [info vars $pat] {
# Handle array vars
if {[array exists $var]} {
# Plus 2 for parentheses
set arrNameLen [expr [string length $var] + 2]
set maxLabelLen 0
foreach {key} [array names $var] {
set currLabelLen [expr [string length $key] + $arrNameLen]
if {$currLabelLen > $maxLabelLen} {set maxLabelLen $currLabelLen}
}
lappend arrVarsList "$var"
if {$maxLabelLen > $arrMaxLabelLen} {set arrMaxLabelLen $maxLabelLen}
continue
}
set type_str [::tcl::unsupported::representation [set $var]]
if {! [regexp $type_RE $type_str -> type]} {
set currLabelLen [string length $var]
if {$currLabelLen > $genMaxLabelLen} {set genMaxLabelLen $currLabelLen}
lappend genVarsList "$var"
continue
}
# Handle list vars
if {$type eq "list" && [llength [set $var]] > 0} {
# Plus 2 for parentheses + max index character-length
set maxLabelLen [expr [string length $var] + 2 + [string length [llength [set $var]]]]
if {$maxLabelLen > $lstMaxLabelLen} {set lstMaxLabelLen $maxLabelLen}
lappend lstVarsList "$var"
continue
}
# Handle all other vars
set currLabelLen [string length $var]
if {$currLabelLen > $genMaxLabelLen} {set genMaxLabelLen $currLabelLen}
lappend genVarsList "$var"
continue
}
set overallMaxLen $arrMaxLabelLen
if {$overallMaxLen < $lstMaxLabelLen} {set overallMaxLen $lstMaxLabelLen}
if {$overallMaxLen < $genMaxLabelLen} {set overallMaxLen $genMaxLabelLen}
if {$overallMaxLen > $defaultLabelLen} {set overallMaxLen $defaultLabelLen}
foreach {item} $arrVarsList {lappend maxLensList [list $item $overallMaxLen]}
foreach {item} $lstVarsList {lappend maxLensList [list $item $overallMaxLen]}
foreach {item} $genVarsList {lappend maxLensList [list $item $overallMaxLen]}
return $maxLensList
}
proc print_all_vars {{ns ::}} {
set pat [set ns]::*
set arrVarsList ""
set lstVarsList ""
set genVarsList ""
set CLR_FMT "\033\[0;0m"
set FMT_BLUE "\033\[0;34m"
set FMT_PURP "\033\[0;35m"
set FMT_LRED "\033\[0;91m"
set type_RE {value is a (.+) with a refcount}
set maxList [concat {*}[get_max_field_widths]]
array set labelLen $maxList
set all_vars [lsort [info vars $pat]]
foreach {var} $all_vars {
# Handle array vars
if {[array exists $var]} {
set arrNames [lsort [array names $var]]
foreach {key} $arrNames {
lappend arrVarsList [get_var_info "$var\($key\)" [lindex [array get $var $key] 1] $labelLen($var)]
}
continue
}
set type_str [::tcl::unsupported::representation [set $var]]
if {! [regexp $type_RE $type_str -> type]} {
lappend genVarsList [format "%${labelLen($var)}s ${FMT_LRED}%s${CLR_FMT} %s" $var "unknown" [set $var]]
continue
}
# Handle list vars
if {$type eq "list" && [llength [set $var]] > 0} {
set idx 0
foreach {lst_item} [set $var] {
lappend lstVarsList [get_var_info "$var\[$idx\]" $lst_item $labelLen($var)]
incr idx
}
continue
} else {
# Handle all other vars
lappend genVarsList [get_var_info "$var" [set $var] $labelLen($var)]
}
}
puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
puts "\[${FMT_PURP}\+${CLR_FMT}] ${FMT_BLUE}ALL VARIABLES${CLR_FMT}"
puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
if {[llength $arrVarsList] > 0} {foreach {arrItem} $arrVarsList {puts $arrItem}}
if {[llength $lstVarsList] > 0} {foreach {lstItem} $lstVarsList {puts $lstItem}}
if {[llength $genVarsList] > 0} {foreach {genItem} $genVarsList {puts $genItem}}
return
}
proc print_all_namespaces {{ns ::}} {
puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
puts "\[${FMT_PURP}\+${CLR_FMT}] ${FMT_BLUE}ALL NAMESPACES${CLR_FMT}"
puts "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
puts [list "namespace" $ns]
foreach child [namespace children $ns] {puts [list "namespace" $child]}
return
}