bug and unittests for renders
This commit is contained in:
parent
1ecc25b9bf
commit
232368fd75
@ -74,7 +74,6 @@ class Render(object):
|
|||||||
else:
|
else:
|
||||||
operandeStack.push(token)
|
operandeStack.push(token)
|
||||||
|
|
||||||
|
|
||||||
# Manip pour gerer les cas de listes imbriquées dans d'autres listes
|
# Manip pour gerer les cas de listes imbriquées dans d'autres listes
|
||||||
infix_tokens = operandeStack.pop()
|
infix_tokens = operandeStack.pop()
|
||||||
|
|
||||||
@ -117,6 +116,11 @@ class Render(object):
|
|||||||
and operande < 0 \
|
and operande < 0 \
|
||||||
and posi == "after":
|
and posi == "after":
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
# Pas de parenthèses si c'est une lettre ou une fraction
|
||||||
|
elif (type(operande) == str and operande.isalpha()) \
|
||||||
|
or type(operande) == Fraction:
|
||||||
|
return 0
|
||||||
|
|
||||||
# Si c'est un polynom
|
# Si c'est un polynom
|
||||||
elif type(operande) == Polynom:
|
elif type(operande) == Polynom:
|
||||||
@ -128,7 +132,7 @@ class Render(object):
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
elif not self.isNumber(operande):
|
elif not self.isNumber(operande):
|
||||||
# Si c'est une grande expression ou un chiffre négatif
|
# Si c'est une grande expression
|
||||||
stand_alone = self.get_main_op(operande)
|
stand_alone = self.get_main_op(operande)
|
||||||
# Si la priorité de l'operande est plus faible que celle de l'opérateur
|
# Si la priorité de l'operande est plus faible que celle de l'opérateur
|
||||||
minor_priority = self.PRIORITY[self.get_main_op(operande)] < self.PRIORITY[operator]
|
minor_priority = self.PRIORITY[self.get_main_op(operande)] < self.PRIORITY[operator]
|
||||||
@ -202,7 +206,7 @@ class Render(object):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
return (type(exp) == str and exp in self.operators)
|
return (type(exp) == str and exp in self.operators)
|
||||||
|
|
||||||
class flist(list):
|
class flist(list):
|
||||||
"""Fake list- they are used to stock the main operation of an rendered expression"""
|
"""Fake list- they are used to stock the main operation of an rendered expression"""
|
||||||
pass
|
pass
|
||||||
|
@ -4,26 +4,44 @@
|
|||||||
from .render import Render
|
from .render import Render
|
||||||
from .fraction import Fraction
|
from .fraction import Fraction
|
||||||
from .polynom import Polynom
|
from .polynom import Polynom
|
||||||
from .generic import first_elem
|
from .generic import first_elem, last_elem
|
||||||
|
|
||||||
# ------------------------
|
|
||||||
# A console render
|
|
||||||
|
|
||||||
txt_infix = {"+": "+", "-": "-", "*": "*", "/" : "/", ":": ":", "^":"^"}
|
|
||||||
txt_postfix = {}
|
|
||||||
txt_other = {"(": "(", ")": ")"}
|
|
||||||
|
|
||||||
txt_render = Render(txt_infix, txt_postfix, txt_other)
|
|
||||||
|
|
||||||
# ------------------------
|
# ------------------------
|
||||||
# A infix to postfix list convertor
|
# A infix to postfix list convertor
|
||||||
|
|
||||||
p2i_infix = {"+": "+", "-": "-", "*": "*", "/" : "/", ":":":", "^":"^"}
|
p2i_infix = {"+": "+", "-": "-", "*": "*", "/" : "/", ":": ":", "^":"^"}
|
||||||
p2i_postfix = {}
|
p2i_postfix = {}
|
||||||
p2i_other = {"(": "(", ")": ")"}
|
p2i_other = {"(": "(", ")": ")"}
|
||||||
|
|
||||||
post2in_fix = Render(p2i_infix, p2i_postfix, p2i_other, join = False)
|
post2in_fix = Render(p2i_infix, p2i_postfix, p2i_other, join = False)
|
||||||
|
|
||||||
|
# ------------------------
|
||||||
|
# A console render
|
||||||
|
|
||||||
|
def txtMult(op1,op2):
|
||||||
|
""" Tex render for *
|
||||||
|
Cases where \\times won't be displayed
|
||||||
|
* nbr letter
|
||||||
|
* nbr (
|
||||||
|
* )(
|
||||||
|
"""
|
||||||
|
first_nbr = type(op1) in [int, Fraction]
|
||||||
|
seg_letter = type(op2) == str and op2.isalpha()
|
||||||
|
first_par = (first_elem(op2) == "(")
|
||||||
|
seg_par = (last_elem(op1) == ")")
|
||||||
|
|
||||||
|
if (first_nbr and (seg_letter or seg_par)) \
|
||||||
|
or (first_par and seg_par):
|
||||||
|
return [op1, op2]
|
||||||
|
else:
|
||||||
|
return [op1, "*", op2]
|
||||||
|
|
||||||
|
txt_infix = {"+": "+", "-": "-", "*": txtMult, "/" : "/", ":":":", "^":"^"}
|
||||||
|
txt_postfix = {}
|
||||||
|
txt_other = {"(": "(", ")": ")"}
|
||||||
|
|
||||||
|
txt_render = Render(txt_infix, txt_postfix, txt_other)
|
||||||
|
|
||||||
# ------------------------
|
# ------------------------
|
||||||
# A latex render
|
# A latex render
|
||||||
|
|
||||||
@ -40,13 +58,20 @@ def texFrac(frac):
|
|||||||
return ["\\frac{" , str(frac._num) , "}{" , str(frac._denom) , "}"]
|
return ["\\frac{" , str(frac._num) , "}{" , str(frac._denom) , "}"]
|
||||||
|
|
||||||
def texMult(op1,op2):
|
def texMult(op1,op2):
|
||||||
""" Tex render for * """
|
""" Tex render for *
|
||||||
fe = first_elem(op2)
|
Cases where \\times won't be displayed
|
||||||
if type(fe) != int and (type(fe) == Polynom or fe.isalpha()):
|
* nbr letter
|
||||||
if type(op1) == list and op1[0] == "(":
|
* nbr (
|
||||||
return ["(", op1[1:-1], op2, ")"]
|
* )(
|
||||||
else:
|
"""
|
||||||
return [op1, op2]
|
first_nbr = type(op1) in [int, Fraction]
|
||||||
|
seg_letter = type(op2) == str and op2.isalpha()
|
||||||
|
first_par = (first_elem(op2) == "(")
|
||||||
|
seg_par = (last_elem(op1) == ")")
|
||||||
|
|
||||||
|
if (first_nbr and (seg_letter or seg_par)) \
|
||||||
|
or (first_par and seg_par):
|
||||||
|
return [op1, op2]
|
||||||
else:
|
else:
|
||||||
return [op1, "\\times", op2]
|
return [op1, "\\times", op2]
|
||||||
|
|
||||||
@ -60,12 +85,13 @@ tex_render = Render(tex_infix, tex_postfix, tex_other, type_render = tex_type_re
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
exp = [2, 5, '^', 1, '-', 3, 4, '*', ':']
|
#exp = [2, 5, '^', 1, '-', 3, 4, '*', ':']
|
||||||
print(txt_render(exp))
|
#print(txt_render(exp))
|
||||||
exp = [2, 5, '^', 1, '-', 3, 4, '*', '/', 3, 5, '/', ':']
|
#exp = [2, 5, '^', 1, '-', 3, 4, '*', '/', 3, 5, '/', ':']
|
||||||
|
exp = [2, -3, "*"]
|
||||||
print(tex_render(exp))
|
print(tex_render(exp))
|
||||||
exp = [2, 5, '^', 1, '-', 3, 4, '*', '/', 3, '+']
|
#exp = [2, 5, '^', 1, '-', 3, 4, '*', '/', 3, '+']
|
||||||
print(post2in_fix(exp))
|
#print(post2in_fix(exp))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -34,14 +34,14 @@ class TestTexRender(unittest.TestCase):
|
|||||||
|
|
||||||
def test_mult_letter(self):
|
def test_mult_letter(self):
|
||||||
exps = [ [2, "a", "*"], ["a", 3, "*"], [-2, "a", "*"], ["a", -2, "*"]]
|
exps = [ [2, "a", "*"], ["a", 3, "*"], [-2, "a", "*"], ["a", -2, "*"]]
|
||||||
wanted_render = [ "2 a", "3 a", "-2 a", "-2 a"]
|
wanted_render = [ "2 a", "a \\times 3", "-2 a", "a \\times ( -2 )"]
|
||||||
for (i,e) in enumerate(exps):
|
for (i,e) in enumerate(exps):
|
||||||
rend = tex_render(e)
|
rend = tex_render(e)
|
||||||
self.assertEqual(rend, wanted_render[i])
|
self.assertEqual(rend, wanted_render[i])
|
||||||
|
|
||||||
def test_mult_fraction(self):
|
def test_mult_fraction(self):
|
||||||
exps = [ [2, Fraction(1,2), "*"], [Fraction(1,2), 3, "*"]]
|
exps = [ [2, Fraction(1,2), "*"], [Fraction(1,2), 3, "*"]]
|
||||||
wanted_render = [ "2 \\times \\frac{1}{2}", "\\frac{1}{2} \\times 3"]
|
wanted_render = [ "2 \\times \\frac{ 1 }{ 2 }", "\\frac{ 1 }{ 2 } \\times 3"]
|
||||||
for (i,e) in enumerate(exps):
|
for (i,e) in enumerate(exps):
|
||||||
rend = tex_render(e)
|
rend = tex_render(e)
|
||||||
self.assertEqual(rend, wanted_render[i])
|
self.assertEqual(rend, wanted_render[i])
|
||||||
@ -79,7 +79,7 @@ class TesttxtRender(unittest.TestCase):
|
|||||||
|
|
||||||
def test_mult_letter(self):
|
def test_mult_letter(self):
|
||||||
exps = [ [2, "a", "*"], ["a", 3, "*"], [-2, "a", "*"], ["a", -2, "*"]]
|
exps = [ [2, "a", "*"], ["a", 3, "*"], [-2, "a", "*"], ["a", -2, "*"]]
|
||||||
wanted_render = [ "2 a", "3 a", "-2 a", "-2 a"]
|
wanted_render = [ "2 a", "a * 3", "-2 a", "a * ( -2 )"]
|
||||||
for (i,e) in enumerate(exps):
|
for (i,e) in enumerate(exps):
|
||||||
rend = txt_render(e)
|
rend = txt_render(e)
|
||||||
self.assertEqual(rend, wanted_render[i])
|
self.assertEqual(rend, wanted_render[i])
|
||||||
|
Loading…
Reference in New Issue
Block a user