Benji York avatar Benji York committed f48fd8a

make_analysator can now handle TypeErrors

Comments (0)

Files changed (2)

             return 0.0
         try:
             return min(1.0, max(0.0, float(rv)))
-        except ValueError:
+        except (ValueError, TypeError):
             return 0.0
     text_analyse.__doc__ = f.__doc__
     return staticmethod(text_analyse)

tests/test_util.py

 from pygments import util
 
 
+class FakeLexer(object):
+    def analyse(text):
+        return float(text)
+    analyse = util.make_analysator(analyse)
+
+
 class UtilTest(unittest.TestCase):
 
     def test_getoptions(self):
         self.assertEquals(util.docstring_headline(f1), "docstring headline")
         self.assertEquals(util.docstring_headline(f2), "docstring headline")
 
-    def test_analysator(self):
+    def test_analysator_returns_float(self):
+        # If an analysator wrapped by make_analysator returns a floating point
+        # number, then that number will be returned by the wrapper.
+        self.assertEquals(FakeLexer.analyse('0.5'), 0.5)
+
+    def test_analysator_returns_boolean(self):
+        # If an analysator wrapped by make_analysator returns a boolean value,
+        # then the wrapper will return 1.0 if the boolean was True or 0.0 if
+        # it was False.
+        self.assertEquals(FakeLexer.analyse(True), 1.0)
+        self.assertEquals(FakeLexer.analyse(False), 0.0)
+
+    def test_analysator_raises_exception(self):
+        # If an analysator wrapped by make_analysator raises an exception,
+        # then the wrapper will return 0.0.
+        class ErrorLexer(object):
+            def analyse(text):
+                raise RuntimeError('something bad happened')
+            analyse = util.make_analysator(analyse)
+        self.assertEquals(FakeLexer.analyse(''), 0.0)
+
+    def test_analysator_value_error(self):
+        # When converting the analysator's return value to a float a
+        # ValueError may occur.  If that happens 0.0 is returned instead.
+        self.assertEquals(FakeLexer.analyse('bad input'), 0.0)
+
+    def test_analysator_type_error(self):
+        # When converting the analysator's return value to a float a
+        # TypeError may occur.  If that happens 0.0 is returned instead.
         class X(object):
             def analyse(text):
-                return 0.5
+                return float(text)
             analyse = util.make_analysator(analyse)
-        self.assertEquals(X.analyse(''), 0.5)
+        self.assertEquals(X.analyse(None), 0.0)
 
     def test_shebang_matches(self):
         self.assert_(util.shebang_matches('#!/usr/bin/env python', r'python(2\.\d)?'))
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.