"""
Test that recursive types are handled correctly.
"""



import lldb
import lldbsuite.test.lldbutil as lldbutil
from lldbsuite.test.lldbtest import *


class RecursiveTypesTestCase(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)

        # Find the line number to break for main.c.
        self.line = line_number('recursive_type_main.cpp',
                                '// Test at this line.')

        self.d1 = {
            'CXX_SOURCES': 'recursive_type_main.cpp recursive_type_1.cpp'}
        self.d2 = {
            'CXX_SOURCES': 'recursive_type_main.cpp recursive_type_2.cpp'}

    def test_recursive_type_1(self):
        """Test that recursive structs are displayed correctly."""
        self.build(dictionary=self.d1)
        self.setTearDownCleanup(dictionary=self.d1)
        self.print_struct()

    def test_recursive_type_2(self):
        """Test that recursive structs are displayed correctly."""
        self.build(dictionary=self.d2)
        self.setTearDownCleanup(dictionary=self.d2)
        self.print_struct()

    def print_struct(self):
        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)

        lldbutil.run_break_set_by_file_and_line(
            self,
            "recursive_type_main.cpp",
            self.line,
            num_expected_locations=-1,
            loc_exact=True)

        self.runCmd("run", RUN_SUCCEEDED)

        self.runCmd("print tpi")
        self.runCmd("print *tpi")
