# Copyright (C) 1995, 1997 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.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# This file tests various Chill values, expressions, and types.

if $tracelevel then {
	strace $tracelevel
}

if [skip_chill_tests] then { continue }

set testfile "powerset"
set srcfile ${srcdir}/$subdir/${testfile}.ch
set binfile ${objdir}/${subdir}/${testfile}.exe
if  { [compile "${srcfile} -g -w -o ${binfile} ${CHILL_RT0} ${CHILL_LIB}"] != "" } {
    perror "Couldn't compile ${srcfile}"
    return -1
}

# Set the current language to chill.  This counts as a test.  If it
# fails, then we skip the other tests.

proc set_lang_chill {} {
    global gdb_prompt
    global binfile objdir subdir

    verbose "loading file '$binfile'"
    gdb_load $binfile
    send_gdb "set language chill\n"
    gdb_expect {
	-re ".*$gdb_prompt $" {}
	timeout { fail "set language chill (timeout)" ; return 0 }
    }

    send_gdb "show language\n"
    gdb_expect {
	-re ".* source language is \"chill\".*$gdb_prompt $" {
	    pass "set language to \"chill\""
	    send_gdb "break xx_\n"
	    gdb_expect {
		-re ".*$gdb_prompt $" {
		    send_gdb "run\n" 
		    gdb_expect -re ".*$gdb_prompt $" {}
		    return 1
		}
		timeout {
		    fail "can't set breakpoint (timeout)"
		    return 0
		}
	    }
	}
	-re ".*$gdb_prompt $" {
	    fail "setting language to \"chill\""
	    return 0
	}
	timeout {
	    fail "can't show language (timeout)"
	    return 0
	}
    }
}

# Testing printing of a specific value.  Increment passcount for
# success or issue fail message for failure.  In both cases, return
# a 1 to indicate that more tests can proceed.  However a timeout
# is a serious error, generates a special fail message, and causes
# a 0 to be returned to indicate that more tests are likely to fail
# as well.
#
# Args are:
#
#	First one is string to send_gdb to gdb
#	Second one is string to match gdb result to
#	Third one is an optional message to be printed

proc test_print_accept { args } {
    global gdb_prompt
    global passcount
    global verbose

    if [llength $args]==3 then {
	set message [lindex $args 2]
    } else {
	set message [lindex $args 0]
    }
    set sendthis [lindex $args 0]
    set expectthis [lindex $args 1]
    set result [gdb_test $sendthis ".* = ${expectthis}" $message]
    if $result==0 {incr passcount}
    return $result
}

proc test_card {} {
    global passcount

    verbose "testing builtin CARD"
    set passcount 0

    # discrete mode names
    test_print_accept "print card(v_ps1)" "4"
    test_print_accept "print card(v_ps2)" "15"
    test_print_accept "print card(v_ps3)" "4"
    test_print_accept "print card(v_ps4)" "11"
    test_print_accept "print card(v_ps5)" "1"
    test_print_accept "print card(v_ps51)" "0"
    test_print_accept "print card(v_ps6)" "101"

    # a failure
    setup_xfail "*-*-*"
    test_print_accept "print card(m_ps1)" "typename in invalid context"
}

proc test_min {} {
    global passcount

    verbose "testing builtin MIN"
    set passcount 0

    # discrete mode names
    test_print_accept "print min(v_ps1)" "1"
    test_print_accept "print min(v_ps2)" "-100"
    test_print_accept "print min(v_ps3)" "bb"
    test_print_accept "print min(v_ps4)" "','"
    test_print_accept "print min(v_ps5)" "FALSE"
    test_print_accept "print min(v_ps6)" "-50"

    # a failure
    setup_xfail "*-*-*"
    test_print_accept "print min(v_ps51)" "MIN for empty powerset"
    setup_xfail "*-*-*"
    test_print_accept "print min(m_ps1)" "typename in invalid context"
}

proc test_max {} {
    global passcount

    verbose "testing builtin MIN"
    set passcount 0

    # discrete mode names
    test_print_accept "print max(v_ps1)" "7"
    test_print_accept "print max(v_ps2)" "100"
    test_print_accept "print max(v_ps3)" "ii"
    test_print_accept "print max(v_ps4)" "'z'"
    test_print_accept "print max(v_ps5)" "FALSE"
    test_print_accept "print max(v_ps6)" "50"

    # test an IN
    test_print_accept "print 0 in v_ps6" "TRUE"

    # a failure
    setup_xfail "*-*-*"
    test_print_accept "print max(v_ps51)" "MAX for empty powerset"
}

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

gdb_test "set print sevenbit-strings" ".*"

if [set_lang_chill] then {
    # test builtins as described in chapter 6.20.3 Z.200
    test_card
    test_min
    test_max
} else {
    warning "$test_name tests suppressed."
}
