You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

151 lines
5.0 KiB

import pprint
import re
import sys
import unittest
import weakref
sys.path.insert(0, '..')
import pycparser.c_ast as c_ast
import pycparser.plyparser as plyparser
class Test_c_ast(unittest.TestCase):
def test_BinaryOp(self):
b1 = c_ast.BinaryOp(
op='+',
left=c_ast.Constant(type='int', value='6'),
right=c_ast.ID(name='joe'))
self.assertIsInstance(b1.left, c_ast.Constant)
self.assertEqual(b1.left.type, 'int')
self.assertEqual(b1.left.value, '6')
self.assertIsInstance(b1.right, c_ast.ID)
self.assertEqual(b1.right.name, 'joe')
def test_weakref_works_on_nodes(self):
c1 = c_ast.Constant(type='float', value='3.14')
wr = weakref.ref(c1)
cref = wr()
self.assertEqual(cref.type, 'float')
self.assertEqual(weakref.getweakrefcount(c1), 1)
def test_weakref_works_on_coord(self):
coord = plyparser.Coord(file='a', line=2)
wr = weakref.ref(coord)
cref = wr()
self.assertEqual(cref.line, 2)
self.assertEqual(weakref.getweakrefcount(coord), 1)
class TestNodeVisitor(unittest.TestCase):
class ConstantVisitor(c_ast.NodeVisitor):
def __init__(self):
self.values = []
def visit_Constant(self, node):
self.values.append(node.value)
def test_scalar_children(self):
b1 = c_ast.BinaryOp(
op='+',
left=c_ast.Constant(type='int', value='6'),
right=c_ast.ID(name='joe'))
cv = self.ConstantVisitor()
cv.visit(b1)
self.assertEqual(cv.values, ['6'])
b2 = c_ast.BinaryOp(
op='*',
left=c_ast.Constant(type='int', value='111'),
right=b1)
b3 = c_ast.BinaryOp(
op='^',
left=b2,
right=b1)
cv = self.ConstantVisitor()
cv.visit(b3)
self.assertEqual(cv.values, ['111', '6', '6'])
def tests_list_children(self):
c1 = c_ast.Constant(type='float', value='5.6')
c2 = c_ast.Constant(type='char', value='t')
b1 = c_ast.BinaryOp(
op='+',
left=c1,
right=c2)
b2 = c_ast.BinaryOp(
op='-',
left=b1,
right=c2)
comp = c_ast.Compound(
block_items=[b1, b2, c1, c2])
cv = self.ConstantVisitor()
cv.visit(comp)
self.assertEqual(cv.values,
['5.6', 't', '5.6', 't', 't', '5.6', 't'])
def test_repr(self):
c1 = c_ast.Constant(type='float', value='5.6')
c2 = c_ast.Constant(type='char', value='t')
b1 = c_ast.BinaryOp(
op='+',
left=c1,
right=c2)
b2 = c_ast.BinaryOp(
op='-',
left=b1,
right=c2)
comp = c_ast.Compound(
block_items=[b1, b2, c1, c2])
expected = ("Compound(block_items=[BinaryOp(op='+',\n"
" left=Constant(type='float',\n"
" value='5.6'\n"
" ),\n"
" right=Constant(type='char',\n"
" value='t'\n"
" )\n"
" ),\n"
" BinaryOp(op='-',\n"
" left=BinaryOp(op='+',\n"
" left=Constant(type='float',\n"
" value='5.6'\n"
" ),\n"
" right=Constant(type='char',\n"
" value='t'\n"
" )\n"
" ),\n"
" right=Constant(type='char',\n"
" value='t'\n"
" )\n"
" ),\n"
" Constant(type='float',\n"
" value='5.6'\n"
" ),\n"
" Constant(type='char',\n"
" value='t'\n"
" )\n"
" ]\n"
" )")
self.assertEqual(repr(comp),
expected)
if __name__ == '__main__':
unittest.main()