File: key_event_spec.rb

package info (click to toggle)
ruby-tty-reader 0.9.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 804 kB
  • sloc: ruby: 1,759; sh: 4; makefile: 4
file content (102 lines) | stat: -rw-r--r-- 2,853 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# frozen_string_literal: true

require "shellwords"

RSpec.describe TTY::Reader::KeyEvent, "#from" do
  let(:keys) { TTY::Reader::Keys.keys }

  it "parses backspace" do
    event = described_class.from(keys, "\x7f")
    expect(event.key.name).to eq(:backspace)
    expect(event.value).to eq("\x7f")
  end

  it "parses lowercase char" do
    event = described_class.from(keys, "a")
    expect(event.key.name).to eq(:alpha)
    expect(event.value).to eq("a")
  end

  it "parses uppercase char" do
    event = described_class.from(keys, "A")
    expect(event.key.name).to eq(:alpha)
    expect(event.value).to eq("A")
  end

  it "parses number char" do
    event = described_class.from(keys, "666")
    expect(event.key.name).to eq(:num)
    expect(event.value).to eq("666")
  end

  it "parses ctrl-a to ctrl-z inputs" do
    (1..26).zip("a".."z").each do |code, char|
      event = described_class.from(TTY::Reader::Keys.ctrl_keys, code.chr)
      expect(event.key.name).to eq(:"ctrl_#{char}")
      expect(event.value).to eq(code.chr)
    end
  end

  it "parses uknown key" do
    no_keys = {}
    event = described_class.from(no_keys, "*")
    expect(event.key.name).to eq(:ignore)
    expect(event.value).to eq("*")
  end

  it "exposes line value" do
    event = described_class.from(keys, "c", "ab")
    expect(event.line).to eq("ab")
  end

  # F1-F12 keys
  {
    f1:  ["\eOP","\e[[A","\e[11~"],
    f2:  ["\eOQ","\e[[B","\e[12~"],
    f3:  ["\eOR","\e[[C","\e[13~"],
    f4:  ["\eOS","\e[[D","\e[14~"],
    f5:  [       "\e[[E","\e[15~"],
    f6:  [               "\e[17~"],
    f7:  [               "\e[18~"],
    f8:  [               "\e[19~"],
    f9:  [               "\e[20~"],
    f10: [               "\e[21~"],
    f11: [               "\e[23~"],
    f12: [               "\e[24~"]
  }.each do |name, codes|
    codes.each do |code|
      it "parses #{Shellwords.escape(code)} as #{name} key" do
        event = described_class.from(keys, code)
        expect(event.key.name).to eq(name)
        expect(event.key.meta).to eq(false)
        expect(event.key.ctrl).to eq(false)
        expect(event.key.shift).to eq(false)
      end
    end
  end

  # arrow keys & text editing
  {
    up:     ["\e[A"],
    down:   ["\e[B"],
    right:  ["\e[C"],
    left:   ["\e[D"],
    clear:  ["\e[E"],
    home:   ["\e[1~", "\e[7~", "\e[H"],
    end:    ["\e[4~", "\eOF", "\e[F"],
    insert: ["\e[2~"],
    delete: ["\e[3~"],
    page_up:   ["\e[5~"],
    page_down: ["\e[6~"]
  }.each do |name, codes|
    codes.each do |code|
      it "parses #{Shellwords.escape(code)} as #{name} key" do
        event = described_class.from(keys, code)
        expect(event.key.name).to eq(name)
        expect(event.key.meta).to eq(false)
        expect(event.key.ctrl).to eq(false)
        expect(event.key.shift).to eq(false)
      end
    end
  end
end