oracle7-slim / tests /usage /computing /test_base_conversion.py
emberian's picture
Preserve quantity, relation and conversation meaning in legacy runtime paths
f5b73e0 verified
Raw History Blame
4.28 kB
"""Narrow regression checks; no engine startup or specialist panel claim."""
import importlib.util
import os
from pathlib import Path
import unittest
ROOT = Path(__file__).resolve().parents[3]
MODULE = Path(os.environ.get('ORACLE_OPERATOR_SPECS', ROOT / 'root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_operator_specs_v1.py'))
def load(name, path):
spec = importlib.util.spec_from_file_location(name, path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
return module
op = load('computing_test_operator', MODULE)
class BaseConversionRepair(unittest.TestCase):
def check(self, prompt, expected, value, source):
args = op._base_parse(prompt)
self.assertEqual((args['n'], args['frm']), (value, source))
actual, _ = op._base_fn(args)
self.assertEqual(actual, expected)
self.assertEqual(op._base_ref(args), expected)
def test_real_wrong_answer_and_explicit_source(self):
self.check('Convert binary 11111111 to decimal.', '255', 255, 2)
self.check('Convert 11111111 from base 2 to base 10.', '255', 255, 2)
self.check('Convert 17 from base 8 to base 10.', '15', 15, 8)
self.check('Convert 0010 from base 2 to base 10.', '2', 2, 2)
def test_hexadecimal_words_and_prefix(self):
for text in ('Convert hex ff to binary.', 'Convert ff from hexadecimal to binary.',
'What is 0xff in binary?', 'Convert +0xff to binary.'):
self.check(text, '11111111', 255, 16)
self.check('Convert 0b1010 to decimal.', '10', 10, 2)
self.check('Convert 0o17 to decimal.', '15', 15, 8)
self.check('Convert 1010 in binary to decimal.', '10', 10, 2)
def test_decimal_control_and_zero(self):
self.check('Convert 255 to hexadecimal.', 'ff', 255, 10)
self.check('Write 0 in binary.', '0', 0, 10)
self.check('Express +15 as hex.', 'f', 15, 10)
self.check('Convert decimal 255 to hex.', 'ff', 255, 10)
def test_declines_invalid_digits_signs_and_conflicting_bases(self):
for text in ('Convert 102 from base 2 to base 10.', 'Convert binary 102 to decimal.',
'Convert -10 to binary.', 'Convert -0xff to binary.',
'Convert 0x to decimal.', 'Convert 19 from base 8 to decimal.',
'Convert 10 from base 1 to decimal.', 'Convert 10 to base 37.',
'Convert binary 11 from base 8 to decimal.',
'Convert decimal 0xff to binary.'):
with self.subTest(text=text), self.assertRaises(op.OutOfFragment):
op._base_parse(text)
def test_never_takes_a_suffix_of_malformed_or_compound_input(self):
for text in ('Convert - 10 to binary.', 'Convert 12.5 to binary.',
'Convert 10 to binary and 20 to hexadecimal.',
'Convert 1011/2 to decimal.', 'Convert 0b102 to decimal.',
'Convert --10 to binary.', 'Convert ++10 to binary.'):
with self.subTest(text=text), self.assertRaises(op.OutOfFragment):
op._base_parse(text)
def test_every_source_target_base_with_independent_integer_values(self):
# 35*35*5 known source values; output decoding is stdlib int rather
# than either target-encoding implementation under test.
for source in range(2, 37):
for target in range(2, 37):
for digits in ('0', '1', '10', '11', '101'):
args = op._base_parse(f'Convert {digits} from base {source} to base {target}.')
expected = {'0': 0, '1': 1, '10': source,
'11': source+1, '101': source*source+1}[digits]
output, _ = op._base_fn(args)
self.assertEqual(int(output, target), expected)
self.assertEqual(op._base_ref(args), output)
def test_arithmetic_does_not_reuse_a_corrupted_decimal_binding(self):
args = op._base_parse('Convert binary 11111111 to decimal.')
args['n'] = 11111111
self.assertEqual(op._base_fn(args)[0], '255')
self.assertEqual(op._base_ref(args), '255')
if __name__ == '__main__':
unittest.main()