| namespace eval ::command { |
| namespace export test_standardUsage |
| |
| variable _action "undefined" |
| variable _subject "undefined" |
| variable _test "undefined" |
| } |
| |
| ############################################################################### |
| |
| proc ::command::beginAction { args } { |
| variable _section |
| |
| set _action [lindex $args 0] |
| set _subject [lrange $args 1 end] |
| |
| clone_output "++ $_action: $_subject" |
| } |
| |
| proc ::command::beginTest { args } { |
| variable _test |
| set _test [lindex $args 0] |
| } |
| |
| ############################################################################### |
| |
| proc ::command::exec { args } { |
| set status [lindex $args 0] |
| set exe [lindex $args 1] |
| set xargs [lrange $args 2 end] |
| |
| if { [llength $xargs] == 0 } { |
| beginAction "EXECUTE" $exe |
| set rv [catch {::exec $::objdir/$exe} output] |
| } else { |
| beginAction "EXECUTE" $exe [join $xargs] |
| set rv [catch {::exec $::objdir/$exe [join $xargs]} output] |
| } |
| |
| set output [split $output "\n"] |
| |
| beginTest "exit=$status" |
| if { $rv } { |
| set errg [lindex $::errorCode 0] |
| set errc [lindex $::errorCode 2] |
| if { $errg == "CHILDSTATUS" && $errc == $status } { |
| pass |
| return [list 0 $output] |
| } else { |
| fail "exit=$errc" |
| return [list 1 $output] |
| } |
| } else { |
| if { $status == 0 } { |
| pass |
| return [list 0 $output] |
| } else { |
| fail "exit=0" |
| return [list 1 $output] |
| } |
| } |
| } |
| |
| ############################################################################### |
| |
| proc ::command::fail { args } { |
| variable _test |
| |
| set text [lindex $args 0] |
| set input [lindex $args 1] |
| |
| set max [llength $input] |
| |
| ::fail $_test |
| if { $max == 0 } { |
| send_user -- "-- $text\n" |
| return |
| } |
| |
| if { $max == 1 } { |
| send_user -- "-- $text (1 line of match text follows)\n" |
| } else { |
| send_user -- "-- $text ($max lines of match text follows)\n" |
| } |
| |
| for { set i 0 } { $i < $max } { incr i } { |
| set line [lindex $input $i] |
| send_user -- "-- | $line\n" |
| } |
| } |
| |
| proc ::command::pass { args } { |
| variable _test |
| ::pass $_test |
| } |
| |
| ############################################################################### |
| |
| proc ::command::matchListAny { args } { |
| set rx [lindex $args 0] |
| set lines [lindex $args 1] |
| |
| beginTest "match: $rx" |
| set max [llength $lines] |
| for { set i 0 } { $i < $max } { incr i } { |
| set line [lindex $lines $i] |
| |
| if { [regexp $rx $line] } { |
| pass |
| return |
| } |
| } |
| |
| fail "no match" $lines |
| } |
| |
| proc ::command::matchListLine { args } { |
| set rx [lindex $args 0] |
| set lines [lindex $args 1] |
| set idx [lindex $args 2] |
| |
| set line [lindex $lines $idx] |
| |
| beginTest "match: $rx" |
| if { [regexp $rx $line] } { |
| pass |
| } else { |
| fail "no match" [list $line] |
| } |
| } |
| |
| ############################################################################### |
| |
| proc ::command::test_standardUsage { args } { |
| set exe [lindex $args 0] |
| |
| # noargs |
| set rv [exec 1 $exe] |
| matchListLine {^Usage: \S+} [lindex $rv 1] 0 |
| matchListLine {^Try.*-h.*--help} [lindex $rv 1] 1 |
| |
| # -h |
| set rv [exec 0 $exe -h] |
| matchListLine {^Usage: \S+} [lindex $rv 1] 0 |
| matchListAny {\s+--help} [lindex $rv 1] |
| matchListAny {\s+--version} [lindex $rv 1] |
| |
| # --help |
| set rv [exec 0 $exe --help] |
| matchListLine {^Usage: \S+} [lindex $rv 1] 0 |
| matchListAny {\s+--help} [lindex $rv 1] |
| matchListAny {\s+--version} [lindex $rv 1] |
| matchListAny {^VERBOSE LEVELS} [lindex $rv 1] |
| |
| # --version |
| set rv [exec 0 $exe --version] |
| matchListLine {^\S+\s-\s\S+} [lindex $rv 1] 0 |
| |
| # --versionx |
| set rv [exec 0 $exe --versionx] |
| matchListAny {^utility:\s+\S+} [lindex $rv 1] |
| matchListAny {^product:\s+\S+} [lindex $rv 1] |
| matchListAny {^version:\s+\S+} [lindex $rv 1] |
| |
| # bogus short-option |
| set rv [exec 1 $exe "-*" ] |
| matchListLine {invalid} [lindex $rv 1] 0 |
| |
| # bogus long-option |
| set rv [exec 1 $exe --bogusLongOption ] |
| matchListLine {unrecognized} [lindex $rv 1] 0 |
| } |