From 04edd1893c2d0f35880fd5f81e78dc23979df0b9 Mon Sep 17 00:00:00 2001 From: Lawrence D'Anna Date: Tue, 22 Oct 2019 02:32:37 +0000 Subject: remove multi-argument form of PythonObject::Reset() Summary: With this patch, only the no-argument form of `Reset()` remains in PythonDataObjects. It also deletes PythonExceptionState in favor of PythonException, because the only call-site of PythonExceptionState was also using Reset, so I cleaned up both while I was there. Reviewers: JDevlieghere, clayborg, labath, jingham Reviewed By: labath Subscribers: mgorny, lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D69214 llvm-svn: 375475 --- .../Python/PythonDataObjectsTests.cpp | 84 ++++++++++++++++++++++ 1 file changed, 84 insertions(+) (limited to 'lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp') diff --git a/lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp b/lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp index c01dade..b676b42 100644 --- a/lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp +++ b/lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp @@ -21,6 +21,8 @@ using namespace lldb_private; using namespace lldb_private::python; +using llvm::Error; +using llvm::Expected; class PythonDataObjectsTest : public PythonTestSuite { public: @@ -771,4 +773,86 @@ bar_unbound = Foo.bar } #endif +} + +TEST_F(PythonDataObjectsTest, TestScript) { + + static const char script[] = R"( +def factorial(n): + if n > 1: + return n * factorial(n-1) + else: + return 1; +main = factorial +)"; + + PythonScript factorial(script); + + EXPECT_THAT_EXPECTED(As(factorial(5ll)), llvm::HasValue(120)); +} + +TEST_F(PythonDataObjectsTest, TestExceptions) { + + static const char script[] = R"( +def foo(): + return bar() +def bar(): + return baz() +def baz(): + return 1 / 0 +main = foo +)"; + + PythonScript foo(script); + + EXPECT_THAT_EXPECTED(foo(), + llvm::Failed(testing::Property( + &PythonException::ReadBacktrace, + testing::ContainsRegex("line 3, in foo..*" + "line 5, in bar.*" + "line 7, in baz.*" + "ZeroDivisionError")))); + + static const char script2[] = R"( +class MyError(Exception): + def __str__(self): + return self.my_message + +def main(): + raise MyError("lol") + +)"; + + PythonScript lol(script2); + + EXPECT_THAT_EXPECTED(lol(), + llvm::Failed(testing::Property( + &PythonException::ReadBacktrace, + testing::ContainsRegex("unprintable MyError")))); +} + +TEST_F(PythonDataObjectsTest, TestRun) { + + PythonDictionary globals(PyInitialValue::Empty); + + auto x = As(runStringOneLine("40 + 2", globals, globals)); + ASSERT_THAT_EXPECTED(x, llvm::Succeeded()); + EXPECT_EQ(x.get(), 42l); + + Expected r = runStringOneLine("n = 42", globals, globals); + ASSERT_THAT_EXPECTED(r, llvm::Succeeded()); + auto y = As(globals.GetItem("n")); + ASSERT_THAT_EXPECTED(y, llvm::Succeeded()); + EXPECT_EQ(y.get(), 42l); + + const char script[] = R"( +def foobar(): + return "foo" + "bar" + "baz" +g = foobar() +)"; + + r = runStringMultiLine(script, globals, globals); + ASSERT_THAT_EXPECTED(r, llvm::Succeeded()); + auto g = As(globals.GetItem("g")); + ASSERT_THAT_EXPECTED(g, llvm::HasValue("foobarbaz")); } \ No newline at end of file -- cgit v1.1