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

if { [skip_cplus_tests] } { continue }

load_lib mi-support.exp
set MIFLAGS "-i=mi"

gdb_exit
if [mi_gdb_start] {
    continue
}

standard_testfile .cc
set opts {debug c++}

if [build_executable $testfile.exp $testfile $srcfile $opts] {
    return -1
}

mi_gdb_load ${binfile}

mi_prepare_inline_tests $srcfile

# Enable using RTTI to determine real types of the objects
proc set_print_object {state testname} {
    mi_gdb_test "-interpreter-exec console \"set print object ${state}\"" \
	"(.*=cmd-param-changed,param=\"print object\",value=\"${state}\".*|)\\^done" \
        "-interpreter-exec console \"set print object ${state}\" in $testname"
}

proc check_derived_children_without_rtti {varobj_name var_name testname} {
    mi_list_varobj_children ${varobj_name} "
        { ${varobj_name}.public public 1 }
    " "list children of ${var_name} (without RTTI) in $testname"
    mi_list_varobj_children "${varobj_name}.public" "
        { ${varobj_name}.public.A A 0 int }
    " "list children of ${var_name}.public (without RTTI) in $testname"
}

proc check_derived_content_without_rtti {varobj_name var_name testname} {
    mi_check_varobj_value ${varobj_name}.public.A 1 \
        "check ${var_name}->A (without RTTI) in $testname"
}

proc check_derived_without_rtti {varobj_name var_name testname} {
    check_derived_children_without_rtti ${varobj_name} ${var_name} ${testname}
    check_derived_content_without_rtti ${varobj_name} ${var_name} ${testname}
}

proc check_new_derived_without_rtti {var_name var_type testname} {
    set varobj_name VAR
    mi_create_varobj_checked ${varobj_name} ${var_name} ${var_type} \
        "create varobj for ${var_name} (without RTTI) in ${testname}"
    check_derived_without_rtti ${varobj_name} ${var_name} ${testname}
    mi_delete_varobj ${varobj_name} \
        "delete varobj for ${var_name} (without RTTI) in ${testname}"
}

proc check_derived_children_with_rtti {varobj_name var_name testname} {
    mi_list_varobj_children ${varobj_name} "
        { ${varobj_name}.Base Base 1 Base }
        { ${varobj_name}.public public 2 }
    " "list children of ${var_name} (with RTTI) in $testname"
    mi_list_varobj_children "${varobj_name}.Base" "
        { ${varobj_name}.Base.public public 1 }
    " "list children of ${var_name}.Base (with RTTI) in $testname"
    mi_list_varobj_children "${varobj_name}.Base.public" "
        { ${varobj_name}.Base.public.A A 0 int }
    " "list children of ${var_name}.Base.public (with RTTI) in $testname"
    mi_list_varobj_children "${varobj_name}.public" "
        { ${varobj_name}.public.B B 0 int }
        { ${varobj_name}.public.C C 0 int }
    " "list children of ${var_name}.public (with RTTI) in $testname"
}

proc check_derived_content_with_rtti {varobj_name var_name testname} {
    mi_check_varobj_value ${varobj_name}.Base.public.A 1 \
        "check ${var_name}->A (with RTTI) in $testname"
    mi_check_varobj_value ${varobj_name}.public.B 2 \
        "check ${var_name}->B (with RTTI) in $testname"
    mi_check_varobj_value ${varobj_name}.public.C 3 \
        "check ${var_name}->C (with RTTI) in $testname"
}

proc check_derived_with_rtti {varobj_name var_name testname} {
    check_derived_children_with_rtti ${varobj_name} ${var_name} $testname
    check_derived_content_with_rtti ${varobj_name} ${var_name} $testname
}

proc check_new_derived_with_rtti {var_name var_type testname} {
    set varobj_name VAR
    mi_create_varobj_checked ${varobj_name} ${var_name} ${var_type} \
        "create varobj for ${var_name} (with RTTI) in $testname"
    check_derived_with_rtti ${varobj_name} ${var_name} $testname
    mi_delete_varobj ${varobj_name} \
        "delete varobj for ${var_name} (with RTTI) in $testname"
}

mi_run_inline_test use_rtti_for_ptr
mi_run_inline_test use_rtti_for_ref
mi_run_inline_test use_rtti_for_ptr_child
mi_run_inline_test use_rtti_for_ref_child
mi_run_inline_test use_rtti_with_multiple_inheritence
mi_run_inline_test type_update_when_use_rtti
mi_run_inline_test skip_type_update_when_not_use_rtti

mi_gdb_exit
return 0
