• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python
2# Copyright (c) 2021, Alliance for Open Media. All rights reserved.
3#
4# This source code is subject to the terms of the BSD 2 Clause License and
5# the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6# was not distributed with this source code in the LICENSE file, you can
7# obtain it at www.aomedia.org/license/software. If the Alliance for Open
8# Media Patent License 1.0 was not distributed with this source code in the
9# PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10#
11
12import pprint
13import re
14import os, sys
15import io
16import unittest as googletest
17
18sys.path[0:0] = ['.', '..']
19
20from pycparser import c_parser, parse_file
21from pycparser.c_ast import *
22from pycparser.c_parser import CParser, Coord, ParseError
23
24from auto_refactor import *
25
26
27def get_c_file_path(filename):
28  return os.path.join('c_files', filename)
29
30
31class TestStructInfo(googletest.TestCase):
32
33  def setUp(self):
34    filename = get_c_file_path('struct_code.c')
35    self.ast = parse_file(filename)
36
37  def test_build_struct_info(self):
38    struct_info = build_struct_info(self.ast)
39    typedef_name_dic = struct_info.typedef_name_dic
40    self.assertEqual('T1' in typedef_name_dic, True)
41    self.assertEqual('T4' in typedef_name_dic, True)
42    self.assertEqual('T5' in typedef_name_dic, True)
43
44    struct_name_dic = struct_info.struct_name_dic
45    struct_name = 'S1'
46    self.assertEqual(struct_name in struct_name_dic, True)
47    struct_item = struct_name_dic[struct_name]
48    self.assertEqual(struct_item.is_union, False)
49
50    struct_name = 'S3'
51    self.assertEqual(struct_name in struct_name_dic, True)
52    struct_item = struct_name_dic[struct_name]
53    self.assertEqual(struct_item.is_union, False)
54
55    struct_name = 'U5'
56    self.assertEqual(struct_name in struct_name_dic, True)
57    struct_item = struct_name_dic[struct_name]
58    self.assertEqual(struct_item.is_union, True)
59
60    self.assertEqual(len(struct_info.struct_item_list), 6)
61
62  def test_get_child_decl_status(self):
63    struct_info = build_struct_info(self.ast)
64    struct_item = struct_info.typedef_name_dic['T4']
65
66    decl_status = struct_item.child_decl_map['x']
67    self.assertEqual(decl_status.struct_item, None)
68    self.assertEqual(decl_status.is_ptr_decl, False)
69
70    decl_status = struct_item.child_decl_map['s3']
71    self.assertEqual(decl_status.struct_item.struct_name, 'S3')
72    self.assertEqual(decl_status.is_ptr_decl, False)
73
74    struct_item = struct_info.typedef_name_dic['T6']
75    decl_status = struct_item.child_decl_map['x']
76    self.assertEqual(decl_status.struct_item, None)
77    self.assertEqual(decl_status.is_ptr_decl, False)
78
79    decl_status = struct_item.child_decl_map['y']
80    self.assertEqual(decl_status.struct_item, None)
81    self.assertEqual(decl_status.is_ptr_decl, False)
82
83    decl_status = struct_item.child_decl_map['z']
84    self.assertEqual(decl_status.struct_item, None)
85    self.assertEqual(decl_status.is_ptr_decl, False)
86
87    struct_item = struct_info.typedef_name_dic['T7']
88    decl_status = struct_item.child_decl_map['y']
89    self.assertEqual('x' in decl_status.struct_item.child_decl_map, True)
90
91    struct_item = struct_info.typedef_name_dic['T7']
92    decl_status = struct_item.child_decl_map['z']
93    self.assertEqual('w' in decl_status.struct_item.child_decl_map, True)
94
95
96class TestParseLvalue(googletest.TestCase):
97
98  def setUp(self):
99    filename = get_c_file_path('parse_lvalue.c')
100    self.ast = parse_file(filename)
101    self.func_dictionary = build_func_dictionary(self.ast)
102
103  def test_parse_lvalue(self):
104    func_node = self.func_dictionary['func']
105    func_body_items = func_node.body.block_items
106    id_list = parse_lvalue(func_body_items[0].lvalue)
107    ref_id_list = ['cpi', 'rd', 'u']
108    self.assertEqual(id_list, ref_id_list)
109
110    id_list = parse_lvalue(func_body_items[2].lvalue)
111    ref_id_list = ['y']
112    self.assertEqual(id_list, ref_id_list)
113
114    id_list = parse_lvalue(func_body_items[3].lvalue)
115    ref_id_list = ['cpi', 'rd2', 'v']
116    self.assertEqual(id_list, ref_id_list)
117
118    id_list = parse_lvalue(func_body_items[4].lvalue)
119    ref_id_list = ['cpi', 'rd', 'arr']
120    self.assertEqual(id_list, ref_id_list)
121
122    id_list = parse_lvalue(func_body_items[5].lvalue)
123    ref_id_list = ['cpi', 'rd3', 'arr']
124    self.assertEqual(id_list, ref_id_list)
125
126  def test_parse_lvalue_2(self):
127    func_node = self.func_dictionary['parse_lvalue_2']
128    func_body_items = func_node.body.block_items
129    id_list = parse_lvalue(func_body_items[0].init)
130    ref_id_list = ['cpi', 'rd2']
131    self.assertEqual(id_list, ref_id_list)
132
133
134class TestIDStatusNode(googletest.TestCase):
135
136  def test_add_descendant(self):
137    root = IDStatusNode('root')
138    id_chain1 = ['cpi', 'rd', 'u']
139    id_chain2 = ['cpi', 'rd', 'v']
140    root.add_descendant(id_chain1)
141    root.add_descendant(id_chain2)
142
143    ref_children_list1 = ['cpi']
144    children_list1 = list(root.children.keys())
145    self.assertEqual(children_list1, ref_children_list1)
146
147    ref_children_list2 = ['rd']
148    children_list2 = list(root.children['cpi'].children.keys())
149    self.assertEqual(children_list2, ref_children_list2)
150
151    ref_children_list3 = ['u', 'v']
152    children_list3 = list(root.children['cpi'].children['rd'].children.keys())
153    self.assertEqual(children_list3, ref_children_list3)
154
155  def test_get_descendant(self):
156    root = IDStatusNode('root')
157    id_chain1 = ['cpi', 'rd', 'u']
158    id_chain2 = ['cpi', 'rd', 'v']
159    ref_descendant_1 = root.add_descendant(id_chain1)
160    ref_descendant_2 = root.add_descendant(id_chain2)
161
162    descendant_1 = root.get_descendant(id_chain1)
163    self.assertEqual(descendant_1 is ref_descendant_1, True)
164
165    descendant_2 = root.get_descendant(id_chain2)
166    self.assertEqual(descendant_2 is ref_descendant_2, True)
167
168    id_chain3 = ['cpi', 'rd', 'h']
169    descendant_3 = root.get_descendant(id_chain3)
170    self.assertEqual(descendant_3, None)
171
172
173class TestFuncInOut(googletest.TestCase):
174
175  def setUp(self):
176    c_filename = get_c_file_path('func_in_out.c')
177    self.ast = parse_file(c_filename)
178    self.func_dictionary = build_func_dictionary(self.ast)
179    self.struct_info = build_struct_info(self.ast)
180
181  def test_get_func_param_id_map(self):
182    func_def_node = self.func_dictionary['func']
183    param_id_map = get_func_param_id_map(func_def_node)
184    ref_param_id_map_keys = ['cpi', 'x']
185    self.assertEqual(list(param_id_map.keys()), ref_param_id_map_keys)
186
187  def test_assign_refer_status_1(self):
188    func_def_node = self.func_dictionary['func_assign_refer_status_1']
189    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
190                               self.func_dictionary)
191    visitor.visit(func_def_node.body)
192    root = visitor.get_id_tree_stack()
193    body_id_tree = visitor.body_id_tree
194
195    id_chain = ['rd']
196    descendant = body_id_tree.get_descendant(id_chain)
197    self.assertEqual(descendant.get_assign(), False)
198    self.assertEqual(descendant.get_refer(), False)
199    ref_link_id_chain = ['cpi', 'rd']
200    self.assertEqual(ref_link_id_chain, descendant.get_link_id_chain())
201
202    id_chain = ['cpi', 'rd']
203    descendant = root.get_id_node(id_chain)
204    self.assertEqual(descendant.get_assign(), False)
205    self.assertEqual(descendant.get_refer(), False)
206    self.assertEqual(None, descendant.get_link_id_chain())
207
208  def test_assign_refer_status_2(self):
209    func_def_node = self.func_dictionary['func_assign_refer_status_2']
210    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
211                               self.func_dictionary)
212    visitor.visit(func_def_node.body)
213    root = visitor.get_id_tree_stack()
214    body_id_tree = visitor.body_id_tree
215
216    id_chain = ['rd2']
217    descendant = body_id_tree.get_descendant(id_chain)
218    self.assertEqual(descendant.get_assign(), False)
219    self.assertEqual(descendant.get_refer(), False)
220
221    ref_link_id_chain = ['cpi', 'rd']
222    self.assertEqual(ref_link_id_chain, descendant.get_link_id_chain())
223
224    id_chain = ['cpi', 'rd']
225    descendant = root.get_id_node(id_chain)
226    self.assertEqual(descendant.get_assign(), False)
227    self.assertEqual(descendant.get_refer(), False)
228    self.assertEqual(None, descendant.get_link_id_chain())
229
230  def test_assign_refer_status_3(self):
231    func_def_node = self.func_dictionary['func_assign_refer_status_3']
232    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
233                               self.func_dictionary)
234    visitor.visit(func_def_node.body)
235    root = visitor.get_id_tree_stack()
236    body_id_tree = visitor.body_id_tree
237
238    id_chain = ['a']
239    descendant = body_id_tree.get_descendant(id_chain)
240    self.assertEqual(descendant.get_assign(), True)
241    self.assertEqual(descendant.get_refer(), False)
242    self.assertEqual(None, descendant.get_link_id_chain())
243
244    id_chain = ['cpi', 'y']
245    descendant = root.get_id_node(id_chain)
246    self.assertEqual(descendant.get_assign(), False)
247    self.assertEqual(descendant.get_refer(), True)
248    self.assertEqual(None, descendant.get_link_id_chain())
249
250  def test_assign_refer_status_4(self):
251    func_def_node = self.func_dictionary['func_assign_refer_status_4']
252    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
253                               self.func_dictionary)
254    visitor.visit(func_def_node.body)
255    root = visitor.get_id_tree_stack()
256    body_id_tree = visitor.body_id_tree
257
258    id_chain = ['b']
259    descendant = body_id_tree.get_descendant(id_chain)
260    self.assertEqual(descendant.get_assign(), True)
261    self.assertEqual(descendant.get_refer(), False)
262    self.assertEqual(None, descendant.get_link_id_chain())
263
264    id_chain = ['cpi', 'y']
265    descendant = root.get_id_node(id_chain)
266    self.assertEqual(descendant.get_assign(), True)
267    self.assertEqual(descendant.get_refer(), True)
268    self.assertEqual(None, descendant.get_link_id_chain())
269
270  def test_assign_refer_status_5(self):
271    func_def_node = self.func_dictionary['func_assign_refer_status_5']
272    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
273                               self.func_dictionary)
274    visitor.visit(func_def_node.body)
275    root = visitor.get_id_tree_stack()
276    body_id_tree = visitor.body_id_tree
277
278    id_chain = ['rd5']
279    descendant = body_id_tree.get_descendant(id_chain)
280    self.assertEqual(descendant.get_assign(), False)
281    self.assertEqual(descendant.get_refer(), False)
282
283    id_chain = ['cpi', 'rd2']
284    descendant = root.get_id_node(id_chain)
285    self.assertEqual(descendant.get_assign(), False)
286    self.assertEqual(descendant.get_refer(), False)
287    self.assertEqual(None, descendant.get_link_id_chain())
288
289  def test_assign_refer_status_6(self):
290    func_def_node = self.func_dictionary['func_assign_refer_status_6']
291    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
292                               self.func_dictionary)
293    visitor.visit(func_def_node.body)
294    root = visitor.get_id_tree_stack()
295
296    id_chain = ['cpi', 'rd']
297    descendant = root.get_id_node(id_chain)
298    self.assertEqual(descendant.get_assign(), True)
299    self.assertEqual(descendant.get_refer(), False)
300    self.assertEqual(None, descendant.get_link_id_chain())
301
302    id_chain = ['cpi2', 'rd']
303    descendant = root.get_id_node(id_chain)
304    self.assertEqual(descendant.get_assign(), False)
305    self.assertEqual(descendant.get_refer(), True)
306    self.assertEqual(None, descendant.get_link_id_chain())
307
308  def test_assign_refer_status_7(self):
309    func_def_node = self.func_dictionary['func_assign_refer_status_7']
310    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
311                               self.func_dictionary)
312    visitor.visit(func_def_node.body)
313    root = visitor.get_id_tree_stack()
314    id_chain = ['cpi', 'arr']
315    descendant = root.get_id_node(id_chain)
316    self.assertEqual(descendant.get_assign(), True)
317    self.assertEqual(descendant.get_refer(), False)
318
319  def test_assign_refer_status_8(self):
320    func_def_node = self.func_dictionary['func_assign_refer_status_8']
321    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
322                               self.func_dictionary)
323    visitor.visit(func_def_node.body)
324    root = visitor.get_id_tree_stack()
325    id_chain = ['cpi', 'arr']
326    descendant = root.get_id_node(id_chain)
327    self.assertEqual(descendant.get_assign(), False)
328    self.assertEqual(descendant.get_refer(), True)
329
330  def test_assign_refer_status_9(self):
331    func_def_node = self.func_dictionary['func_assign_refer_status_9']
332    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
333                               self.func_dictionary)
334    visitor.visit(func_def_node.body)
335    root = visitor.get_id_tree_stack()
336    id_chain = ['cpi', 'rd', 'u']
337    descendant = root.get_id_node(id_chain)
338    self.assertEqual(descendant.get_assign(), True)
339    self.assertEqual(descendant.get_refer(), False)
340
341  def test_assign_refer_status_10(self):
342    func_def_node = self.func_dictionary['func_assign_refer_status_10']
343    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
344                               self.func_dictionary)
345    visitor.visit(func_def_node.body)
346    root = visitor.get_id_tree_stack()
347    id_chain = ['cpi', 'rd', 'u']
348    descendant = root.get_id_node(id_chain)
349    self.assertEqual(descendant.get_assign(), False)
350    self.assertEqual(descendant.get_refer(), True)
351
352    id_chain = ['cpi', 'arr']
353    descendant = root.get_id_node(id_chain)
354    self.assertEqual(descendant.get_assign(), True)
355    self.assertEqual(descendant.get_refer(), False)
356
357  def test_assign_refer_status_11(self):
358    func_def_node = self.func_dictionary['func_assign_refer_status_11']
359    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
360                               self.func_dictionary)
361    visitor.visit(func_def_node.body)
362    root = visitor.get_id_tree_stack()
363    id_chain = ['cpi', 'rd2', 'v']
364    descendant = root.get_id_node(id_chain)
365    self.assertEqual(descendant.get_assign(), True)
366    self.assertEqual(descendant.get_refer(), False)
367
368  def test_assign_refer_status_12(self):
369    func_def_node = self.func_dictionary['func_assign_refer_status_12']
370    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
371                               self.func_dictionary)
372    visitor.visit(func_def_node.body)
373    root = visitor.get_id_tree_stack()
374    id_chain = ['cpi', 'rd']
375    descendant = root.get_id_node(id_chain)
376    self.assertEqual(descendant.get_assign(), True)
377    self.assertEqual(descendant.get_refer(), False)
378
379    id_chain = ['cpi2', 'rd']
380    descendant = root.get_id_node(id_chain)
381    self.assertEqual(descendant.get_assign(), False)
382    self.assertEqual(descendant.get_refer(), True)
383
384  def test_assign_refer_status_13(self):
385    func_def_node = self.func_dictionary['func_assign_refer_status_13']
386    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
387                               self.func_dictionary)
388    visitor.visit(func_def_node.body)
389    root = visitor.get_id_tree_stack()
390    id_chain = ['cpi', 'z']
391    descendant = root.get_id_node(id_chain)
392    self.assertEqual(descendant.get_assign(), True)
393    self.assertEqual(descendant.get_refer(), False)
394
395    id_chain = ['cpi', 'w']
396    descendant = root.get_id_node(id_chain)
397    self.assertEqual(descendant.get_assign(), True)
398    self.assertEqual(descendant.get_refer(), False)
399
400  def test_id_status_forrest_1(self):
401    func_def_node = self.func_dictionary['func']
402    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
403                               self.func_dictionary)
404    visitor.visit(func_def_node.body)
405    root = visitor.get_id_tree_stack().top()
406    children_names = set(root.get_children().keys())
407    ref_children_names = set(['cpi', 'x'])
408    self.assertEqual(children_names, ref_children_names)
409
410    root = visitor.body_id_tree
411    children_names = set(root.get_children().keys())
412    ref_children_names = set(['a', 'ref_rd', 'ref_rd2', 'ref_rd3', 'b'])
413    self.assertEqual(children_names, ref_children_names)
414
415  def test_id_status_forrest_show(self):
416    func_def_node = self.func_dictionary['func_id_forrest_show']
417    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
418                               self.func_dictionary)
419    visitor.visit(func_def_node.body)
420    visitor.get_id_tree_stack().top().show()
421
422  def test_id_status_forrest_2(self):
423    func_def_node = self.func_dictionary['func_id_forrest_show']
424    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
425                               self.func_dictionary)
426    visitor.visit(func_def_node.body)
427    root = visitor.get_id_tree_stack().top()
428    self.assertEqual(root, root.root)
429
430    id_chain = ['cpi', 'rd']
431    descendant = root.get_descendant(id_chain)
432    self.assertEqual(root, descendant.root)
433
434    id_chain = ['b']
435    descendant = root.get_descendant(id_chain)
436    self.assertEqual(root, descendant.root)
437
438  def test_link_id_chain_1(self):
439    func_def_node = self.func_dictionary['func_link_id_chain_1']
440    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
441                               self.func_dictionary)
442    visitor.visit(func_def_node.body)
443    root = visitor.get_id_tree_stack()
444    id_chain = ['cpi', 'rd', 'u']
445    descendant = root.get_id_node(id_chain)
446    self.assertEqual(descendant.get_assign(), True)
447
448  def test_link_id_chain_2(self):
449    func_def_node = self.func_dictionary['func_link_id_chain_2']
450    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
451                               self.func_dictionary)
452    visitor.visit(func_def_node.body)
453    root = visitor.get_id_tree_stack()
454    id_chain = ['cpi', 'rd', 'xd', 'u']
455    descendant = root.get_id_node(id_chain)
456    self.assertEqual(descendant.get_assign(), True)
457
458  def test_func_call_1(self):
459    func_def_node = self.func_dictionary['func_call_1']
460    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
461                               self.func_dictionary)
462    visitor.visit(func_def_node.body)
463    root = visitor.get_id_tree_stack()
464    id_chain = ['cpi', 'y']
465    descendant = root.get_id_node(id_chain)
466    self.assertEqual(descendant.get_assign(), True)
467    self.assertEqual(descendant.get_refer(), False)
468
469    id_chain = ['y']
470    descendant = root.get_id_node(id_chain)
471    self.assertEqual(descendant.get_assign(), False)
472    self.assertEqual(descendant.get_refer(), True)
473
474  def test_func_call_2(self):
475    func_def_node = self.func_dictionary['func_call_2']
476    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
477                               self.func_dictionary)
478    visitor.visit(func_def_node.body)
479    root = visitor.get_id_tree_stack()
480    id_chain = ['cpi', 'rd', 'u']
481    descendant = root.get_id_node(id_chain)
482    self.assertEqual(descendant.get_assign(), True)
483    self.assertEqual(descendant.get_refer(), False)
484
485    id_chain = ['cpi', 'rd']
486    descendant = root.get_id_node(id_chain)
487    self.assertEqual(descendant.get_assign(), False)
488    self.assertEqual(descendant.get_refer(), False)
489
490  def test_func_call_3(self):
491    func_def_node = self.func_dictionary['func_call_3']
492    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
493                               self.func_dictionary)
494    visitor.visit(func_def_node.body)
495    root = visitor.get_id_tree_stack()
496    id_chain = ['cpi', 'y']
497    descendant = root.get_id_node(id_chain)
498    self.assertEqual(descendant.get_assign(), True)
499    self.assertEqual(descendant.get_refer(), True)
500
501  def test_func_call_4(self):
502    func_def_node = self.func_dictionary['func_call_4']
503    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
504                               self.func_dictionary)
505    visitor.visit(func_def_node.body)
506    root = visitor.get_id_tree_stack()
507
508    id_chain = ['cpi', 'rd', 'u']
509    descendant = root.get_id_node(id_chain)
510    self.assertEqual(descendant.get_assign(), True)
511    self.assertEqual(descendant.get_refer(), False)
512
513    id_chain = ['cpi', 'rd', 'xd', 'u']
514    descendant = root.get_id_node(id_chain)
515    self.assertEqual(descendant.get_assign(), True)
516    self.assertEqual(descendant.get_refer(), False)
517
518  def test_func_call_5(self):
519    func_def_node = self.func_dictionary['func_call_5']
520    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
521                               self.func_dictionary)
522    visitor.visit(func_def_node.body)
523    root = visitor.get_id_tree_stack()
524
525    id_chain = ['cpi', 'y']
526    descendant = root.get_id_node(id_chain)
527    self.assertEqual(descendant.get_assign(), True)
528    self.assertEqual(descendant.get_refer(), False)
529
530  def test_func_compound_1(self):
531    func_def_node = self.func_dictionary['func_compound_1']
532    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
533                               self.func_dictionary)
534    visitor.visit(func_def_node.body)
535    root = visitor.get_id_tree_stack()
536    id_chain = ['cpi', 'y']
537    descendant = root.get_id_node(id_chain)
538    self.assertEqual(descendant.get_assign(), True)
539    self.assertEqual(descendant.get_refer(), True)
540
541  def test_func_compound_2(self):
542    func_def_node = self.func_dictionary['func_compound_2']
543    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
544                               self.func_dictionary)
545    visitor.visit(func_def_node.body)
546    root = visitor.get_id_tree_stack()
547    id_chain = ['cpi', 'y']
548    descendant = root.get_id_node(id_chain)
549    self.assertEqual(descendant.get_assign(), False)
550    self.assertEqual(descendant.get_refer(), True)
551
552    id_chain = ['cpi', 'rd', 'u']
553    descendant = root.get_id_node(id_chain)
554    self.assertEqual(descendant.get_assign(), True)
555    self.assertEqual(descendant.get_refer(), False)
556
557  def test_func_compound_3(self):
558    func_def_node = self.func_dictionary['func_compound_3']
559    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
560                               self.func_dictionary)
561    visitor.visit(func_def_node.body)
562    root = visitor.get_id_tree_stack()
563
564    id_chain = ['cpi', 'rd', 'u']
565    descendant = root.get_id_node(id_chain)
566    self.assertEqual(descendant.get_assign(), True)
567    self.assertEqual(descendant.get_refer(), False)
568
569  def test_func_compound_4(self):
570    func_def_node = self.func_dictionary['func_compound_4']
571    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
572                               self.func_dictionary)
573    visitor.visit(func_def_node.body)
574    root = visitor.get_id_tree_stack()
575    id_chain = ['cpi', 'y']
576    descendant = root.get_id_node(id_chain)
577    self.assertEqual(descendant.get_assign(), True)
578    self.assertEqual(descendant.get_refer(), True)
579
580  def test_func_compound_5(self):
581    func_def_node = self.func_dictionary['func_compound_5']
582    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
583                               self.func_dictionary)
584    visitor.visit(func_def_node.body)
585    root = visitor.get_id_tree_stack()
586    id_chain = ['cpi', 'y']
587    descendant = root.get_id_node(id_chain)
588    self.assertEqual(descendant.get_assign(), True)
589    self.assertEqual(descendant.get_refer(), True)
590
591  def test_func_compound_6(self):
592    func_def_node = self.func_dictionary['func_compound_6']
593    visitor = FuncInOutVisitor(func_def_node, self.struct_info,
594                               self.func_dictionary)
595    visitor.visit(func_def_node.body)
596    root = visitor.get_id_tree_stack()
597    id_chain = ['cpi', 'y']
598    descendant = root.get_id_node(id_chain)
599    self.assertEqual(descendant.get_assign(), True)
600    self.assertEqual(descendant.get_refer(), True)
601
602
603class TestDeclStatus(googletest.TestCase):
604
605  def setUp(self):
606    filename = get_c_file_path('decl_status_code.c')
607    self.ast = parse_file(filename)
608    self.func_dictionary = build_func_dictionary(self.ast)
609    self.struct_info = build_struct_info(self.ast)
610
611  def test_parse_decl_node(self):
612    func_def_node = self.func_dictionary['main']
613    decl_list = func_def_node.body.block_items
614    decl_status = parse_decl_node(self.struct_info, decl_list[0])
615    self.assertEqual(decl_status.name, 'a')
616    self.assertEqual(decl_status.is_ptr_decl, False)
617
618    decl_status = parse_decl_node(self.struct_info, decl_list[1])
619    self.assertEqual(decl_status.name, 't1')
620    self.assertEqual(decl_status.is_ptr_decl, False)
621
622    decl_status = parse_decl_node(self.struct_info, decl_list[2])
623    self.assertEqual(decl_status.name, 's1')
624    self.assertEqual(decl_status.is_ptr_decl, False)
625
626    decl_status = parse_decl_node(self.struct_info, decl_list[3])
627    self.assertEqual(decl_status.name, 't2')
628    self.assertEqual(decl_status.is_ptr_decl, True)
629
630  def test_parse_decl_node_2(self):
631    func_def_node = self.func_dictionary['parse_decl_node_2']
632    decl_list = func_def_node.body.block_items
633    decl_status = parse_decl_node(self.struct_info, decl_list[0])
634    self.assertEqual(decl_status.name, 'arr')
635    self.assertEqual(decl_status.is_ptr_decl, True)
636    self.assertEqual(decl_status.struct_item, None)
637
638  def test_parse_decl_node_3(self):
639    func_def_node = self.func_dictionary['parse_decl_node_3']
640    decl_list = func_def_node.body.block_items
641    decl_status = parse_decl_node(self.struct_info, decl_list[0])
642    self.assertEqual(decl_status.name, 'a')
643    self.assertEqual(decl_status.is_ptr_decl, True)
644    self.assertEqual(decl_status.struct_item, None)
645
646  def test_parse_decl_node_4(self):
647    func_def_node = self.func_dictionary['parse_decl_node_4']
648    decl_list = func_def_node.body.block_items
649    decl_status = parse_decl_node(self.struct_info, decl_list[0])
650    self.assertEqual(decl_status.name, 't1')
651    self.assertEqual(decl_status.is_ptr_decl, True)
652    self.assertEqual(decl_status.struct_item.typedef_name, 'T1')
653    self.assertEqual(decl_status.struct_item.struct_name, 'S1')
654
655  def test_parse_decl_node_5(self):
656    func_def_node = self.func_dictionary['parse_decl_node_5']
657    decl_list = func_def_node.body.block_items
658    decl_status = parse_decl_node(self.struct_info, decl_list[0])
659    self.assertEqual(decl_status.name, 't2')
660    self.assertEqual(decl_status.is_ptr_decl, True)
661    self.assertEqual(decl_status.struct_item.typedef_name, 'T1')
662    self.assertEqual(decl_status.struct_item.struct_name, 'S1')
663
664  def test_parse_decl_node_6(self):
665    func_def_node = self.func_dictionary['parse_decl_node_6']
666    decl_list = func_def_node.body.block_items
667    decl_status = parse_decl_node(self.struct_info, decl_list[0])
668    self.assertEqual(decl_status.name, 't3')
669    self.assertEqual(decl_status.is_ptr_decl, True)
670    self.assertEqual(decl_status.struct_item.typedef_name, 'T1')
671    self.assertEqual(decl_status.struct_item.struct_name, 'S1')
672
673
674if __name__ == '__main__':
675  googletest.main()
676