diff options
Diffstat (limited to 'plugins/externaltools/tests/testlinkparsing.py')
-rw-r--r-- | plugins/externaltools/tests/testlinkparsing.py | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/plugins/externaltools/tests/testlinkparsing.py b/plugins/externaltools/tests/testlinkparsing.py new file mode 100644 index 0000000..3b8a78e --- /dev/null +++ b/plugins/externaltools/tests/testlinkparsing.py @@ -0,0 +1,203 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2009-2010 Per Arneng <per.arneng@anyplanet.com> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +import unittest +from linkparsing import LinkParser + + +class TestLinkParser(unittest.TestCase): + + def setUp(self): + self.p = LinkParser() + + def assert_link_count(self, links, expected_count): + self.assertEqual(len(links), expected_count, 'incorrect nr of links') + + def assert_link(self, actual, path, line_nr, col_nr=0): + self.assertEqual(actual.path, path, "incorrect path") + self.assertEqual(actual.line_nr, line_nr, "incorrect line nr") + self.assertEqual(actual.col_nr, col_nr, "incorrect col nr") + + def assert_link_text(self, text, link, link_text): + self.assertEqual(text[link.start:link.end], link_text, + "the expected link text does not match the text within the string") + + def test_parse_gcc_simple_test_with_real_output(self): + gcc_output = """ +test.c: In function 'f': +test.c:5:6: warning: passing argument 1 of 'f' makes integer from pointer without a cast +test.c:3:7: note: expected 'int' but argument is of type 'char *' +test.c: In function 'main': +test.c:11:10: warning: initialization makes pointer from integer without a cast +test.c:12:11: warning: initialization makes integer from pointer without a cast +test.c:13:12: error: too few arguments to function 'f' +test.c:14:13: error: expected ';' before 'return' +""" + links = self.p.parse(gcc_output) + self.assert_link_count(links, 6) + lnk = links[2] + self.assert_link(lnk, "test.c", 11, 10) + self.assert_link_text(gcc_output, lnk, "test.c:11:10") + + def test_parse_gcc_one_line(self): + line = "/tmp/myfile.c:1212:12: error: ..." + links = self.p.parse(line) + self.assert_link_count(links, 1) + lnk = links[0] + self.assert_link(lnk, "/tmp/myfile.c", 1212, 12) + self.assert_link_text(line, lnk, "/tmp/myfile.c:1212:12") + + def test_parse_gcc_empty_string(self): + links = self.p.parse("") + self.assert_link_count(links, 0) + + def test_parse_gcc_no_files_in_text(self): + links = self.p.parse("no file links in this string") + self.assert_link_count(links, 0) + + def test_parse_gcc_none_as_argument(self): + self.assertRaises(ValueError, self.p.parse, None) + + def test_parse_grep_one_line(self): + line = "libnautilus-private/nautilus-canvas-container.h:45:#define NAUTILUS_CANVAS_ICON_DATA(pointer)" + links = self.p.parse(line) + self.assert_link_count(links, 1) + lnk = links[0] + self.assert_link(lnk, "libnautilus-private/nautilus-canvas-container.h", 45) + self.assert_link_text(line, lnk, "libnautilus-private/nautilus-canvas-container.h:45") + + def test_parse_python_simple_test_with_real_output(self): + output = """ +Traceback (most recent call last): + File "test.py", line 10, in <module> + err() + File "test.py", line 7, in err + real_err() + File "test.py", line 4, in real_err + int('xxx') +ValueError: invalid literal for int() with base 10: 'xxx' +""" + links = self.p.parse(output) + self.assert_link_count(links, 3) + lnk = links[2] + self.assert_link(lnk, "test.py", 4) + self.assert_link_text(output, lnk, '"test.py", line 4') + + def test_parse_python_one_line(self): + line = " File \"test.py\", line 1\n def a()" + links = self.p.parse(line) + self.assert_link_count(links, 1) + lnk = links[0] + self.assert_link(lnk, "test.py", 1) + self.assert_link_text(line, lnk, '"test.py", line 1') + + def test_parse_bash_one_line(self): + line = "test.sh: line 5: gerp: command not found" + links = self.p.parse(line) + self.assert_link_count(links, 1) + lnk = links[0] + self.assert_link(lnk, "test.sh", 5) + self.assert_link_text(line, lnk, 'test.sh: line 5') + + def test_parse_javac_one_line(self): + line = "/tmp/Test.java:10: incompatible types" + links = self.p.parse(line) + self.assert_link_count(links, 1) + lnk = links[0] + self.assert_link(lnk, "/tmp/Test.java", 10) + self.assert_link_text(line, lnk, '/tmp/Test.java:10') + + def test_parse_valac_simple_test_with_real_output(self): + output = """ +Test.vala:14.13-14.21: error: Assignment: Cannot convert from `string' to `int' + int a = "xxx"; + ^^^^^^^^^ +""" + links = self.p.parse(output) + self.assert_link_count(links, 1) + lnk = links[0] + self.assert_link(lnk, "Test.vala", 14) + self.assert_link_text(output, lnk, 'Test.vala:14.13-14.21') + + def test_parse_ruby_simple_test_with_real_output(self): + output = """ +test.rb:5: undefined method `fake_method' for main:Object (NoMethodError) + from test.rb:3:in `each' + from test.rb:3 +""" + links = self.p.parse(output) + self.assert_link_count(links, 3) + lnk = links[0] + self.assert_link(lnk, "test.rb", 5) + self.assert_link_text(output, lnk, 'test.rb:5') + lnk = links[1] + self.assert_link(lnk, "test.rb", 3) + self.assert_link_text(output, lnk, 'test.rb:3') + + def test_parse_scalac_one_line(self): + line = "Test.scala:7: error: not found: value fakeMethod" + links = self.p.parse(line) + self.assert_link_count(links, 1) + lnk = links[0] + self.assert_link(lnk, "Test.scala", 7) + self.assert_link_text(line, lnk, 'Test.scala:7') + + def test_parse_sbt_one_line(self): + line = "[error] /home/hank/foo/Test.scala:7: not found: value fakeMethod" + links = self.p.parse(line) + self.assert_link_count(links, 1) + lnk = links[0] + self.assert_link(lnk, "/home/hank/foo/Test.scala", 7) + self.assert_link_text(line, lnk, '/home/hank/foo/Test.scala:7') + + def test_parse_go_6g_one_line(self): + line = "test.go:9: undefined: FakeMethod" + links = self.p.parse(line) + self.assert_link_count(links, 1) + lnk = links[0] + self.assert_link(lnk, "test.go", 9) + self.assert_link_text(line, lnk, 'test.go:9') + + def test_parse_perl_one_line(self): + line = 'syntax error at test.pl line 889, near "$fake_var' + links = self.p.parse(line) + self.assert_link_count(links, 1) + lnk = links[0] + self.assert_link(lnk, "test.pl", 889) + self.assert_link_text(line, lnk, 'test.pl line 889') + + def test_parse_mcs_one_line(self): + line = 'Test.cs(12,7): error CS0103: The name `fakeMethod' + links = self.p.parse(line) + self.assert_link_count(links, 1) + lnk = links[0] + self.assert_link(lnk, "Test.cs", 12) + self.assert_link_text(line, lnk, 'Test.cs(12,7)') + + def test_parse_pas_one_line(self): + line = 'hello.pas(11,1) Fatal: Syntax error, ":" expected but "BEGIN"' + links = self.p.parse(line) + self.assert_link_count(links, 1) + lnk = links[0] + self.assert_link(lnk, "hello.pas", 11) + self.assert_link_text(line, lnk, 'hello.pas(11,1)') + +if __name__ == '__main__': + unittest.main() + +# ex:ts=4:et: |