""" Test lldb data formatter subsystem for bitset for libcxx and libstdcpp. """ import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil USE_LIBSTDCPP = "USE_LIBSTDCPP" USE_LIBCPP = "USE_LIBCPP" VALUE = "VALUE" REFERENCE = "REFERENCE" POINTER = "POINTER" class GenericBitsetDataFormatterTestCase(TestBase): def setUp(self): TestBase.setUp(self) primes = [1] * 1000 primes[0] = primes[1] = 0 for i in range(2, len(primes)): for j in range(2 * i, len(primes), i): primes[j] = 0 self.primes = primes def getBitsetVariant(self, size, variant): if variant == VALUE: return "std::bitset<" + str(size) + ">" elif variant == REFERENCE: return "std::bitset<" + str(size) + "> &" elif variant == POINTER: return "std::bitset<" + str(size) + "> *" return "" def check(self, name, size, variant): var = self.frame().FindVariable(name) self.assertTrue(var.IsValid()) self.assertEqual(var.GetNumChildren(), size) children = [] for i in range(size): child = var.GetChildAtIndex(i) children.append( ValueCheck(value=str(bool(child.GetValueAsUnsigned())).lower()) ) self.assertEqual( child.GetValueAsUnsigned(), self.primes[i], "variable: %s, index: %d" % (name, size), ) self.expect_var_path( name, type=self.getBitsetVariant(size, variant), children=children ) def do_test_value(self, stdlib_type): """Test that std::bitset is displayed correctly""" self.build(dictionary={stdlib_type: "1"}) lldbutil.run_to_source_breakpoint( self, "// break here", lldb.SBFileSpec("main.cpp", False) ) self.check("empty", 0, VALUE) self.check("small", 13, VALUE) self.check("medium", 70, VALUE) self.check("large", 1000, VALUE) @add_test_categories(["libstdcxx"]) def test_value_libstdcpp(self): self.do_test_value(USE_LIBSTDCPP) @add_test_categories(["libc++"]) def test_value_libcpp(self): self.do_test_value(USE_LIBCPP) def do_test_ptr_and_ref(self, stdlib_type): """Test that ref and ptr to std::bitset is displayed correctly""" self.build(dictionary={stdlib_type: "1"}) (_, process, _, bkpt) = lldbutil.run_to_source_breakpoint( self, "Check ref and ptr", lldb.SBFileSpec("main.cpp", False) ) self.check("ref", 13, REFERENCE) self.check("ptr", 13, POINTER) lldbutil.continue_to_breakpoint(process, bkpt) self.check("ref", 70, REFERENCE) self.check("ptr", 70, POINTER) lldbutil.continue_to_breakpoint(process, bkpt) self.check("ref", 1000, REFERENCE) self.check("ptr", 1000, POINTER) @add_test_categories(["libstdcxx"]) def test_ptr_and_ref_libstdcpp(self): self.do_test_ptr_and_ref(USE_LIBSTDCPP) @add_test_categories(["libc++"]) def test_ptr_and_ref_libcpp(self): self.do_test_ptr_and_ref(USE_LIBCPP)