# -*- coding: utf-8 -*- import pytest import os from thefuck.rules.fix_file import match, get_new_command from thefuck.types import Command # (script, file, line, col (or None), output) tests = ( ('gcc a.c', 'a.c', 3, 1, """ a.c: In function 'main': a.c:3:1: error: expected expression before '}' token } ^ """), ('clang a.c', 'a.c', 3, 1, """ a.c:3:1: error: expected expression } ^ """), ('perl a.pl', 'a.pl', 3, None, """ syntax error at a.pl line 3, at EOF Execution of a.pl aborted due to compilation errors. """), ('perl a.pl', 'a.pl', 2, None, """ Search pattern not terminated at a.pl line 2. """), ('sh a.sh', 'a.sh', 2, None, """ a.sh: line 2: foo: command not found """), ('zsh a.sh', 'a.sh', 2, None, """ a.sh:2: command not found: foo """), ('bash a.sh', 'a.sh', 2, None, """ a.sh: line 2: foo: command not found """), ('rustc a.rs', 'a.rs', 2, 5, """ a.rs:2:5: 2:6 error: unexpected token: `+` a.rs:2 + ^ """), ('cargo build', 'src/lib.rs', 3, 5, """ Compiling test v0.1.0 (file:///tmp/fix-error/test) src/lib.rs:3:5: 3:6 error: unexpected token: `+` src/lib.rs:3 + ^ Could not compile `test`. To learn more, run the command again with --verbose. """), ('python a.py', 'a.py', 2, None, """ File "a.py", line 2 + ^ SyntaxError: invalid syntax """), ('python a.py', 'a.py', 8, None, """ Traceback (most recent call last): File "a.py", line 8, in match("foo") File "a.py", line 5, in match m = re.search(None, command) File "/usr/lib/python3.4/re.py", line 170, in search return _compile(pattern, flags).search(string) File "/usr/lib/python3.4/re.py", line 293, in _compile raise TypeError("first argument must be string or compiled pattern") TypeError: first argument must be string or compiled pattern """), (u'python café.py', u'café.py', 8, None, u""" Traceback (most recent call last): File "café.py", line 8, in match("foo") File "café.py", line 5, in match m = re.search(None, command) File "/usr/lib/python3.4/re.py", line 170, in search return _compile(pattern, flags).search(string) File "/usr/lib/python3.4/re.py", line 293, in _compile raise TypeError("first argument must be string or compiled pattern") TypeError: first argument must be string or compiled pattern """), ('ruby a.rb', 'a.rb', 3, None, """ a.rb:3: syntax error, unexpected keyword_end """), ('lua a.lua', 'a.lua', 2, None, """ lua: a.lua:2: unexpected symbol near '+' """), ('fish a.sh', '/tmp/fix-error/a.sh', 2, None, """ fish: Unknown command 'foo' /tmp/fix-error/a.sh (line 2): foo ^ """), ('./a', './a', 2, None, """ awk: ./a:2: BEGIN { print "Hello, world!" + } awk: ./a:2: ^ syntax error """), ('llc a.ll', 'a.ll', 1, 2, """ llc: a.ll:1:2: error: expected top-level entity + ^ """), ('go build a.go', 'a.go', 1, 2, """ can't load package: a.go:1:2: expected 'package', found '+' """), ('make', 'Makefile', 2, None, """ bidule make: bidule: Command not found Makefile:2: recipe for target 'target' failed make: *** [target] Error 127 """), ('git st', '/home/martin/.config/git/config', 1, None, """ fatal: bad config file line 1 in /home/martin/.config/git/config """), ('node fuck.js asdf qwer', '/Users/pablo/Workspace/barebones/fuck.js', '2', 5, """ /Users/pablo/Workspace/barebones/fuck.js:2 conole.log(arg); // this should read console.log(arg); ^ ReferenceError: conole is not defined at /Users/pablo/Workspace/barebones/fuck.js:2:5 at Array.forEach (native) at Object. (/Users/pablo/Workspace/barebones/fuck.js:1:85) at Module._compile (module.js:460:26) at Object.Module._extensions..js (module.js:478:10) at Module.load (module.js:355:32) at Function.Module._load (module.js:310:12) at Function.Module.runMain (module.js:501:10) at startup (node.js:129:16) at node.js:814:3 """), ('pep8', './tests/rules/test_systemctl.py', 17, 80, """ ./tests/rules/test_systemctl.py:17:80: E501 line too long (93 > 79 characters) ./tests/rules/test_systemctl.py:18:80: E501 line too long (103 > 79 characters) ./tests/rules/test_whois.py:20:80: E501 line too long (89 > 79 characters) ./tests/rules/test_whois.py:22:80: E501 line too long (83 > 79 characters) """), ('py.test', '/home/thefuck/tests/rules/test_fix_file.py', 218, None, """ monkeypatch = <_pytest.monkeypatch.monkeypatch object at 0x7fdb76a25b38> test = ('fish a.sh', '/tmp/fix-error/a.sh', 2, None, '', "\\nfish: Unknown command 'foo'\\n/tmp/fix-error/a.sh (line 2): foo\\n ^\\n") @pytest.mark.parametrize('test', tests) @pytest.mark.usefixtures('no_memoize') def test_get_new_command(monkeypatch, test): > mocker.patch('os.path.isfile', return_value=True) E NameError: name 'mocker' is not defined /home/thefuck/tests/rules/test_fix_file.py:218: NameError """), ) # noqa @pytest.mark.parametrize('test', tests) @pytest.mark.usefixtures('no_memoize') def test_match(mocker, monkeypatch, test): mocker.patch('os.path.isfile', return_value=True) monkeypatch.setenv('EDITOR', 'dummy_editor') assert match(Command('', test[4])) @pytest.mark.parametrize('test', tests) @pytest.mark.usefixtures('no_memoize') def test_no_editor(mocker, monkeypatch, test): mocker.patch('os.path.isfile', return_value=True) if 'EDITOR' in os.environ: monkeypatch.delenv('EDITOR') assert not match(Command('', test[4])) @pytest.mark.parametrize('test', tests) @pytest.mark.usefixtures('no_memoize') def test_not_file(mocker, monkeypatch, test): mocker.patch('os.path.isfile', return_value=False) monkeypatch.setenv('EDITOR', 'dummy_editor') assert not match(Command('', test[4])) @pytest.mark.parametrize('test', tests) @pytest.mark.usefixtures('no_memoize') def test_get_new_command(mocker, monkeypatch, test): mocker.patch('os.path.isfile', return_value=True) monkeypatch.setenv('EDITOR', 'dummy_editor') @pytest.mark.parametrize('test', tests) @pytest.mark.usefixtures('no_memoize') def test_get_new_command_with_settings(mocker, monkeypatch, test, settings): mocker.patch('os.path.isfile', return_value=True) monkeypatch.setenv('EDITOR', 'dummy_editor') cmd = Command(test[0], test[4]) settings.fixcolcmd = '{editor} {file} +{line}:{col}' if test[3]: assert (get_new_command(cmd) == u'dummy_editor {} +{}:{} && {}'.format(test[1], test[2], test[3], test[0])) else: assert (get_new_command(cmd) == u'dummy_editor {} +{} && {}'.format(test[1], test[2], test[0]))