# Copyright 1998-2021 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/>.

# This file was written by Elena Zannoni (ezannoni@cygnus.com)

# This file is part of the gdb testsuite
#
# tests for correctenss of relational operators, associativity and precedence
# with integer type variables
# 

#
# test running programs
#

if { [prepare_for_testing "failed to prepare" relational int-type.c {debug nowarnings}] } {
    return -1
}

if [get_compiler_info] {
    return -1
}

#
# set it up at a breakpoint so we can play with the variable values
#

if ![runto_main] then {
    perror "couldn't run to breakpoint"
    continue
}

#
# test expressions with "int" types
#

with_test_prefix "int types" {

    gdb_test_no_output "set variable x=14" "set variable x=14"
    gdb_test_no_output "set variable y=2" "set variable y=2"
    gdb_test_no_output "set variable z=2" "set variable z=2"
    gdb_test_no_output "set variable w=3" "set variable w=3"

    gdb_test "print x" " = 14" "print value of x"

    gdb_test "print y" " = 2" "print value of y"

    gdb_test "print z" " = 2" "print value of z"

    gdb_test "print w" " = 3" "print value of w"

    gdb_test "print x < y" "$false" "print value of x<y"

    gdb_test "print x <= y" "$false" "print value of x<=y"

    gdb_test "print x > y" "$true" "print value of x>y"

    gdb_test "print x >= y" "$true" "print value of x>=y"

    gdb_test "print x == y" "$false" "print value of x==y"

    gdb_test "print x != y" "$true" "print value of x!=y"
}

# Test associativity of <, >, <=, >=, ==, !=
with_test_prefix "basic associativity" {

    gdb_test_no_output "set variable x=3" "set variable x=3"
    gdb_test_no_output "set variable y=5" "set variable y=5"
    gdb_test_no_output "set variable z=2" "set variable z=2"

    gdb_test "print x < y < z" "$true" "print value of x<y<z"

    gdb_test "print x <= y <= z" "$true" "print value of x<=y<=z"

    gdb_test "print x > y > z" "$false" "print value of x>y>z"

    gdb_test "print x >= y >= z" "$false" "print value of x>=y>=z"

    gdb_test_no_output "set variable x=2" "set variable x=2"
    gdb_test_no_output "set variable y=2" "set variable y=2"
    gdb_test_no_output "set variable z=1" "set variable z=1"

    gdb_test "print x == y == z" "$true" "print value of x==y==z"

    gdb_test_no_output "set variable z=0" "set variable z"

    gdb_test "print x != y != z" "$false" "print value of x!=y!=z"
}

# Test precedence rules on pairs of relational operators.  The use of
# with_test_prefix with keys 1, 2, 3, etc is only to ensure that the
# test names are unique.  Each nested group of tests starts at a
# location where we are setting a variable to a value it has had in
# the past, which would result in a test name repeating.
with_test_prefix "pair associativity" {
    with_test_prefix "1" {
	gdb_test_no_output "set variable x=0" "set variable x=0"
	gdb_test_no_output "set variable y=2" "set variable y=2"
	gdb_test_no_output "set variable z=2" "set variable z=2"

	gdb_test "print x < y == z" "$false" "print value of x<y==z"

	# 0  2  2
	gdb_test "print x < y != z" "$true" "print value of x<y!=z"

	gdb_test_no_output "set variable x=2" "set variable x=2"
	gdb_test_no_output "set variable y=3" "set variable y=3"
	gdb_test_no_output "set variable z=1" "set variable z=1"

	# 2 3 1
	gdb_test "print x < y <= z" "$true" "print value of x<y<=z"

	# 2 3 1
	gdb_test "print x < y >= z" "$true" "print value of x<y>=z"

	gdb_test_no_output "set variable z=0" " set variable z=0"

	# 2 3 0
	gdb_test "print x < y > z" "$true" "print value of x<y>z"

	gdb_test_no_output "set variable x=1" " set variable x=1"

	# 1 3 0
	gdb_test "print x > y >= z" "$true" "print value of x>y>=z"
    }

    with_test_prefix "2" {
	gdb_test_no_output "set variable z=2" " set variable z=2"

	# 1 3 2
	gdb_test "print x > y == z" "$false" "print value of x>y==z"

	gdb_test_no_output "set variable x=2" " set variable x=2"
	gdb_test_no_output "set variable z=0" " set variable z=0"

	# 2 3 0
	gdb_test "print x > y != z" "$false" "print value of x>y!=z"

	gdb_test_no_output "set variable x=4" "set variable x=4"

	# 4 3 0
	gdb_test "print x > y <= z" "$false" "print value of x>y<=z"

	# 4 3 0
	gdb_test "print x >= y == z" "$false" "print value of x>=y==z"
    }

    with_test_prefix "3" {
	gdb_test_no_output "set variable x=2" " set variable x=2"

	# 2 3 0
	gdb_test "print x >= y != z" "$false" "print value of x>=y!=z"

	gdb_test_no_output "set variable x=0" " set variable x=0"
	gdb_test_no_output "set variable z=4" " set variable z=4"

	# 0 3 4
	gdb_test "print x >= y <= z" "$true" "print value of x>=y<=z"

	# 0 3 4
	gdb_test "print x <= y == z" "$false" "print value of x<=y==z"
    }

    with_test_prefix "4" {
	gdb_test_no_output "set variable x=2" " set variable x=2"

	# 2 3 4
	gdb_test "print x <= y != z" "$true" "print value of x<=y!=z"

	# 2 3 4
	gdb_test "print x == y != z" "$true" "print value of x==y!=z"
    }
}

# test use of parenthesis to enforce different order of evaluation
with_test_prefix "with parenthesis" {
    gdb_test_no_output "set variable z=0" " set variable z=0"

    # 2 3 0
    gdb_test "print x >= (y < z)" "$true" "print value of x>=(y<z)"

    # 2 3 0
    gdb_test "print x >= (y != z)" "$true" "print value of x>=(y!=z)"

    # 2 3 0
    gdb_test "print x == (y == z)" "$false" "print value of x==(y==z)"

    gdb_test_no_output "set variable x=1" " set variable x=1"
    gdb_test_no_output "set variable z=4" " set variable z=4"

    # 1 3 4
    gdb_test "print (x == y) < z" "$true" "print value of (x==y)<z"
}

