emoji: repair one-shot candidate selection
This commit is contained in:
85
tests/mkemoji_test.py
Normal file
85
tests/mkemoji_test.py
Normal file
@@ -0,0 +1,85 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
MKEMOJI = ROOT / "map" / "mkemoji"
|
||||
|
||||
|
||||
def generate(source=None):
|
||||
args = [sys.executable, "-B", str(MKEMOJI)]
|
||||
if source is not None:
|
||||
args.append(str(source))
|
||||
return subprocess.run(args, capture_output=True, text=True, check=False)
|
||||
|
||||
|
||||
def table(output):
|
||||
return dict(line.split("\t", 1) for line in output.splitlines())
|
||||
|
||||
|
||||
class MkemojiTest(unittest.TestCase):
|
||||
def source(self, text):
|
||||
tmp = tempfile.TemporaryDirectory()
|
||||
path = Path(tmp.name) / "emoji.src"
|
||||
path.write_text(text, encoding="utf-8")
|
||||
self.addCleanup(tmp.cleanup)
|
||||
return path
|
||||
|
||||
def test_production_digit_slots(self):
|
||||
result = generate()
|
||||
self.assertEqual(result.returncode, 0, result.stderr)
|
||||
data = table(result.stdout)
|
||||
self.assertEqual(data["^"].split()[:9], list("¹²³⁴⁵⁶⁷⁸⁹"))
|
||||
self.assertEqual(data["_"].split()[:9], list("₁₂₃₄₅₆₇₈₉"))
|
||||
self.assertEqual(data["<"].split()[2], "♥")
|
||||
self.assertEqual(data["^1"], "¹")
|
||||
self.assertEqual(data["_2"], "₂")
|
||||
self.assertEqual(data["<3"], "♥")
|
||||
|
||||
def test_fold_normalize_and_exact_first(self):
|
||||
source = self.source(
|
||||
"β\tALPHABET\n"
|
||||
"α\talpha\n"
|
||||
"e\u0301\tE\u0301\n"
|
||||
"#\thash\n"
|
||||
)
|
||||
first = generate(source)
|
||||
second = generate(source)
|
||||
self.assertEqual(first.returncode, 0, first.stderr)
|
||||
self.assertEqual(first.stdout, second.stdout)
|
||||
data = table(first.stdout)
|
||||
self.assertEqual(data["alpha"].split(), ["α", "β"])
|
||||
self.assertEqual(data["al"].split(), ["β", "α"])
|
||||
self.assertEqual(data["é"], "é")
|
||||
self.assertEqual(data["hash"], "#")
|
||||
|
||||
def test_rejects_malformed_and_oversized_rows(self):
|
||||
bad = [
|
||||
"x\n",
|
||||
"bad result\ta\n",
|
||||
"x\t\n",
|
||||
"x\t a\n",
|
||||
"\0\ta\n",
|
||||
"x\ta\0b\n",
|
||||
"x" * 65 + "\ta\n",
|
||||
"x\t" + "a" * 65 + "\n",
|
||||
]
|
||||
for text in bad:
|
||||
with self.subTest(text=repr(text)):
|
||||
result = generate(self.source(text))
|
||||
self.assertEqual(result.returncode, 1)
|
||||
|
||||
def test_accepts_runtime_boundary(self):
|
||||
source = self.source("x" * 64 + "\t" + "a" * 64 + "\n")
|
||||
result = generate(source)
|
||||
self.assertEqual(result.returncode, 0, result.stderr)
|
||||
self.assertIn("a" * 64 + "\t" + "x" * 64, result.stdout)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user