* lib/gdb.exp (gdb_test_list_exact): New function.
authorDoug Evans <dje@google.com>
Wed, 7 Jul 2010 18:49:51 +0000 (18:49 +0000)
committerDoug Evans <dje@google.com>
Wed, 7 Jul 2010 18:49:51 +0000 (18:49 +0000)
* gdb.base/default.exp (show convenience): Call it, add tests for
$_sdata = void, $_thread = 0.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/default.exp
gdb/testsuite/lib/gdb.exp

index f1b58b409016d20501afe678e4601c5f58d6ae4d..5d29407f75b61b5a0284125491a8a8d89538555e 100644 (file)
@@ -1,3 +1,9 @@
+2010-07-07  Doug Evans  <dje@google.com>
+
+       * lib/gdb.exp (gdb_test_list_exact): New function.
+       * gdb.base/default.exp (show convenience): Call it, add tests for
+       $_sdata = void, $_thread = 0.
+
 2010-07-05  Jan Kratochvil  <jan.kratochvil@redhat.com>
            Joel Brobecker  <brobecker@adacore.com>
 
index 283745abffba2005ae4c4bee8a18f33949e6f6e6..64d4c9da6c34ff020bb7147cabcb4ba5e7a25680 100644 (file)
@@ -567,8 +567,19 @@ gdb_test "show commands" ".*" "show commands"
 gdb_test "show complaints" "Max number of complaints about incorrect symbols is 0." "show complaints"
 #test show confirm
 gdb_test "show confirm" "Whether to confirm potentially dangerous operations is o\[a-z\]*." "show confirm"
+
 #test show convenience
-gdb_test "show convenience" "\\\$_siginfo = void" "show convenience"
+# This is tricker as there are multiple internal convenience vars and we
+# can't assume any particular order.
+gdb_test_list_exact "show convenience" "show convenience" \
+    {[^\r\n]+[\r\n]+} \
+    {[^\r\n]+} \
+    { \
+       {$_sdata = void} \
+       {$_siginfo = void} \
+       {$_thread = 0} \
+    }
+
 #test show directories
 gdb_test "show directories" "Source directories searched: .cdir\[:;\].cwd" "show directories"
 #test show editing
index d702dee810342c9c445ddab338534491729f19fa..b5b33628f9be9f3b569f9060d8e7f2bef017d94d 100644 (file)
@@ -1036,6 +1036,59 @@ proc gdb_test_exact { args } {
 
     return [gdb_test $command $pattern $message]
 }
+
+# Wrapper around gdb_test_multiple that looks for a list of expected
+# output elements, but which can appear in any order.
+# CMD is the gdb command.
+# NAME is the name of the test.
+# ELM_FIND_REGEXP specifies how to partition the output into elements to
+# compare.
+# ELM_EXTRACT_REGEXP specifies the part of ELM_FIND_REGEXP to compare.
+# RESULT_MATCH_LIST is a list of exact matches for each expected element.
+# All elements of RESULT_MATCH_LIST must appear for the test to pass.
+#
+# A typical use of ELM_FIND_REGEXP/ELM_EXTRACT_REGEXP is to extract one line
+# of text per element and then strip trailing \r\n's.
+# Example:
+# gdb_test_list_exact "foo" "bar" \
+#     {[^\r\n]+[\r\n]+} \
+#     {[^\r\n]+} \
+#     { \
+#      {expected result 1} \
+#      {expected result 2} \
+#     }
+
+proc gdb_test_list_exact { cmd name elm_find_regexp elm_extract_regexp result_match_list } {
+    global gdb_prompt
+
+    set matches [lsort $result_match_list]
+    set seen {}
+    gdb_test_multiple $cmd $name {
+       "$cmd\[\r\n\]" { exp_continue }
+       -re $elm_find_regexp {
+           set str $expect_out(0,string)
+           verbose -log "seen: $str" 3
+           regexp -- $elm_extract_regexp $str elm_seen
+           verbose -log "extracted: $elm_seen" 3
+           lappend seen $elm_seen
+           exp_continue
+       }
+       -re "$gdb_prompt $" {
+           set failed ""
+           foreach got [lsort $seen] have $matches {
+               if {![string equal $got $have]} {
+                   set failed $have
+                   break
+               }
+           }
+           if {[string length $failed] != 0} {
+               fail "$name ($failed not found)"
+           } else {
+               pass $name
+           }
+       }
+    }
+}
 \f
 proc gdb_reinitialize_dir { subdir } {
     global gdb_prompt