kothic/tests/testEval.py

124 lines
6.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import unittest
import sys
from pathlib import Path
# Add `src` directory to the import paths
sys.path.insert(0, str(Path(__file__).parent.parent / 'src'))
from mapcss.Eval import Eval
class EvalTest(unittest.TestCase):
""" Test eval(...) feature for CSS properties.
NOTE: eval() is not used in Organic Maps styles. We can drop it completely.
"""
def test_eval_tag(self):
a = Eval("""eval( tag("lanes") )""")
self.assertEqual(a.compute({"lanes": "4"}), "4")
self.assertEqual(a.compute({"natural": "trees"}), "")
self.assertSetEqual(a.extract_tags(), {"lanes"})
def test_eval_prop(self):
a = Eval("""eval( prop("dpi") / 2 )""")
self.assertEqual(a.compute({"lanes": "4"}, {"dpi": 144}), "72")
self.assertEqual(a.compute({"lanes": "4"}, {"orientation": "vertical"}), "")
self.assertSetEqual(a.extract_tags(), set())
def test_eval_num(self):
a = Eval("""eval( num(tag("lanes")) + 2 )""")
self.assertEqual(a.compute({"lanes": "4"}), "6")
self.assertEqual(a.compute({"lanes": "many"}), "2")
self.assertSetEqual(a.extract_tags(), {"lanes"})
def test_eval_metric(self):
a = Eval("""eval( metric(tag("height")) )""")
self.assertEqual(a.compute({"height": "512"}), "512")
self.assertEqual(a.compute({"height": "10m"}), "10")
self.assertEqual(a.compute({"height": " 10m"}), "10")
self.assertEqual(a.compute({"height": "500cm"}), "5")
self.assertEqual(a.compute({"height": "500 cm"}), "5")
self.assertEqual(a.compute({"height": "250CM"}), "2.5")
self.assertEqual(a.compute({"height": "250 CM"}), "2.5")
self.assertEqual(a.compute({"height": "30см"}), "0.3")
self.assertEqual(a.compute({"height": " 30 см"}), "0.3")
self.assertEqual(a.compute({"height": "1200 mm"}), "1.2")
self.assertEqual(a.compute({"height": "2400MM"}), "2.4")
self.assertEqual(a.compute({"height": "2800 мм"}), "2.8")
self.assertSetEqual(a.extract_tags(), {"height"})
def test_eval_metric_with_scale(self):
a = Eval("""eval( metric(tag("height")) )""")
self.assertEqual(a.compute({"height": "512"}, xscale=4), "2048")
self.assertEqual(a.compute({"height": "512"}, zscale=4), "512")
self.assertEqual(a.compute({"height": "10m"}, xscale=4), "40")
self.assertEqual(a.compute({"height": " 10m"}, xscale=4), "40")
self.assertEqual(a.compute({"height": "500cm"}, xscale=4), "20")
self.assertEqual(a.compute({"height": "500 cm"}, xscale=4), "20")
self.assertEqual(a.compute({"height": "250CM"}, xscale=4), "10")
self.assertEqual(a.compute({"height": "250 CM"}, xscale=4), "10")
self.assertEqual(a.compute({"height": "30см"}, xscale=4), "1.2")
self.assertEqual(a.compute({"height": " 30 см"}, xscale=4), "1.2")
self.assertEqual(a.compute({"height": "1200 mm"}, xscale=4), "4.8")
self.assertEqual(a.compute({"height": "2400MM"}, xscale=4), "9.6")
self.assertEqual(a.compute({"height": "2800 мм"}, xscale=4), "11.2")
self.assertSetEqual(a.extract_tags(), {"height"})
def test_eval_zmetric(self):
a = Eval("""eval( zmetric(tag("depth")) )""")
self.assertEqual(a.compute({"depth": "512"}), "256")
self.assertEqual(a.compute({"depth": "10m"}), "5")
self.assertEqual(a.compute({"depth": " 10m"}), "5")
self.assertEqual(a.compute({"depth": "500cm"}), "2.5")
self.assertEqual(a.compute({"depth": "500 cm"}), "2.5")
self.assertEqual(a.compute({"depth": "250CM"}), "1.25")
self.assertEqual(a.compute({"depth": "250 CM"}), "1.25")
self.assertEqual(a.compute({"depth": "30см"}), "0.15")
self.assertEqual(a.compute({"depth": " 30 см"}), "0.15")
self.assertEqual(a.compute({"depth": "1200 mm"}), "0.6")
self.assertEqual(a.compute({"depth": "2400MM"}), "1.2")
self.assertEqual(a.compute({"depth": "2800 мм"}), "1.4")
self.assertSetEqual(a.extract_tags(), {"depth"})
def test_eval_str(self):
a = Eval("""eval( str( num(tag("width")) - 200 ) )""")
self.assertEqual(a.compute({"width": "400"}), "200.0")
self.assertSetEqual(a.extract_tags(), {"width"})
def test_eval_any(self):
a = Eval("""eval( any(tag("building"), tag("building:part"), "no") )""")
self.assertEqual(a.compute({"building": "apartment"}), "apartment")
self.assertEqual(a.compute({"building:part": "roof"}), "roof")
self.assertEqual(a.compute({"junction": "roundabout"}), "no")
self.assertSetEqual(a.extract_tags(), {"building", "building:part"})
def test_eval_min(self):
a = Eval("""eval( min( num(tag("building:levels")) * 3, 50) )""")
self.assertEqual(a.compute({"natural": "wood"}), "0")
self.assertEqual(a.compute({"building:levels": "0"}), "0")
self.assertEqual(a.compute({"building:levels": "10"}), "30")
self.assertEqual(a.compute({"building:levels": "30"}), "50")
self.assertSetEqual(a.extract_tags(), {"building:levels"})
def test_eval_max(self):
a = Eval("""eval( max( tag("speed:limit"), 60) )""")
self.assertEqual(a.compute({"natural": "wood"}), "60")
self.assertEqual(a.compute({"speed:limit": "30"}), "60")
self.assertEqual(a.compute({"speed:limit": "60"}), "60")
self.assertEqual(a.compute({"speed:limit": "90"}), "90")
self.assertSetEqual(a.extract_tags(), {"speed:limit"})
def test_eval_cond(self):
a = Eval("""eval( cond( boolean(tag("oneway")), 200, 100) )""")
self.assertEqual(a.compute({"natural": "wood"}), "100")
self.assertEqual(a.compute({"oneway": "yes"}), "200")
self.assertEqual(a.compute({"oneway": "no"}), "100")
self.assertEqual(a.compute({"oneway": "true"}), "200")
self.assertEqual(a.compute({"oneway": "probably no"}), "200")
self.assertSetEqual(a.extract_tags(), {"oneway"})
def test_complex_eval(self):
a = Eval(""" eval( any( metric(tag("height")), metric ( num(tag("building:levels")) * 3), metric("1m"))) """)
self.assertEqual(a.compute({"building:levels": "3"}), "9")
self.assertSetEqual(a.extract_tags(), {"height", "building:levels"})
if __name__ == '__main__':
unittest.main()