# Copyright (C) 2008-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.
# It tests basic Guile features.

load_lib gdb-guile.exp

# Start with a fresh gdb.
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

# Do this instead of the skip_guile_check.
# We want to do some tests when Guile is not present.
gdb_test_multiple "guile (display 23) (newline)" "verify guile support" {
    -re "Undefined command.*$gdb_prompt $" {
	unsupported "guile not supported."
	return
    }
    -re "not supported.*$gdb_prompt $"	{
      unsupported "guile support is disabled"

      # If Guile is not supported, verify that sourcing a guile script
      # causes an error.
      gdb_test "source $srcdir/$subdir/source2.scm" \
	  "Error in sourced command file:.*" \
	  "source source2.scm when guile disabled"

      # Verify multi-line guile commands cause an error.
      gdb_test_multiline "multi-line guile command" \
	  "guile" "" \
	  "(print 23)" "" \
	  "end" "not supported.*"

      return
    }
    -re "$gdb_prompt $"	{}
}

gdb_install_guile_utils
gdb_install_guile_module

gdb_test_multiline "multi-line guile command" \
  "guile" "" \
  "(print 23)" "" \
  "end" "= 23"

gdb_test_multiline "show guile command" \
  "define zzq" "Type commands for definition of .* just \"end\"\\.*" \
  "guile" "" \
  "(print 23)" "" \
  "end" "" \
  "end" "" \
  "show user zzq" "User command \"zzq\":.*  guile.*\\(print 23\\).*  end"

gdb_test "source $srcdir/$subdir/source2.scm" "yes" "source source2.scm"

gdb_test "source -s source2.scm" "yes"

gdb_test "guile (print (current-objfile))" "= #f"
gdb_test "guile (print (objfiles))" "= \\(\\)"

gdb_test_no_output \
    {guile (define x (execute "printf \"%d\", 23" #:to-string #t))}
gdb_test "guile (print x)" "= 23"

gdb_test_no_output "guile (define a (execute \"help\" #:to-string #t))" \
    "collect help from uiout"

gdb_test "guile (print a)" "= .*aliases -- User-defined aliases of other commands.*" \
    "verify help to uiout"

# Verify that we can source a guile script using ~ for the HOME directory.
save_vars { env(HOME) } {
    # Create a new directory to act as a temporary HOME directory.
    set tmp_home [standard_output_file tmp_home]
    file mkdir $tmp_home

    # Copy the file we want to source into the new HOME directory.
    gdb_remote_download host ${srcdir}/${subdir}/source2.scm \
	${tmp_home}/source2.scm

    # Arrange to use the new HOME directory.
    set env(HOME) $tmp_home
    clean_restart

    # Finally, source the file out of our new HOME directory.
    gdb_test "source ~/source2.scm" "yes"
}
