test_rules_utils.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. # This file is part of TRS (http://math.kompiler.org)
  2. #
  3. # TRS is free software: you can redistribute it and/or modify it under the
  4. # terms of the GNU Affero General Public License as published by the Free
  5. # Software Foundation, either version 3 of the License, or (at your option) any
  6. # later version.
  7. #
  8. # TRS is distributed in the hope that it will be useful, but WITHOUT ANY
  9. # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
  10. # A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
  11. # details.
  12. #
  13. # You should have received a copy of the GNU Affero General Public License
  14. # along with TRS. If not, see <http://www.gnu.org/licenses/>.
  15. from src.rules import utils
  16. from src.rules.utils import least_common_multiple, is_fraction, partition, \
  17. find_variables, first_sorted_variable, find_variable, substitute, \
  18. divides, dividers, is_prime, prime_dividers, evals_to_numeric, \
  19. iter_pairs, range_except
  20. from tests.rulestestcase import tree, RulesTestCase
  21. class TestRulesUtils(RulesTestCase):
  22. def test_doctest(self):
  23. self.assertDoctests(utils)
  24. def test_least_common_multiple(self):
  25. self.assertEqual(least_common_multiple(5, 6), 30)
  26. self.assertEqual(least_common_multiple(5, 6, 15), 30)
  27. self.assertEqual(least_common_multiple(2, 4), 4)
  28. def test_is_fraction(self):
  29. l1, a = tree('1, a')
  30. self.assertTrue(is_fraction(a / 2, a, 2))
  31. self.assertTrue(is_fraction(l1 / 2 * a, a, 2))
  32. self.assertTrue(is_fraction(a * (l1 / 2), a, 2))
  33. self.assertFalse(is_fraction(l1 / 3 * a, a, 2))
  34. self.assertFalse(is_fraction(l1, a, 2))
  35. def test_partition(self):
  36. self.assertEqual(partition(lambda x: x & 1, range(6)),
  37. ([1, 3, 5], [0, 2, 4]))
  38. def test_find_variables(self):
  39. x, l2, add, mul0, mul1 = tree('x, 2, x + 2, 2x, xy')
  40. self.assertSetEqual(find_variables(x), set(['x']))
  41. self.assertSetEqual(find_variables(l2), set())
  42. self.assertSetEqual(find_variables(add), set(['x']))
  43. self.assertSetEqual(find_variables(mul0), set(['x']))
  44. self.assertSetEqual(find_variables(mul1), set(['x', 'y']))
  45. def test_first_sorted_variable(self):
  46. self.assertEqual(first_sorted_variable(set('ax')), 'x')
  47. self.assertEqual(first_sorted_variable(set('ay')), 'y')
  48. self.assertEqual(first_sorted_variable(set('az')), 'z')
  49. self.assertEqual(first_sorted_variable(set('xz')), 'x')
  50. self.assertEqual(first_sorted_variable(set('bac')), 'a')
  51. def test_find_variable(self):
  52. x, y = tree('x, y')
  53. self.assertEqual(find_variable(tree('x')), x)
  54. self.assertEqual(find_variable(tree('x ^ 2')), x)
  55. self.assertEqual(find_variable(tree('1 + 2')), x)
  56. self.assertEqual(find_variable(tree('y ^ 2')), y)
  57. def test_substitute(self):
  58. x, a = tree('x, a')
  59. self.assertEqual(substitute(x, x, a), a)
  60. self.assertEqual(substitute(tree('x2'), x, a), tree('a2'))
  61. self.assertEqual(substitute(tree('y + x + 1'), x, a),
  62. tree('y + a + 1'))
  63. self.assertEqual(substitute(tree('1 - 2x'), x, a),
  64. tree('1 - 2a'))
  65. def test_divides(self):
  66. self.assertTrue(divides(3, 3))
  67. self.assertTrue(divides(2, 4))
  68. self.assertTrue(divides(7, 21))
  69. self.assertFalse(divides(4, 2))
  70. self.assertFalse(divides(2, 3))
  71. def test_dividers(self):
  72. self.assertEqual(dividers(1), [])
  73. self.assertEqual(dividers(2), [])
  74. self.assertEqual(dividers(4), [2])
  75. self.assertEqual(dividers(6), [2, 3])
  76. self.assertEqual(dividers(10), [2, 5])
  77. self.assertEqual(dividers(21), [3, 7])
  78. self.assertEqual(dividers(20), [2, 4, 5, 10])
  79. self.assertEqual(dividers(1000000), [2, 4, 5, 8, 10, 16, 20, 25, 32,
  80. 40, 50, 64, 80, 100, 125, 160, 200, 250, 320, 400, 500, 625, 800,
  81. 1000, 1250, 1600, 2000, 2500, 3125, 4000, 5000, 6250, 8000, 10000,
  82. 12500, 15625, 20000, 25000, 31250, 40000, 50000, 62500, 100000,
  83. 125000, 200000, 250000, 500000])
  84. def test_is_prime(self):
  85. self.assertFalse(is_prime(1))
  86. self.assertTrue(is_prime(2))
  87. self.assertTrue(is_prime(3))
  88. self.assertFalse(is_prime(6))
  89. self.assertFalse(is_prime(9))
  90. self.assertTrue(is_prime(19))
  91. self.assertTrue(is_prime(43))
  92. def test_prime_dividers(self):
  93. self.assertEqual(prime_dividers(6), [2, 3])
  94. self.assertEqual(prime_dividers(20), [2, 5])
  95. def test_evals_to_numeric(self):
  96. self.assertTrue(evals_to_numeric(tree('1')))
  97. self.assertFalse(evals_to_numeric(tree('a')))
  98. self.assertTrue(evals_to_numeric(tree('1 + 2')))
  99. self.assertFalse(evals_to_numeric(tree('1 + a')))
  100. self.assertTrue(evals_to_numeric(tree('1 + 2 / 2 * 9')))
  101. self.assertFalse(evals_to_numeric(tree('int 1')))
  102. self.assertFalse(evals_to_numeric(tree('int a')))
  103. self.assertTrue(evals_to_numeric(tree('sqrt 1')))
  104. def test_iter_pairs(self):
  105. self.assertEqual(list(iter_pairs([1])), [])
  106. self.assertEqual(list(iter_pairs([1, 2])), [(1, 2)])
  107. self.assertEqual(list(iter_pairs([1, 2, 3])), [(1, 2), (2, 3)])
  108. self.assertEqual(list(iter_pairs([1, 2, 3, 4])), [(1, 2), (2, 3), (3, 4)])
  109. def test_range_except(self):
  110. self.assertEqual(range_except(0, 5, 2), [0, 1, 3, 4])
  111. self.assertEqual(range_except(0, 4, 0), [1, 2, 3])
  112. self.assertEqual(range_except(0, 3, 3), [0, 1, 2])