blob: bfe301a346e1dde0b6753dbfbb6392d8461e716e [file] [log] [blame]
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.failUnless(isinstance(b1.left, c_ast.Constant))
self.assertEqual(b1.left.type, 'int')
self.assertEqual(b1.left.value, '6')
self.failUnless(isinstance(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'])
if __name__ == '__main__':
unittest.main()