OLD | NEW |
1 # -*- coding: utf-8; -*- | 1 # -*- coding: utf-8; -*- |
2 # | 2 # |
3 # Copyright (C) 2011 Google Inc. All rights reserved. | 3 # Copyright (C) 2011 Google Inc. All rights reserved. |
4 # Copyright (C) 2009 Torch Mobile Inc. | 4 # Copyright (C) 2009 Torch Mobile Inc. |
5 # Copyright (C) 2009 Apple Inc. All rights reserved. | 5 # Copyright (C) 2009 Apple Inc. All rights reserved. |
6 # Copyright (C) 2010 Chris Jerdonek (cjerdonek@webkit.org) | 6 # Copyright (C) 2010 Chris Jerdonek (cjerdonek@webkit.org) |
7 # | 7 # |
8 # Redistribution and use in source and binary forms, with or without | 8 # Redistribution and use in source and binary forms, with or without |
9 # modification, are permitted provided that the following conditions are | 9 # modification, are permitted provided that the following conditions are |
10 # met: | 10 # met: |
(...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
533 'body_start_position': (2, 1), | 533 'body_start_position': (2, 1), |
534 'end_position': (2, 2), | 534 'end_position': (2, 2), |
535 'is_pure': False, | 535 'is_pure': False, |
536 'is_declaration': True}) | 536 'is_declaration': True}) |
537 | 537 |
538 # Simple test case with something that is not a function. | 538 # Simple test case with something that is not a function. |
539 self.perform_function_detection(['class Stuff;'], None) | 539 self.perform_function_detection(['class Stuff;'], None) |
540 | 540 |
541 def test_parameter_list(self): | 541 def test_parameter_list(self): |
542 # A function with no arguments. | 542 # A function with no arguments. |
543 function_state = self.perform_function_detection( | 543 self.perform_function_detection( |
544 ['void functionName();'], | 544 ['void functionName();'], |
545 {'name': 'functionName', | 545 {'name': 'functionName', |
546 'modifiers_and_return_type': 'void', | 546 'modifiers_and_return_type': 'void', |
547 'function_name_start_position': (0, 5), | 547 'function_name_start_position': (0, 5), |
548 'parameter_start_position': (0, 17), | 548 'parameter_start_position': (0, 17), |
549 'parameter_end_position': (0, 19), | 549 'parameter_end_position': (0, 19), |
550 'body_start_position': (0, 19), | 550 'body_start_position': (0, 19), |
551 'end_position': (0, 20), | 551 'end_position': (0, 20), |
552 'is_pure': False, | 552 'is_pure': False, |
553 'is_declaration': True, | 553 'is_declaration': True, |
554 'parameter_list': ()}) | 554 'parameter_list': ()}) |
555 | 555 |
556 # A function with one argument. | 556 # A function with one argument. |
557 function_state = self.perform_function_detection( | 557 self.perform_function_detection( |
558 ['void functionName(int);'], | 558 ['void functionName(int);'], |
559 {'name': 'functionName', | 559 {'name': 'functionName', |
560 'modifiers_and_return_type': 'void', | 560 'modifiers_and_return_type': 'void', |
561 'function_name_start_position': (0, 5), | 561 'function_name_start_position': (0, 5), |
562 'parameter_start_position': (0, 17), | 562 'parameter_start_position': (0, 17), |
563 'parameter_end_position': (0, 22), | 563 'parameter_end_position': (0, 22), |
564 'body_start_position': (0, 22), | 564 'body_start_position': (0, 22), |
565 'end_position': (0, 23), | 565 'end_position': (0, 23), |
566 'is_pure': False, | 566 'is_pure': False, |
567 'is_declaration': True, | 567 'is_declaration': True, |
568 'parameter_list': | 568 'parameter_list': |
569 ({'type': 'int', 'name': '', 'row': 0},)}) | 569 ({'type': 'int', 'name': '', 'row': 0},)}) |
570 | 570 |
571 # A function with unsigned and short arguments | 571 # A function with unsigned and short arguments |
572 function_state = self.perform_function_detection( | 572 self.perform_function_detection( |
573 ['void functionName(unsigned a, short b, long c, long long short uns
igned int);'], | 573 ['void functionName(unsigned a, short b, long c, long long short uns
igned int);'], |
574 {'name': 'functionName', | 574 {'name': 'functionName', |
575 'modifiers_and_return_type': 'void', | 575 'modifiers_and_return_type': 'void', |
576 'function_name_start_position': (0, 5), | 576 'function_name_start_position': (0, 5), |
577 'parameter_start_position': (0, 17), | 577 'parameter_start_position': (0, 17), |
578 'parameter_end_position': (0, 76), | 578 'parameter_end_position': (0, 76), |
579 'body_start_position': (0, 76), | 579 'body_start_position': (0, 76), |
580 'end_position': (0, 77), | 580 'end_position': (0, 77), |
581 'is_pure': False, | 581 'is_pure': False, |
582 'is_declaration': True, | 582 'is_declaration': True, |
583 'parameter_list': | 583 'parameter_list': |
584 ({'type': 'unsigned', 'name': 'a', 'row': 0}, | 584 ({'type': 'unsigned', 'name': 'a', 'row': 0}, |
585 {'type': 'short', 'name': 'b', 'row': 0}, | 585 {'type': 'short', 'name': 'b', 'row': 0}, |
586 {'type': 'long', 'name': 'c', 'row': 0}, | 586 {'type': 'long', 'name': 'c', 'row': 0}, |
587 {'type': 'long long short unsigned int', 'name': '', 'row': 0}
)}) | 587 {'type': 'long long short unsigned int', 'name': '', 'row': 0}
)}) |
588 | 588 |
589 # Some parameter type with modifiers and no parameter names. | 589 # Some parameter type with modifiers and no parameter names. |
590 function_state = self.perform_function_detection( | 590 self.perform_function_detection( |
591 [ | 591 [ |
592 'virtual void determineARIADropEffects(Vector<String>*&, const u
nsigned long int*&, const MediaPlayer::Preload, Other<Other2, Other3<P1, P2> >,
int);'], | 592 'virtual void determineARIADropEffects(Vector<String>*&, const u
nsigned long int*&, const MediaPlayer::Preload, Other<Other2, Other3<P1, P2> >,
int);'], |
593 {'name': 'determineARIADropEffects', | 593 {'name': 'determineARIADropEffects', |
594 'modifiers_and_return_type': 'virtual void', | 594 'modifiers_and_return_type': 'virtual void', |
595 'parameter_start_position': (0, 37), | 595 'parameter_start_position': (0, 37), |
596 'function_name_start_position': (0, 13), | 596 'function_name_start_position': (0, 13), |
597 'parameter_end_position': (0, 147), | 597 'parameter_end_position': (0, 147), |
598 'body_start_position': (0, 147), | 598 'body_start_position': (0, 147), |
599 'end_position': (0, 148), | 599 'end_position': (0, 148), |
600 'is_pure': False, | 600 'is_pure': False, |
601 'is_declaration': True, | 601 'is_declaration': True, |
602 'parameter_list': | 602 'parameter_list': |
603 ({'type': 'Vector<String>*&', 'name': '', 'row': 0}, | 603 ({'type': 'Vector<String>*&', 'name': '', 'row': 0}, |
604 {'type': 'const unsigned long int*&', 'name': '', 'row': 0}, | 604 {'type': 'const unsigned long int*&', 'name': '', 'row': 0}, |
605 {'type': 'const MediaPlayer::Preload', 'name': '', 'row': 0}, | 605 {'type': 'const MediaPlayer::Preload', 'name': '', 'row': 0}, |
606 {'type': 'Other<Other2, Other3<P1, P2> >', 'name': '', 'row':
0}, | 606 {'type': 'Other<Other2, Other3<P1, P2> >', 'name': '', 'row':
0}, |
607 {'type': 'int', 'name': '', 'row': 0})}) | 607 {'type': 'int', 'name': '', 'row': 0})}) |
608 | 608 |
609 # Try parsing a function with a very complex definition. | 609 # Try parsing a function with a very complex definition. |
610 function_state = self.perform_function_detection( | 610 self.perform_function_detection( |
611 ['#define MyMacro(a) a', | 611 ['#define MyMacro(a) a', |
612 'virtual', | 612 'virtual', |
613 'AnotherTemplate<Class1, Class2> aFunctionName(PassRefPtr<MyClass>
paramName,', | 613 'AnotherTemplate<Class1, Class2> aFunctionName(PassRefPtr<MyClass>
paramName,', |
614 'const Other1Class& foo,', | 614 'const Other1Class& foo,', |
615 'const ComplexTemplate<Class1, NestedTemplate<P1, P2> >* const * pa
ram = new ComplexTemplate<Class1, NestedTemplate<P1, P2> >(34, 42),', | 615 'const ComplexTemplate<Class1, NestedTemplate<P1, P2> >* const * pa
ram = new ComplexTemplate<Class1, NestedTemplate<P1, P2> >(34, 42),', |
616 'int* myCount = 0);'], | 616 'int* myCount = 0);'], |
617 {'name': 'aFunctionName', | 617 {'name': 'aFunctionName', |
618 'modifiers_and_return_type': 'virtual AnotherTemplate<Class1, Class
2>', | 618 'modifiers_and_return_type': 'virtual AnotherTemplate<Class1, Class
2>', |
619 'function_name_start_position': (2, 32), | 619 'function_name_start_position': (2, 32), |
620 'parameter_start_position': (2, 45), | 620 'parameter_start_position': (2, 45), |
(...skipping 1853 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2474 build_storage_class_error_message) | 2474 build_storage_class_error_message) |
2475 | 2475 |
2476 self.assert_lint('int register foo = 0;', | 2476 self.assert_lint('int register foo = 0;', |
2477 build_storage_class_error_message) | 2477 build_storage_class_error_message) |
2478 | 2478 |
2479 # Since there are a very large number of possibilities, randomly | 2479 # Since there are a very large number of possibilities, randomly |
2480 # construct declarations. | 2480 # construct declarations. |
2481 # Make sure that the declaration is logged if there's an error. | 2481 # Make sure that the declaration is logged if there's an error. |
2482 # Seed generator with an integer for absolute reproducibility. | 2482 # Seed generator with an integer for absolute reproducibility. |
2483 random.seed(25) | 2483 random.seed(25) |
2484 for unused_i in range(10): | 2484 for _ in range(10): |
2485 # Build up random list of non-storage-class declaration specs. | 2485 # Build up random list of non-storage-class declaration specs. |
2486 other_decl_specs = [random.choice(qualifiers), random.choice(signs), | 2486 other_decl_specs = [random.choice(qualifiers), random.choice(signs), |
2487 random.choice(types)] | 2487 random.choice(types)] |
2488 # remove None | 2488 # remove None |
2489 other_decl_specs = filter(lambda x: x is not None, other_decl_specs) | 2489 other_decl_specs = filter(lambda x: x is not None, other_decl_specs) |
2490 | 2490 |
2491 # shuffle | 2491 # shuffle |
2492 random.shuffle(other_decl_specs) | 2492 random.shuffle(other_decl_specs) |
2493 | 2493 |
2494 # insert storage class after the first | 2494 # insert storage class after the first |
(...skipping 25 matching lines...) Expand all Loading... |
2520 # There should be a copyright message in the first 10 lines | 2520 # There should be a copyright message in the first 10 lines |
2521 error_collector = ErrorCollector(self.assertTrue) | 2521 error_collector = ErrorCollector(self.assertTrue) |
2522 self.process_file_data(file_path, 'cpp', [], error_collector) | 2522 self.process_file_data(file_path, 'cpp', [], error_collector) |
2523 self.assertEqual( | 2523 self.assertEqual( |
2524 1, | 2524 1, |
2525 error_collector.result_list().count(legal_copyright_message)) | 2525 error_collector.result_list().count(legal_copyright_message)) |
2526 | 2526 |
2527 error_collector = ErrorCollector(self.assertTrue) | 2527 error_collector = ErrorCollector(self.assertTrue) |
2528 self.process_file_data( | 2528 self.process_file_data( |
2529 file_path, 'cpp', | 2529 file_path, 'cpp', |
2530 ['' for unused_i in range(10)] + [copyright_line], | 2530 ['' for _ in range(10)] + [copyright_line], |
2531 error_collector) | 2531 error_collector) |
2532 self.assertEqual( | 2532 self.assertEqual( |
2533 1, | 2533 1, |
2534 error_collector.result_list().count(legal_copyright_message)) | 2534 error_collector.result_list().count(legal_copyright_message)) |
2535 | 2535 |
2536 # Test that warning isn't issued if Copyright line appears early enough. | 2536 # Test that warning isn't issued if Copyright line appears early enough. |
2537 error_collector = ErrorCollector(self.assertTrue) | 2537 error_collector = ErrorCollector(self.assertTrue) |
2538 self.process_file_data(file_path, 'cpp', [copyright_line], error_collect
or) | 2538 self.process_file_data(file_path, 'cpp', [copyright_line], error_collect
or) |
2539 for message in error_collector.result_list(): | 2539 for message in error_collector.result_list(): |
2540 if message.find('legal/copyright') != -1: | 2540 if message.find('legal/copyright') != -1: |
2541 self.fail('Unexpected error: %s' % message) | 2541 self.fail('Unexpected error: %s' % message) |
2542 | 2542 |
2543 error_collector = ErrorCollector(self.assertTrue) | 2543 error_collector = ErrorCollector(self.assertTrue) |
2544 self.process_file_data( | 2544 self.process_file_data( |
2545 file_path, 'cpp', | 2545 file_path, 'cpp', |
2546 ['' for unused_i in range(9)] + [copyright_line], | 2546 ['' for _ in range(9)] + [copyright_line], |
2547 error_collector) | 2547 error_collector) |
2548 for message in error_collector.result_list(): | 2548 for message in error_collector.result_list(): |
2549 if message.find('legal/copyright') != -1: | 2549 if message.find('legal/copyright') != -1: |
2550 self.fail('Unexpected error: %s' % message) | 2550 self.fail('Unexpected error: %s' % message) |
2551 | 2551 |
2552 def test_invalid_increment(self): | 2552 def test_invalid_increment(self): |
2553 self.assert_lint('*count++;', | 2553 self.assert_lint('*count++;', |
2554 'Changing pointer instead of value (or unused value of
' | 2554 'Changing pointer instead of value (or unused value of
' |
2555 'operator*). [runtime/invalid_increment] [5]') | 2555 'operator*). [runtime/invalid_increment] [5]') |
2556 | 2556 |
(...skipping 732 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3289 ('Small and focused functions are preferred: ' | 3289 ('Small and focused functions are preferred: ' |
3290 'TEST_F(GoogleUpdateRecoveryRegistryProtectedTest, ' # 1 space | 3290 'TEST_F(GoogleUpdateRecoveryRegistryProtectedTest, ' # 1 space |
3291 'FixGoogleUpdate_AllValues_MachineApp) has %d non-comment lines ' | 3291 'FixGoogleUpdate_AllValues_MachineApp) has %d non-comment lines ' |
3292 '(error triggered by exceeding %d lines).' | 3292 '(error triggered by exceeding %d lines).' |
3293 ' [readability/fn_size] [%d]') | 3293 ' [readability/fn_size] [%d]') |
3294 % (error_lines, trigger_level, error_level)) | 3294 % (error_lines, trigger_level, error_level)) |
3295 | 3295 |
3296 def test_function_length_check_definition_severity1_for_bad_test_doesnt_brea
k(self): | 3296 def test_function_length_check_definition_severity1_for_bad_test_doesnt_brea
k(self): |
3297 error_level = 1 | 3297 error_level = 1 |
3298 error_lines = self.trigger_test_lines(error_level) + 1 | 3298 error_lines = self.trigger_test_lines(error_level) + 1 |
3299 trigger_level = self.trigger_test_lines(self.min_confidence) | |
3300 # Since the function name isn't valid, the function detection algorithm | 3299 # Since the function name isn't valid, the function detection algorithm |
3301 # will skip it, so no error is produced. | 3300 # will skip it, so no error is produced. |
3302 self.assert_function_lengths_check( | 3301 self.assert_function_lengths_check( |
3303 ('TEST_F(' | 3302 ('TEST_F(' |
3304 + self.function_body(error_lines)), | 3303 + self.function_body(error_lines)), |
3305 '') | 3304 '') |
3306 | 3305 |
3307 def test_function_length_check_definition_severity1_with_embedded_no_lints(s
elf): | 3306 def test_function_length_check_definition_severity1_with_embedded_no_lints(s
elf): |
3308 error_level = 1 | 3307 error_level = 1 |
3309 error_lines = self.trigger_lines(error_level) + 1 | 3308 error_lines = self.trigger_lines(error_level) + 1 |
(...skipping 1981 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5291 def test_ne(self): | 5290 def test_ne(self): |
5292 """Test __ne__ inequality function.""" | 5291 """Test __ne__ inequality function.""" |
5293 checker1 = self._checker() | 5292 checker1 = self._checker() |
5294 checker2 = self._checker() | 5293 checker2 = self._checker() |
5295 | 5294 |
5296 # != calls __ne__. | 5295 # != calls __ne__. |
5297 # By default, __ne__ always returns true on different objects. | 5296 # By default, __ne__ always returns true on different objects. |
5298 # Thus, just check the distinguishing case to verify that the | 5297 # Thus, just check the distinguishing case to verify that the |
5299 # code defines __ne__. | 5298 # code defines __ne__. |
5300 self.assertFalse(checker1 != checker2) | 5299 self.assertFalse(checker1 != checker2) |
OLD | NEW |