Skip to content

Commit 29d40ce

Browse files
mcclurewhitequark
authored andcommitted
utils: F-strings are missing the letter "f"
Also adds tests for utils ValueError strings. (@whitequark) Adding tests/test_utils.py in the cherry-pick, slightly modified from the one in `main` to remove tests for `TypeError` when a float is passed.
1 parent a430c1d commit 29d40ce

File tree

2 files changed

+73
-2
lines changed

2 files changed

+73
-2
lines changed

amaranth/utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ def ceil_log2(n):
99
Raises a `ValueError` for negative inputs."""
1010
n = operator.index(n)
1111
if n < 0:
12-
raise ValueError("{n} is negative")
12+
raise ValueError(f"{n} is negative")
1313
if n == 0:
1414
return 0
1515
return (n - 1).bit_length()
@@ -21,7 +21,7 @@ def exact_log2(n):
2121
Raises a `ValueError` if `n` is not a power of two."""
2222
n = operator.index(n)
2323
if n <= 0 or (n & (n - 1)):
24-
raise ValueError("{n} is not a power of 2")
24+
raise ValueError(f"{n} is not a power of 2")
2525
return (n - 1).bit_length()
2626

2727
def log2_int(n, need_pow2=True):

tests/test_utils.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import unittest
2+
3+
from amaranth.utils import *
4+
from amaranth._utils import _ignore_deprecated
5+
6+
7+
class Log2TestCase(unittest.TestCase):
8+
def test_ceil_log2(self):
9+
self.assertEqual(ceil_log2(0), 0)
10+
self.assertEqual(ceil_log2(1), 0)
11+
self.assertEqual(ceil_log2(2), 1)
12+
self.assertEqual(ceil_log2(3), 2)
13+
self.assertEqual(ceil_log2(4), 2)
14+
self.assertEqual(ceil_log2(5), 3)
15+
self.assertEqual(ceil_log2(8), 3)
16+
self.assertEqual(ceil_log2(9), 4)
17+
with self.assertRaises(TypeError):
18+
ceil_log2(1.5)
19+
with self.assertRaisesRegex(ValueError, r"^-1 is negative$"):
20+
ceil_log2(-1)
21+
22+
def test_exact_log2(self):
23+
self.assertEqual(exact_log2(1), 0)
24+
self.assertEqual(exact_log2(2), 1)
25+
self.assertEqual(exact_log2(4), 2)
26+
self.assertEqual(exact_log2(8), 3)
27+
for val in [-1, 0, 3, 5, 6, 7, 9]:
28+
with self.assertRaisesRegex(ValueError, (f"^{val} is not a power of 2$")):
29+
exact_log2(val)
30+
with self.assertRaises(TypeError):
31+
exact_log2(1.5)
32+
33+
@_ignore_deprecated
34+
def test_log2_int(self):
35+
self.assertEqual(log2_int(1), 0)
36+
self.assertEqual(log2_int(2), 1)
37+
self.assertEqual(log2_int(4), 2)
38+
self.assertEqual(log2_int(8), 3)
39+
for val in [-1, 3, 5, 6, 7, 9]:
40+
with self.assertRaises(ValueError):
41+
log2_int(val)
42+
self.assertEqual(log2_int(0, False), 0)
43+
self.assertEqual(log2_int(1, False), 0)
44+
self.assertEqual(log2_int(2, False), 1)
45+
self.assertEqual(log2_int(3, False), 2)
46+
self.assertEqual(log2_int(4, False), 2)
47+
self.assertEqual(log2_int(5, False), 3)
48+
self.assertEqual(log2_int(8, False), 3)
49+
self.assertEqual(log2_int(9, False), 4)
50+
51+
def test_bits_for(self):
52+
self.assertEqual(bits_for(-4), 3)
53+
self.assertEqual(bits_for(-3), 3)
54+
self.assertEqual(bits_for(-2), 2)
55+
self.assertEqual(bits_for(-1), 1)
56+
self.assertEqual(bits_for(0), 1)
57+
self.assertEqual(bits_for(1), 1)
58+
self.assertEqual(bits_for(2), 2)
59+
self.assertEqual(bits_for(3), 2)
60+
self.assertEqual(bits_for(4), 3)
61+
self.assertEqual(bits_for(5), 3)
62+
self.assertEqual(bits_for(-4, True), 3)
63+
self.assertEqual(bits_for(-3, True), 3)
64+
self.assertEqual(bits_for(-2, True), 2)
65+
self.assertEqual(bits_for(-1, True), 1)
66+
self.assertEqual(bits_for(0, True), 1)
67+
self.assertEqual(bits_for(1, True), 2)
68+
self.assertEqual(bits_for(2, True), 3)
69+
self.assertEqual(bits_for(3, True), 3)
70+
self.assertEqual(bits_for(4, True), 4)
71+
self.assertEqual(bits_for(5, True), 4)

0 commit comments

Comments
 (0)