summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2015-11-10 01:50:41 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2015-11-10 01:54:37 +0900
commit31278bcc6895089c97fc5d038cd1dd99053c3764 (patch)
tree5087edff8c881fa1b0c320b84d5952b7cc98d010
parente7e86b68f4e6a27cc071cf48530ad6ae2c0c37bb (diff)
Fix compatibility issues with OR operator and inverse terms
-rw-r--r--src/item.go3
-rw-r--r--src/item_test.go9
-rw-r--r--src/pattern.go13
-rw-r--r--test/test_go.rb6
4 files changed, 22 insertions, 9 deletions
diff --git a/src/item.go b/src/item.go
index f2f105ac..5ce25c71 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 5b9232a5..50d6851e 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 795fbb52..2abcf439 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 e3b52747..e33f0476 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