TestObjCNewSyntax.py revision 992d227ab9ef1a8ffabc138fd515fb667556ae10
16e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan"""Test that the Objective-C syntax for dictionary/array literals and indexing works"""
26e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
36e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callananimport os, time
46e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callananimport unittest2
56e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callananimport lldb
66e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callananimport platform
7431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Inghamimport lldbutil
86e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
96e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callananfrom distutils.version import StrictVersion
106e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
116e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callananfrom lldbtest import *
126e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
136e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callananclass ObjCNewSyntaxTestCase(TestBase):
146e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
156e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan    mydir = os.path.join("lang", "objc", "objc-new-syntax")
166e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
17bf1209054c4ba709202e7f2fca31dfc97a0d8338Filipe Cabecinhas    @unittest2.expectedFailure
1821b1984e161b0cadee331d32bfd721eccfdf4b1fJohnny Chen    @dsym_test
196e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan    def test_expr_with_dsym(self):
206e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.buildDsym()
216e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expr()
226e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
23bf1209054c4ba709202e7f2fca31dfc97a0d8338Filipe Cabecinhas    @unittest2.expectedFailure
2421b1984e161b0cadee331d32bfd721eccfdf4b1fJohnny Chen    @dwarf_test
256e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan    def test_expr_with_dwarf(self):
266e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.buildDwarf()
276e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expr()
286e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
296e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan    def setUp(self):
306e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        # Call super's setUp().
316e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        TestBase.setUp(self)
326e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        # Find the line number to break inside main().
336e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.line = line_number('main.m', '// Set breakpoint 0 here.')
346e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
356e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan    def applies(self):
366e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        if platform.system() != "Darwin":
376e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            return False
386e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        if StrictVersion('12.0.0') > platform.release():
396e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            return False
406e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
416e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        return True
426e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
436e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan    def common_setup(self):
446e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        exe = os.path.join(os.getcwd(), "a.out")
456e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
466e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
476e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        # Break inside the foo function which takes a bar_ptr argument.
48431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Ingham        lldbutil.run_break_set_by_file_and_line (self, "main.m", self.line, num_expected_locations=1, loc_exact=True)
496e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
506e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.runCmd("run", RUN_SUCCEEDED)
516e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
526e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        # The stop reason of the thread should be breakpoint.
536e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
546e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ['stopped',
556e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan                       'stop reason = breakpoint'])
566e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
576e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        # The breakpoint should have a hit count of 1.
586e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
596e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = [' resolved, hit count = 1'])
606e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
616e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan    def expr(self):
626e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        if not self.applies():
636e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            return
646e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
656e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.common_setup()
666e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
67992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata        self.expect("expr --object-description -- immutable_array[0]", VARIABLES_DISPLAYED_CORRECTLY,
686e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["foo"])
696e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
70992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata        self.expect("expr --object-description -- mutable_array[0]", VARIABLES_DISPLAYED_CORRECTLY,
716e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["foo"])
726e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
73992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata        self.expect("expr --object-description -- mutable_array[0] = @\"bar\"", VARIABLES_DISPLAYED_CORRECTLY,
746e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["bar"])
756e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
76992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata        self.expect("expr --object-description -- mutable_array[0]", VARIABLES_DISPLAYED_CORRECTLY,
776e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["bar"])
786e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
79992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata        self.expect("expr --object-description -- immutable_dictionary[@\"key\"]", VARIABLES_DISPLAYED_CORRECTLY,
806e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["value"])
816e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
82992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata        self.expect("expr --object-description -- mutable_dictionary[@\"key\"]", VARIABLES_DISPLAYED_CORRECTLY,
836e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["value"])
846e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
85992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata        self.expect("expr --object-description -- mutable_dictionary[@\"key\"] = @\"object\"", VARIABLES_DISPLAYED_CORRECTLY,
866e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["object"])
876e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
88992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata        self.expect("expr --object-description -- mutable_dictionary[@\"key\"]", VARIABLES_DISPLAYED_CORRECTLY,
896e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["object"])
906e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
91992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata        self.expect("expr --object-description -- @[ @\"foo\", @\"bar\" ]", VARIABLES_DISPLAYED_CORRECTLY,
926e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["NSArray", "foo", "bar"])
936e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
94992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata        self.expect("expr --object-description -- @{ @\"key\" : @\"object\" }", VARIABLES_DISPLAYED_CORRECTLY,
956e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["NSDictionary", "key", "object"])
966e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
97992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata        self.expect("expr --object-description -- @'a'", VARIABLES_DISPLAYED_CORRECTLY,
986e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["NSNumber", str(ord('a'))])
996e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
100992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata        self.expect("expr --object-description -- @1", VARIABLES_DISPLAYED_CORRECTLY,
1016e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["NSNumber", "1"])
1026e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
103992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata        self.expect("expr --object-description -- @1l", VARIABLES_DISPLAYED_CORRECTLY,
1046e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["NSNumber", "1"])
1056e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
106992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata        self.expect("expr --object-description -- @1ul", VARIABLES_DISPLAYED_CORRECTLY,
1076e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["NSNumber", "1"])
1086e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
109992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata        self.expect("expr --object-description -- @1ll", VARIABLES_DISPLAYED_CORRECTLY,
1106e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["NSNumber", "1"])
1116e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
112992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata        self.expect("expr --object-description -- @1ull", VARIABLES_DISPLAYED_CORRECTLY,
1136e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["NSNumber", "1"])
1146e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
115992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata        self.expect("expr --object-description -- @123.45", VARIABLES_DISPLAYED_CORRECTLY,
116930f10a19c8142f2f082d06087052464f0c64a39Sean Callanan            substrs = ["NSNumber", "123.45"])
117992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata        self.expect("expr --object-description -- @123.45f", VARIABLES_DISPLAYED_CORRECTLY,
118930f10a19c8142f2f082d06087052464f0c64a39Sean Callanan            substrs = ["NSNumber", "123.45"])
119930f10a19c8142f2f082d06087052464f0c64a39Sean Callanan
120992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata        self.expect("expr --object-description -- @( 1 + 3 )", VARIABLES_DISPLAYED_CORRECTLY,
121930f10a19c8142f2f082d06087052464f0c64a39Sean Callanan            substrs = ["NSNumber", "4"])
122992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata        self.expect("expr --object-description -- @(\"Hello world\" + 6)", VARIABLES_DISPLAYED_CORRECTLY,
123267b9d9b55e6a0526277a1c4f6a6dd77def5bb36Sean Callanan            substrs = ["NSString", "world"])
1246e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
1256e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
1266e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callananif __name__ == '__main__':
1276e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan    import atexit
1286e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan    lldb.SBDebugger.Initialize()
1296e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan    atexit.register(lambda: lldb.SBDebugger.Terminate())
1306e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan    unittest2.main()
131