# -*- coding: utf-8 -*- */

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

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

# Test GDB's support for UTF-8 C/C++ identifiers.

load_lib completion-support.exp

standard_testfile

# Enable basic use of UTF-8.  LC_ALL gets reset for each testfile.
setenv LC_ALL C.UTF-8

if { [prepare_for_testing "failed to prepare" ${testfile} [list $srcfile]] } {
    return -1
}

if ![runto done] {
    return
}

# Test expressions.
gdb_test "print g_s.num_€" " = 1000"
gdb_test "print num_€" " = 2000"

# Test linespecs/breakpoints.
gdb_test "break função2" "Breakpoint $decimal at .*$srcfile.*"

set test "info breakpoints"
gdb_test_multiple $test $test {
    -re "in função2 at .*$srcfile.*$gdb_prompt $" {
	pass $test
    }
}

gdb_test "continue" \
    "Breakpoint $decimal, função2 \\(\\) at .*$srcfile.*"

# Unload symbols from shared libraries to avoid random symbol and file
# names getting in the way of completion.
gdb_test_no_output "nosharedlibrary"

# Tests below are about tab-completion, which doesn't work if readline
# library isn't used.  Check it first.

if { ![readline_is_used] } {
    untested "no tab completion support without readline"
    return -1
}

# Test linespec completion.

# A unique completion.
test_gdb_complete_unique "break my_fun" "break my_função"

# A multiple-matches completion:

# kfailed because gdb/readline display the completion match list like
# this, with no separating space:
#
#  (gdb) break função[TAB]
#  função1função2
#
# ... which is bogus.
setup_kfail "gdb/23211" "*-*-*"
test_gdb_complete_multiple "break " "fun" "ção" {"função1" "função2"}

# Test expression completion.
test_gdb_complete_unique "print g_s.num" "print g_s.num_€"
