File: test_mathutil.py

package info (click to toggle)
python-pyutil 3.3.2-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 884 kB
  • sloc: python: 7,198; makefile: 6
file content (146 lines) | stat: -rw-r--r-- 5,403 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#!/usr/bin/env python
# -*- coding: utf-8-with-signature-unix; fill-column: 77 -*-
# -*- indent-tabs-mode: nil -*-

#  This file is part of pyutil; see README.rst for licensing terms.

import unittest

from pyutil import mathutil
from pyutil.assertutil import _assert

class MathUtilTestCase(unittest.TestCase):
    def _help_test_is_power_of_k(self, k):
        for i in range(2, 40):
            _assert(mathutil.is_power_of_k(k**i, k), k, i)

    def test_is_power_of_k(self):
        for i in range(2, 5):
            self._help_test_is_power_of_k(i)

    def test_log_ceil(self):
        f = mathutil.log_ceil
        self.assertEqual(f(1, 2), 0)
        self.assertEqual(f(1, 3), 0)
        self.assertEqual(f(2, 2), 1)
        self.assertEqual(f(2, 3), 1)
        self.assertEqual(f(3, 2), 2)

    def test_log_floor(self):
        f = mathutil.log_floor
        self.assertEqual(f(1, 2), 0)
        self.assertEqual(f(1, 3), 0)
        self.assertEqual(f(2, 2), 1)
        self.assertEqual(f(2, 3), 0)
        self.assertEqual(f(3, 2), 1)

    def test_div_ceil(self):
        f = mathutil.div_ceil
        self.assertEqual(f(0, 1), 0)
        self.assertEqual(f(0, 2), 0)
        self.assertEqual(f(0, 3), 0)
        self.assertEqual(f(1, 3), 1)
        self.assertEqual(f(2, 3), 1)
        self.assertEqual(f(3, 3), 1)
        self.assertEqual(f(4, 3), 2)
        self.assertEqual(f(5, 3), 2)
        self.assertEqual(f(6, 3), 2)
        self.assertEqual(f(7, 3), 3)
        self.assertTrue(isinstance(f(0.0, 1), int))
        self.assertEqual(f(7.0, 3.0), 3)
        self.assertEqual(f(7, 3.0), 3)
        self.assertEqual(f(7.0, 3), 3)
        self.assertEqual(f(6.0, 3.0), 2)
        self.assertEqual(f(6.0, 3), 2)
        self.assertEqual(f(6, 3.0), 2)

    def test_next_multiple(self):
        f = mathutil.next_multiple
        self.assertEqual(f(5, 1), 5)
        self.assertEqual(f(5, 2), 6)
        self.assertEqual(f(5, 3), 6)
        self.assertEqual(f(5, 4), 8)
        self.assertEqual(f(5, 5), 5)
        self.assertEqual(f(5, 6), 6)
        self.assertEqual(f(32, 1), 32)
        self.assertEqual(f(32, 2), 32)
        self.assertEqual(f(32, 3), 33)
        self.assertEqual(f(32, 4), 32)
        self.assertEqual(f(32, 5), 35)
        self.assertEqual(f(32, 6), 36)
        self.assertEqual(f(32, 7), 35)
        self.assertEqual(f(32, 8), 32)
        self.assertEqual(f(32, 9), 36)
        self.assertEqual(f(32, 10), 40)
        self.assertEqual(f(32, 11), 33)
        self.assertEqual(f(32, 12), 36)
        self.assertEqual(f(32, 13), 39)
        self.assertEqual(f(32, 14), 42)
        self.assertEqual(f(32, 15), 45)
        self.assertEqual(f(32, 16), 32)
        self.assertEqual(f(32, 17), 34)
        self.assertEqual(f(32, 18), 36)
        self.assertEqual(f(32, 589), 589)

    def test_pad_size(self):
        f = mathutil.pad_size
        self.assertEqual(f(0, 4), 0)
        self.assertEqual(f(1, 4), 3)
        self.assertEqual(f(2, 4), 2)
        self.assertEqual(f(3, 4), 1)
        self.assertEqual(f(4, 4), 0)
        self.assertEqual(f(5, 4), 3)

    def test_is_power_of_k_part_2(self):
        f = mathutil.is_power_of_k
        for i in range(1, 100):
            if i in (1, 2, 4, 8, 16, 32, 64):
                self.assertTrue(f(i, 2), "but %d *is* a power of 2" % i)
            else:
                self.assertFalse(f(i, 2), "but %d is *not* a power of 2" % i)
        for i in range(1, 100):
            if i in (1, 3, 9, 27, 81):
                self.assertTrue(f(i, 3), "but %d *is* a power of 3" % i)
            else:
                self.assertFalse(f(i, 3), "but %d is *not* a power of 3" % i)

    def test_next_power_of_k(self):
        f = mathutil.next_power_of_k
        self.assertEqual(f(0,2), 1)
        self.assertEqual(f(1,2), 1)
        self.assertEqual(f(2,2), 2)
        self.assertEqual(f(3,2), 4)
        self.assertEqual(f(4,2), 4)
        for i in range(5, 8): self.assertEqual(f(i,2), 8, "%d" % i)
        for i in range(9, 16): self.assertEqual(f(i,2), 16, "%d" % i)
        for i in range(17, 32): self.assertEqual(f(i,2), 32, "%d" % i)
        for i in range(33, 64): self.assertEqual(f(i,2), 64, "%d" % i)
        for i in range(65, 100): self.assertEqual(f(i,2), 128, "%d" % i)

        self.assertEqual(f(0,3), 1)
        self.assertEqual(f(1,3), 1)
        self.assertEqual(f(2,3), 3)
        self.assertEqual(f(3,3), 3)
        for i in range(4, 9): self.assertEqual(f(i,3), 9, "%d" % i)
        for i in range(10, 27): self.assertEqual(f(i,3), 27, "%d" % i)
        for i in range(28, 81): self.assertEqual(f(i,3), 81, "%d" % i)
        for i in range(82, 200): self.assertEqual(f(i,3), 243, "%d" % i)

    def test_ave(self):
        f = mathutil.ave
        self.assertEqual(f([1,2,3]), 2)
        self.assertEqual(f([0,0,0,4]), 1)
        self.assertAlmostEqual(f([0.0, 1.0, 1.0]), .666666666666)

    def assertEqualContents(self, a, b):
        self.assertEqual(sorted(a), sorted(b))

    def test_permute(self):
        f = mathutil.permute
        self.assertEqualContents(f([]), [])
        self.assertEqualContents(f([1]), [[1]])
        self.assertEqualContents(f([1,2]), [[1,2], [2,1]])
        self.assertEqualContents(f([1,2,3]),
                                     [[1,2,3], [1,3,2],
                                      [2,1,3], [2,3,1],
                                      [3,1,2], [3,2,1]])