# This testcase is part of GDB, the GNU debugger.

# Copyright 1998-1999, 2004, 2007-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/>.

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

# Tests for correctenss of logical operators, associativity and
# precedence with integer type variables


#
# test running programs
#

set testfile "int-type"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } {
    untested logical.exp
    return -1
}

if [get_compiler_info] {
    return -1;
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}


#
# 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
}

proc evaluate { vars ops } {
    for {set vari 0} {$vari < [llength $vars]} {incr vari} {
	set var [lindex $vars $vari]
	for {set opi 0} {$opi < [llength $ops]} {incr opi} {
	    set op [lindex [lindex $ops $opi] 0]
	    set val [lindex [lindex $ops $opi] [expr $vari + 1]]
	    gdb_test "print $var, $op" " = $val" "evaluate $op; variables $var; expecting $val"
	}
    }
}

# Unary

evaluate {
    {x = 0} {x = 1}
} {
    { {x}   0 1 }
    { {!x}  1 0 }
    { {!!x} 0 1 }
}

# Binary (with unary)

evaluate {
    {x = 0, y = 0} {x = 0, y = 1} {x = 1, y = 0} {x = 1, y = 1}
} {
    { {x && y}   0 0 0 1 }
    { {!x && y}  0 1 0 0 }
    { {x && !y}  0 0 1 0 }
    { {!x && !y} 1 0 0 0 }

    { {x || y}   0 1 1 1 }
    { {!x || y}  1 1 0 1 }
    { {x || !y}  1 0 1 1 }
    { {!x || !y} 1 1 1 0 }

    { {x < y}    0 1 0 0 }
    { {x <= y}   1 1 0 1 }
    { {x == y}   1 0 0 1 }
    { {x != y}   0 1 1 0 }
    { {x >= y}   1 0 1 1 }
    { {x > y}    0 0 1 0 }
}

# Full table of &&, || combinations, followed by random mix of unary ops

evaluate {
    {x = 0, y = 0, z = 0} {x = 0, y = 0, z = 1} {x = 0, y = 1, z = 0} {x = 0, y = 1, z = 1}
    {x = 1, y = 0, z = 0} {x = 1, y = 0, z = 1} {x = 1, y = 1, z = 0} {x = 1, y = 1, z = 1}
} {
    { {x && y && z}    0 0 0 0  0 0 0 1 }
    { {x || y && z}    0 0 0 1  1 1 1 1 }
    { {x && y || z}    0 1 0 1  0 1 1 1 }
    { {x || y || z}    0 1 1 1  1 1 1 1 }

    { {x || !y && z}   0 1 0 0  1 1 1 1 }
    { {!x || y && z}   1 1 1 1  0 0 0 1 }
    { {!x || y && !z}  1 1 1 1  0 0 1 0 }
}

# More complex operations

evaluate {
    {x = 1, y = 2, w = 3, z = 3}
    {x = 1, y = 2, w = 1, z = 3}
    {x = 2, y = 2, w = 2, z = 3}
} {
    { {x > y || w == z}   1 0 0 }
    { {x >= y && w != z}  0 0 1 }
    { {! x > y || w + z}  1 1 1 }
}
