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