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

# Copyright 1998, 1999, 2004 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

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

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


if $tracelevel then {
    strace $tracelevel
}

#
# test running programs
#
set prms_id 0
set bug_id 0

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

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } {
    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

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