Ejemplo n.º 1
0
    def test_resolve_labels_error(self, mock_err_exit):
        """
        未定義のラベルがあった場合、正しくメッセージを出力して終了するか
        (SystemExit以外の例外が発生しないか)
        """
        def_labels = {"LAB": 0x0020}
        patterns = [(def_labels, "LST", {}, "undefined start label (LST)",
                     "undefined start label"),
                    ({}, "LST", {}, "undefined start label (LST)",
                     "undefined start label (empty)"),
                    (def_labels, "LAB", {
                        "LLL": [casl2sim.Element(0, 1)]
                    }, "undefined label (L1: LLL)", "undefined label"),
                    (def_labels, None, {
                        "GR1": [casl2sim.Element(0, 212)]
                    }, "reserved label (L212: GR1)", "reserved label")]

        for def_labels, start_label, unr_labels, expected_err_msg, msg in patterns:
            with self.subTest(msg):
                mock_err_exit.reset_mock()
                p = casl2sim.Parser()
                p._defined_labels.update(def_labels)
                p._start_label = start_label
                p._unresolved_labels = unr_labels
                with self.assertRaises(SystemExit) as cm:
                    p.resolve_labels()
                self.assertEqual(1, cm.exception.code)
                mock_err_exit.assert_called_once_with(expected_err_msg)
Ejemplo n.º 2
0
 def test_op_LAD_no_opr3(self):
     mem = [casl2sim.Element(0x1210, 0), casl2sim.Element(0x0007, 0)]
     c = casl2sim.Comet2(mem)
     expected = c._gr[:]
     expected[1] = 0x0007
     elem = c.fetch()
     c.op_LAD(elem)
     self.assertEqual(expected, c._gr)
Ejemplo n.º 3
0
 def test_op_ST_no_opr3(self):
     mem = [
         casl2sim.Element(0x1110, 0),
         casl2sim.Element(0x0003, 0),
         casl2sim.Element(0x0001, 0),
         casl2sim.Element(0x0002, 0)
     ]
     c = casl2sim.Comet2(mem)
     c._gr[1] = 0x0007
     expected = 0x0007
     elem = c.fetch()
     c.op_ST(elem)
     self.assertEqual(expected, c._mem[0x0003].value)
Ejemplo n.º 4
0
    def test_op_PUSH(self):
        patterns = [(0x0000, 0xbeef, "no reg"), (0x0010, 0xbeff, "reg")]

        mem = [casl2sim.Element(0x7002, 0), casl2sim.Element(0xbeef, 0)]
        c = casl2sim.Comet2(mem)
        for rval, expected_mval, msg in patterns:
            with self.subTest(msg):
                c._pr = 0
                c._sp = 0
                c._gr = [0, 0, rval, 0, 0, 0, 0, 0]
                elem = c.fetch()
                c.op_PUSH(elem)
                self.assertEqual([0, 0, rval, 0, 0, 0, 0, 0], c._gr)
                self.assertEqual(c._mem[c._sp].value, expected_mval)
                self.assertEqual(0xffff, c._sp)
Ejemplo n.º 5
0
 def test_op_LD_opr3(self):
     mem = [
         casl2sim.Element(0x1013, 0),
         casl2sim.Element(0x0003, 0),
         casl2sim.Element(0x0000, 0),
         casl2sim.Element(0x0001, 0),
         casl2sim.Element(0x0012, 0)
     ]
     c = casl2sim.Comet2(mem)
     c._gr[3] = 1
     expected = c._gr[:]
     expected[1] = 0x0012
     elem = c.fetch()
     c.op_LD(elem)
     self.assertEqual(expected, c._gr)
Ejemplo n.º 6
0
    def test_op_JUMP(self):
        patterns = [((0, 0, 0), True, "jump 1"), ((1, 1, 1), True, "jump 2")]

        mem = [casl2sim.Element(0x6400, 0), casl2sim.Element(0xbeef, 0)]
        c = casl2sim.Comet2(mem)
        for flags, expected_branched, msg in patterns:
            with self.subTest(msg):
                c._pr = 0
                c._gr = [0, 0, 0, 0, 0, 0, 0, 0]
                c._zf, c._sf, c._of = flags
                elem = c.fetch()
                c.op_JUMP(elem)
                expected_pr = 0xbeef if expected_branched else 0x0002
                self.assertEqual([0, 0, 0, 0, 0, 0, 0, 0], c._gr)
                self.assertEqual(flags, (c._zf, c._sf, c._of))
                self.assertEqual(expected_pr, c._pr)
Ejemplo n.º 7
0
    def test_op_XOR(self):
        patterns = [(0x0000, 0x0000, 0x0000, (1, 0, 0), "zero"),
                    (0xff00, 0x0f0f, 0xf00f, (0, 0, 0), "no zero")]

        mem = [casl2sim.Element(0x3110, 0), casl2sim.Element(0x0002, 0)]
        c = casl2sim.Comet2(mem)
        for rval, mval, expected_rval, expected_flags, msg in patterns:
            with self.subTest(msg):
                c._pr = 0
                c._gr = [0, rval, 0, 0, 0, 0, 0, 0]
                c._zf, c._sf, c._of = 0, 0, 0
                c._mem[2].value = mval
                elem = c.fetch()
                c.op_XOR(elem)
                self.assertEqual([0, expected_rval, 0, 0, 0, 0, 0, 0], c._gr)
                self.assertEqual(expected_flags, (c._zf, c._sf, c._of))
Ejemplo n.º 8
0
 def test_op_SVC_OUT(self):
     mem_vals = [
         0xf000, 0x0002,
         ord("X"),
         ord("X"),
         ord("t"),
         ord("e"),
         ord("s"),
         ord("t"),
         ord(" "),
         ord("O"),
         ord("U"),
         ord("T"),
         ord("Y"),
         ord("Y"), 0x0008
     ]
     mem = [casl2sim.Element(v, 0) for v in mem_vals]
     expected = "  OUT: test OUT\n"
     c = casl2sim.Comet2(mem)
     c._fout = io.StringIO()
     c._gr[1] = 4
     c._gr[2] = 14
     elem = c.fetch()
     c.op_SVC(elem)
     actual = c._fout.getvalue()
     self.assertEqual(expected, actual)
Ejemplo n.º 9
0
    def test_op_SRL(self):
        patterns = [
            (0x7000, 0x0000, 0x0004, 0x0700, (0, 0, 0), "no flag"),
            (0x7000, 0x0001, 0x0003, 0x0700, (0, 0, 0), "offset"),
            (0xf00f, 0x0000, 0x0004, 0x0f00, (0, 0, 1), "overflow"),
            (0x0007, 0x0000, 0x0004, 0x0000, (1, 0, 0), "zero"),
            (0xbf00, 0x0000, 0x0010, 0x0000, (1, 0, 1), "16bit shift"),
            (0xbf00, 0x0000, 0x0011, 0x0000, (1, 0, 0), "17bit shift"),
            (0x7f00, 0x0000, 0xffff, 0x0000, (1, 0, 0), "long shift positive"),
            (0xff00, 0x0000, 0xffff, 0x0000, (1, 0, 0), "long shift negative")
        ]

        mem = [casl2sim.Element(0x5345, 0)]
        c = casl2sim.Comet2(mem)
        for rval, oval, xval, expected_rval, expected_flags, msg in patterns:
            with self.subTest(msg):
                c._pr = 0
                c._gr = [0, 0, 0, 0, rval, xval, 0, 0]
                c._zf, c._sf, c._of = 0, 0, 0
                c._mem[1].value = oval
                elem = c.fetch()
                c.op_SRL(elem)
                self.assertEqual([0, 0, 0, 0, expected_rval, xval, 0, 0],
                                 c._gr)
                self.assertEqual(expected_flags, (c._zf, c._sf, c._of))
Ejemplo n.º 10
0
    def test_op_SUBL(self):
        patterns = [(0x0008, 0x0006, 0x0002, (0, 0, 0), "no flag"),
                    (0x7000, 0xf000, 0x8000, (0, 0, 1), "overflow 1"),
                    (0x8001, 0x7000, 0x1001, (0, 0, 0), "overflow 2")]

        mem = [casl2sim.Element(0x2310, 0), casl2sim.Element(0x0002, 0)]
        c = casl2sim.Comet2(mem)
        for rval, mval, expected_rval, expected_flags, msg in patterns:
            with self.subTest(msg):
                c._pr = 0
                c._gr = [0, rval, 0, 0, 0, 0, 0, 0]
                c._zf, c._sf, c._of = 0, 0, 0
                c._mem[2].value = mval
                elem = c.fetch()
                c.op_SUBL(elem)
                self.assertEqual([0, expected_rval, 0, 0, 0, 0, 0, 0], c._gr)
                self.assertEqual(expected_flags, (c._zf, c._sf, c._of))
Ejemplo n.º 11
0
    def test_resolve_labels(self):
        def_labels = {"LAB": 0x0020, "LST": 0x0010, "ABC": 0x0100}
        patterns = [({}, None, {}, -1, {}, "empty"),
                    (def_labels, "LST", {}, 0x0010, {}, "start label"),
                    (def_labels, None, {
                        "LAB": [casl2sim.Element(0, 0)]
                    }, -1, {
                        "LAB": 0x0020
                    }, "label"),
                    (def_labels, None, {
                        "LAB": [
                            casl2sim.Element(0, 0),
                            casl2sim.Element(0, 1),
                            casl2sim.Element(0, 2)
                        ]
                    }, -1, {
                        "LAB": 0x0020
                    }, "label (multi elements)"),
                    (def_labels, None, {
                        "LAB": [casl2sim.Element(0, 0)],
                        "LST": [casl2sim.Element(0, 1)]
                    }, -1, {
                        "LAB": 0x0020,
                        "LST": 0x0010
                    }, "labels"),
                    (def_labels, "ABC", {
                        "LAB": [
                            casl2sim.Element(0, 0),
                            casl2sim.Element(0, 1),
                            casl2sim.Element(0, 2)
                        ]
                    }, 0x0100, {
                        "LAB": 0x0020
                    }, "start label & label (multi elements)")]

        for def_labels, start_label, unr_labels, expected_start, expected_adrs, msg in patterns:
            with self.subTest(msg):
                p = casl2sim.Parser()
                p._defined_labels.update(def_labels)
                p._unresolved_labels = unr_labels
                p._start_label = start_label
                p.resolve_labels()
                for key in p._unresolved_labels:
                    self.assertTrue(key in expected_adrs)
                    expected_adr = expected_adrs[key]
                    actuals = p._unresolved_labels[key]
                    for i, actual in enumerate(actuals):
                        self.assertEqual(expected_adr,
                                         actual.value,
                                         msg=f"list[{i}]")
                self.assertEqual(expected_start, p._start)
Ejemplo n.º 12
0
 def test_op_SVC_IN_newline(self):
     mem_vals = [0xf000, 0x0001]
     mem_vals.extend([i for i in range(0x1000, 0x1100)])
     input_str = '1111 test\nTEST\r!"#$'
     expected_str = '1111testTEST!"#$'
     input_size = len(expected_str)
     expected_vals = mem_vals[:]
     expected_vals[3] = input_size
     expected_vals[4:4 + input_size] = [ord(s) for s in expected_str]
     expected = [casl2sim.Element(s, 0) for s in expected_vals]
     c = casl2sim.Comet2([casl2sim.Element(v, 0) for v in mem_vals])
     c._fin = io.StringIO(input_str)
     c._pr = 0
     c._gr = [0, 4, 3, 0, 0, 0, 0, 0]
     elem = c.fetch()
     c.op_SVC(elem)
     self.assertEqual(expected, c._mem[:len(expected)])
Ejemplo n.º 13
0
    def test_op_CPL(self):
        patterns = [(0x0005, 0x0005, (1, 0, 0), "=="),
                    (0x000f, 0xf000, (0, 1, 0), "<"),
                    (0xf000, 0x000f, (0, 0, 0), ">")]

        mem = [casl2sim.Element(0x4110, 0), casl2sim.Element(0x0002, 0)]
        c = casl2sim.Comet2(mem)
        for rval, mval, expected_flags, msg in patterns:
            with self.subTest(msg):
                c._pr = 0
                c._gr = [0, rval, 0, 0, 0, 0, 0, 0]
                c._zf, c._sf, c._of = 0, 0, 0
                c._mem[2].value = mval
                expected_gr = c._gr
                elem = c.fetch()
                c.op_CPL(elem)
                self.assertEqual(expected_gr, c._gr)
                self.assertEqual(expected_flags, (c._zf, c._sf, c._of))
Ejemplo n.º 14
0
 def test_op_LD_REG(self):
     mem = [casl2sim.Element(0x1415, 0)]
     c = casl2sim.Comet2(mem)
     c._gr[5] = 23
     expected = c._gr[:]
     expected[1] = c._gr[5]
     elem = c.fetch()
     c.op_LD_REG(elem)
     self.assertEqual(expected, c._gr)
Ejemplo n.º 15
0
 def test_op_POP(self):
     mem = [casl2sim.Element(0x7120, 0)]
     c = casl2sim.Comet2(mem)
     c._mem[0xff00].value = 0xbeef
     c._pr = 0
     c._sp = 0xff00
     c._gr = [0, 0, 0, 0, 0, 0, 0, 0]
     elem = c.fetch()
     c.op_POP(elem)
     self.assertEqual([0, 0, 0xbeef, 0, 0, 0, 0, 0], c._gr)
     self.assertEqual(0xff01, c._sp)
Ejemplo n.º 16
0
 def test_op_SUBL_REG(self):
     mem = [casl2sim.Element(0x2516, 0)]
     c = casl2sim.Comet2(mem)
     c._gr[1] = 2
     c._gr[6] = 5
     c._zf, c._sf, c._of = 0, 0, 0
     expected = c._gr[:]
     expected[1] = (-3) & 0xffff
     elem = c.fetch()
     c.op_SUBL_REG(elem)
     self.assertEqual(expected, c._gr)
     self.assertEqual((0, 0, 1), (c._zf, c._sf, c._of))
Ejemplo n.º 17
0
    def test_op_2word(self):
        patterns = [(0x11, ["GR1", "13"], (0x1110, 0x000d), "2 operands"),
                    (0x11, ["GR1", "-2"], (0x1110, 0xfffe), "negative"),
                    (0x11, ["GR2", "8",
                            "GR6"], (0x1126, 0x0008), "3 operands")]

        p = casl2sim.Parser()
        for op, args, expected_vals, msg in patterns:
            with self.subTest(msg):
                expected = [casl2sim.Element(v, 0) for v in expected_vals]
                actual = p.op_2word(op, args)
                self.assertEqual(expected, actual)
Ejemplo n.º 18
0
 def test_op_XOR_REG(self):
     mem = [casl2sim.Element(0x3610, 0)]
     c = casl2sim.Comet2(mem)
     c._gr[1] = 0xff00
     c._gr[0] = 0xf0f0
     c._zf, c._sf, c._of = 0, 0, 0
     expected = c._gr[:]
     expected[1] = 0x0ff0
     elem = c.fetch()
     c.op_XOR_REG(elem)
     self.assertEqual(expected, c._gr)
     self.assertEqual((0, 0, 0), (c._zf, c._sf, c._of))
Ejemplo n.º 19
0
 def test_op_CPL_REG(self):
     # ==
     mem = [casl2sim.Element(0x4412, 0)]
     c = casl2sim.Comet2(mem)
     c._gr[1] = 304
     c._gr[2] = 304
     c._zf, c._sf, c._of = 0, 0, 0
     expected = c._gr[:]
     elem = c.fetch()
     c.op_CPL_REG(elem)
     self.assertEqual(expected, c._gr)
     self.assertEqual((1, 0, 0), (c._zf, c._sf, c._of))
Ejemplo n.º 20
0
    def test_op_SVC_IN_size(self):
        patterns = [(256, "just input"), (0, "no input"), (11, "short input"),
                    (300, "long input")]

        mem_vals = [0xf000, 0x0001]
        mem_vals.extend([i for i in range(0x1000, 0x1100)])
        for input_size, msg in patterns:
            with self.subTest(msg):
                valid_input_size = min(input_size, 256)
                input_vals = ["X" for _ in range(valid_input_size)]
                expected_vals = mem_vals[:]
                expected_vals[3] = min(valid_input_size, 256)
                expected_vals[4:4 +
                              valid_input_size] = [ord(s) for s in input_vals]
                expected = [casl2sim.Element(s, 0) for s in expected_vals]
                c = casl2sim.Comet2([casl2sim.Element(v, 0) for v in mem_vals])
                c._fin = io.StringIO("".join(input_vals))
                c._pr = 0
                c._gr = [0, 4, 3, 0, 0, 0, 0, 0]
                elem = c.fetch()
                c.op_SVC(elem)
                self.assertEqual(expected, c._mem[:len(expected)])
Ejemplo n.º 21
0
    def test_op_1or2word(self):
        patterns = [
            ((0xff, 0xf0), ["GR0", "GR1"], [], (0xff01, ), (None, ), "1 word"),
            ((0xff, 0xf0), ["GR3", "LAB", "GR5"], [], (0xf035, 0x00ff),
             (None, "LAB"), "2 words label"),
            ((0xff, 0xf0), ["GR3", "=11", "GR5"], [casl2sim.Element(0, 0)] * 3,
             (0xf035, 0x0003), (None, "=11"), "2 words const addr"),
            ((0xff, 0xf0), ["GR3", "11", "GR5"], [], (0xf035, 0x000b),
             (None, None), "2 words const literal")
        ]

        p = casl2sim.Parser()
        for ops, args, mem, expected_vals, expected_lbls, msg in patterns:
            with self.subTest(msg):
                p._mem = mem
                p._defined_labels = {"LAB": 0xff}
                expected = [
                    casl2sim.Element(v, 0, b)
                    for v, b in zip(expected_vals, expected_lbls)
                ]
                actual = p.op_1or2word(ops[0], ops[1], args)
                p.resolve_labels()
                p.allocate_consts()
                self.assertEqual(expected, actual)
Ejemplo n.º 22
0
    def test_parse_DC(self):
        patterns = [(" DC 12", [casl2sim.Element(12, 0)], "decimal"),
                    (" DC 12   ", [casl2sim.Element(12, 0)], "space end"),
                    (" DC #000a", [casl2sim.Element(10, 0)], "hex"),
                    (" DC LAB", [casl2sim.Element(0xff, 0, "LAB")], "label"),
                    (" DC 'abc'", [
                        casl2sim.Element(ord("a"), 0),
                        casl2sim.Element(ord("b"), 0),
                        casl2sim.Element(ord("c"), 0)
                    ], "str"),
                    (" DC 'y''z'", [
                        casl2sim.Element(ord("y"), 0),
                        casl2sim.Element(ord("'"), 0),
                        casl2sim.Element(ord("z"), 0)
                    ], "str (')"),
                    (" DC 12, #000f, LAB, 'abcd''e'''", [
                        casl2sim.Element(12, 0),
                        casl2sim.Element(0xf, 0),
                        casl2sim.Element(0xff, 0, "LAB"),
                        casl2sim.Element(ord("a"), 0),
                        casl2sim.Element(ord("b"), 0),
                        casl2sim.Element(ord("c"), 0),
                        casl2sim.Element(ord("d"), 0),
                        casl2sim.Element(ord("'"), 0),
                        casl2sim.Element(ord("e"), 0),
                        casl2sim.Element(ord("'"), 0)
                    ], "multi")]

        p = casl2sim.Parser()
        p._defined_labels = {"LAB": 0xff}
        for asm, expected, msg in patterns:
            with self.subTest(msg):
                actual = p.parse_DC(asm)
                p.resolve_labels()
                self.assertEqual(expected, actual)