Skip to content
This repository was archived by the owner on Apr 4, 2024. It is now read-only.

Commit 6e1e5fe

Browse files
authored
LiteralInt and LiteratInt_test (#40)
2 parents a9c17e8 + f2afb64 commit 6e1e5fe

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed

python/selfie-lib/selfie_lib/Literals.py

+30
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from typing import Protocol, TypeVar
33
from abc import abstractmethod
44
from .EscapeLeadingWhitespace import EscapeLeadingWhitespace
5+
import io
56

67
T = TypeVar("T")
78

@@ -41,6 +42,35 @@ def parse(self, string: str, language: Language) -> T:
4142
PADDING_SIZE = len(str(MAX_RAW_NUMBER)) - 1
4243

4344

45+
class LiteralInt(LiteralFormat[int]):
46+
def _encode_underscores(
47+
self, buffer: io.StringIO, value: int, language: Language
48+
) -> io.StringIO:
49+
if value >= MAX_RAW_NUMBER:
50+
mod = value % MAX_RAW_NUMBER
51+
left_padding = PADDING_SIZE - len(str(mod))
52+
self._encode_underscores(buffer, value // MAX_RAW_NUMBER, language)
53+
buffer.write("_")
54+
buffer.write("0" * left_padding)
55+
buffer.write(str(mod))
56+
return buffer
57+
elif value < 0:
58+
buffer.write("-")
59+
self._encode_underscores(buffer, abs(value), language)
60+
return buffer
61+
else:
62+
buffer.write(str(value))
63+
return buffer
64+
65+
def encode(
66+
self, value: int, language: Language, encoding_policy: EscapeLeadingWhitespace
67+
) -> str:
68+
return self._encode_underscores(io.StringIO(), value, language).getvalue()
69+
70+
def parse(self, string: str, language: Language) -> int:
71+
return int(string.replace("_", ""))
72+
73+
4474
class LiteralBoolean(LiteralFormat[bool]):
4575
def encode(
4676
self, value: bool, language: Language, encoding_policy: EscapeLeadingWhitespace
+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
from selfie_lib.Literals import LiteralInt, Language
2+
from selfie_lib.EscapeLeadingWhitespace import EscapeLeadingWhitespace
3+
4+
5+
def _encode(value: int, expected: str):
6+
literal_int = LiteralInt()
7+
actual = literal_int.encode(value, Language.PYTHON, EscapeLeadingWhitespace.NEVER)
8+
assert actual == expected, f"Expected '{expected}', but got '{actual}'"
9+
10+
11+
def _decode(value: str, expected: int):
12+
literal_int = LiteralInt()
13+
actual = literal_int.parse(value, Language.PYTHON)
14+
assert actual == expected, f"Expected '{expected}', but got '{actual}'"
15+
16+
17+
class TestLiteralInt:
18+
def test_encode(self):
19+
test_cases = [
20+
(0, "0"),
21+
(1, "1"),
22+
(-1, "-1"),
23+
(999, "999"),
24+
(-999, "-999"),
25+
(1_000, "1_000"),
26+
(-1_000, "-1_000"),
27+
(1_000_000, "1_000_000"),
28+
(-1_000_000, "-1_000_000"),
29+
(2400500, "2_400_500"),
30+
(2400501, "2_400_501"),
31+
(200, "200"),
32+
(1001, "1_001"),
33+
(1010, "1_010"),
34+
(10010, "10_010"),
35+
]
36+
for value, expected in test_cases:
37+
_encode(value, expected)
38+
39+
def test_decode(self):
40+
test_cases = [
41+
("0", 0),
42+
("1", 1),
43+
("-1", -1),
44+
("999", 999),
45+
("9_99", 999),
46+
("9_9_9", 999),
47+
("-999", -999),
48+
("-9_99", -999),
49+
("-9_9_9", -999),
50+
]
51+
for value, expected in test_cases:
52+
_decode(value, expected)

0 commit comments

Comments
 (0)