"""
Make sure FindTypes finds struct types with the struct prefix.
"""

from __future__ import print_function


import os
import time
import re
import lldb
import lldbsuite.test.lldbutil as lldbutil
from lldbsuite.test.lldbtest import *


class TestFindTypesOnStructType(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    # If your test case doesn't stress debug info, the
    # set this to true.  That way it won't be run once for
    # each debug info format.
    NO_DEBUG_INFO_TESTCASE = True

    def test_find_types_struct_type(self):
        """Make sure FindTypes actually finds 'struct typename' not just 'typename'."""
        self.build()
        self.do_test()

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

    def do_test(self):
        """Make sure FindTypes actually finds 'struct typename' not just 'typename'."""
        exe = self.getBuildArtifact("a.out")

        # Create a target by the debugger.
        target = self.dbg.CreateTarget(exe)
        self.assertTrue(target, VALID_TARGET)

        # Make sure this works with struct
        type_list = target.FindTypes("struct mytype")
        self.assertEqual(type_list.GetSize(), 1, "Found one instance of the type with struct")

        # Make sure this works without the struct:
        type_list = target.FindTypes("mytype")
        self.assertEqual(type_list.GetSize(), 1, "Found one instance of the type without struct")

        # Make sure it works with union
        type_list = target.FindTypes("union myunion")
        self.assertEqual(type_list.GetSize(), 1, "Found one instance of the type with union")

        # Make sure this works without the union:
        type_list = target.FindTypes("myunion")
        self.assertEqual(type_list.GetSize(), 1, "Found one instance of the type without union")

        # Make sure it works with typedef
        type_list = target.FindTypes("typedef MyType")
        self.assertEqual(type_list.GetSize(), 1, "Found one instance of the type with typedef")

        # Make sure this works without the typedef:
        type_list = target.FindTypes("MyType")
        self.assertEqual(type_list.GetSize(), 1, "Found one instance of the type without typedef")



