| 1 |  |  | import unittest | 
            
                                                                                                            
                            
            
                                    
            
            
                | 2 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 3 |  |  | from bears.tests.BearTestHelper import generate_skip_decorator | 
            
                                                                                                            
                            
            
                                    
            
            
                | 4 |  |  | from bears.c_languages.IndentBear import IndentBear | 
            
                                                                                                            
                            
            
                                    
            
            
                | 5 |  |  | from coalib.bearlib.abstractions.Lint import Lint | 
            
                                                                                                            
                            
            
                                    
            
            
                | 6 |  |  | from coalib.results.SourceRange import SourceRange | 
            
                                                                                                            
                            
            
                                    
            
            
                | 7 |  |  | from coalib.results.RESULT_SEVERITY import RESULT_SEVERITY | 
            
                                                                                                            
                            
            
                                    
            
            
                | 8 |  |  | from coalib.settings.Section import Section | 
            
                                                                                                            
                            
            
                                    
            
            
                | 9 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 10 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 11 |  |  | class LintTest(unittest.TestCase): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 12 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 13 |  |  |     def setUp(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 14 |  |  |         section = Section("some_name") | 
            
                                                                                                            
                            
            
                                    
            
            
                | 15 |  |  |         self.uut = Lint(section, None) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 16 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 17 |  |  |     def test_invalid_output(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 18 |  |  |         out = list(self.uut.process_output( | 
            
                                                                                                            
                            
            
                                    
            
            
                | 19 |  |  |             ["1.0|0: Info message\n", | 
            
                                                                                                            
                            
            
                                    
            
            
                | 20 |  |  |              "2.2|1: Normal message\n", | 
            
                                                                                                            
                            
            
                                    
            
            
                | 21 |  |  |              "3.4|2: Major message\n"], | 
            
                                                                                                            
                            
            
                                    
            
            
                | 22 |  |  |             "a/file.py", | 
            
                                                                                                            
                            
            
                                    
            
            
                | 23 |  |  |             ['original_file_lines_placeholder'])) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 24 |  |  |         self.assertEqual(len(out), 3) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 25 |  |  |         self.assertEqual(out[0].origin, "Lint") | 
            
                                                                                                            
                            
            
                                    
            
            
                | 26 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 27 |  |  |         self.assertEqual(out[0].affected_code[0], | 
            
                                                                                                            
                            
            
                                    
            
            
                | 28 |  |  |                          SourceRange.from_values("a/file.py", 1, 0)) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 29 |  |  |         self.assertEqual(out[0].severity, RESULT_SEVERITY.INFO) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 30 |  |  |         self.assertEqual(out[0].message, "Info message") | 
            
                                                                                                            
                            
            
                                    
            
            
                | 31 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 32 |  |  |         self.assertEqual(out[1].affected_code[0], | 
            
                                                                                                            
                            
            
                                    
            
            
                | 33 |  |  |                          SourceRange.from_values("a/file.py", 2, 2)) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 34 |  |  |         self.assertEqual(out[1].severity, RESULT_SEVERITY.NORMAL) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 35 |  |  |         self.assertEqual(out[1].message, "Normal message") | 
            
                                                                                                            
                            
            
                                    
            
            
                | 36 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 37 |  |  |         self.assertEqual(out[2].affected_code[0], | 
            
                                                                                                            
                            
            
                                    
            
            
                | 38 |  |  |                          SourceRange.from_values("a/file.py", 3, 4)) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 39 |  |  |         self.assertEqual(out[2].severity, RESULT_SEVERITY.MAJOR) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 40 |  |  |         self.assertEqual(out[2].message, "Major message") | 
            
                                                                                                            
                            
            
                                    
            
            
                | 41 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 42 |  |  |     def test_custom_regex(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 43 |  |  |         self.uut.output_regex = (r'(?P<line>\d+)\.(?P<column>\d+)\|' | 
            
                                                                                                            
                            
            
                                    
            
            
                | 44 |  |  |                                  r'(?P<end_line>\d+)\.(?P<end_column>\d+)\|' | 
            
                                                                                                            
                            
            
                                    
            
            
                | 45 |  |  |                                  r'(?P<severity>\d+): (?P<message>.*)') | 
            
                                                                                                            
                            
            
                                    
            
            
                | 46 |  |  |         self.uut.severity_map = {"I": RESULT_SEVERITY.INFO} | 
            
                                                                                                            
                            
            
                                    
            
            
                | 47 |  |  |         out = list(self.uut.process_output( | 
            
                                                                                                            
                            
            
                                    
            
            
                | 48 |  |  |             ["1.0|2.3|0: Info message\n"], | 
            
                                                                                                            
                            
            
                                    
            
            
                | 49 |  |  |             'a/file.py', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 50 |  |  |             ['original_file_lines_placeholder'])) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 51 |  |  |         self.assertEqual(len(out), 1) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 52 |  |  |         self.assertEqual(out[0].affected_code[0].start.line, 1) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 53 |  |  |         self.assertEqual(out[0].affected_code[0].start.column, 0) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 54 |  |  |         self.assertEqual(out[0].affected_code[0].end.line, 2) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 55 |  |  |         self.assertEqual(out[0].affected_code[0].end.column, 3) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 56 |  |  |         self.assertEqual(out[0].severity, RESULT_SEVERITY.INFO) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 57 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 58 |  |  |     def test_valid_output(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 59 |  |  |         out = list(self.uut.process_output( | 
            
                                                                                                            
                            
            
                                    
            
            
                | 60 |  |  |             ["Random line that shouldn't be captured\n", | 
            
                                                                                                            
                            
            
                                    
            
            
                | 61 |  |  |              "*************\n"], | 
            
                                                                                                            
                            
            
                                    
            
            
                | 62 |  |  |             'a/file.py', | 
            
                                                                                                            
                            
            
                                    
            
            
                | 63 |  |  |             ['original_file_lines_placeholder'])) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 64 |  |  |         self.assertEqual(len(out), 0) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 65 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 66 |  |  |     @generate_skip_decorator(IndentBear) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 67 |  |  |     def test_stdin_input(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 68 |  |  |         self.uut.executable = IndentBear.executable | 
            
                                                                                                            
                            
            
                                    
            
            
                | 69 |  |  |         self.uut.use_stdin = True | 
            
                                                                                                            
                            
            
                                    
            
            
                | 70 |  |  |         self.uut.use_stderr = False | 
            
                                                                                                            
                            
            
                                    
            
            
                | 71 |  |  |         self.uut.process_output = lambda output, filename, file: output | 
            
                                                                                                            
                            
            
                                    
            
            
                | 72 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 73 |  |  |         input_file = ["int main(){return 0;}"] | 
            
                                                                                                            
                            
            
                                    
            
            
                | 74 |  |  |         out = self.uut.lint(file=input_file) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 75 |  |  |         self.assertEqual(out, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 76 |  |  |                          ['int\n', 'main ()\n', '{\n', '  return 0;\n', '}\n']) | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 77 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 78 |  |  |     def test_missing_binary(self): | 
            
                                                        
            
                                    
            
            
                | 79 |  |  |         old_binary = Lint.executable | 
            
                                                        
            
                                    
            
            
                | 80 |  |  |         invalid_binary = "invalid_binary_which_doesnt_exist" | 
            
                                                        
            
                                    
            
            
                | 81 |  |  |         Lint.executable = invalid_binary | 
            
                                                        
            
                                    
            
            
                | 82 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 83 |  |  |         self.assertEqual(Lint.check_prerequisites(), | 
            
                                                        
            
                                    
            
            
                | 84 |  |  |                          "'{}' is not installed.".format(invalid_binary)) | 
            
                                                        
            
                                    
            
            
                | 85 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 86 |  |  |         # "echo" is existent on nearly all platforms. | 
            
                                                        
            
                                    
            
            
                | 87 |  |  |         Lint.executable = "echo" | 
            
                                                        
            
                                    
            
            
                | 88 |  |  |         self.assertTrue(Lint.check_prerequisites()) | 
            
                                                        
            
                                    
            
            
                | 89 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 90 |  |  |         del Lint.executable | 
            
                                                        
            
                                    
            
            
                | 91 |  |  |         self.assertTrue(Lint.check_prerequisites()) | 
            
                                                        
            
                                    
            
            
                | 92 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 93 |  |  |         Lint.executable = old_binary | 
            
                                                        
            
                                    
            
            
                | 94 |  |  |  |