1 # SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
3 from metric import Constant
4 from metric import Event
5 from metric import ParsePerfJson
8 class TestMetricExpressions(unittest.TestCase):
10 def test_Operators(self):
13 self.assertEqual((a | b).ToPerfJson(), 'a | b')
14 self.assertEqual((a ^ b).ToPerfJson(), 'a ^ b')
15 self.assertEqual((a & b).ToPerfJson(), 'a & b')
16 self.assertEqual((a < b).ToPerfJson(), 'a < b')
17 self.assertEqual((a > b).ToPerfJson(), 'a > b')
18 self.assertEqual((a + b).ToPerfJson(), 'a + b')
19 self.assertEqual((a - b).ToPerfJson(), 'a - b')
20 self.assertEqual((a * b).ToPerfJson(), 'a * b')
21 self.assertEqual((a / b).ToPerfJson(), 'a / b')
22 self.assertEqual((a % b).ToPerfJson(), 'a % b')
24 self.assertEqual((a + one).ToPerfJson(), 'a + 1')
26 def test_Brackets(self):
30 self.assertEqual((a * b + c).ToPerfJson(), 'a * b + c')
31 self.assertEqual((a + b * c).ToPerfJson(), 'a + b * c')
32 self.assertEqual(((a + a) + a).ToPerfJson(), 'a + a + a')
33 self.assertEqual(((a + b) * c).ToPerfJson(), '(a + b) * c')
34 self.assertEqual((a + (b * c)).ToPerfJson(), 'a + b * c')
35 self.assertEqual(((a / b) * c).ToPerfJson(), 'a / b * c')
36 self.assertEqual((a / (b * c)).ToPerfJson(), 'a / (b * c)')
38 def test_ParsePerfJson(self):
39 # Based on an example of a real metric.
40 before = '(a + b + c + d) / (2 * e)'
42 self.assertEqual(ParsePerfJson(before).ToPerfJson(), after)
44 # Parsing should handle events with '-' in their name. Note, in
45 # the json file the '\' are doubled to '\\'.
46 before = r'topdown\-fe\-bound / topdown\-slots - 1'
48 self.assertEqual(ParsePerfJson(before).ToPerfJson(), after)
50 # Parsing should handle escaped modifiers. Note, in the json file
51 # the '\' are doubled to '\\'.
52 before = r'arb@event\=0x81\,umask\=0x1@ + arb@event\=0x84\,umask\=0x1@'
54 self.assertEqual(ParsePerfJson(before).ToPerfJson(), after)
56 # Parsing should handle exponents in numbers.
57 before = r'a + 1e12 + b'
59 self.assertEqual(ParsePerfJson(before).ToPerfJson(), after)
61 def test_IfElseTests(self):
62 # if-else needs rewriting to Select and back.
63 before = r'Event1 if #smt_on else Event2'
65 self.assertEqual(ParsePerfJson(before).ToPerfJson(), after)
67 before = r'Event1 if 0 else Event2'
69 self.assertEqual(ParsePerfJson(before).ToPerfJson(), after)
71 before = r'Event1 if 1 else Event2'
73 self.assertEqual(ParsePerfJson(before).ToPerfJson(), after)
75 # Ensure the select is evaluate last.
76 before = r'Event1 + 1 if Event2 < 2 else Event3 + 3'
77 after = (r'Select(Event(r"Event1") + Constant(1), Event(r"Event2") < '
78 r'Constant(2), Event(r"Event3") + Constant(3))')
79 self.assertEqual(ParsePerfJson(before).ToPython(), after)
81 before = r'Event1 > 1 if Event2 < 2 else Event3 > 3'
82 after = (r'Select(Event(r"Event1") > Constant(1), Event(r"Event2") < '
83 r'Constant(2), Event(r"Event3") > Constant(3))')
84 self.assertEqual(ParsePerfJson(before).ToPython(), after)
86 before = r'min(a + b if c > 1 else c + d, e + f)'
87 after = r'min((a + b if c > 1 else c + d), e + f)'
88 self.assertEqual(ParsePerfJson(before).ToPerfJson(), after)
90 before =3D r'a if b else c if d else e'
91 after =3D r'(a if b else (c if d else e))'
92 self.assertEqual(ParsePerfJson(before).ToPerfJson(), after)
94 def test_ToPython(self):
95 # pylint: disable=eval-used
96 # Based on an example of a real metric.
97 before = '(a + b + c + d) / (2 * e)'
98 py = ParsePerfJson(before).ToPython()
99 after = eval(py).ToPerfJson()
100 self.assertEqual(before, after)
102 def test_Simplify(self):
105 self.assertEqual(ParsePerfJson(before).Simplify().ToPerfJson(), after)
109 self.assertEqual(ParsePerfJson(before).Simplify().ToPerfJson(), after)
113 self.assertEqual(ParsePerfJson(before).Simplify().ToPerfJson(), after)
117 self.assertEqual(ParsePerfJson(before).Simplify().ToPerfJson(), after)
121 self.assertEqual(ParsePerfJson(before).Simplify().ToPerfJson(), after)
125 self.assertEqual(ParsePerfJson(before).Simplify().ToPerfJson(), after)
129 self.assertEqual(ParsePerfJson(before).Simplify().ToPerfJson(), after)
133 self.assertEqual(ParsePerfJson(before).Simplify().ToPerfJson(), after)
137 self.assertEqual(ParsePerfJson(before).Simplify().ToPerfJson(), after)
139 before = 'a if 0 else b'
141 self.assertEqual(ParsePerfJson(before).Simplify().ToPerfJson(), after)
143 before = 'a if 1 else b'
145 self.assertEqual(ParsePerfJson(before).Simplify().ToPerfJson(), after)
147 before = 'a if b else a'
149 self.assertEqual(ParsePerfJson(before).Simplify().ToPerfJson(), after)
151 # Pattern used to add a slots event to metrics that require it.
154 self.assertEqual(ParsePerfJson(before).Simplify().ToPerfJson(), after)
156 if __name__ == '__main__':