1#!/usr/local/bin/python3.8
2# -*- coding: utf-8 -*-
3
4
5import unittest
6from mathics.core.expression import Expression, Integer, Rational, Symbol
7from mathics.core.definitions import Definitions
8from mathics.core.evaluation import Evaluation
9
10
11class ArithmeticTest(unittest.TestCase):
12    def setUp(self):
13        definitions = Definitions(add_builtin=True)
14        self.evaluation = Evaluation(definitions, format="xml")
15
16    def testAdd(self):
17        cases = (
18            (Symbol("a") + 3, Expression("Plus", 3, Symbol("a"))),
19            (Integer(1) + 3, Integer(4)),
20            (Integer(1) + (-3), Integer(-2)),
21            (
22                Expression("List", 1, 2) + Expression("List", -1, 8),
23                Expression("List", 0, 10),
24            ),
25        )
26        self._testCases(cases)
27
28    def testSub(self):
29        cases = (
30            (Symbol("a") - 3, Expression("Plus", -3, Symbol("a"))),
31            (Integer(1) - 3, Integer(-2)),
32            (Integer(1) - (-3), Integer(4)),
33            (
34                Expression("List", 1, 2) - Expression("List", -1, 8),
35                Expression("List", 2, -6),
36            ),
37        )
38        self._testCases(cases)
39
40    def testMul(self):
41        cases = (
42            (Symbol("a") * 3, Expression("Times", 3, Symbol("a"))),
43            (Integer(3) * 7, Integer(21)),
44            (Integer(3) * (-7), Integer(-21)),
45            (
46                Expression("List", 1, 2) * Expression("List", -1, 8),
47                Expression("List", -1, 16),
48            ),
49        )
50        self._testCases(cases)
51
52    def testTrueDiv(self):
53        cases = (
54            (Symbol("a") / 3, Expression("Times", Rational(1, 3), Symbol("a"))),
55            (Integer(8) / 2, Integer(4)),
56            (Integer(8) / (-2), Integer(-4)),
57            (Integer(7) / 2, Rational(7, 2)),
58            (
59                Expression("List", 1, 9) / Expression("List", -1, 3),
60                Expression("List", -1, 3),
61            ),
62        )
63        self._testCases(cases)
64
65    def testFloorDiv(self):
66        cases = (
67            (Integer(8) // 2, Integer(4)),
68            (Integer(8) // (-2), Integer(-4)),
69            (Integer(7) // 2, Integer(3)),
70        )
71        self._testCases(cases)
72
73    def testPow(self):
74        cases = (
75            (Integer(8) ** 2, Integer(64)),
76            (
77                Expression("List", 2, 5) ** Expression("List", 3, 4),
78                Expression("List", 8, 625),
79            ),
80        )
81        self._testCases(cases)
82
83    def testAbs(self):
84        cases = (
85            (abs(Integer(-8)), Integer(8)),
86            (abs(Expression("List")), Expression("Abs", Expression("List"))),
87        )
88        self._testCases(cases)
89
90    def _testCases(self, cases):
91        for expression, result in cases:
92            self.assertEqual(
93                Expression("FullSimplify", expression).evaluate(self.evaluation),
94                Expression("FullSimplify", result).evaluate(self.evaluation),
95            )
96
97
98if __name__ == "__main__":
99    unittest.main()
100