summaryrefslogtreecommitdiffstats
path: root/lldb/unittests/ScriptInterpreter/Python
diff options
context:
space:
mode:
authorLawrence D'Anna <lawrence_danna@apple.com>2019-10-22 02:32:37 +0000
committerLawrence D'Anna <lawrence_danna@apple.com>2019-10-22 02:32:37 +0000
commit04edd1893c2d0f35880fd5f81e78dc23979df0b9 (patch)
tree3cf81a16415feb717f0c566e804a8ddbdb87db06 /lldb/unittests/ScriptInterpreter/Python
parentb94ac8a2632968d3961d528faa75d68a517b3bc4 (diff)
downloadbcm5719-llvm-04edd1893c2d0f35880fd5f81e78dc23979df0b9.tar.gz
bcm5719-llvm-04edd1893c2d0f35880fd5f81e78dc23979df0b9.zip
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')
-rw-r--r--lldb/unittests/ScriptInterpreter/Python/CMakeLists.txt1
-rw-r--r--lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp84
-rw-r--r--lldb/unittests/ScriptInterpreter/Python/PythonExceptionStateTests.cpp164
3 files changed, 84 insertions, 165 deletions
diff --git a/lldb/unittests/ScriptInterpreter/Python/CMakeLists.txt b/lldb/unittests/ScriptInterpreter/Python/CMakeLists.txt
index 618767de91e..471f4c6dbc3 100644
--- a/lldb/unittests/ScriptInterpreter/Python/CMakeLists.txt
+++ b/lldb/unittests/ScriptInterpreter/Python/CMakeLists.txt
@@ -1,6 +1,5 @@
add_lldb_unittest(ScriptInterpreterPythonTests
PythonDataObjectsTests.cpp
- PythonExceptionStateTests.cpp
PythonTestSuite.cpp
LINK_LIBS
diff --git a/lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp b/lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp
index c01dade4440..b676b42da66 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
diff --git a/lldb/unittests/ScriptInterpreter/Python/PythonExceptionStateTests.cpp b/lldb/unittests/ScriptInterpreter/Python/PythonExceptionStateTests.cpp
deleted file mode 100644
index 8334e64738e..00000000000
--- a/lldb/unittests/ScriptInterpreter/Python/PythonExceptionStateTests.cpp
+++ /dev/null
@@ -1,164 +0,0 @@
-//===-- PythonExceptionStateTest.cpp ------------------------------*- C++
-//-*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "gtest/gtest.h"
-
-#include "Plugins/ScriptInterpreter/Python/PythonDataObjects.h"
-#include "Plugins/ScriptInterpreter/Python/PythonExceptionState.h"
-#include "Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h"
-#include "Plugins/ScriptInterpreter/Python/lldb-python.h"
-
-#include "PythonTestSuite.h"
-
-using namespace lldb_private;
-
-class PythonExceptionStateTest : public PythonTestSuite {
-public:
-protected:
- void RaiseException() {
- PyErr_SetString(PyExc_RuntimeError, "PythonExceptionStateTest test error");
- }
-};
-
-TEST_F(PythonExceptionStateTest, TestExceptionStateChecking) {
- PyErr_Clear();
- EXPECT_FALSE(PythonExceptionState::HasErrorOccurred());
-
- RaiseException();
- EXPECT_TRUE(PythonExceptionState::HasErrorOccurred());
-
- PyErr_Clear();
-}
-
-TEST_F(PythonExceptionStateTest, TestAcquisitionSemantics) {
- PyErr_Clear();
- PythonExceptionState no_error(false);
- EXPECT_FALSE(no_error.IsError());
- EXPECT_FALSE(PythonExceptionState::HasErrorOccurred());
-
- PyErr_Clear();
- RaiseException();
- PythonExceptionState error(false);
- EXPECT_TRUE(error.IsError());
- EXPECT_FALSE(PythonExceptionState::HasErrorOccurred());
- error.Discard();
-
- PyErr_Clear();
- RaiseException();
- error.Acquire(false);
- EXPECT_TRUE(error.IsError());
- EXPECT_FALSE(PythonExceptionState::HasErrorOccurred());
-
- PyErr_Clear();
-}
-
-TEST_F(PythonExceptionStateTest, TestDiscardSemantics) {
- PyErr_Clear();
-
- // Test that discarding an exception does not restore the exception
- // state even when auto-restore==true is set
- RaiseException();
- PythonExceptionState error(true);
- EXPECT_TRUE(error.IsError());
- EXPECT_FALSE(PythonExceptionState::HasErrorOccurred());
-
- error.Discard();
- EXPECT_FALSE(error.IsError());
- EXPECT_FALSE(PythonExceptionState::HasErrorOccurred());
-}
-
-TEST_F(PythonExceptionStateTest, TestResetSemantics) {
- PyErr_Clear();
-
- // Resetting when auto-restore is true should restore.
- RaiseException();
- PythonExceptionState error(true);
- EXPECT_TRUE(error.IsError());
- EXPECT_FALSE(PythonExceptionState::HasErrorOccurred());
- error.Reset();
- EXPECT_FALSE(error.IsError());
- EXPECT_TRUE(PythonExceptionState::HasErrorOccurred());
-
- PyErr_Clear();
-
- // Resetting when auto-restore is false should discard.
- RaiseException();
- PythonExceptionState error2(false);
- EXPECT_TRUE(error2.IsError());
- EXPECT_FALSE(PythonExceptionState::HasErrorOccurred());
- error2.Reset();
- EXPECT_FALSE(error2.IsError());
- EXPECT_FALSE(PythonExceptionState::HasErrorOccurred());
-
- PyErr_Clear();
-}
-
-TEST_F(PythonExceptionStateTest, TestManualRestoreSemantics) {
- PyErr_Clear();
- RaiseException();
- PythonExceptionState error(false);
- EXPECT_TRUE(error.IsError());
- EXPECT_FALSE(PythonExceptionState::HasErrorOccurred());
-
- error.Restore();
- EXPECT_FALSE(error.IsError());
- EXPECT_TRUE(PythonExceptionState::HasErrorOccurred());
-
- PyErr_Clear();
-}
-
-TEST_F(PythonExceptionStateTest, TestAutoRestoreSemantics) {
- PyErr_Clear();
- // Test that using the auto-restore flag correctly restores the exception
- // state on destruction, and not using the auto-restore flag correctly
- // does NOT restore the state on destruction.
- {
- RaiseException();
- PythonExceptionState error(false);
- EXPECT_TRUE(error.IsError());
- EXPECT_FALSE(PythonExceptionState::HasErrorOccurred());
- }
- EXPECT_FALSE(PythonExceptionState::HasErrorOccurred());
-
- PyErr_Clear();
- {
- RaiseException();
- PythonExceptionState error(true);
- EXPECT_TRUE(error.IsError());
- EXPECT_FALSE(PythonExceptionState::HasErrorOccurred());
- }
- EXPECT_TRUE(PythonExceptionState::HasErrorOccurred());
-
- PyErr_Clear();
-}
-
-TEST_F(PythonExceptionStateTest, TestAutoRestoreChanged) {
- // Test that if we re-acquire with different auto-restore semantics,
- // that the new semantics are respected.
- PyErr_Clear();
-
- RaiseException();
- PythonExceptionState error(false);
- EXPECT_TRUE(error.IsError());
-
- error.Reset();
- EXPECT_FALSE(error.IsError());
- EXPECT_FALSE(PythonExceptionState::HasErrorOccurred());
-
- RaiseException();
- error.Acquire(true);
- EXPECT_TRUE(error.IsError());
- EXPECT_FALSE(PythonExceptionState::HasErrorOccurred());
-
- error.Reset();
- EXPECT_FALSE(error.IsError());
- EXPECT_TRUE(PythonExceptionState::HasErrorOccurred());
-
- PyErr_Clear();
-}
OpenPOWER on IntegriCloud