Add test cases for header and fix corner cases

This commit is contained in:
Junegunn Choi 2015-07-22 13:45:38 +09:00
parent f469c25730
commit f71ea5f3ea
3 changed files with 71 additions and 6 deletions

View File

@ -784,6 +784,10 @@ func parseOptions(opts *Options, allArgs []string) {
} }
} }
if opts.HeaderLines < 0 {
errorExit("header lines must be a non-negative integer")
}
// Change default actions for CTRL-N / CTRL-P when --history is used // Change default actions for CTRL-N / CTRL-P when --history is used
if opts.History != nil { if opts.History != nil {
if _, prs := keymap[curses.CtrlP]; !prs { if _, prs := keymap[curses.CtrlP]; !prs {

View File

@ -377,10 +377,18 @@ func (t *Terminal) printHeader() {
if len(t.header) == 0 { if len(t.header) == 0 {
return return
} }
max := C.MaxY()
for idx, lineStr := range t.header { for idx, lineStr := range t.header {
if !t.reverse { if !t.reverse {
idx = len(t.header) - idx - 1 idx = len(t.header) - idx - 1
} }
line := idx + 2
if t.inlineInfo {
line -= 1
}
if line >= max {
break
}
trimmed, colors := extractColor(&lineStr) trimmed, colors := extractColor(&lineStr)
item := &Item{ item := &Item{
text: trimmed, text: trimmed,
@ -388,10 +396,6 @@ func (t *Terminal) printHeader() {
colors: colors, colors: colors,
rank: Rank{0, 0, 0}} rank: Rank{0, 0, 0}}
line := idx + 2
if t.inlineInfo {
line -= 1
}
t.move(line, 2, true) t.move(line, 2, true)
t.printHighlighted(item, false, C.ColHeader, 0, false) t.printHighlighted(item, false, C.ColHeader, 0, false)
} }
@ -993,6 +997,7 @@ func (t *Terminal) constrain() {
t.offset = util.Max(0, count-height) t.offset = util.Max(0, count-height)
t.cy = util.Constrain(t.offset+diffpos, 0, count-1) t.cy = util.Constrain(t.offset+diffpos, 0, count-1)
} }
t.offset = util.Max(0, t.offset)
} }
func (t *Terminal) vmove(o int) { func (t *Terminal) vmove(o int) {
@ -1021,8 +1026,9 @@ func (t *Terminal) vset(o int) bool {
} }
func (t *Terminal) maxItems() int { func (t *Terminal) maxItems() int {
max := C.MaxY() - 2 - len(t.header)
if t.inlineInfo { if t.inlineInfo {
return C.MaxY() - 1 - len(t.header) max += 1
} }
return C.MaxY() - 2 - len(t.header) return util.Max(max, 0)
} }

View File

@ -648,6 +648,61 @@ class TestGoFZF < TestBase
tmux.until { |lines| lines[-10].start_with? '>' } tmux.until { |lines| lines[-10].start_with? '>' }
end end
def test_header_lines
tmux.send_keys "seq 100 | #{fzf '--header-lines=10 -q 5'}", :Enter
2.times do
tmux.until do |lines|
lines[-2].include?('/90') &&
lines[-3] == ' 1' &&
lines[-4] == ' 2' &&
lines[-13] == '> 15'
end
tmux.send_keys :Down
end
tmux.send_keys :Enter
assert_equal '15', readonce.chomp
end
def test_header_lines_reverse
tmux.send_keys "seq 100 | #{fzf '--header-lines=10 -q 5 --reverse'}", :Enter
2.times do
tmux.until do |lines|
lines[1].include?('/90') &&
lines[2] == ' 1' &&
lines[3] == ' 2' &&
lines[12] == '> 15'
end
tmux.send_keys :Up
end
tmux.send_keys :Enter
assert_equal '15', readonce.chomp
end
def test_header_lines_overflow
tmux.send_keys "seq 100 | #{fzf '--header-lines=200'}", :Enter
tmux.until { |lines| lines[-2].include?('0/0') }
tmux.send_keys :Enter
assert_equal '', readonce.chomp
end
def test_header_file
tmux.send_keys "seq 100 | #{fzf "--header-file <(head -5 #{__FILE__})"}", :Enter
header = File.readlines(__FILE__).take(5).map(&:strip)
tmux.until do |lines|
lines[-2].include?('100/100') &&
lines[-7..-3].map(&:strip) == header
end
end
def test_header_file_reverse
tmux.send_keys "seq 100 | #{fzf "--header-file <(head -5 #{__FILE__}) --reverse"}", :Enter
header = File.readlines(__FILE__).take(5).map(&:strip)
tmux.until do |lines|
lines[1].include?('100/100') &&
lines[2..6].map(&:strip) == header
end
end
private private
def writelines path, lines def writelines path, lines
File.unlink path while File.exists? path File.unlink path while File.exists? path