# Copyright 2011-2012 Free Software Foundation, Inc.

# This program 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.
#
# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.

set testfile "info-macros"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
get_compiler_info ${binfile}
if [test_compiler_info gcc*] {
    lappend options additional_flags=-g3
} else {
  untested ${testfile}.exp
  return -1
}

if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} $options] } {
    untested ${testfile}.exp
    return -1
}

if ![runto_main] {
    untested ${testfile}.exp
    return -1
}

# Test various error messages.
gdb_test "info macro -- -all" \
	 "The symbol `-all' has no definition .*\r\nat .*$srcfile:\[0-9\]+" \
	 "info macro -- -all"
gdb_test "info macro  -- -all" \
	 "The symbol `-all' has no definition .*\r\nat .*$srcfile:\[0-9\]+" \
	 "info macro  -- -all"

gdb_test "info macro -all --" \
	 "You must follow.*with the name.*you want to see.*\[^\r\n\]*\[\r\n\]" \
	 "info macro -all --"

gdb_test "info macro -all  --" \
	 "You must follow.*with the name.*you want to see.*\[^\r\n\]*\[\r\n\]" \
	 "info macro -all  --"

gdb_test "info macro  -all  --" \
	 "You must follow.*with the name.*you want to see.*\[^\r\n\]*\[\r\n\]" \
	 "info macro  -all  --"

gdb_test "info macro --" \
	 "You must follow.*with the name.*you want to see.*\[^\r\n\]*\[\r\n\]" \
	 "info macro --"

gdb_test "info macro -- " \
	 "You must follow.*with the name.*you want to see.*\[^\r\n\]*\[\r\n\]" \
	 "'info macro -- '"
gdb_test "info macro  -- " \
	 "You must follow.*with the name.*you want to see.*\[^\r\n\]*\[\r\n\]" \
	 "'info macro  -- '"

gdb_test "info macro -invalid-option" \
	 "Unrecognized option.*Try \"help info macro\"\." \
	 "info macro -invalid-option 1"

gdb_test "info macro  -invalid-option" \
	 "Unrecognized option.*Try \"help info macro\"\." \
	 "info macro  -invalid-option"

gdb_test "info macro -invalid-option FOO" \
	 "Unrecognized option.*Try \"help info macro\"\." \
	 "info macro -invalid-option FOO"
gdb_test "info macro  -invalid-option FOO" \
	 "Unrecognized option.*Try \"help info macro\"\." \
	 "info macro  -invalid-option FOO"

# Single macro lookups.
gdb_test "info macro -- FOO" \
	 ".*#define FOO \"hello\"" \
	 "info macro -- FOO"

gdb_test "info macro  -- FOO" \
	 ".*#define FOO \"hello\"" \
	 "info macro  -- FOO"

gdb_test "info macro --  FOO" \
	 ".*#define FOO \"hello\"" \
	 "info macro --  FOO"

gdb_test "info macro FOO" \
	 ".*#define FOO \"hello\"" \
	 "info macro FOO"

gdb_test "info macro  FOO" \
	 ".*#define FOO \"hello\"" \
	 "info macro  FOO"

# Multiple macro lookups.
set test "info macro -a FOO"
set r1 ".*#define FOO \"hello\""
set r2 ".*#define FOO \" \""
set r3 ".*#define FOO \"world\""
set r4 ".*#define FOO\\(a\\) foo = a"
set testname "$test 1"
gdb_test "$test" "$r1$r2$r3$r4" "$testname"

set test "info macro -a -- FOO"
set testname "$test 1"
gdb_test "$test" "$r1$r2$r3$r4" "$testname"

set test "info macro -all -- FOO"
set testname "$test 1"
gdb_test "$test" "$r1$r2$r3$r4" "$testname"

set test "info macro -a  --  FOO"
set testname "$test"
gdb_test "$test" "$r1$r2$r3$r4" "$testname"

set test "info macro  -a  --  FOO"
set testname "$test"
gdb_test "$test" "$r1$r2$r3$r4" "$testname"

set test "info macros"
set r1 ".*#define FOO \"hello\""
set r2 ".*#define ONE"
set r3 ".*\r\n$gdb_prompt"
set testname "$test 2"
gdb_test_multiple "$test" $testname {
  -re "$r1$r2$r3" {
     pass $testname
  }
  -re ".*#define TWO.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define THREE.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define FOUR.*\r\n$gdb_prompt" {
     fail $testname
  }
}
gdb_test "next" ".*" ""

set r1 ".*#define FOO \" \""
set r2 ".*#define ONE"
set r3 ".*#define TWO"
set r4 ".*\r\n$gdb_prompt"
set testname "$test 3"
gdb_test_multiple "$test" $testname {
  -re ".*#define THREE.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define FOUR.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re "$r1$r2$r3$r4" {
     pass $testname
  }
}
gdb_test "next" ".*" ""

# in alpabetical order...
set r1 ".*#define FOO \"world\""
set r2 ".*#define ONE"
set r3 ".*#define THREE"
set r4 ".*#define TWO"
set r5 ".*\r\n$gdb_prompt"
set testname "$test 4"
gdb_test_multiple "$test" $testname {
  -re ".*#define FOUR.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re "$r1$r2$r3$r4$r5" {
     pass $testname
  }
}
# same as above with a linespec.
set test "info macros *\$pc"
gdb_test_multiple "$test" $test {
  -re ".*#define FOUR.*\r\n$gdb_prompt" {
     fail $test
  }
  -re "$r1$r2$r3$r4$r5" {
     pass $test
  }
}
gdb_test "next" ".*" ""

set r1 ".*#define FOO \" \""
set r2 ".*#define ONE"
set r3 ".*#define TWO."
set r4 ".*\r\n$gdb_prompt"
set test "info macros"
set testname "$test 5"
gdb_test_multiple "$test" $test {
  -re ".*#define THREE.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define FOUR.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re "$r1$r2$r3$r4" {
     pass $testname
  }
}
gdb_test "next" ".*" ""
gdb_test "next" ".*" ""

set r1 ".*#define DEF_MACROS"
set r2 ".*\r\n$gdb_prompt"
set testname "$test 6"
gdb_test_multiple "$test" $testname {
  -re ".*#define FOO \" \".*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define FOO \"hello\".*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define FOO \"world\".*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define FOO\\(a\\) foo = a.*" {
     fail $testname
  }
  -re ".*#define ONE.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define TWO.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define THREE.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define FOUR.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re "$r1$r2" {
     pass $testname
  }
}

gdb_test "next" ".*" ""
set r1 ".*#define DEF_MACROS"
set r2 ".*#define FOO\\(a\\) foo = a"
set r3 ".*#define FOUR"
set r4 ".*\r\n$gdb_prompt"
set testname "$test 7"
gdb_test_multiple "$test" $testname {
  -re ".*#define FOO \" \".*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define FOO \"hello\".*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define FOO \"world\".*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define ONE.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define TWO.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define THREE.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re "$r1$r2$r3$r4" {
     pass $testname
  }
}

set test "info macros info-macros.c:42"

set r1 ".*define DEF_MACROS"
set r2 ".*define ONE"
# info macros on the line where the #define or #include is
# fails to find the macro defined (though it works on the next line.)
setup_kfail "gdb/NNNN" *-*-*
gdb_test "$test" "$r1$r2" "$test"
