# 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
if ![test_compiler_info gcc*] {
  untested ${testfile}.exp
  return -1
}

set options "debug additional_flags=-g3"

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"
