summaryrefslogtreecommitdiff
path: root/src/greenlet/tests/test_extension_interface.py
diff options
context:
space:
mode:
authorJason Madden <jamadden@gmail.com>2020-11-12 11:49:12 -0600
committerJason Madden <jamadden@gmail.com>2020-11-12 11:49:12 -0600
commit8448b094d1b81788ac9cbaf86a184712f1daf5e0 (patch)
tree34e07251b520b94f44fd40136687bb059a08e256 /src/greenlet/tests/test_extension_interface.py
parentc80fab93073603289f41df8e32b7ecc25f37763e (diff)
downloadgreenlet-issue184.tar.gz
Move to the src/ layout, and make greenlet a package.issue184
Make 'tests' become 'greenlet.tests', and be compatible with 'python -m unittest discover'. Fixes #184. Fixes #184. Fixes #189.
Diffstat (limited to 'src/greenlet/tests/test_extension_interface.py')
-rw-r--r--src/greenlet/tests/test_extension_interface.py74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/greenlet/tests/test_extension_interface.py b/src/greenlet/tests/test_extension_interface.py
new file mode 100644
index 0000000..bc87452
--- /dev/null
+++ b/src/greenlet/tests/test_extension_interface.py
@@ -0,0 +1,74 @@
+from __future__ import print_function
+from __future__ import absolute_import
+
+import sys
+import unittest
+
+import greenlet
+from . import _test_extension
+
+
+class CAPITests(unittest.TestCase):
+ def test_switch(self):
+ self.assertEqual(
+ 50, _test_extension.test_switch(greenlet.greenlet(lambda: 50)))
+
+ def test_switch_kwargs(self):
+ def foo(x, y):
+ return x * y
+ g = greenlet.greenlet(foo)
+ self.assertEqual(6, _test_extension.test_switch_kwargs(g, x=3, y=2))
+
+ def test_setparent(self):
+ def foo():
+ def bar():
+ greenlet.getcurrent().parent.switch()
+
+ # This final switch should go back to the main greenlet, since
+ # the test_setparent() function in the C extension should have
+ # reparented this greenlet.
+ greenlet.getcurrent().parent.switch()
+ raise AssertionError("Should never have reached this code")
+ child = greenlet.greenlet(bar)
+ child.switch()
+ greenlet.getcurrent().parent.switch(child)
+ greenlet.getcurrent().parent.throw(
+ AssertionError("Should never reach this code"))
+ foo_child = greenlet.greenlet(foo).switch()
+ self.assertEqual(None, _test_extension.test_setparent(foo_child))
+
+ def test_getcurrent(self):
+ _test_extension.test_getcurrent()
+
+ def test_new_greenlet(self):
+ self.assertEqual(-15, _test_extension.test_new_greenlet(lambda: -15))
+
+ def test_raise_greenlet_dead(self):
+ self.assertRaises(
+ greenlet.GreenletExit, _test_extension.test_raise_dead_greenlet)
+
+ def test_raise_greenlet_error(self):
+ self.assertRaises(
+ greenlet.error, _test_extension.test_raise_greenlet_error)
+
+ def test_throw(self):
+ seen = []
+
+ def foo():
+ try:
+ greenlet.getcurrent().parent.switch()
+ except ValueError:
+ seen.append(sys.exc_info()[1])
+ except greenlet.GreenletExit:
+ raise AssertionError
+ g = greenlet.greenlet(foo)
+ g.switch()
+ _test_extension.test_throw(g)
+ self.assertEqual(len(seen), 1)
+ self.assertTrue(
+ isinstance(seen[0], ValueError),
+ "ValueError was not raised in foo()")
+ self.assertEqual(
+ str(seen[0]),
+ 'take that sucka!',
+ "message doesn't match")