Пример #1
0
 def uio1_user_exit(self, node: KeyValue) -> str:
     r2 = self.regs.get_value("R2")
     if r2 != 0:
         ui2cnn = r2 + macros["UI2PF"].lookup("UI2CNN").dsp
         ui2uio = r2 + macros["UI2PF"].lookup("UI2UIO").dsp
         canned_number = self.vm.get_unsigned_value(ui2cnn, 1)
         if self.vm.all_bits_on(ui2uio, 0x01):  # UI2SEC = 0x01
             canned_number += 256
         message_string = next((canned["message"] for canned in UI2CNN
                                if int(canned["number"]) == canned_number),
                               None)
         if not message_string:
             raise UserDefinedMacroExecutionError(node)
         self.messages.append(message_string)
         return node.fall_down
     ebw000_address: int = self.regs.get_value(
         "R9") + macros["EB0EB"].evaluate("EBW000")
     ebw000: bytearray = self.vm.get_bytes(ebw000_address, 72)
     eom = DataType("C", input="+").to_bytes()[0]
     if not any(eom == byte for byte in ebw000):
         raise UserDefinedMacroExecutionError(node)
     message: bytearray = bytearray()
     for byte in ebw000:
         if byte == eom:
             break
         message.append(byte)
     message_string = DataType("X", bytes=message).decode
     self.messages.append(message_string)
     return node.fall_down
Пример #2
0
 def _tjr_setup(self, iy_chain_count: int = 0, variation: int = 0):
     fixed_file = FixedFile()
     fixed_file.variation = variation
     fixed_file.rec_id = DataType("C", input="TJ").value
     fixed_file.macro_name = "TJ0TJ"
     fixed_file.fixed_type = macros["SYSEQC"].evaluate("#TJRRI")
     fixed_file.fixed_ordinal = 0x17F
     pool_file = PoolFile()
     fixed_file.pool_files.append(pool_file)
     pool_file.macro_name = "IY1IY"
     pool_file.rec_id = DataType("C", input="IY").value
     pool_file.index_macro_name = "TJ0TJ"
     pool_file.index_field = "TJ0ATH"
     pool_file.forward_chain_label = "IY1FCH"
     pool_file.forward_chain_count = iy_chain_count
     item = FileItem()
     pool_file.file_items.append(item)
     item.macro_name = "IY1IY"
     item.field = "IY1ATH"
     item.field_data = deepcopy(self.iy_item)
     item.count_field = "IY1CTR"
     file_dict = fixed_file.cascade_to_dict()
     del file_dict["id"]
     del file_dict["pool_files"][0]["id"]
     del file_dict["pool_files"][0]["file_items"][0]["id"]
     self.test_data.create_fixed_file(file_dict, persistence=False)
     return
Пример #3
0
 def dp(self, node: FieldLenFieldLen) -> str:
     if node.field_len2.length + 1 > 8:
         raise PackExecutionError
     source_address = self.regs.get_address(node.field_len2.base,
                                            node.field_len2.dsp)
     target_address = self.regs.get_address(node.field_len1.base,
                                            node.field_len1.dsp)
     dividend = DataType(
         'P',
         bytes=self.vm.get_bytes(target_address,
                                 node.field_len1.length + 1)).value
     divisor = DataType(
         'P',
         bytes=self.vm.get_bytes(source_address,
                                 node.field_len2.length + 1)).value
     quotient = int(dividend // divisor)
     remainder = dividend % divisor
     remainder_len = node.field_len2.length + 1
     quotient_len = node.field_len1.length + 1 - remainder_len
     self.vm.set_bytes(
         DataType('P', input=str(quotient)).to_bytes(quotient_len),
         target_address, quotient_len)
     self.vm.set_bytes(
         DataType('P', input=str(remainder)).to_bytes(remainder_len),
         target_address + quotient_len, remainder_len)
     return node.fall_down
Пример #4
0
 def _mini_tjr_setup(self, tj2qaa) -> None:
     fixed_file = FixedFile()
     fixed_file.rec_id = DataType("C", input="P9").value
     fixed_file.macro_name = "TJ2TJ"
     fixed_file.fixed_type = macros["SYSEQC"].evaluate("#PR9RI")  # 390
     fixed_file.fixed_ordinal = 0x17F // macros["TJ2TJ"].evaluate(
         "#TJ2MAX")  # 38  0x26
     item = FileItem()
     item.macro_name = "TJ2TJ"
     item.field = "TJ2ITM"
     item.adjust = True
     item.field_data = [
         {
             "field": "TJ2QAA",
             "data": b64encode(DataType("X",
                                        input=tj2qaa).to_bytes()).decode()
         },
     ]
     item.repeat = 0x17F % macros["TJ2TJ"].evaluate("#TJ2MAX") + 1  # 4
     fixed_file.file_items.append(item)
     file_dict = fixed_file.doc_to_dict()
     file_dict["file_items"] = [
         item.doc_to_dict() for item in fixed_file.file_items
     ]
     self.test_data.create_fixed_file(file_dict, persistence=False)
     return
Пример #5
0
 def test_eta1_e_no_error(self):
     self.test_data.set_field("MI0ACC", DataType("C", input="E").to_bytes())
     self.test_data.set_field("WA0FNS", DataType("X", input="10").to_bytes())
     self.test_data.set_field("WA0UB4", DataType("X", input="08").to_bytes())
     test_data = self.tpf_server.run("ETA1", self.test_data)
     self.output = test_data.output
     self.assertEqual("ETAX265.6", self.output.last_line, self.output.last_node)
     self.assertIn("UNABLE TO END TRANSACTION - NO PNR PRESENT IN WORK AREA", self.output.messages)
Пример #6
0
 def test_etaz_rcvd_from(self) -> None:
     self.test_data.set_field("WA0ET5", DataType("X", input="01").to_bytes())
     self.test_data.set_field("WA0ASC", DataType("X", input="01").to_bytes())
     self.test_data.add_pnr_element(["NAYAN"], RCVD_FROM)
     test_data = self.tpf_server.run("ETA1", self.test_data)
     self.output = test_data.output
     self.assertEqual("FMSG0100", self.output.last_line, self.output.last_node)
     self.assertIn("NEED PHONE FIELD - USE 9", self.output.messages)
Пример #7
0
 def test_etaz_vanilla(self) -> None:
     self.test_data.set_field("WA0ET5", DataType("X", input="01").to_bytes())
     self.test_data.set_field("WA0ASC", DataType("X", input="01").to_bytes())
     test_data = self.tpf_server.run("ETA1", self.test_data)
     self.output = test_data.output
     self.assertEqual("ETAZ1950.1", self.output.last_line, self.output.last_node)
     self.assertIn("NEED RECEIVED FROM FIELD - USE 6", self.output.messages)
     self.assertEqual(list(), self.output.dumps)
Пример #8
0
 def test_eta1_el_restricted(self):
     self.test_data.add_fields([("EBW000", 10)], "EB0EB")
     self.test_data.set_field("MI0ACC", DataType("C", input="EL").to_bytes())
     self.test_data.set_field("WA0FNS", DataType("X", input="10").to_bytes())
     self.test_data.set_field("WA0UB4", DataType("X", input="08").to_bytes())
     test_data = self.tpf_server.run("ETA1", self.test_data)
     self.output = test_data.output
     self.assertEqual("$$UIO1$$.2", self.output.last_line, self.output.last_node)
     self.assertIn("RESTRICTED" + 40 * " ", self.output.messages)
Пример #9
0
 def test_eta4_vanilla(self) -> None:
     self.test_data.set_field("WA0ET5", DataType("X", input="01").to_bytes())
     self.test_data.set_field("WA0ASC", DataType("X", input="01").to_bytes())
     self.test_data.add_pnr_element(["NAYAN"], RCVD_FROM)
     self.test_data.add_pnr_element(["123456"], PHONE)
     test_data = self.tpf_server.run("ETA1", self.test_data)
     self.output = test_data.output
     self.assertEqual("ETA5420.9", self.output.last_line, self.output.last_node)
     self.assertIn("NEED NAME IN PNR TO COMPLETE TRANSACTION", self.output.messages)
Пример #10
0
 def test_A1B1(self):
     self.test_data.set_field('EBX003',
                              DataType('C', input='A1B1').to_bytes())
     test_data = self.tpf_server.run('TS22', self.test_data)
     self.assertEqual('TS22EXIT.1', test_data.output.last_line)
     self.assertEqual(0, test_data.output.regs['R0'])
     self.assertEqual(
         'A1B1 ',
         DataType('X', input=test_data.get_field('EBX003')).decode)
     self.assertEqual('006DCB', test_data.get_field('EBX000'))
     self.assertEqual('006DCB', test_data.get_field('EBX008'))
Пример #11
0
 def compare_logical_character_mask(self, node: RegisterDataField) -> str:
     if node.data == 0:
         self.set_number_cc(0)
         return node.fall_down
     bytes1 = self.regs.get_bytes_from_mask(node.reg, node.data)
     address = self.regs.get_address(node.field.base, node.field.dsp)
     bytes2 = self.vm.get_bytes(address, bin(node.data).count('1'))
     value1 = DataType('X', bytes=bytes1).value
     value2 = DataType('X', bytes=bytes2).value
     self.set_number_cc(value1 - value2)
     return node.fall_down
Пример #12
0
 def unpack(self, node: FieldLenFieldLen) -> str:
     source_address = self.regs.get_address(node.field_len2.base,
                                            node.field_len2.dsp)
     target_address = self.regs.get_address(node.field_len1.base,
                                            node.field_len1.dsp)
     packed_bytes = self.vm.get_bytes(source_address,
                                      node.field_len2.length + 1)
     value = DataType('P', bytes=packed_bytes).value
     zoned_bytes = DataType(
         'Z', input=str(value)).to_bytes(node.field_len1.length + 1)
     self.vm.set_bytes(zoned_bytes, target_address,
                       node.field_len1.length + 1)
     return node.fall_down
Пример #13
0
 def test_etaa_remarks_insurance(self) -> None:
     self.test_data.set_field("WA0ET5", DataType("X", input="01").to_bytes())
     self.test_data.set_field("WA0ASC", DataType("X", input="01").to_bytes())
     self.test_data.set_field("WA0TSC", DataType("X", input="01").to_bytes())
     self.test_data.set_field("WA0POR", DataType("X", input="00017F").to_bytes())
     self.test_data.set_field("WA0FNS", DataType("X", input="10").to_bytes())
     self.test_data.add_pnr_element(["1ZAVERI/NAYAN"], NAME)
     self.test_data.add_pnr_element(["NAYAN"], RCVD_FROM)
     self.test_data.add_pnr_element(["123456"], PHONE)
     self.test_data.add_pnr_element(["I$INSURANCE SEGMENT"], REMARKS)
     test_data = self.tpf_server.run("ETA1", self.test_data)
     self.output = test_data.output
     self.assertEqual("ETAA590.2", self.output.last_line, f"{self.output.last_node}--{self.output.dumps}")
     self.assertIn("5I$ REMARK EXISTS-NEED INS SEGMENT OR REMOVE 5I$ REMARK", self.output.messages)
Пример #14
0
 def zap(self, node: FieldLenFieldLen) -> str:
     source_address = self.regs.get_address(node.field_len2.base,
                                            node.field_len2.dsp)
     target_address = self.regs.get_address(node.field_len1.base,
                                            node.field_len1.dsp)
     value = DataType('P',
                      bytes=self.vm.get_bytes(
                          source_address, node.field_len2.length + 1)).value
     self.vm.set_bytes(
         DataType('P',
                  input=str(value)).to_bytes(node.field_len1.length + 1),
         target_address, node.field_len1.length + 1)
     self.set_number_cc(value)
     return node.fall_down
Пример #15
0
 def test_etaw_vanilla(self) -> None:
     self.test_data.set_field("WA0ET5",
                              DataType("X", input="01").to_bytes())
     self.test_data.set_field("WA0ASC",
                              DataType("X", input="01").to_bytes())
     self.test_data.add_pnr_element(["1ZAVERI/NAYAN"], NAME)
     self.test_data.add_pnr_element(["NAYAN"], RCVD_FROM)
     self.test_data.add_pnr_element(["123456"], PHONE)
     test_data = self.tpf_server.run("ETA1", self.test_data)
     self.output = test_data.output
     self.assertEqual("FMSG0100", self.output.last_line,
                      self.output.last_node)
     self.assertIn("INVLD ITIN", self.output.messages,
                   self.output.get_traces("ETAW"))
Пример #16
0
 def test_etaa_remarks(self) -> None:
     self.test_data.set_field("WA0ET5", DataType("X", input="01").to_bytes())
     self.test_data.set_field("WA0ASC", DataType("X", input="01").to_bytes())
     self.test_data.set_field("WA0TSC", DataType("X", input="01").to_bytes())
     self.test_data.set_field("WA0POR", DataType("X", input="00017F").to_bytes())
     self.test_data.set_field("WA0FNS", DataType("X", input="10").to_bytes())
     self.test_data.add_pnr_element(["1ZAVERI/NAYAN"], NAME)
     self.test_data.add_pnr_element(["NAYAN"], RCVD_FROM)
     self.test_data.add_pnr_element(["123456"], PHONE)
     self.test_data.add_pnr_element(["SOME REMARKS"], REMARKS)
     test_data = self.tpf_server.run("ETA1", self.test_data)
     self.output = test_data.output
     self.assertEqual(self.ETG1_TJR_END, self.output.last_line, f"{self.output.last_node}--{self.output.dumps}")
     self.assertIn("019005", self.output.dumps)  # TJR Face Error
Пример #17
0
 def pack(self, node: FieldLenFieldLen) -> str:
     source_address = self.regs.get_address(node.field_len2.base,
                                            node.field_len2.dsp)
     target_address = self.regs.get_address(node.field_len1.base,
                                            node.field_len1.dsp)
     source_bytes = self.vm.get_bytes(source_address,
                                      node.field_len2.length + 1)
     number = DataType('X', bytes=source_bytes).decode
     if not number.isdigit():
         raise PackExecutionError
     packed_bytes = DataType(
         'P', input=number).to_bytes(node.field_len1.length + 1)
     self.vm.set_bytes(packed_bytes, target_address,
                       node.field_len1.length + 1)
     return node.fall_down
Пример #18
0
 def _main_tjr_setup(self):
     fixed_file = FixedFile()
     fixed_file.rec_id = DataType("C", input="TJ").value
     fixed_file.macro_name = "TJ0TJ"
     fixed_file.fixed_type = macros["SYSEQC"].evaluate("#TJRRI")
     fixed_file.fixed_ordinal = 0x17F
     fixed_file.field_data = [
         {
             "field": "TJ0BID",
             "data": b64encode(DataType("C",
                                        input="TJ").to_bytes()).decode()
         },
     ]
     file_dict = fixed_file.doc_to_dict()
     self.test_data.create_fixed_file(file_dict, persistence=False)
Пример #19
0
 def test_eta1_el_plus_off_queue(self):
     self.test_data.set_field("MI0ACC", DataType("C", input="EL+").to_bytes())
     test_data = self.tpf_server.run("ETA1", self.test_data)
     self.output = test_data.output
     self.assertEqual("$$UIO1$$.2", self.output.last_line, self.output.last_node)
     off_queue = "CANNOT DO THIS IF OFF QUEUE"
     self.assertIn(off_queue + (50 - len(off_queue)) * " ", self.output.messages)
Пример #20
0
 def get_pnr_data(
         pnr_locator: str,
         key: str,
         item_number: int,
         packed: bool = False,
         starts_with: Optional[str] = None
 ) -> Tuple[Optional[bytearray], int]:
     # item_number starts from 1 for the 1st item (index 0)
     try:
         pnr_doc = next(pnr["doc"] for pnr in Pnr.DB
                        if pnr["id"] == pnr_locator)
         data_list = [
             element["data"] for element in pnr_doc if element["key"] == key
         ]
     except StopIteration:
         raise PnrLocatorNotFoundError
     starts_with = DataType(
         "C",
         input=starts_with).to_bytes() if starts_with is not None else None
     attribute = Pnr.get_attribute_by_key(key)
     if not attribute:
         raise PnrElementError
     start = (len(Pnr.STD_PREFIX_BYTES) + len(attribute.std_fix) + len(attribute.std_var)) \
         if packed else len(attribute.std_var)
     for item_number in range(item_number, len(data_list) + 1):
         data = data_list[item_number - 1]
         data = data[len(Pnr.STD_PREFIX_BYTES) +
                     len(attribute.std_fix):] if not packed else data
         if starts_with is None:
             return data, item_number
         elif data[start:start + len(starts_with)] == starts_with:
             return data, item_number
     return None, item_number
Пример #21
0
 def convert_binary(self, node: RegisterFieldIndex):
     address = self.regs.get_address(node.field.base, node.field.dsp,
                                     node.field.index)
     packed_bytes = self.vm.get_bytes(address, 8)
     value = DataType('P', bytes=packed_bytes).value
     self.regs.set_value(value, node.reg)
     return node.fall_down
Пример #22
0
 def convert_decimal(self, node: RegisterFieldIndex):
     address = self.regs.get_address(node.field.base, node.field.dsp,
                                     node.field.index)
     value = self.regs.get_value(node.reg)
     packed_bytes = DataType('P', input=str(value)).to_bytes(8)
     self.vm.set_bytes(packed_bytes, address, 8)
     return node.fall_down
Пример #23
0
 def test_b4t0(self):
     self.test_data.set_field('EBX003',
                              DataType('C', input='B4T0').to_bytes())
     test_data = self.tpf_server.run('TS22', self.test_data)
     self.assertEqual('TS22EXIT.1', test_data.output.last_line)
     self.assertEqual(0, test_data.output.regs['R0'])
     self.assertEqual(
         'B4T0 ',
         DataType('X', input=test_data.get_field('EBX003')).decode)
     self.assertEqual('C2F4E3', test_data.get_field('EBX000'))
     self.assertEqual('00017F', test_data.get_field('EBX008'))
     # TODO remove once the scenario for it is present
     tnaa_bytes = DataType(
         'X', input='00003EF8000002A40000001A00040000').to_bytes()
     self.assertEqual(tnaa_bytes,
                      segments['SUB1'].get_constant_bytes('SUB2TNAA', 16))
Пример #24
0
 def test_etax_efc(self):
     self.test_data.set_field("MI0ACC", DataType("C", input="EF$").to_bytes())
     self.test_data.add_fields(["UI2CNN"], "UI2PF", "R7")
     test_data = self.tpf_server.run("ETA1", self.test_data)
     self.output = test_data.output
     self.assertEqual("$$UIO1$$.2", self.output.last_line, self.output.last_node)
     self.assertEqual("33", test_data.get_field("UI2CNN"))
Пример #25
0
 def entnc(self, node: SegmentCall) -> str:
     if node.keys[0] not in segments:
         raise SegmentNotFoundError
     self.fields["CE3ENTPGM"] = DataType("C",
                                         input=self.seg.name).to_bytes()
     self._init_seg(node.keys[0])
     return node.goes
Пример #26
0
 def test_etaw_wa0tsc(self) -> None:
     self.test_data.set_field("WA0ET5",
                              DataType("X", input="01").to_bytes())
     self.test_data.set_field("WA0ASC",
                              DataType("X", input="01").to_bytes())
     self.test_data.set_field("WA0TSC",
                              DataType("X", input="01").to_bytes())
     self.test_data.set_field("WA0POR",
                              DataType("X", input="00017F").to_bytes())
     self.test_data.add_pnr_element(["1ZAVERI/NAYAN"], NAME)
     self.test_data.add_pnr_element(["NAYAN"], RCVD_FROM)
     self.test_data.add_pnr_element(["123456"], PHONE)
     test_data = self.tpf_server.run("ETA1", self.test_data)
     self.output = test_data.output
     self.assertEqual(self.SUCCESS_END, self.output.last_line,
                      self.output.last_node)
Пример #27
0
 def test_etax_efs(self):
     self.test_data.set_field("MI0ACC", DataType("C", input="EF*").to_bytes())
     self.test_data.add_fields(["UI2CNN"], "UI2PF", "R7")
     test_data = self.tpf_server.run("ETA1", self.test_data)
     self.output = test_data.output
     self.assertEqual("ETAX265.6", self.output.last_line, self.output.last_node)
     self.assertIn("UNABLE TO END TRANSACTION - NO PNR PRESENT IN WORK AREA", self.output.messages)
Пример #28
0
 def _tjr_setup(self) -> None:
     fixed_file = FixedFile()
     fixed_file.rec_id = DataType("C", input="TJ").value
     fixed_file.macro_name = "TJ0TJ"
     fixed_file.fixed_type = macros["SYSEQC"].evaluate("#TJRRI")
     fixed_file.fixed_ordinal = 0x17F
     fixed_file.field_data = [
         {
             "field": "TJ0PCC",
             "data": b64encode(DataType("C", input="B4T").to_bytes()).decode()
         },
     ]
     file_dict = fixed_file.cascade_to_dict()
     del file_dict["id"]
     self.test_data.create_fixed_file(file_dict, persistence=False)
     return
Пример #29
0
 def test_branch_validation_fail_lok_off(self) -> None:
     self.iy_item[0]["data"] = b64encode(
         DataType("X", input="00006F2F").to_bytes()).decode()
     self._tjr_setup(2)
     test_data = self.tpf_server.run("TS21", self.test_data)
     self.assertEqual("$$ETK4$$.1", test_data.output.last_line)
     self.assertEqual(8, test_data.output.regs["R6"])
Пример #30
0
 def set_partition(self, partition: str) -> None:
     if partition not in config.PARTITION:
         raise PartitionError
     haalc = config.GLOBAL + macros["GLOBAL"].evaluate("@HAALC")
     ce1uid = config.ECB + macros["EB0EB"].evaluate("CE1$UID")
     self.vm.set_bytes(DataType("C", input=partition).to_bytes(), haalc, 2)
     self.vm.set_value(config.PARTITION[partition], ce1uid, 1)