Commit d78e041c by Victor Shnayder

Testing and small fixes

- make chemical_equations_equal return False instead of raising errors.
- make tests not choke on unicode
- get full coverage
parent f6f2663b
...@@ -218,6 +218,9 @@ def render_to_html(eq): ...@@ -218,6 +218,9 @@ def render_to_html(eq):
return u'\u2192' return u'\u2192'
if arrow == '<->': if arrow == '<->':
return u'\u2194' return u'\u2194'
# this won't be reached unless we add more arrow types, but keep it to avoid explosions when
# that happens.
return arrow return arrow
def render_expression(ex): def render_expression(ex):
...@@ -391,36 +394,40 @@ def chemical_equations_equal(eq1, eq2, exact=False): ...@@ -391,36 +394,40 @@ def chemical_equations_equal(eq1, eq2, exact=False):
chemical_equations_equal('H2 + O2 -> H2O2', '2 H2 + 2 O2 -> 2 H2O2', exact=True) -> False chemical_equations_equal('H2 + O2 -> H2O2', '2 H2 + 2 O2 -> 2 H2O2', exact=True) -> False
If there's a syntax error, we raise pyparsing.ParseException. If there's a syntax error, we return False.
""" """
left1, arrow1, right1 = split_on_arrow(eq1) left1, arrow1, right1 = split_on_arrow(eq1)
left2, arrow2, right2 = split_on_arrow(eq2) left2, arrow2, right2 = split_on_arrow(eq2)
if arrow1 == '' or arrow2 == '': if arrow1 == '' or arrow2 == '':
raise ParseException("Could not find arrow. Legal arrows: {0}".format(ARROWS)) return False
# TODO: may want to be able to give student helpful feedback about why things didn't work. # TODO: may want to be able to give student helpful feedback about why things didn't work.
if arrow1 != arrow2: if arrow1 != arrow2:
# arrows don't match # arrows don't match
return False return False
factor_left = divide_chemical_expression(left1, left2) try:
if not factor_left: factor_left = divide_chemical_expression(left1, left2)
# left sides don't match if not factor_left:
return False # left sides don't match
return False
factor_right = divide_chemical_expression(right1, right2) factor_right = divide_chemical_expression(right1, right2)
if not factor_right: if not factor_right:
# right sides don't match # right sides don't match
return False return False
if factor_left != factor_right: if factor_left != factor_right:
# factors don't match (molecule counts to add up) # factors don't match (molecule counts to add up)
return False return False
if exact and factor_left != 1: if exact and factor_left != 1:
# want an exact match. # want an exact match.
return False return False
return True return True
except ParseException:
# Don't want external users to have to deal with parsing exceptions. Just return False.
return False
import codecs
from fractions import Fraction from fractions import Fraction
from pyparsing import ParseException from pyparsing import ParseException
import unittest import unittest
...@@ -55,15 +56,17 @@ class Test_Compare_Equations(unittest.TestCase): ...@@ -55,15 +56,17 @@ class Test_Compare_Equations(unittest.TestCase):
self.assertTrue(chemical_equations_equal('H2 + O2 -> H2O2', self.assertTrue(chemical_equations_equal('H2 + O2 -> H2O2',
'O2 + H2 -> H2O2', exact=True)) 'O2 + H2 -> H2O2', exact=True))
def test_syntax_errors(self): def test_syntax_errors(self):
self.assertRaises(ParseException, chemical_equations_equal, self.assertFalse(chemical_equations_equal('H2 + O2 a-> H2O2',
'H2 + O2 a-> H2O2', '2O2 + 2H2 -> 2H2O2'))
'2O2 + 2H2 -> 2H2O2')
self.assertFalse(chemical_equations_equal('H2O( -> H2O2',
'H2O -> H2O2'))
self.assertRaises(ParseException, chemical_equations_equal,
'H2 + O2 ==> H2O2', # strange arrow self.assertFalse(chemical_equations_equal('H2 + O2 ==> H2O2', # strange arrow
'2O2 + 2H2 -> 2H2O2') '2O2 + 2H2 -> 2H2O2'))
class Test_Compare_Expressions(unittest.TestCase): class Test_Compare_Expressions(unittest.TestCase):
...@@ -294,6 +297,29 @@ class Test_Render_Equations(unittest.TestCase): ...@@ -294,6 +297,29 @@ class Test_Render_Equations(unittest.TestCase):
log(out + ' ------- ' + correct, 'html') log(out + ' ------- ' + correct, 'html')
self.assertEqual(out, correct) self.assertEqual(out, correct)
def test_render_eq1(self):
s = "H^+ + OH^- -> H2O"
out = render_to_html(s)
correct = u'<span class="math">H<sup>+</sup>+OH<sup>-</sup>\u2192H<sub>2</sub>O</span>'
log(out + ' ------- ' + correct, 'html')
self.assertEqual(out, correct)
def test_render_eq2(self):
s = "H^+ + OH^- <-> H2O"
out = render_to_html(s)
correct = u'<span class="math">H<sup>+</sup>+OH<sup>-</sup>\u2194H<sub>2</sub>O</span>'
log(out + ' ------- ' + correct, 'html')
self.assertEqual(out, correct)
def test_render_eq3(self):
s = "H^+ + OH^- <= H2O" # unsupported arrow
out = render_to_html(s)
correct = u'<span class="math"><span class="inline-error inline">H^+ + OH^- <= H2O</span></span>'
log(out + ' ------- ' + correct, 'html')
self.assertEqual(out, correct)
def suite(): def suite():
...@@ -305,6 +331,6 @@ def suite(): ...@@ -305,6 +331,6 @@ def suite():
if __name__ == "__main__": if __name__ == "__main__":
local_debug = True local_debug = True
with open('render.html', 'w') as f: with codecs.open('render.html', 'w', encoding='utf-8') as f:
unittest.TextTestRunner(verbosity=2).run(suite()) unittest.TextTestRunner(verbosity=2).run(suite())
# open render.html to look at rendered equations # open render.html to look at rendered equations
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment