From 31278bcc6895089c97fc5d038cd1dd99053c3764 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Tue, 10 Nov 2015 01:50:41 +0900 Subject: [PATCH] Fix compatibility issues with OR operator and inverse terms --- src/item.go | 3 +++ src/item_test.go | 9 +++++---- src/pattern.go | 13 ++++++++----- test/test_go.rb | 6 ++++++ 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/item.go b/src/item.go index f2f105a..5ce25c7 100644 --- a/src/item.go +++ b/src/item.go @@ -63,6 +63,9 @@ func (item *Item) Rank(cache bool) Rank { matchlen += end - begin } } + if matchlen == 0 { + matchlen = math.MaxUint16 + } var tiebreak uint16 switch rankTiebreak { case byLength: diff --git a/src/item_test.go b/src/item_test.go index 5b9232a..50d6851 100644 --- a/src/item_test.go +++ b/src/item_test.go @@ -1,6 +1,7 @@ package fzf import ( + "math" "sort" "testing" @@ -42,7 +43,7 @@ func TestItemRank(t *testing.T) { strs := [][]rune{[]rune("foo"), []rune("foobar"), []rune("bar"), []rune("baz")} item1 := Item{text: strs[0], index: 1, offsets: []Offset{}} rank1 := item1.Rank(true) - if rank1.matchlen != 0 || rank1.tiebreak != 3 || rank1.index != 1 { + if rank1.matchlen != math.MaxUint16 || rank1.tiebreak != 3 || rank1.index != 1 { t.Error(item1.Rank(true)) } // Only differ in index @@ -68,9 +69,9 @@ func TestItemRank(t *testing.T) { item6 := Item{text: strs[2], rank: Rank{0, 0, 2}, offsets: []Offset{Offset{1, 2}, Offset{6, 7}}} items = []*Item{&item1, &item2, &item3, &item4, &item5, &item6} sort.Sort(ByRelevance(items)) - if items[0] != &item2 || items[1] != &item1 || - items[2] != &item6 || items[3] != &item4 || - items[4] != &item5 || items[5] != &item3 { + if items[0] != &item6 || items[1] != &item4 || + items[2] != &item5 || items[3] != &item3 || + items[4] != &item2 || items[5] != &item1 { t.Error(items) } } diff --git a/src/pattern.go b/src/pattern.go index 795fbb5..2abcf43 100644 --- a/src/pattern.go +++ b/src/pattern.go @@ -323,21 +323,24 @@ func (p *Pattern) basicMatch(item *Item) (int, int, int) { func (p *Pattern) extendedMatch(item *Item) []Offset { input := p.prepareInput(item) offsets := []Offset{} -Loop: for _, termSet := range p.termSets { + var offset *Offset for _, term := range termSet { pfun := p.procFun[term.typ] if sidx, eidx, tlen := p.iter(pfun, input, term.caseSensitive, p.forward, term.text); sidx >= 0 { if term.inv { - break Loop + continue } - offsets = append(offsets, Offset{int32(sidx), int32(eidx), int32(tlen)}) + offset = &Offset{int32(sidx), int32(eidx), int32(tlen)} break } else if term.inv { - offsets = append(offsets, Offset{0, 0, 0}) - break + offset = &Offset{0, 0, 0} + continue } } + if offset != nil { + offsets = append(offsets, *offset) + } } return offsets } diff --git a/test/test_go.rb b/test/test_go.rb index e3b5274..e33f047 100644 --- a/test/test_go.rb +++ b/test/test_go.rb @@ -933,6 +933,12 @@ class TestGoFZF < TestBase assert_equal 4, `seq 123 | #{FZF} -f 13 +e`.lines.length end + def test_or_operator + assert_equal %w[1 5 10], `seq 10 | #{FZF} -f "1 | 5"`.lines.map(&:chomp) + assert_equal %w[1 10 2 3 4 5 6 7 8 9], + `seq 10 | #{FZF} -f '1 | !1'`.lines.map(&:chomp) + end + private def writelines path, lines File.unlink path while File.exists? path