Completed
Pull Request — master (#1522)
by Abdeali
01:44
created

coalib.tests.bearlib.abstractions.LintTest.setUp()   A

Complexity

Conditions 1

Size

Total Lines 3

Duplication

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