TestObjCNewSyntax.py revision 267b9d9b55e6a0526277a1c4f6a6dd77def5bb36
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
76e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
86e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callananfrom distutils.version import StrictVersion
96e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
106e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callananfrom lldbtest import *
116e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
126e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callananclass ObjCNewSyntaxTestCase(TestBase):
136e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
146e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan    mydir = os.path.join("lang", "objc", "objc-new-syntax")
156e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
16f3e5da20b61550f25c40191c777cab31d2496d72Johnny Chen    @expectedFailurei386
1721b1984e161b0cadee331d32bfd721eccfdf4b1fJohnny Chen    @dsym_test
186e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan    def test_expr_with_dsym(self):
196e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.buildDsym()
206e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expr()
216e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
22f3e5da20b61550f25c40191c777cab31d2496d72Johnny Chen    @expectedFailurei386
2321b1984e161b0cadee331d32bfd721eccfdf4b1fJohnny Chen    @dwarf_test
246e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan    def test_expr_with_dwarf(self):
256e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.buildDwarf()
266e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expr()
276e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
286e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan    def setUp(self):
296e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        # Call super's setUp().
306e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        TestBase.setUp(self)
316e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        # Find the line number to break inside main().
326e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.line = line_number('main.m', '// Set breakpoint 0 here.')
336e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
346e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan    def applies(self):
356e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        if platform.system() != "Darwin":
366e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            return False
376e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        if StrictVersion('12.0.0') > platform.release():
386e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            return False
396e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
406e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        return True
416e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
426e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan    def common_setup(self):
436e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        exe = os.path.join(os.getcwd(), "a.out")
446e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
456e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
466e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        # Break inside the foo function which takes a bar_ptr argument.
476e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expect("breakpoint set -f main.m -l %d" % self.line, BREAKPOINT_CREATED,
486e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            startstr = "Breakpoint created")
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
676e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expect("expr -o -- immutable_array[0]", VARIABLES_DISPLAYED_CORRECTLY,
686e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["foo"])
696e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
706e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expect("expr -o -- mutable_array[0]", VARIABLES_DISPLAYED_CORRECTLY,
716e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["foo"])
726e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
736e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expect("expr -o -- mutable_array[0] = @\"bar\"", VARIABLES_DISPLAYED_CORRECTLY,
746e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["bar"])
756e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
766e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expect("expr -o -- mutable_array[0]", VARIABLES_DISPLAYED_CORRECTLY,
776e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["bar"])
786e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
796e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expect("expr -o -- immutable_dictionary[@\"key\"]", VARIABLES_DISPLAYED_CORRECTLY,
806e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["value"])
816e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
826e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expect("expr -o -- mutable_dictionary[@\"key\"]", VARIABLES_DISPLAYED_CORRECTLY,
836e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["value"])
846e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
856e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expect("expr -o -- mutable_dictionary[@\"key\"] = @\"object\"", VARIABLES_DISPLAYED_CORRECTLY,
866e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["object"])
876e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
886e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expect("expr -o -- mutable_dictionary[@\"key\"]", VARIABLES_DISPLAYED_CORRECTLY,
896e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["object"])
906e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
916e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expect("expr -o -- @[ @\"foo\", @\"bar\" ]", VARIABLES_DISPLAYED_CORRECTLY,
926e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["NSArray", "foo", "bar"])
936e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
946e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expect("expr -o -- @{ @\"key\" : @\"object\" }", VARIABLES_DISPLAYED_CORRECTLY,
956e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["NSDictionary", "key", "object"])
966e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
976e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expect("expr -o -- @'a'", VARIABLES_DISPLAYED_CORRECTLY,
986e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["NSNumber", str(ord('a'))])
996e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
1006e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expect("expr -o -- @1", VARIABLES_DISPLAYED_CORRECTLY,
1016e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["NSNumber", "1"])
1026e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
1036e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expect("expr -o -- @1l", VARIABLES_DISPLAYED_CORRECTLY,
1046e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["NSNumber", "1"])
1056e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
1066e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expect("expr -o -- @1ul", VARIABLES_DISPLAYED_CORRECTLY,
1076e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["NSNumber", "1"])
1086e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
1096e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expect("expr -o -- @1ll", VARIABLES_DISPLAYED_CORRECTLY,
1106e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["NSNumber", "1"])
1116e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
1126e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan        self.expect("expr -o -- @1ull", VARIABLES_DISPLAYED_CORRECTLY,
1136e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan            substrs = ["NSNumber", "1"])
1146e12c7a5a851f661677b16c544aac2f93fb6e86dSean Callanan
115930f10a19c8142f2f082d06087052464f0c64a39Sean Callanan        self.expect("expr -o -- @123.45", VARIABLES_DISPLAYED_CORRECTLY,
116930f10a19c8142f2f082d06087052464f0c64a39Sean Callanan            substrs = ["NSNumber", "123.45"])
117930f10a19c8142f2f082d06087052464f0c64a39Sean Callanan        self.expect("expr -o -- @123.45f", VARIABLES_DISPLAYED_CORRECTLY,
118930f10a19c8142f2f082d06087052464f0c64a39Sean Callanan            substrs = ["NSNumber", "123.45"])
119930f10a19c8142f2f082d06087052464f0c64a39Sean Callanan
120930f10a19c8142f2f082d06087052464f0c64a39Sean Callanan        self.expect("expr -o -- @( 1 + 3 )", VARIABLES_DISPLAYED_CORRECTLY,
121930f10a19c8142f2f082d06087052464f0c64a39Sean Callanan            substrs = ["NSNumber", "4"])
122930f10a19c8142f2f082d06087052464f0c64a39Sean Callanan        self.expect("expr -o -- @(\"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