Something went wrong. Try again.
HEXWORK - A Lantern in the Deep: 3D ASCII terminal roguelike RPG in Rust.
Entirely designed and built by Muse Spark 1.3 to evaluate if I like the model.
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384import jsonimport osimport pathlibimport tempfileimport unittestfrom unittest.mock import patchfrom vt import VT, export
class DecoderTests(unittest.TestCase): def test_every_byte_split_handwritten_colors_and_chrome(self): wire = '\x1b[2J\x1b[H\x1b[1;38;2;1;2;3;48;5;196m▀\x1b[22;39;49mX\x1b[2;1f\x1b[0mHUD'.encode() expected = [[('▀',(1,2,3),196,True),('X',None,None,False),(' ',None,None,False),(' ',None,None,False)], [('H',None,None,False),('U',None,None,False),('D',None,None,False),(' ',None,None,False)]] for split in range(len(wire)+1): vt = VT(4,2) vt.feed(wire[:split]); vt.feed(wire[split:]); vt.finish() self.assertEqual(vt.cells, expected, split) vt = VT(4,2) for byte in wire: vt.feed(bytes([byte])) self.assertEqual(vt.cells, expected)
def test_full_diff_reference(self): full = b'\x1b[2J\x1b[H\x1b[38;5;42mabc\x1b[2;1H\x1b[0mHUD' diff = b'\x1b[1;2H\x1b[38;2;9;8;7;48;5;4;1mZ\x1b[0m\x1b[2;1HHUD' reference = b'\x1b[2J\x1b[H\x1b[38;5;42ma\x1b[38;2;9;8;7;48;5;4;1mZ\x1b[0;38;5;42mc\x1b[2;1H\x1b[0mHUD' a,b = VT(4,2),VT(4,2) a.feed(full); a.feed(diff); b.feed(reference) self.assertEqual(a.snapshot(), b.snapshot()) self.assertEqual(a.cells[0][1], ('Z',(9,8,7),4,True)) self.assertTrue(all(cell[1:] == (None,None,False) for cell in a.cells[1]))
def test_erase_inclusive_and_pen(self): for command, expected in [(b'0K','abc \nfghij'),(b'1K',' e\nfghij'),(b'2K',' \nfghij'), (b'0J','abc \n '),(b'1J',' e\nfghij'),(b'2J',' \n ')]: vt = VT(5,2); vt.feed(b'abcdefghij\x1b[1;4H\x1b['+command) self.assertEqual(vt.text(), expected)
def test_alt_wrap_resize(self): vt = VT(3,2); vt.feed(b'abcD') self.assertEqual(vt.text(),'abc\nD ') vt.feed(b'\x1b[?1049hXYZQ') self.assertEqual(vt.text(),'XYZ\nQ ') vt.resize(4,3); vt.feed(b'\x1b[?1049l') self.assertEqual(vt.text(),'abc \nD \n ') vt.feed(b'\x1b[?7l\x1b[3;4H12') self.assertEqual(vt.cells[2][3][0],'2')
def test_all_byte_splits_alt_erase_and_indexed(self): wire=b'base\x1b[?1049h\x1b[?25l\x1b[?7l\x1b[38;5;255;48;2;4;5;6mAB\x1b[1;2f\x1b[K\x1b[0m\x1b[?1049l\x1b[?25h' for split in range(len(wire)+1): vt=VT(5,2); vt.feed(wire[:split]); vt.feed(wire[split:]); vt.finish() self.assertEqual(vt.text(),'base \n ',split) self.assertFalse(vt.alternate) self.assertTrue(vt.visible) self.assertEqual(vt.cells[0][0],('b',None,None,False))
def test_loud_unknown_and_incomplete(self): for wire in [b'\x1b[3m',b'\x1b[?999h',b'\x1b]title\x07',b'\x07',b'\x1b[38;2;4m']: with self.assertRaises(ValueError): VT().feed(wire) vt=VT(); vt.feed(b'\x1b[') with self.assertRaises(ValueError): vt.finish() vt=VT(); vt.feed(b'\xe2') with self.assertRaises(UnicodeDecodeError): vt.finish()
def test_export_opt_in_determinism_and_sanitization(self): vt=VT(2,1); vt.feed(b'<&') with tempfile.TemporaryDirectory() as directory: with patch.dict(os.environ, {'HEXWORK_PTY_ARTIFACT_DIR':directory}): export(vt,'fixture',{'mode':'Play','untrusted_path':'/secret'}) path=pathlib.Path(directory) first={p.name:p.read_bytes() for p in path.iterdir()} export(vt,'fixture',{'mode':'Play','untrusted_path':'/secret'}) self.assertEqual(first,{p.name:p.read_bytes() for p in path.iterdir()}) self.assertNotIn(b'/secret',first['fixture.json']) self.assertIn(b'<',first['fixture.svg']) self.assertEqual(json.loads(first['fixture.json'])['screen']['cell_aspect'],[1,2]) with self.assertRaises(ValueError): export(vt,'../bad',{}) with self.assertRaises(ValueError): export(vt,'bad',{'mode':'/secret'})
if __name__ == '__main__': unittest.main()