*fix typo in comment; test of commit access
[oota-llvm.git] / bindings / python / llvm / tests / test_disassembler.py
1 from unittest import expectedFailure
2 from unittest import skip
3
4 from .base import TestBase
5 from ..disassembler import DisassemblerByteArraySource
6 from ..disassembler import DisassemblerFileSource
7 from ..disassembler import Disassembler
8 from ..object import ObjectFile
9
10 class TestDisassembler(TestBase):
11     def test_simple(self):
12         sequence = '\x67\xe3\x81' # jcxz -127
13         triple = 'i686-apple-darwin9'
14
15         source = DisassemblerByteArraySource(sequence)
16
17         disassembler = Disassembler(triple, source)
18         instructions = list(disassembler.get_instructions())
19
20         self.assertEqual(len(instructions), 1)
21
22         i = instructions[0]
23         self.assertEqual(str(i), '\tjcxz\t-127\n')
24         self.assertEqual(i.byte_size, 3)
25         self.assertEqual(i.id, 1032)
26         self.assertTrue(i.is_branch)
27         self.assertFalse(i.is_move)
28         self.assertEqual(i.branch_target_id, 0)
29
30         tokens = list(i.get_tokens())
31         self.assertEqual(len(tokens), 4)
32         token = tokens[0]
33         self.assertEqual(str(token), 'jcxz')
34         self.assertFalse(token.is_whitespace)
35         self.assertFalse(token.is_punctuation)
36         self.assertTrue(token.is_opcode)
37         self.assertFalse(token.is_literal)
38         self.assertFalse(token.is_register)
39
40         self.assertTrue(tokens[1].is_whitespace)
41
42         operands = list(i.get_operands())
43         self.assertEqual(len(operands), 1)
44
45         # TODO implement operand tests
46
47     @skip('This test is horribly broken and probably not even correct.')
48     def test_read_instructions(self):
49         filename = self.get_test_binary()
50         o = ObjectFile(filename=filename)
51
52         for symbol in o.get_symbols():
53             address = symbol.address
54             offset = symbol.file_offset
55             size = symbol.size
56
57             source = DisassemblerFileSource(filename, offset, length=size,
58                                             start_address=address)
59
60             disassembler = Disassembler('x86-generic-gnu-linux', source)
61             for instruction in disassembler.get_instructions():
62                 print instruction