diff options
author | Lawrence D'Anna <lawrence_danna@apple.com> | 2019-10-22 02:32:37 +0000 |
---|---|---|
committer | Lawrence D'Anna <lawrence_danna@apple.com> | 2019-10-22 02:32:37 +0000 |
commit | 04edd1893c2d0f35880fd5f81e78dc23979df0b9 (patch) | |
tree | 3cf81a16415feb717f0c566e804a8ddbdb87db06 /lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp | |
parent | b94ac8a2632968d3961d528faa75d68a517b3bc4 (diff) | |
download | llvm-04edd1893c2d0f35880fd5f81e78dc23979df0b9.zip llvm-04edd1893c2d0f35880fd5f81e78dc23979df0b9.tar.gz llvm-04edd1893c2d0f35880fd5f81e78dc23979df0b9.tar.bz2 |
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
Diffstat (limited to 'lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp')
-rw-r--r-- | lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp | 84 |
1 files changed, 84 insertions, 0 deletions
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<long long>(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<PythonException>(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<PythonException>(testing::Property( + &PythonException::ReadBacktrace, + testing::ContainsRegex("unprintable MyError")))); +} + +TEST_F(PythonDataObjectsTest, TestRun) { + + PythonDictionary globals(PyInitialValue::Empty); + + auto x = As<long long>(runStringOneLine("40 + 2", globals, globals)); + ASSERT_THAT_EXPECTED(x, llvm::Succeeded()); + EXPECT_EQ(x.get(), 42l); + + Expected<PythonObject> r = runStringOneLine("n = 42", globals, globals); + ASSERT_THAT_EXPECTED(r, llvm::Succeeded()); + auto y = As<long long>(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<std::string>(globals.GetItem("g")); + ASSERT_THAT_EXPECTED(g, llvm::HasValue("foobarbaz")); }
\ No newline at end of file |