# Copyright 2022-2023 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/>.

# Test the detection and printing of repeated elements in Fortran arrays.

require allow_fortran_tests

load_lib fortran.exp

# Build up the expected output for each array.
set a9p9o "(9, 9, 9, 9, 9, 9)"
set a1p   "(1, 1, 1, 1, 1)"
set a1p9  "(1, 1, 1, 1, 1, 9)"
set a2po  "(2, 2, 2, 2, 2)"
set a2p   "(${a2po} ${a2po} ${a2po} ${a2po} ${a2po})"
set a2p9o "(2, 2, 2, 2, 2, 9)"
set a2p9  "(${a2p9o} ${a2p9o} ${a2p9o} ${a2p9o} ${a2p9o} ${a9p9o})"
set a3po  "(3, 3, 3, 3, 3)"
set a3p   "(${a3po} ${a3po} ${a3po} ${a3po} ${a3po})"
set a3p   "(${a3p} ${a3p} ${a3p} ${a3p} ${a3p})"
set a3p9o "(3, 3, 3, 3, 3, 9)"
set a3p9  "(${a3p9o} ${a3p9o} ${a3p9o} ${a3p9o} ${a3p9o} ${a9p9o})"
set a9p9  "(${a9p9o} ${a9p9o} ${a9p9o} ${a9p9o} ${a9p9o} ${a9p9o})"
set a3p9  "(${a3p9} ${a3p9} ${a3p9} ${a3p9} ${a3p9} ${a9p9})"

# Convert the output into a regexp.
set r1p   [string_to_regexp $a1p]
set r1p9  [string_to_regexp $a1p9]
set r2po  [string_to_regexp $a2po]
set r2p9o [string_to_regexp $a2p9o]
set r2p   [string_to_regexp $a2p]
set r2p9  [string_to_regexp $a2p9]
set r3po  [string_to_regexp $a3po]
set r3p9o [string_to_regexp $a3p9o]
set r3p   [string_to_regexp $a3p]
set r3p9  [string_to_regexp $a3p9]

set rep5  "<repeats 5 times>"
set rep6  "<repeats 6 times>"

proc array_repeat { variant } {
    global testfile srcfile binfile
    upvar r1p r1p r1p9 r1p9 r2po r2po r2p9o r2p9o r2p r2p r2p9 r2p9
    upvar r3po r3po r3p9o r3p9o r3p r3p r3p9 r3p9
    upvar a2po a2po a2p9o a2p9o a3po a3po a3p9o a3p9o
    upvar rep5 rep5 rep6 rep6

    standard_testfile "${variant}.f90"

    if {[prepare_for_testing ${testfile}.exp ${variant} ${srcfile} \
	    {debug f90}]} {
	return -1
    }

    if {![fortran_runto_main]} {
	perror "Could not run to main."
	return
    }

    gdb_breakpoint [gdb_get_line_number "Break here"]
    gdb_continue_to_breakpoint "${variant}"

    with_test_prefix "${variant}: repeats=unlimited, elements=unlimited" {
	# Check the arrays print as expected.
	gdb_test_no_output "set print repeats unlimited"
	gdb_test_no_output "set print elements unlimited"

	gdb_test "print array_1d"  "${r1p}"
	gdb_test "print array_1d9" "${r1p9}"
	gdb_test "print array_2d"  "${r2p}"
	gdb_test "print array_2d9" "${r2p9}"
	gdb_test "print array_3d"  "${r3p}"
	gdb_test "print array_3d9" "${r3p9}"
    }

    with_test_prefix "${variant}: repeats=4, elements=unlimited" {
	# Now set the repeat limit.
	gdb_test_no_output "set print repeats 4"
	gdb_test_no_output "set print elements unlimited"

	gdb_test "print array_1d" \
	    [string_to_regexp "(1, ${rep5})"]
	gdb_test "print array_1d9" \
	    [string_to_regexp "(1, ${rep5}, 9)"]
	gdb_test "print array_2d" \
	    [string_to_regexp "((2, ${rep5}) ${rep5})"]
	gdb_test "print array_2d9" \
	    [string_to_regexp "((2, ${rep5}, 9) ${rep5} (9, ${rep6}))"]
	gdb_test "print array_3d" \
	    [string_to_regexp "(((3, ${rep5}) ${rep5}) ${rep5})"]
	gdb_test "print array_3d9" \
	    [string_to_regexp "(((3, ${rep5}, 9) ${rep5} (9, ${rep6})) ${rep5}\
				((9, ${rep6}) ${rep6}))"]
    }

    with_test_prefix "${variant}: repeats=unlimited, elements=12" {
	# Now set the element limit.
	gdb_test_no_output "set print repeats unlimited"
	gdb_test_no_output "set print elements 12"

	gdb_test "print array_1d"  "${r1p}"
	gdb_test "print array_1d9" "${r1p9}"
	gdb_test "print array_2d" \
	    [string_to_regexp "(${a2po} ${a2po} (2, 2, ...) ...)"]
	gdb_test "print array_2d9" \
	    [string_to_regexp "(${a2p9o} ${a2p9o} ...)"]
	gdb_test "print array_3d" \
	    [string_to_regexp "((${a3po} ${a3po} (3, 3, ...) ...) ...)"]
	gdb_test "print array_3d9" \
	    [string_to_regexp "((${a3p9o} ${a3p9o} ...) ...)"]
    }

    with_test_prefix "${variant}: repeats=4, elements=12" {
	# Now set both limits.
	gdb_test_no_output "set print repeats 4"
	gdb_test_no_output "set print elements 12"

	gdb_test "print array_1d" \
	    [string_to_regexp "(1, ${rep5})"]
	gdb_test "print array_1d9" \
	    [string_to_regexp "(1, ${rep5}, 9)"]
	gdb_test "print array_2d" \
	    [string_to_regexp "((2, ${rep5}) (2, ${rep5}) (2, 2, ...) ...)"]
	gdb_test "print array_2d9" \
	    [string_to_regexp "((2, ${rep5}, 9) (2, ${rep5}, 9) ...)"]
	gdb_test "print array_3d" \
	    [string_to_regexp "(((3, ${rep5}) (3, ${rep5}) (3, 3, ...) ...)\
				...)"]
	gdb_test "print array_3d9" \
	    [string_to_regexp "(((3, ${rep5}, 9) (3, ${rep5}, 9) ...) ...)"]
    }

    with_test_prefix "${variant}: repeats=4, elements=30" {
	# Now set both limits.
	gdb_test_no_output "set print repeats 4"
	gdb_test_no_output "set print elements 30"

	gdb_test "print array_1d" \
	    [string_to_regexp "(1, ${rep5})"]
	gdb_test "print array_1d9" \
	    [string_to_regexp "(1, ${rep5}, 9)"]
	gdb_test "print array_2d" \
	    [string_to_regexp "((2, ${rep5}) ${rep5})"]
	gdb_test "print array_2d9" \
	    [string_to_regexp "((2, ${rep5}, 9) ${rep5} ...)"]
	gdb_test "print array_3d" \
	    [string_to_regexp "(((3, ${rep5}) ${rep5}) ((3, ${rep5}) ...)\
				...)"]
	gdb_test "print array_3d9" \
	    [string_to_regexp "(((3, ${rep5}, 9) ${rep5} ...) ...)"]
    }
}

array_repeat "array-repeat"
array_repeat "array-slices-repeat"
