# 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 ${binfile}] {
    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 }
}
