# Copyright 2015-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 is part of the gdb testsuite.

# Test the setting of "history size" via the GDBHISTSIZE environment variable


# We cannot expect remote hosts to see environment variables set on the
# local machine.

if { [is_remote host] } {
    unsupported "can't set environment variables on remote host"
    return -1
}

# Check that the history size is properly set to SIZE when the environment
# variable ENV_VAR is set to GDBHISTSIZE.

proc test_histsize_history_setting { histsize size { env_var "GDBHISTSIZE" } } {
    global env

    save_vars { env(GDBHISTFILE) env(GDBHISTSIZE) env($env_var) } {
	# These environment variables take precedence over whatever
	# history size is set in .gdbinit.  Make sure the former is not
	# set.
	unset -nocomplain env(GDBHISTFILE)
	unset -nocomplain env(GDBHISTSIZE)

	set env($env_var) $histsize

	with_test_prefix "histsize=$histsize" {
	    gdb_exit
	    gdb_start

	    gdb_test "show history size" "The size of the command history is $size."

	    if { $size == "0" } {
		gdb_test_no_output "show commands"
	    } elseif { $size != "1" } {
		gdb_test "show commands" \
		         "    .  show history size\r\n    .  show commands"
	    }
        }
    }
}

test_histsize_history_setting "" "unlimited"
test_histsize_history_setting "0" "0"
test_histsize_history_setting "20" "20"
test_histsize_history_setting " 20 " "20"
test_histsize_history_setting "-5" "unlimited"

# Test defaulting to 256 upon encountering a non-numeric GDBHISTSIZE.
test_histsize_history_setting "not_an_integer" "256"
test_histsize_history_setting "10zab" "256"
test_histsize_history_setting "-5ab" "256"

# A huge number (hopefully larger than INT_MAX)
test_histsize_history_setting "99999999999999999999999999999999999" "unlimited"

# We no longer read HISTSIZE
test_histsize_history_setting "50" "256" "HISTSIZE"
