import synta
def section(title):
print(f"\n{'─' * 60}\n{title}\n{'─' * 60}")
def demo_constructors():
section("Integer — three constructors")
i1 = synta.Integer(42)
print(f" Integer(42).to_int() = {i1.to_int()}")
assert i1.to_int() == 42
i2 = synta.Integer.from_u64(2**32)
print(f" Integer.from_u64(2**32).to_bytes() = {i2.to_bytes().hex()}")
assert i2.to_bytes() == (2**32).to_bytes(5, "big", signed=True)
serial_bytes = b'\x7f' + b'\xff' * 19
i3 = synta.Integer.from_bytes(serial_bytes)
print(f" Integer.from_bytes(20-byte): to_bytes={i3.to_bytes().hex()[:20]}...")
def demo_to_int_overflow():
section("to_int() — succeeds for small values, OverflowError for big ones")
small = synta.Integer(2**62)
print(f" Integer(2**62).to_int() = {small.to_int()}")
big_bytes = b'\x7f' + b'\xff' * 19 big = synta.Integer.from_bytes(big_bytes)
try:
big.to_int()
print(" No OverflowError (unexpected)")
except OverflowError as e:
print(f" OverflowError from to_int(): {e}")
def demo_to_i128():
section("to_i128() — works for 17–16 byte values")
val = 2**127 - 1 val_bytes = val.to_bytes(16, "big", signed=True) i = synta.Integer.from_bytes(val_bytes)
print(f" 16-byte value (i128 max = 2^127-1): {i.to_i128()}")
assert i.to_i128() == val
neg = synta.Integer(-1)
print(f" Integer(-1).to_i128() = {neg.to_i128()}")
assert neg.to_i128() == -1
too_big = b'\x00\x80' + b'\x00' * 16 big = synta.Integer.from_bytes(too_big)
try:
big.to_i128()
print(" No OverflowError (unexpected)")
except OverflowError as e:
print(f" OverflowError from to_i128(): {e}")
def demo_to_bytes():
section("to_bytes() — big-endian signed representation")
i = synta.Integer(255)
b = i.to_bytes()
print(f" Integer(255).to_bytes() = {b.hex()!r} (0x00ff — sign byte preserved)")
neg = synta.Integer(-1)
b = neg.to_bytes()
print(f" Integer(-1).to_bytes() = {b.hex()!r} (0xff)")
large = synta.Integer.from_bytes(b'\x7f' + b'\xff' * 19)
b = large.to_bytes()
print(f" 20-byte serial: {b.hex()[:20]}... ({len(b)} bytes)")
def demo_encode_integer_large():
section("encode_integer — arbitrary-magnitude Python int (bigint path)")
enc = synta.Encoder(synta.Encoding.DER)
enc.encode_integer(42)
print(f" encode_integer(42) → {enc.finish().hex()}")
serial = 2**159 - 1 enc = synta.Encoder(synta.Encoding.DER)
enc.encode_integer(serial)
out = enc.finish()
print(f" encode_integer(2**159-1): tag=0x{out[0]:02x} length={out[1]} value={out[2:4].hex()}...")
assert out[0] == 0x02 assert out[1] == 20
dec = synta.Decoder(out, synta.Encoding.DER)
decoded = dec.decode_integer()
assert decoded.to_bytes() == b'\x7f' + b'\xff' * 19
print(" Decode round-trip: OK")
val = 2**127 enc = synta.Encoder(synta.Encoding.DER)
enc.encode_integer(val)
out2 = enc.finish()
assert out2[2] == 0x00 print(f" encode_integer(2**127) → content starts 0x{out2[2]:02x}0x{out2[3]:02x} (sign prefix + high byte)")
enc = synta.Encoder(synta.Encoding.DER)
enc.encode_integer(-128)
assert enc.finish() == b'\x02\x01\x80'
enc = synta.Encoder(synta.Encoding.DER)
enc.encode_integer(-129)
assert enc.finish() == b'\x02\x02\xff\x7f'
print(" Negative values (two's complement): OK")
def demo_encode_integer_object():
section("encode_integer_object — encode an Integer instance")
big = synta.Integer.from_bytes(b'\x01' + b'\x00' * 16) enc = synta.Encoder(synta.Encoding.DER)
enc.encode_integer_object(big)
data = enc.finish()
dec = synta.Decoder(data, synta.Encoding.DER)
decoded = dec.decode_integer()
assert decoded.to_bytes() == big.to_bytes()
print(f" encode_integer_object round-trip: {decoded.to_bytes().hex()}")
print(" encode_integer_object: OK")
def main():
print("=" * 60)
print("Example 14: Integer edge cases and bigint")
print("=" * 60)
demo_constructors()
demo_to_int_overflow()
demo_to_i128()
demo_to_bytes()
demo_encode_integer_large()
demo_encode_integer_object()
print("\nAll Integer advanced examples completed.")
if __name__ == "__main__":
main()