# Copyright (C) 2018, 2024 Free Software Foundation, Inc. # # This file is part of DejaGnu. # # DejaGnu is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # DejaGnu is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with DejaGnu; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. # This file was written by Jacob Bachmeyer. set header_column_names { PASS FAIL ?PASS ?FAIL UNSUP UNRES UNTEST } set separator_count 0 set re_digit_columns {} for { set i 0 } { $i < 7 } { incr i } { append re_digit_columns {[[:space:]]+([[:digit:]]+)} } set test_names { pass fail kpass kfail xpass xfail unsupported unresolved untested note warning error } set test_results { PASS FAIL KPASS KFAIL XPASS XFAIL UNSUPPORTED UNRESOLVED UNTESTED NOTE WARNING ERROR } foreach name $test_names result $test_results { set fd [open [testsuite file -object -test onetest one-${name}.sum] w] puts $fd "${result}: one test" close $fd } set stty_init { -onlcr } spawn /bin/sh -c \ "cd [testsuite file -object -test onetest]\ && exec $LAUNCHER report-card" # check header expect { -re {^[[:space:]]+_+[\r\n]+} { # discard initial header line exp_continue } -re {^[[:space:]]+/([^\r\n]*)[\r\n]+} { # check column labels foreach want $header_column_names have $expect_out(1,string) { if { $have eq $want } { pass "header item $want" } else { fail "header item $want" } } exp_continue } -re {^[[:space:]]+\|-+[\r\n]+} { incr separator_count } } # check results array unset scoreboard array set scoreboard { pass 0 fail 0 kpass 0 kfail 0 xpass 0 xfail 0 unsupported 0 unresolved 0 untested 0 note 0 warning 0 error 0 } array unset column_subexp_map array set column_subexp_map { pass 2 fail 3 kpass 4 kfail 5 xpass 4 xfail 5 unsupported 6 unresolved 7 untested 8 note 0 warning 9 error 9 } set re_table_row {^[[:space:]]*one-([[:alpha:]]+)[[:space:]]+\|} append re_table_row $re_digit_columns append re_table_row {((?:[[:space:]]+![EW]!)*)[\r\n]+} expect { -re $re_table_row { for { set i 2 } { $i < 9 } { incr i } { if { $expect_out($i,string)\ == ( $i == $column_subexp_map($expect_out(1,string))\ ? 1 : 0 ) } { incr scoreboard($expect_out(1,string)) } else { incr scoreboard($expect_out(1,string)) -1 } } set have_warning_tag [string match "*!W!*" $expect_out(9,string)] set have_error_tag [string match "*!E!*" $expect_out(9,string)] if { $column_subexp_map($expect_out(1,string)) == 9 } { # testing an after-row tag switch -- $expect_out(1,string) { warning { incr scoreboard(warning) \ [expr { $have_warning_tag ? 1 : -1 }] incr scoreboard(error) \ [expr { $have_error_tag ? -1 : 1 }] } error { incr scoreboard(warning) \ [expr { $have_warning_tag ? -1 : 1 }] incr scoreboard(error) \ [expr { $have_error_tag ? 1 : -1 }] } default { error "unknown tag $expect_out(1,string)" } } } else { incr scoreboard(warning) [expr { $have_warning_tag ? -1 : 1 }] incr scoreboard(error) [expr { $have_error_tag ? -1 : 1 }] } exp_continue } -re {^[[:space:]]+\|-+[\r\n]+} { incr separator_count } } foreach result [lsort [array names scoreboard]] { verbose -log "scoreboard($result) = $scoreboard($result)" } foreach result [array names scoreboard] { if { $scoreboard($result) == ( 7 + ( $column_subexp_map($result) == 9\ ? [llength $test_names] : 0 ) ) } { pass "count result $result" } else { fail "count result $result" } } # check totals set column_totals { pad 1 1 2 2 1 1 1 } set re_totals_row {^[[:space:]]+\|} append re_totals_row $re_digit_columns append re_totals_row {[\r\n]+} set totals_matched 0 expect { -re $re_totals_row { for { set i 1 } { $i < 8 } { incr i } { if { [lindex $column_totals $i] == $expect_out($i,string) } { incr totals_matched } } exp_continue } -re {^[[:space:]]+\|-+[\r\n]+} { incr separator_count } -re {^[[:space:]]+\\_+[\r\n]+} { # all done } } if { $totals_matched == 7 } { pass "expected total count" } else { fail "expected total count" } if { $separator_count == 2 } { pass "expected separator lines" } else { fail "expected separator lines" } # Ensure that totals map correctly by reading each file one at a time foreach name $test_names { set separator_count 0 spawn /bin/sh -c \ "cd [testsuite file -object -test onetest]\ && exec $LAUNCHER report-card one-${name}.sum" # skip header expect { -re {^[[:space:]]+_+[\r\n]+} { exp_continue } -re {^[[:space:]]+/([^\r\n]*)[\r\n]+} { exp_continue } -re {^[[:space:]]+\|-+[\r\n]+} { incr separator_count } } # capture the item line expect -re {^one-[^|]+(\|[[:space:][:digit:]]*)[[:space:]!EW]*[\r\n]+} { regsub {[[:space:]]*$} $expect_out(1,string) "" item_line } # skip the separator expect -re {^[[:space:]]+\|-+[\r\n]+} { incr separator_count } # capture the totals line expect -re {^[[:space:]]+(\|[[:space:][:digit:]]*)[\r\n]+} { regsub {[[:space:]]*$} $expect_out(1,string) "" totals_line } # skip the footer expect -re {.+} { exp_continue } # were item and totals lines even produced? if { [info exists item_line] && [info exists totals_line] } { # do the item and totals lines match? if { $item_line eq $totals_line } { pass "verify total for $name" } else { fail "verify total for $name" } } else { # either an item line or the totals line was not seen unresolved "verify total for $name" } if { $separator_count == 2 } { pass "expected separator lines for $name" } else { fail "expected separator lines for $name" } } #EOF