]> granicus.if.org Git - python/commitdiff
Close #19156: add tests and fix for Enum helper edge cases. Patch from CliffM.
authorEthan Furman <ethan@stoneleaf.us>
Mon, 7 Oct 2013 00:19:54 +0000 (17:19 -0700)
committerEthan Furman <ethan@stoneleaf.us>
Mon, 7 Oct 2013 00:19:54 +0000 (17:19 -0700)
Lib/enum.py
Lib/test/test_enum.py

index 921d00c3a3b814c683f728a3ee0a33b7434309b4..7ca85035deb25a3dae56e0434cb0f006626b27bf 100644 (file)
@@ -17,14 +17,16 @@ def _is_dunder(name):
     """Returns True if a __dunder__ name, False otherwise."""
     return (name[:2] == name[-2:] == '__' and
             name[2:3] != '_' and
-            name[-3:-2] != '_')
+            name[-3:-2] != '_' and
+            len(name) > 4)
 
 
 def _is_sunder(name):
     """Returns True if a _sunder_ name, False otherwise."""
     return (name[0] == name[-1] == '_' and
             name[1:2] != '_' and
-            name[-2:-1] != '_')
+            name[-2:-1] != '_' and
+            len(name) > 2)
 
 
 def _make_class_unpicklable(cls):
index d59c5e3ea3cc89871e7b78c6c504a8beccfc016d..3d962f9688eded4c75fe0377c6e40d9485187121 100644 (file)
@@ -58,6 +58,35 @@ try:
 except Exception:
     pass
 
+
+class TestHelpers(unittest.TestCase):
+    # _is_descriptor, _is_sunder, _is_dunder
+
+    def test_is_descriptor(self):
+        class foo:
+            pass
+        for attr in ('__get__','__set__','__delete__'):
+            obj = foo()
+            self.assertFalse(enum._is_descriptor(obj))
+            setattr(obj, attr, 1)
+            self.assertTrue(enum._is_descriptor(obj))
+
+    def test_is_sunder(self):
+        for s in ('_a_', '_aa_'):
+            self.assertTrue(enum._is_sunder(s))
+
+        for s in ('a', 'a_', '_a', '__a', 'a__', '__a__', '_a__', '__a_', '_',
+                '__', '___', '____', '_____',):
+            self.assertFalse(enum._is_sunder(s))
+
+    def test_is_dunder(self):
+        for s in ('__a__', '__aa__'):
+            self.assertTrue(enum._is_dunder(s))
+        for s in ('a', 'a_', '_a', '__a', 'a__', '_a_', '_a__', '__a_', '_',
+                '__', '___', '____', '_____',):
+            self.assertFalse(enum._is_dunder(s))
+
+
 class TestEnum(unittest.TestCase):
     def setUp(self):
         class Season(Enum):