def test_parse_array_leave(self): vm = apx.VM() prog = bytes([apx.OPCODE_ARRAY_LEAVE]) code_next, instruction, args = vm.parse_next_instruction(prog, 0, len(prog)) self.assertEqual(code_next, len(prog)) self.assertEqual(instruction, vm.exec_array_leave) self.assertIsNone(args)
def test_parse_record_select(self): vm = apx.VM() prog = bytes([apx.OPCODE_RECORD_SELECT])+'Selection\0'.encode('ascii') code_next, instruction, args = vm.parse_next_instruction(prog, 0, len(prog)) self.assertEqual(code_next, len(prog)) self.assertEqual(instruction, vm.exec_record_select) self.assertEqual(args, ['Selection'])
def test_parse_record_enter(self): vm = apx.VM() prog = bytes([apx.OPCODE_RECORD_ENTER]) code_next, instruction, args = vm.parse_next_instruction(prog, 0, len(prog)) self.assertEqual(code_next, len(prog)) self.assertEqual(instruction, vm.exec_record_enter) self.assertIsNone(args)
def __init__(self,node): if isinstance(node, apx.Node): self.node=node context=apx.Context() context.append(node) apx_text=context.dumps() elif isinstance(node, str): parser = apx.Parser() apx_text=node self.node = parser.loads(apx_text) else: raise NotImplementedError(type(node)) compiler = apx.compiler.Compiler() self.name=self.node.name self.inPortByteMap = [] #length: length of self.inPortDataFile self.inPortDataMap = [] #length: number of require ports self.outPortDataMap = [] #length: number of provide ports self.inPortPrograms = [] #length: number of require ports self.outPortPrograms = [] #length: number of provide ports self.outPortValues = [] #length: number of provide ports self.inPortDataFile = self._createInPortDataFile(self.node, compiler) if len(self.node.requirePorts)>0 else None self.outPortDataFile = self._createOutPortDataFile(self.node, compiler) if len(self.node.providePorts)>0 else None self.definitionFile = self._createDefinitionFile(node.name,apx_text) self.vm = apx.VM() self.lock=threading.Lock() #the virtual machine is not thread-safe, use this lock to protect it in case users try to read/write ports from multiple threads if self.inPortDataFile is not None: self.inPortDataFile.nodeDataHandler=self self.nodeDataClient=None
def test_parse_pack_str(self): vm = apx.VM() prog = bytes([apx.OPCODE_PACK_STR, 0x34, 0x12]) code_next, instruction, args = vm.parse_next_instruction(prog, 0, len(prog)) self.assertEqual(code_next, len(prog)) self.assertEqual(instruction, vm.exec_pack_str) self.assertEqual(args, [0x1234])
def test_exec_unpack_s32_array(self): vm = apx.VM() data = bytearray('Hello\0'.encode('utf-8')) vm.init_unpack_prog(len(data), data, 0) vm.exec_instruction(vm.exec_unpack_str, [6]) self.assertEqual(vm.value, 'Hello') self.assertEqual(vm.data_offset, 6)
def test_parse_unpack_s32_array(self): vm = apx.VM() prog = bytes([apx.OPCODE_UNPACK_S32AR, 0x34, 0x12]) code_next, instruction, args = vm.parse_next_instruction(prog, 0, len(prog)) self.assertEqual(code_next, len(prog)) self.assertEqual(instruction, vm.exec_unpack_s32) self.assertEqual(args, [0x1234])
def test_parse_pack_u32(self): vm = apx.VM() prog = bytes([apx.OPCODE_PACK_U32]) code_next, instruction, args = vm.parse_next_instruction(prog, 0, len(prog)) self.assertEqual(code_next, len(prog)) self.assertEqual(instruction, vm.exec_pack_u32) self.assertIsNone(args)
def test_exec_unpack_prog_u8(self): prog = bytes([apx.OPCODE_UNPACK_PROG, 1,0,0,0, apx.OPCODE_UNPACK_U8]) data = bytearray([128]) vm = apx.VM() vm.exec_unpack_prog(prog, data, 0) self.assertEqual(vm.value, 128) self.assertEqual(vm.data_offset, 1)
def test_parse_pack_prog_header(self): vm = apx.VM() prog = bytes([apx.OPCODE_PACK_PROG, 0x78, 0x56, 0x34, 0x12]) code_next, instruction, args = vm.parse_next_instruction(prog, 0, len(prog)) self.assertEqual(code_next, len(prog)) self.assertEqual(instruction, vm.exec_pack_prog_instruction) self.assertEqual(args, [0x12345678])
def test_parse_unpack_s8(self): vm = apx.VM() prog = bytes([apx.OPCODE_UNPACK_S8]) code_next, instruction, args = vm.parse_next_instruction(prog, 0, len(prog)) self.assertEqual(code_next, len(prog)) self.assertEqual(instruction, vm.exec_unpack_s8) self.assertIsNone(args)
def test_exec_pack_s8_array(self): vm = apx.VM() data = bytearray(4) vm.init_pack_prog(value=[1,-23,18,-94], data_len=len(data), data=data, data_offset=0) vm.exec_instruction(vm.exec_pack_s8, [4]) self.assertEqual(data, bytearray([1, 0xe9, 18, 0xa2])) with self.assertRaises(ValueError) as context: vm.exec_instruction(vm.exec_pack_u8, [5])
def test_exec_pack_s16_array(self): vm = apx.VM() data = bytearray(6) vm.init_pack_prog(value=[-918, 600, 42], data_len=len(data), data=data, data_offset=0) vm.exec_instruction(vm.exec_pack_s16, [3]) self.assertEqual(data, bytearray([0x6a,0xfc, 0x58,0x02, 42,0])) with self.assertRaises(ValueError) as context: vm.exec_instruction(vm.exec_pack_u8, [4])
def test_exec_pack_u32_array(self): vm = apx.VM() data = bytearray(16) vm.init_pack_prog(value=[19, 12345678, 0x12345678, 900], data_len=len(data), data=data, data_offset=0) vm.exec_instruction(vm.exec_pack_u32, [4]) self.assertEqual(data, bytearray([19,0,0,0, 0x4e,0x61,0xbc,0, 0x78,0x56,0x34,0x12, 0x84,0x03,0,0])) with self.assertRaises(ValueError) as context: vm.exec_instruction(vm.exec_pack_u32, [5])
def test_exec_pack_u16_array(self): vm = apx.VM() data = bytearray(8) vm.init_pack_prog(value=[0x0A,0x1234,65535,22], data_len=len(data), data=data, data_offset=0) vm.exec_instruction(vm.exec_pack_u16, [4]) self.assertEqual(data, bytearray([0x0A,0, 0x34,0x12, 0xFF,0xFF, 22,0])) with self.assertRaises(ValueError) as context: vm.exec_instruction(vm.exec_pack_u16, [5])
def test_exec_pack_s32_array(self): vm = apx.VM() data = bytearray(8) vm.init_pack_prog(value=[-100000, 100000], data_len=len(data), data=data, data_offset=0) vm.exec_instruction(vm.exec_pack_s32, [2]) self.assertEqual(data, bytearray([0x60,0x79,0xfe,0xff, 0xa0, 0x86,0x01,0x00])) with self.assertRaises(ValueError) as context: vm.exec_instruction(vm.exec_pack_u8, [3])
def test_exec_unpack_prog_record(self): prog = bytes([apx.OPCODE_UNPACK_PROG, 3,0,0,0, apx.OPCODE_RECORD_ENTER, apx.OPCODE_RECORD_SELECT])+'SoundId\0'.encode('ascii') prog += bytes([apx.OPCODE_UNPACK_U16,apx.OPCODE_RECORD_SELECT])+'Volume\0'.encode('ascii')+bytes([apx.OPCODE_UNPACK_U8, apx.OPCODE_RECORD_LEAVE]) data = bytearray([63,0,12]) vm = apx.VM() vm.exec_unpack_prog(prog, data, 0) self.assertEqual(vm.value, {'SoundId': 63, 'Volume': 12}) self.assertEqual(vm.data_offset, 3)
def test_exec_unpack_s8_array(self): vm = apx.VM() data = bytearray([1, 0xe9, 18, 0xa2]) vm.init_unpack_prog(len(data), data, 0) self.assertEqual(vm.value, None) self.assertEqual(vm.data_offset, 0) vm.exec_instruction(vm.exec_unpack_s8, [4]) self.assertEqual(vm.value, [1,-23,18,-94]) self.assertEqual(vm.data_offset, 4)
def test_exec_unpack_u32_array(self): vm = apx.VM() data = bytearray([19,0,0,0, 0x4e,0x61,0xbc,0, 0x78,0x56,0x34,0x12, 0x84,0x03,0,0]) vm.init_unpack_prog(len(data), data, 0) self.assertEqual(vm.value, None) self.assertEqual(vm.data_offset, 0) vm.exec_instruction(vm.exec_unpack_u32, [4]) self.assertEqual(vm.value, [19, 12345678, 0x12345678, 900]) self.assertEqual(vm.data_offset, 16)
def test_exec_unpack_u16_array(self): vm = apx.VM() data = bytearray([0x0A,0, 0x34,0x12, 0xFF,0xFF, 22,0]) vm.init_unpack_prog(len(data), data, 0) self.assertEqual(vm.value, None) self.assertEqual(vm.data_offset, 0) vm.exec_instruction(vm.exec_unpack_u16, [4]) self.assertEqual(vm.value, [0x0A,0x1234,65535,22]) self.assertEqual(vm.data_offset, 8)
def test_exec_unpack_s32_array(self): vm = apx.VM() data = bytearray([0x60,0x79,0xfe,0xff, 0xa0, 0x86,0x01,0x00]) vm.init_unpack_prog(len(data), data, 0) self.assertEqual(vm.value, None) self.assertEqual(vm.data_offset, 0) vm.exec_instruction(vm.exec_unpack_s32, [2]) self.assertEqual(vm.value, [-100000, 100000]) self.assertEqual(vm.data_offset, 8)
def test_exec_unpack_s16_array(self): vm = apx.VM() data = bytearray([0x6a,0xfc, 0x58,0x02, 42,0]) vm.init_unpack_prog(len(data), data, 0) self.assertEqual(vm.value, None) self.assertEqual(vm.data_offset, 0) vm.exec_instruction(vm.exec_unpack_s16, [3]) self.assertEqual(vm.value, [-918, 600, 42]) self.assertEqual(vm.data_offset, 6)
def test_parse_end_of_program(self): """ Return None when end of program """ vm = apx.VM() prog = bytes([0,0,0]) code_next, instruction, args = vm.parse_next_instruction(prog, len(prog), len(prog)) self.assertEqual(code_next, len(prog)) self.assertIsNone(instruction) self.assertIsNone(args)
def test_exec_pack_u16(self): vm = apx.VM() data = bytearray(6) vm.init_pack_prog(value=0, data_len=len(data), data=data, data_offset=0) vm.exec_instruction(vm.exec_pack_u16, None) self.assertEqual(data, bytearray([0, 0, 0, 0, 0, 0])) vm.value = 0x1234 vm.exec_instruction(vm.exec_pack_u16, None) self.assertEqual(data, bytearray([0, 0, 0x34, 0x12, 0, 0])) vm.value = 65535 vm.exec_instruction(vm.exec_pack_u16, None) self.assertEqual(data, bytearray([0, 0, 0x34, 0x12, 0xFF, 0xFF]))
def test_exec_pack_u32(self): vm = apx.VM() data = bytearray(12) vm.init_pack_prog(value=0, data_len=len(data), data=data, data_offset=0) vm.exec_instruction(vm.exec_pack_u32, None) self.assertEqual(data, bytearray([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])) vm.value = 0x12345678 vm.exec_instruction(vm.exec_pack_u32, None) self.assertEqual(data, bytearray([0, 0, 0, 0, 0x78, 0x56, 0x34, 0x12, 0, 0, 0, 0])) vm.value = 0xFFFFFFFF vm.exec_instruction(vm.exec_pack_u32, None) self.assertEqual(data, bytearray([0, 0, 0, 0, 0x78, 0x56, 0x34, 0x12, 0xFF, 0xFF, 0xFF, 0xFF]))
def test_exec_pack_u8(self): vm = apx.VM() data = bytearray(3) vm.init_pack_prog(value=0, data_len=len(data), data=data, data_offset=0) vm.exec_instruction(vm.exec_pack_u8, None) self.assertEqual(data, bytearray([0,0,0])) vm.value = 128 vm.exec_instruction(vm.exec_pack_u8, None) self.assertEqual(data, bytearray([0,128,0])) vm.value = 255 vm.exec_instruction(vm.exec_pack_u8, None) self.assertEqual(data, bytearray([0,128,255]))
def test_exec_unpack_u32(self): vm = apx.VM() data = bytearray([0, 0, 0, 0, 0x78, 0x56, 0x34, 0x12, 0xFF, 0xFF, 0xFF, 0xFF]) vm.init_unpack_prog(len(data), data, 0) self.assertEqual(vm.value, None) self.assertEqual(vm.data_offset, 0) vm.exec_instruction(vm.exec_unpack_u32, None) self.assertEqual(vm.value, 0) vm.exec_instruction(vm.exec_unpack_u32, None) self.assertEqual(vm.value, 0x12345678) vm.exec_instruction(vm.exec_unpack_u32, None) self.assertEqual(vm.value, 0xFFFFFFFF) self.assertEqual(vm.data_offset, 12)
def test_exec_unpack_s16(self): vm = apx.VM() data = bytearray([0,0x80,0xFF,0xFF,0,0,0xFF,0x7F]) vm.init_unpack_prog(len(data), data, 0) self.assertEqual(vm.value, None) self.assertEqual(vm.data_offset, 0) vm.exec_instruction(vm.exec_unpack_s16, None) self.assertEqual(vm.value, -32768) vm.exec_instruction(vm.exec_unpack_s16, None) self.assertEqual(vm.value, -1) vm.exec_instruction(vm.exec_unpack_s16, None) self.assertEqual(vm.value, 0) vm.exec_instruction(vm.exec_unpack_s16, None) self.assertEqual(vm.value, 32767) self.assertEqual(vm.data_offset, 8)
def test_exec_pack_s32(self): vm = apx.VM() data = bytearray(16) vm.init_pack_prog(value=-2147483648, data_len=len(data), data=data, data_offset=0) vm.exec_instruction(vm.exec_pack_s32, None) self.assertEqual(data, bytearray([0,0,0,0x80, 0,0,0,0, 0,0,0,0, 0,0,0,0])) vm.value = -1 vm.exec_instruction(vm.exec_pack_s32, None) self.assertEqual(data, bytearray([0,0,0,0x80, 0xFF,0xFF,0xFF,0xFF, 0,0,0,0, 0,0,0,0])) vm.value = 0 vm.exec_instruction(vm.exec_pack_s32, None) self.assertEqual(data, bytearray([0,0,0,0x80, 0xFF,0xFF,0xFF,0xFF, 0,0,0,0, 0,0,0,0])) vm.value = 2147483647 vm.exec_instruction(vm.exec_pack_s32, None) self.assertEqual(data, bytearray([0,0,0,0x80, 0xFF,0xFF,0xFF,0xFF, 0,0,0,0, 0xFF,0xFF,0xFF,0x7F]))
def test_exec_unpack_s32(self): vm = apx.VM() data = bytearray([0,0,0,0x80, 0xFF,0xFF,0xFF,0xFF, 0,0,0,0, 0xFF,0xFF,0xFF,0x7F]) vm.init_unpack_prog(len(data), data, 0) self.assertEqual(vm.value, None) self.assertEqual(vm.data_offset, 0) vm.exec_instruction(vm.exec_unpack_s32, None) self.assertEqual(vm.value, -2147483648) vm.exec_instruction(vm.exec_unpack_s32, None) self.assertEqual(vm.value, -1) vm.exec_instruction(vm.exec_unpack_s32, None) self.assertEqual(vm.value, 0) vm.exec_instruction(vm.exec_unpack_s32, None) self.assertEqual(vm.value, 2147483647) self.assertEqual(vm.data_offset, 16)