tty-prompt 0.12.0 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -3
  3. data/CHANGELOG.md +12 -0
  4. data/README.md +3 -3
  5. data/appveyor.yml +2 -0
  6. data/lib/tty/prompt/keypress.rb +7 -4
  7. data/lib/tty/prompt/reader.rb +1 -1
  8. data/lib/tty/prompt/reader/win_api.rb +14 -0
  9. data/lib/tty/prompt/reader/win_console.rb +9 -2
  10. data/lib/tty/prompt/timeout.rb +44 -23
  11. data/lib/tty/prompt/version.rb +1 -1
  12. data/tty-prompt.gemspec +6 -3
  13. metadata +21 -131
  14. data/spec/spec_helper.rb +0 -45
  15. data/spec/unit/ask_spec.rb +0 -132
  16. data/spec/unit/choice/eql_spec.rb +0 -22
  17. data/spec/unit/choice/from_spec.rb +0 -29
  18. data/spec/unit/choices/add_spec.rb +0 -12
  19. data/spec/unit/choices/each_spec.rb +0 -13
  20. data/spec/unit/choices/find_by_spec.rb +0 -10
  21. data/spec/unit/choices/new_spec.rb +0 -10
  22. data/spec/unit/choices/pluck_spec.rb +0 -9
  23. data/spec/unit/collect_spec.rb +0 -33
  24. data/spec/unit/converters/convert_bool_spec.rb +0 -58
  25. data/spec/unit/converters/convert_char_spec.rb +0 -11
  26. data/spec/unit/converters/convert_custom_spec.rb +0 -14
  27. data/spec/unit/converters/convert_date_spec.rb +0 -34
  28. data/spec/unit/converters/convert_file_spec.rb +0 -17
  29. data/spec/unit/converters/convert_number_spec.rb +0 -39
  30. data/spec/unit/converters/convert_path_spec.rb +0 -18
  31. data/spec/unit/converters/convert_range_spec.rb +0 -22
  32. data/spec/unit/converters/convert_regex_spec.rb +0 -12
  33. data/spec/unit/converters/convert_string_spec.rb +0 -21
  34. data/spec/unit/converters/on_error_spec.rb +0 -9
  35. data/spec/unit/distance/distance_spec.rb +0 -73
  36. data/spec/unit/enum_paginator_spec.rb +0 -65
  37. data/spec/unit/enum_select_spec.rb +0 -310
  38. data/spec/unit/error_spec.rb +0 -20
  39. data/spec/unit/evaluator_spec.rb +0 -67
  40. data/spec/unit/expand_spec.rb +0 -198
  41. data/spec/unit/keypress_spec.rb +0 -58
  42. data/spec/unit/mask_spec.rb +0 -132
  43. data/spec/unit/multi_select_spec.rb +0 -319
  44. data/spec/unit/multiline_spec.rb +0 -77
  45. data/spec/unit/new_spec.rb +0 -20
  46. data/spec/unit/ok_spec.rb +0 -10
  47. data/spec/unit/paginator_spec.rb +0 -63
  48. data/spec/unit/question/checks_spec.rb +0 -97
  49. data/spec/unit/question/default_spec.rb +0 -31
  50. data/spec/unit/question/echo_spec.rb +0 -38
  51. data/spec/unit/question/in_spec.rb +0 -115
  52. data/spec/unit/question/initialize_spec.rb +0 -12
  53. data/spec/unit/question/modifier/apply_to_spec.rb +0 -24
  54. data/spec/unit/question/modifier/letter_case_spec.rb +0 -41
  55. data/spec/unit/question/modifier/whitespace_spec.rb +0 -51
  56. data/spec/unit/question/modify_spec.rb +0 -41
  57. data/spec/unit/question/required_spec.rb +0 -92
  58. data/spec/unit/question/validate_spec.rb +0 -115
  59. data/spec/unit/question/validation/call_spec.rb +0 -31
  60. data/spec/unit/question/validation/coerce_spec.rb +0 -30
  61. data/spec/unit/reader/history_spec.rb +0 -172
  62. data/spec/unit/reader/key_event_spec.rb +0 -86
  63. data/spec/unit/reader/line_spec.rb +0 -110
  64. data/spec/unit/reader/publish_keypress_event_spec.rb +0 -94
  65. data/spec/unit/reader/read_keypress_spec.rb +0 -80
  66. data/spec/unit/reader/read_line_spec.rb +0 -68
  67. data/spec/unit/reader/read_multiline_spec.rb +0 -60
  68. data/spec/unit/result_spec.rb +0 -40
  69. data/spec/unit/say_spec.rb +0 -67
  70. data/spec/unit/select_spec.rb +0 -359
  71. data/spec/unit/slider_spec.rb +0 -96
  72. data/spec/unit/statement/initialize_spec.rb +0 -15
  73. data/spec/unit/suggest_spec.rb +0 -28
  74. data/spec/unit/warn_spec.rb +0 -21
  75. data/spec/unit/yes_no_spec.rb +0 -235
@@ -1,17 +0,0 @@
1
- # encoding: utf-8
2
-
3
- RSpec.describe TTY::Prompt::Question, 'convert file' do
4
- it "converts to file" do
5
- file = double(:file)
6
- prompt = TTY::TestPrompt.new
7
- prompt.input << "test.txt"
8
- prompt.input.rewind
9
-
10
- allow(::File).to receive(:open).with(/test\.txt/).and_return(file)
11
- expect(::File).to receive(:open).with(/test\.txt/)
12
-
13
- answer = prompt.ask("Which file to open?", convert: :file)
14
-
15
- expect(answer).to eq(file)
16
- end
17
- end
@@ -1,39 +0,0 @@
1
- # encoding: utf-8
2
-
3
- RSpec.describe TTY::Prompt::Question, 'convert numbers' do
4
-
5
- subject(:prompt) { TTY::TestPrompt.new }
6
-
7
- it 'fails to convert integer' do
8
- prompt.input << 'invalid'
9
- prompt.input.rewind
10
- expect {
11
- prompt.ask("What temparture?", convert: :int)
12
- }.to raise_error(TTY::Prompt::ConversionError)
13
- end
14
-
15
- it 'converts integer' do
16
- prompt.input << 35
17
- prompt.input.rewind
18
- answer = prompt.ask("What temperature?", convert: :int)
19
- expect(answer).to be_a(Integer)
20
- expect(answer).to eq(35)
21
- end
22
-
23
- it 'fails to convert float' do
24
- prompt.input << 'invalid'
25
- prompt.input.rewind
26
- expect {
27
- prompt.ask("How tall are you?", convert: :float)
28
- }.to raise_error(TTY::Prompt::ConversionError)
29
- end
30
-
31
- it 'converts float' do
32
- number = 6.666
33
- prompt.input << number
34
- prompt.input.rewind
35
- answer = prompt.ask('How tall are you?', convert: :float)
36
- expect(answer).to be_a(Float)
37
- expect(answer).to eq(number)
38
- end
39
- end
@@ -1,18 +0,0 @@
1
- # encoding: utf-8
2
-
3
- RSpec.describe TTY::Prompt::Question, 'convert path' do
4
- subject(:prompt) { TTY::TestPrompt.new }
5
-
6
- it "converts pathname" do
7
- path = double(:path)
8
- prompt.input << "/path/to/file"
9
- prompt.input.rewind
10
-
11
- allow(Pathname).to receive(:new).and_return(path)
12
- expect(Pathname).to receive(:new).with(/path\/to\/file/)
13
-
14
- answer = prompt.ask('File location?', convert: :path)
15
-
16
- expect(answer).to eql(path)
17
- end
18
- end
@@ -1,22 +0,0 @@
1
- # encoding: utf-8
2
-
3
- RSpec.describe TTY::Prompt::Question, 'convert range' do
4
-
5
- subject(:prompt) { TTY::TestPrompt.new}
6
-
7
- it 'converts with valid range' do
8
- prompt.input << "20-30"
9
- prompt.input.rewind
10
- answer = prompt.ask("Which age group?", convert: :range)
11
- expect(answer).to be_a(Range)
12
- expect(answer).to eq(20..30)
13
- end
14
-
15
- it "fails to convert to range" do
16
- prompt.input << "abcd"
17
- prompt.input.rewind
18
- expect {
19
- prompt.ask('Which age group?', convert: :range)
20
- }.to raise_error(TTY::Prompt::ConversionError)
21
- end
22
- end
@@ -1,12 +0,0 @@
1
- # encoding: utf-8
2
-
3
- RSpec.describe TTY::Prompt::Question, 'convert regexp' do
4
- it "converts regex" do
5
- prompt = TTY::TestPrompt.new
6
- prompt.input << "[a-z]*"
7
- prompt.input.rewind
8
- answer = prompt.ask("Regex?", convert: :regexp)
9
- expect(answer).to be_a(Regexp)
10
- expect(answer).to eq(/[a-z]*/)
11
- end
12
- end
@@ -1,21 +0,0 @@
1
- # encoding: utf-8
2
-
3
- RSpec.describe TTY::Prompt::Question, 'convert string' do
4
- it 'converts string' do
5
- prompt = TTY::TestPrompt.new
6
- prompt.input << 'Piotr'
7
- prompt.input.rewind
8
- answer = prompt.ask("What is your name?", convert: :string)
9
- expect(answer).to be_a(String)
10
- expect(answer).to eq('Piotr')
11
- end
12
-
13
- it "converts symbol" do
14
- prompt = TTY::TestPrompt.new
15
- prompt.input << 'Piotr'
16
- prompt.input.rewind
17
- answer = prompt.ask("What is your name?", convert: :symbol)
18
- expect(answer).to be_a(Symbol)
19
- expect(answer).to eq(:Piotr)
20
- end
21
- end
@@ -1,9 +0,0 @@
1
- # encoding: utf-8
2
-
3
- RSpec.describe TTY::Prompt::Converters do
4
- it "enforces block argument" do
5
- expect {
6
- TTY::Prompt::Converters.on_error
7
- }.to raise_error(ArgumentError, 'You need to provide a block argument.')
8
- end
9
- end
@@ -1,73 +0,0 @@
1
- # coding: utf-8
2
-
3
- RSpec.describe TTY::Prompt::Distance, '.distance' do
4
- let(:object) { described_class.new }
5
-
6
- subject(:distance) { object.distance(*strings) }
7
-
8
- context 'when nil' do
9
- let(:strings) { [nil, nil] }
10
-
11
- it { is_expected.to eql(0) }
12
- end
13
-
14
- context 'when empty' do
15
- let(:strings) { ['', ''] }
16
-
17
- it { is_expected.to eql(0) }
18
- end
19
-
20
- context 'with one non empty' do
21
- let(:strings) { ['abc', ''] }
22
-
23
- it { is_expected.to eql(3) }
24
- end
25
-
26
- context 'when single char' do
27
- let(:strings) { ['a', 'abc'] }
28
-
29
- it { is_expected.to eql(2) }
30
- end
31
-
32
- context 'when similar' do
33
- let(:strings) { ['abc', 'abc'] }
34
-
35
- it { is_expected.to eql(0) }
36
- end
37
-
38
- context 'when similar' do
39
- let(:strings) { ['abc', 'acb'] }
40
-
41
- it { is_expected.to eql(1) }
42
- end
43
-
44
- context 'when end similar' do
45
- let(:strings) { ['saturday', 'sunday'] }
46
-
47
- it { is_expected.to eql(3) }
48
- end
49
-
50
- context 'when contain similar' do
51
- let(:strings) { ['which', 'witch'] }
52
-
53
- it { is_expected.to eql(2) }
54
- end
55
-
56
- context 'when prefix' do
57
- let(:strings) { ['sta', 'status'] }
58
-
59
- it { is_expected.to eql(3) }
60
- end
61
-
62
- context 'when similar' do
63
- let(:strings) { ['smellyfish','jellyfish'] }
64
-
65
- it { is_expected.to eql(2) }
66
- end
67
-
68
- context 'when unicode' do
69
- let(:strings) { ['マラソン五輪代表', 'ララソン五輪代表'] }
70
-
71
- it { is_expected.to eql(1) }
72
- end
73
- end
@@ -1,65 +0,0 @@
1
- # encoding: utf-8
2
-
3
- RSpec.describe TTY::Prompt::EnumPaginator, '#paginate' do
4
- it "ignores per_page when equal items " do
5
- list = %w(a b c d)
6
- paginator = described_class.new({per_page: 4})
7
-
8
- expect(paginator.paginate(list, 1).to_a).to eq([
9
- ['a',0],['b',1],['c',2],['d',3]])
10
- end
11
-
12
- it "ignores per_page when less items " do
13
- list = %w(a b c d)
14
- paginator = described_class.new({per_page: 5})
15
-
16
- expect(paginator.paginate(list, 1).to_a).to eq([
17
- ['a',0],['b',1],['c',2],['d',3]])
18
- end
19
-
20
- it "paginates items matching per_page count" do
21
- list = %w(a b c d e f)
22
- paginator = described_class.new({per_page: 3})
23
-
24
- expect(paginator.paginate(list, 1).to_a).to eq([['a',0], ['b',1], ['c',2]])
25
- expect(paginator.paginate(list, 2).to_a).to eq([['a',0], ['b',1], ['c',2]])
26
- expect(paginator.paginate(list, 3).to_a).to eq([['a',0], ['b',1], ['c',2]])
27
- expect(paginator.paginate(list, 4).to_a).to eq([['d',3], ['e',4], ['f',5]])
28
- expect(paginator.paginate(list, 5).to_a).to eq([['d',3], ['e',4], ['f',5]])
29
- expect(paginator.paginate(list, 6).to_a).to eq([['d',3], ['e',4], ['f',5]])
30
- expect(paginator.paginate(list, 7).to_a).to eq([['d',3], ['e',4], ['f',5]])
31
- end
32
-
33
- it "paginates items not matching per_page count" do
34
- list = %w(a b c d e f g)
35
- paginator = described_class.new({per_page: 3})
36
-
37
- expect(paginator.paginate(list, 1).to_a).to eq([['a',0], ['b',1], ['c',2]])
38
- expect(paginator.paginate(list, 2).to_a).to eq([['a',0], ['b',1], ['c',2]])
39
- expect(paginator.paginate(list, 3).to_a).to eq([['a',0], ['b',1], ['c',2]])
40
- expect(paginator.paginate(list, 4).to_a).to eq([['d',3], ['e',4], ['f',5]])
41
- expect(paginator.paginate(list, 5).to_a).to eq([['d',3], ['e',4], ['f',5]])
42
- expect(paginator.paginate(list, 6).to_a).to eq([['d',3], ['e',4], ['f',5]])
43
- expect(paginator.paginate(list, 7).to_a).to eq([['g',6]])
44
- expect(paginator.paginate(list, 8).to_a).to eq([['g',6]])
45
- end
46
-
47
- it "finds maximum index for current selection" do
48
- list = %w(a b c d e f g)
49
- paginator = described_class.new({per_page: 3, default: 0})
50
-
51
- paginator.paginate(list, 4)
52
- expect(paginator.max_index).to eq(5)
53
- paginator.paginate(list, 5)
54
- expect(paginator.max_index).to eq(5)
55
- paginator.paginate(list, 7)
56
- expect(paginator.max_index).to eq(8)
57
- end
58
-
59
- it "starts with default selection" do
60
- list = %w(a b c d e f g)
61
- paginator = described_class.new({per_page: 3, default: 3})
62
-
63
- expect(paginator.paginate(list, 4).to_a).to eq([['d',3], ['e',4], ['f',5]])
64
- end
65
- end
@@ -1,310 +0,0 @@
1
- # encoding: utf-8
2
-
3
- RSpec.describe TTY::Prompt do
4
- it "selects default option when return pressed immediately" do
5
- prompt = TTY::TestPrompt.new
6
- choices = %w(/bin/nano /usr/bin/vim.basic /usr/bin/vim.tiny)
7
- prompt.input << "\n"
8
- prompt.input.rewind
9
-
10
- expect(prompt.enum_select("Select an editor?", choices)).to eq('/bin/nano')
11
- expect(prompt.output.string).to eq([
12
- "Select an editor? \n",
13
- "\e[32m 1) /bin/nano\e[0m\n",
14
- " 2) /usr/bin/vim.basic\n",
15
- " 3) /usr/bin/vim.tiny\n",
16
- " Choose 1-3 [1]: ",
17
- "\e[2K\e[1G\e[1A" * 4,
18
- "\e[2K\e[1G\e[J",
19
- "Select an editor? \e[32m/bin/nano\e[0m\n"
20
- ].join)
21
- end
22
-
23
- it "selects option by index from the list" do
24
- prompt = TTY::TestPrompt.new
25
- choices = %w(/bin/nano /usr/bin/vim.basic /usr/bin/vim.tiny)
26
- prompt.input << "3\n"
27
- prompt.input.rewind
28
-
29
- expect(prompt.enum_select("Select an editor?", choices, default: 2)).to eq('/usr/bin/vim.tiny')
30
- expect(prompt.output.string).to eq([
31
- "Select an editor? \n",
32
- " 1) /bin/nano\n",
33
- "\e[32m 2) /usr/bin/vim.basic\e[0m\n",
34
- " 3) /usr/bin/vim.tiny\n",
35
- " Choose 1-3 [2]: ",
36
- "\e[2K\e[1G\e[1A" * 4,
37
- "\e[2K\e[1G\e[J",
38
- "Select an editor? \n",
39
- " 1) /bin/nano\n",
40
- " 2) /usr/bin/vim.basic\n",
41
- "\e[32m 3) /usr/bin/vim.tiny\e[0m\n",
42
- " Choose 1-3 [2]: 3",
43
- "\e[2K\e[1G\e[1A" * 4,
44
- "\e[2K\e[1G\e[J",
45
- "Select an editor? \e[32m/usr/bin/vim.tiny\e[0m\n"
46
- ].join)
47
- end
48
-
49
- it "selects option through DSL" do
50
- prompt = TTY::TestPrompt.new
51
- prompt.input << "1\n"
52
- prompt.input.rewind
53
- value = prompt.enum_select("Select an editor?") do |menu|
54
- menu.default 2
55
- menu.enum '.'
56
-
57
- menu.choice "/bin/nano"
58
- menu.choice "/usr/bin/vim.basic"
59
- menu.choice "/usr/bin/vim.tiny"
60
- end
61
-
62
- expect(value).to eq('/bin/nano')
63
- expect(prompt.output.string).to eq([
64
- "Select an editor? \n",
65
- " 1. /bin/nano\n",
66
- "\e[32m 2. /usr/bin/vim.basic\e[0m\n",
67
- " 3. /usr/bin/vim.tiny\n",
68
- " Choose 1-3 [2]: ",
69
- "\e[2K\e[1G\e[1A" * 4,
70
- "\e[2K\e[1G\e[J",
71
- "Select an editor? \n",
72
- "\e[32m 1. /bin/nano\e[0m\n",
73
- " 2. /usr/bin/vim.basic\n",
74
- " 3. /usr/bin/vim.tiny\n",
75
- " Choose 1-3 [2]: 1",
76
- "\e[2K\e[1G\e[1A" * 4,
77
- "\e[2K\e[1G\e[J",
78
- "Select an editor? \e[32m/bin/nano\e[0m\n"
79
- ].join)
80
- end
81
-
82
- it "selects option through DSL with key and value" do
83
- prompt = TTY::TestPrompt.new
84
- prompt.input << "\n"
85
- prompt.input.rewind
86
- value = prompt.enum_select("Select an editor?") do |menu|
87
- menu.default 2
88
-
89
- menu.choice :nano, '/bin/nano'
90
- menu.choice :vim, '/usr/bin/vim'
91
- menu.choice :emacs, '/usr/bin/emacs'
92
- end
93
-
94
- expect(value).to eq('/usr/bin/vim')
95
- expect(prompt.output.string).to eq([
96
- "Select an editor? \n",
97
- " 1) nano\n",
98
- "\e[32m 2) vim\e[0m\n",
99
- " 3) emacs\n",
100
- " Choose 1-3 [2]: ",
101
- "\e[2K\e[1G\e[1A" * 4,
102
- "\e[2K\e[1G\e[J",
103
- "Select an editor? \e[32mvim\e[0m\n"
104
- ].join)
105
- end
106
-
107
- it "changes colors for selection, hint and error" do
108
- prompt = TTY::TestPrompt.new
109
- choices = %w(/bin/nano /usr/bin/vim.basic /usr/bin/vim.tiny)
110
- prompt.input << "\n"
111
- prompt.input.rewind
112
- options = {active_color: :red, help_color: :blue, error_color: :green}
113
- expect(prompt.enum_select("Select an editor?", choices, options)).to eq('/bin/nano')
114
- expect(prompt.output.string).to eq([
115
- "Select an editor? \n",
116
- "\e[31m 1) /bin/nano\e[0m\n",
117
- " 2) /usr/bin/vim.basic\n",
118
- " 3) /usr/bin/vim.tiny\n",
119
- " Choose 1-3 [1]: ",
120
- "\e[2K\e[1G\e[1A" * 4,
121
- "\e[2K\e[1G\e[J",
122
- "Select an editor? \e[31m/bin/nano\e[0m\n"
123
- ].join)
124
- end
125
-
126
- it "displays error with unrecognized input" do
127
- prompt = TTY::TestPrompt.new
128
- choices = %w(/bin/nano /usr/bin/vim.basic /usr/bin/vim.tiny)
129
- prompt.input << "11\n2\n"
130
- prompt.input.rewind
131
- value = prompt.enum_select("Select an editor?", choices)
132
- expect(value).to eq('/usr/bin/vim.basic')
133
- expect(prompt.output.string).to eq([
134
- "Select an editor? \n",
135
- "\e[32m 1) /bin/nano\e[0m\n",
136
- " 2) /usr/bin/vim.basic\n",
137
- " 3) /usr/bin/vim.tiny\n",
138
- " Choose 1-3 [1]: ",
139
- "\e[2K\e[1G\e[1A" * 4,
140
- "\e[2K\e[1G\e[J",
141
- "Select an editor? \n",
142
- "\e[32m 1) /bin/nano\e[0m\n",
143
- " 2) /usr/bin/vim.basic\n",
144
- " 3) /usr/bin/vim.tiny\n",
145
- " Choose 1-3 [1]: 1",
146
- "\e[2K\e[1G\e[1A" * 4,
147
- "\e[2K\e[1G\e[J",
148
- "Select an editor? \n",
149
- "\e[32m 1) /bin/nano\e[0m\n",
150
- " 2) /usr/bin/vim.basic\n",
151
- " 3) /usr/bin/vim.tiny\n",
152
- " Choose 1-3 [1]: 11",
153
- "\e[2K\e[1G\e[1A" * 4,
154
- "\e[2K\e[1G\e[J",
155
- "Select an editor? \n",
156
- "\e[32m 1) /bin/nano\e[0m\n",
157
- " 2) /usr/bin/vim.basic\n",
158
- " 3) /usr/bin/vim.tiny\n",
159
- " Choose 1-3 [1]: \n",
160
- "\e[31m>>\e[0m Please enter a valid number",
161
- "\e[A\e[1G\e[18C",
162
- "\e[2K\e[1G\e[1A" * 4,
163
- "\e[2K\e[1G\e[J",
164
- "Select an editor? \n",
165
- " 1) /bin/nano\n",
166
- "\e[32m 2) /usr/bin/vim.basic\e[0m\n",
167
- " 3) /usr/bin/vim.tiny\n",
168
- " Choose 1-3 [1]: 2\n",
169
- "\e[31m>>\e[0m Please enter a valid number",
170
- "\e[A\e[1G\e[19C",
171
- "\e[2K\e[1G\e[1A" * 4,
172
- "\e[2K\e[1G\e[J",
173
- "Select an editor? \e[32m/usr/bin/vim.basic\e[0m\n"
174
- ].join)
175
- end
176
-
177
- it "paginates long selections" do
178
- prompt = TTY::TestPrompt.new
179
- choices = %w(A B C D E F G H)
180
- prompt.input << "\n"
181
- prompt.input.rewind
182
- value = prompt.enum_select("What letter?", choices, per_page: 3, default: 4)
183
- expect(value).to eq('D')
184
- expect(prompt.output.string).to eq([
185
- "What letter? \n",
186
- "\e[32m 4) D\e[0m\n",
187
- " 5) E\n",
188
- " 6) F\n",
189
- " Choose 1-8 [4]: ",
190
- "\n\e[90m(Press tab/right or left to reveal more choices)\e[0m",
191
- "\e[A\e[1G\e[18C",
192
- "\e[2K\e[1G\e[1A" * 4,
193
- "\e[2K\e[1G\e[J",
194
- "What letter? \e[32mD\e[0m\n"
195
- ].join)
196
- end
197
-
198
- it "doesn't paginate short selections" do
199
- prompt = TTY::TestPrompt.new
200
- choices = %w(A B C D)
201
- prompt.input << "\r"
202
- prompt.input.rewind
203
- value = prompt.enum_select("What letter?", choices, per_page: 4, default: 1)
204
- expect(value).to eq('A')
205
-
206
- expect(prompt.output.string).to eq([
207
- "What letter? \n",
208
- "\e[32m 1) A\e[0m\n",
209
- " 2) B\n",
210
- " 3) C\n",
211
- " 4) D\n",
212
- " Choose 1-4 [1]: ",
213
- "\e[2K\e[1G\e[1A" * 5,
214
- "\e[2K\e[1G\e[J",
215
- "What letter? \e[32mA\e[0m\n"
216
- ].join)
217
- end
218
-
219
- it "shows pages matching input" do
220
- prompt = TTY::TestPrompt.new
221
- choices = %w(A B C D E F G H)
222
- prompt.input << "11\n\b\n"
223
- prompt.input.rewind
224
- value = prompt.enum_select("What letter?", choices, per_page: 3)
225
- expect(value).to eq('A')
226
- expect(prompt.output.string).to eq([
227
- "What letter? \n",
228
- "\e[32m 1) A\e[0m\n",
229
- " 2) B\n",
230
- " 3) C\n",
231
- " Choose 1-8 [1]: ",
232
- "\n\e[90m(Press tab/right or left to reveal more choices)\e[0m",
233
- "\e[A\e[1G\e[18C",
234
- "\e[2K\e[1G\e[1A" * 4,
235
- "\e[2K\e[1G\e[J",
236
- "What letter? \n",
237
- "\e[32m 1) A\e[0m\n",
238
- " 2) B\n",
239
- " 3) C\n",
240
- " Choose 1-8 [1]: 1",
241
- "\n\e[90m(Press tab/right or left to reveal more choices)\e[0m",
242
- "\e[A\e[1G\e[19C",
243
- "\e[2K\e[1G\e[1A" * 4,
244
- "\e[2K\e[1G\e[J",
245
- "What letter? \n",
246
- "\e[32m 1) A\e[0m\n",
247
- " 2) B\n",
248
- " 3) C\n",
249
- " Choose 1-8 [1]: 11",
250
- "\n\e[90m(Press tab/right or left to reveal more choices)\e[0m",
251
- "\e[A\e[1G\e[20C",
252
- "\e[2K\e[1G\e[1A" * 4,
253
- "\e[2K\e[1G\e[J",
254
- "What letter? \n",
255
- "\e[32m 1) A\e[0m\n",
256
- " 2) B\n",
257
- " 3) C\n",
258
- " Choose 1-8 [1]: \n",
259
- "\e[31m>>\e[0m Please enter a valid number",
260
- "\n\e[90m(Press tab/right or left to reveal more choices)\e[0m",
261
- "\e[A\e[1G\e[A\e[1G\e[18C",
262
- "\e[2K\e[1G\e[1A" * 4,
263
- "\e[2K\e[1G\e[J",
264
- "What letter? \n",
265
- "\e[32m 1) A\e[0m\n",
266
- " 2) B\n",
267
- " 3) C\n",
268
- " Choose 1-8 [1]: \n",
269
- "\e[31m>>\e[0m Please enter a valid number",
270
- "\n\e[90m(Press tab/right or left to reveal more choices)\e[0m",
271
- "\e[A\e[1G\e[A\e[1G\e[18C",
272
- "\e[2K\e[1G\e[1A" * 4,
273
- "\e[2K\e[1G\e[J",
274
- "What letter? \e[32mA\e[0m\n"
275
- ].join)
276
- end
277
-
278
- it "switches through pages with tab key" do
279
- prompt = TTY::TestPrompt.new
280
- choices = %w(A B C D E F G H)
281
- prompt.input << "\t\n"
282
- prompt.input.rewind
283
- value = prompt.enum_select("What letter?") do |menu|
284
- menu.default 4
285
- menu.per_page 3
286
- menu.choices choices
287
- end
288
- expect(value).to eq('D')
289
- expect(prompt.output.string).to eq([
290
- "What letter? \n",
291
- "\e[32m 4) D\e[0m\n",
292
- " 5) E\n",
293
- " 6) F\n",
294
- " Choose 1-8 [4]: ",
295
- "\n\e[90m(Press tab/right or left to reveal more choices)\e[0m",
296
- "\e[A\e[1G\e[18C",
297
- "\e[2K\e[1G\e[1A" * 4,
298
- "\e[2K\e[1G\e[J",
299
- "What letter? \n",
300
- " 7) G\n",
301
- " 8) H\n",
302
- " Choose 1-8 [4]: ",
303
- "\n\e[90m(Press tab/right or left to reveal more choices)\e[0m",
304
- "\e[A\e[1G\e[18C",
305
- "\e[2K\e[1G\e[1A" * 3,
306
- "\e[2K\e[1G\e[J",
307
- "What letter? \e[32mD\e[0m\n"
308
- ].join)
309
- end
310
- end