spec/unit/reader/key_event_spec.rb in tty-prompt-0.7.1 vs spec/unit/reader/key_event_spec.rb in tty-prompt-0.8.0
- old
+ new
@@ -1,15 +1,23 @@
# encoding: utf-8
-RSpec.describe TTY::Prompt::Reader::KeyEvent, '::from' do
+require 'shellwords'
+RSpec.describe TTY::Prompt::Reader::KeyEvent, '#from' do
it "parses ctrl+h" do
event = described_class.from("\b")
expect(event.key.name).to eq(:backspace)
expect(event.value).to eq("\b")
end
+ it "parses backspace" do
+ event = described_class.from("\e\x7f")
+ expect(event.key.name).to eq(:backspace)
+ expect(event.key.meta).to eq(true)
+ expect(event.value).to eq("\e\x7f")
+ end
+
it "parses lowercase char" do
event = described_class.from('a')
expect(event.key.name).to eq('a')
expect(event.value).to eq('a')
end
@@ -18,50 +26,71 @@
event = described_class.from('A')
expect(event.key.name).to eq('a')
expect(event.value).to eq('A')
end
- it "parses f5 key" do
- event = described_class.from("\e[15~")
- expect(event.key.name).to eq(:f5)
+ # F1-F12 keys
+ {
+ f1: ["\eOP", "\e[11~", "\e[[A"],
+ f2: ["\eOQ", "\e[12~", "\e[[B"],
+ f3: ["\eOR", "\e[13~", "\e[[C"],
+ f4: ["\eOS", "\e[14~", "\e[[D"],
+ f5: [ "\e[15~", "\e[[E"],
+ 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(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
- it "parses up key" do
- event = described_class.from("\e[A")
- expect(event.key.name).to eq(:up)
+ # arrow keys & page navigation
+ #
+ {
+ up: ["\e[A", "\eOA"],
+ down: ["\e[B", "\eOB"],
+ right: ["\e[C", "\eOC"],
+ left: ["\e[D", "\eOD"],
+ clear: ["\e[E", "\eOE"],
+ end: ["\e[F"],
+ home: ["\e[H"]
+ }.each do |name, codes|
+ codes.each do |code|
+ it "parses #{Shellwords.escape(code)} as #{name} key" do
+ event = described_class.from(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
- it "parses up key on gnome" do
- event = described_class.from("\eOA")
- expect(event.key.name).to eq(:up)
- end
-
- it "parses down key" do
- event = described_class.from("\e[B")
- expect(event.key.name).to eq(:down)
- end
-
- it "parses right key" do
- event = described_class.from("\e[C")
- expect(event.key.name).to eq(:right)
- end
-
- it "parses left key" do
- event = described_class.from("\e[D")
- expect(event.key.name).to eq(:left)
- end
-
- it "parses clear key" do
- event = described_class.from("\e[E")
- expect(event.key.name).to eq(:clear)
- end
-
- it "parses end key" do
- event = described_class.from("\e[F")
- expect(event.key.name).to eq(:end)
- end
-
- it "parses home key" do
- event = described_class.from("\e[H")
- expect(event.key.name).to eq(:home)
+ {
+ up: ["\e[a"],
+ down: ["\e[b"],
+ right: ["\e[c"],
+ left: ["\e[d"],
+ clear: ["\e[e"],
+ }.each do |name, codes|
+ codes.each do |code|
+ it "parses #{Shellwords.escape(code)} as SHIFT + #{name} key" do
+ event = described_class.from(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(true)
+ end
+ end
end
end