1""" 2Test that the type of arguments to C++ template classes that have variadic 3parameters can be enumerated. 4""" 5import lldb 6from lldbsuite.test.decorators import * 7from lldbsuite.test.lldbtest import * 8from lldbsuite.test import lldbutil 9 10 11class TemplatePackArgsTestCase(TestBase): 12 13 mydir = TestBase.compute_mydir(__file__) 14 15 def test_template_argument_pack(self): 16 self.build() 17 (_, _, thread, _) = lldbutil.run_to_source_breakpoint(self, 18 'breakpoint here', lldb.SBFileSpec('main.cpp'), exe_name = 'a.out') 19 frame = thread.GetSelectedFrame() 20 21 empty_pack = frame.FindVariable('emptyPack') 22 self.assertTrue(empty_pack.IsValid(), 23 'make sure we find the emptyPack variable') 24 25 only_pack = frame.FindVariable('onlyPack') 26 self.assertTrue(only_pack.IsValid(), 27 'make sure we find the onlyPack variable') 28 self.assertEqual(only_pack.GetType().GetNumberOfTemplateArguments(), 4) 29 self.assertEqual(only_pack.GetType().GetTemplateArgumentType(0).GetName(), 'int') 30 self.assertEqual(only_pack.GetType().GetTemplateArgumentType(1).GetName(), 'char') 31 self.assertEqual(only_pack.GetType().GetTemplateArgumentType(2).GetName(), 'double') 32 # Access the C<double, 42> template parameter. 33 nested_template = only_pack.GetType().GetTemplateArgumentType(3) 34 self.assertEqual(nested_template.GetName(), 'D<int, int, bool>') 35 self.assertEqual(nested_template.GetNumberOfTemplateArguments(), 3) 36 self.assertEqual(nested_template.GetTemplateArgumentType(0).GetName(), 'int') 37 self.assertEqual(nested_template.GetTemplateArgumentType(1).GetName(), 'int') 38 self.assertEqual(nested_template.GetTemplateArgumentType(2).GetName(), 'bool') 39