diff --git a/bin/autojump_match.py b/bin/autojump_match.py index 54bf411..c565d97 100644 --- a/bin/autojump_match.py +++ b/bin/autojump_match.py @@ -75,9 +75,10 @@ def match_consecutive(needles, haystack, ignore_case=False): (path='/foo/baz', weight=10), ] """ - regex_no_sep = '[^' + os.sep + ']*' + sep = '\\\\' if os.sep == '\\' else os.sep + regex_no_sep = '[^' + sep + ']*' regex_no_sep_end = regex_no_sep + '$' - regex_one_sep = regex_no_sep + os.sep + regex_no_sep + regex_one_sep = regex_no_sep + sep + regex_no_sep regex_needle = regex_one_sep.join(imap(re.escape, needles)) + regex_no_sep_end regex_flags = re.IGNORECASE | re.UNICODE if ignore_case else re.UNICODE found = lambda entry: re.search( diff --git a/tests/unit/autojump_match_test.py b/tests/unit/autojump_match_test.py index bd02ff5..7dbb727 100644 --- a/tests/unit/autojump_match_test.py +++ b/tests/unit/autojump_match_test.py @@ -2,6 +2,7 @@ # -*- coding: utf-8 -*- import os import sys +import platform import pytest @@ -10,6 +11,7 @@ from autojump_data import Entry from autojump_match import match_anywhere from autojump_match import match_consecutive +is_windows = platform.system() == 'Windows' class TestMatchAnywhere(object): @@ -19,8 +21,8 @@ class TestMatchAnywhere(object): entry4 = Entry('/中/zhong/国/guo', 10) entry5 = Entry('/is\'t/this/a/b*tchin/edge/case?', 10) win_entry1 = Entry('C:\\foo\\bar\\baz', 10) - win_entry2 = Entry('D:\Program Files (x86)\GIMP', 10) - win_entry3 = Entry('C:\Windows\System32', 10) + win_entry2 = Entry(r'D:\Program Files (x86)\GIMP', 10) + win_entry3 = Entry(r'C:\Windows\System32', 10) @pytest.fixture def haystack(self): @@ -75,9 +77,10 @@ class TestMatchConsecutive(object): entry4 = Entry('/中/zhong/国/guo', 10) entry5 = Entry('/日/本', 10) entry6 = Entry('/is\'t/this/a/b*tchin/edge/case?', 10) - win_entry1 = Entry('C:\Foo\Bar\Baz', 10) - win_entry2 = Entry('D:\Program Files (x86)\GIMP', 10) - win_entry3 = Entry('C:\Windows\System32', 10) + win_entry1 = Entry(r'C:\Foo\Bar\Baz', 10) + win_entry2 = Entry(r'D:\Program Files (x86)\GIMP', 10) + win_entry3 = Entry(r'C:\Windows\System32', 10) + win_entry4 = Entry('C:\\is\'t\\this\\a\\b*tchin\\edge\\case?', 10) @pytest.fixture def haystack(self): @@ -91,18 +94,21 @@ class TestMatchConsecutive(object): @pytest.fixture def windows_haystack(self): - return [self.win_entry1, self.win_entry2, self.win_entry3] + return [self.win_entry1, self.win_entry2, self.win_entry3, self.win_entry4] + @pytest.mark.skipif(is_windows, reason='Different reference data for path.') def test_single_needle(self, haystack): assert list(match_consecutive(['baz'], haystack)) == [self.entry1, self.entry3] assert list(match_consecutive(['本'], haystack)) == [self.entry5] + @pytest.mark.skipif(is_windows, reason='Different reference data for path.') def test_consecutive(self, haystack): assert list(match_consecutive(['bar', 'baz'], haystack)) == [self.entry1] assert list(match_consecutive(['foo', 'bar'], haystack)) == [self.entry2] assert list(match_consecutive(['国', 'guo'], haystack)) == [self.entry4] assert list(match_consecutive(['bar', 'foo'], haystack)) == [] + @pytest.mark.skipif(is_windows, reason='Different reference data for path.') def test_ignore_case(self, haystack): assert list(match_consecutive(['FoO', 'bAR'], haystack, ignore_case=True)) \ == [self.entry2] @@ -110,22 +116,29 @@ class TestMatchConsecutive(object): def test_windows_ignore_case(self, windows_haystack): assert list(match_consecutive(['gimp'], windows_haystack, True)) == [self.win_entry2] - @pytest.mark.xfail(reason='https://github.com/wting/autojump/issues/418') + @pytest.mark.skipif(not is_windows, reason='Different path seperator') def test_backslashes_for_windows_paths(self, windows_haystack): + # https://github.com/wting/autojump/issues/418 assert list(match_consecutive(['program', 'gimp'], windows_haystack, True)) \ == [self.win_entry2] - @pytest.mark.xfail(reason='https://github.com/wting/autojump/issues/418') + @pytest.mark.skipif(not is_windows, reason='Different path seperator') def test_foo_bar_baz(self, windows_haystack): + # https://github.com/wting/autojump/issues/418 assert list(match_consecutive(['bar', 'baz'], windows_haystack, ignore_case=True)) \ == [self.win_entry1] - @pytest.mark.xfail(reason='https://github.com/wting/autojump/issues/402') + @pytest.mark.skipif(not is_windows, reason='Different path seperator') def test_thing(self, windows_haystack): assert list(match_consecutive(['win', '32'], windows_haystack, True)) \ == [self.win_entry3] - @pytest.mark.xfail(reason='https://github.com/wting/autojump/issues/402') + @pytest.mark.skipif(is_windows, reason='Different reference data for path.') def test_wildcard_in_needle(self, haystack): assert list(match_consecutive(['*', 'this'], haystack)) == [] assert list(match_consecutive(['*', 'edge', 'case'], haystack)) == [self.entry6] + + @pytest.mark.skipif(not is_windows, reason='Different path seperator') + def test_wildcard_in_needle(self, windows_haystack): + assert list(match_consecutive(['*', 'this'], windows_haystack)) == [] + assert list(match_consecutive(['*', 'edge', 'case'], windows_haystack)) == [self.win_entry4] diff --git a/tests/unit/autojump_utils_test.py b/tests/unit/autojump_utils_test.py index 07f67b3..9da9828 100644 --- a/tests/unit/autojump_utils_test.py +++ b/tests/unit/autojump_utils_test.py @@ -2,6 +2,7 @@ # -*- coding: utf-8 -*- import os import sys +import platform import mock import pytest @@ -21,6 +22,7 @@ from autojump_utils import surround_quotes from autojump_utils import take from autojump_utils import unico +is_windows = platform.system() == 'Windows' if is_python3(): os.getcwdu = os.getcwd @@ -80,11 +82,15 @@ def test_surround_quotes_in_bash(_): def test_dont_surround_quotes_not_in_bash(_): assert surround_quotes('foo') == 'foo' - +@pytest.mark.skipif(is_windows, reason='Different reference data for path.') def test_sanitize(): assert sanitize([]) == [] assert sanitize([r'/foo/bar/', r'/']) == [u('/foo/bar'), u('/')] +@pytest.mark.skipif(not is_windows, reason='Different reference data for path.') +def test_sanitize_on_windows(): + assert sanitize([]) == [] + assert sanitize(['C:\\foo\\bar\\', 'C:\\']) == [u('C:\\foo\\bar'), u('C:')] @pytest.mark.skipif(is_python3(), reason='Unicode sucks.') def test_unico():