tty-prompt 0.20.0 → 0.21.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -0
  3. data/README.md +29 -4
  4. data/lib/tty/prompt.rb +3 -3
  5. data/lib/tty/prompt/multi_list.rb +33 -10
  6. data/lib/tty/prompt/version.rb +1 -1
  7. metadata +11 -175
  8. data/Rakefile +0 -8
  9. data/examples/ask.rb +0 -7
  10. data/examples/ask_blank.rb +0 -9
  11. data/examples/ask_multiline.rb +0 -7
  12. data/examples/ask_valid.rb +0 -12
  13. data/examples/collect.rb +0 -21
  14. data/examples/echo.rb +0 -11
  15. data/examples/enum_select.rb +0 -7
  16. data/examples/enum_select_disabled.rb +0 -16
  17. data/examples/enum_select_paged.rb +0 -9
  18. data/examples/enum_select_wrapped.rb +0 -15
  19. data/examples/expand.rb +0 -29
  20. data/examples/expand_auto.rb +0 -29
  21. data/examples/in.rb +0 -9
  22. data/examples/inputs.rb +0 -10
  23. data/examples/key_events.rb +0 -15
  24. data/examples/keypress.rb +0 -9
  25. data/examples/mask.rb +0 -13
  26. data/examples/multi_select.rb +0 -8
  27. data/examples/multi_select_disabled.rb +0 -17
  28. data/examples/multi_select_disabled_paged.rb +0 -22
  29. data/examples/multi_select_paged.rb +0 -9
  30. data/examples/multi_select_wrapped.rb +0 -15
  31. data/examples/multiline.rb +0 -9
  32. data/examples/pause.rb +0 -9
  33. data/examples/select.rb +0 -24
  34. data/examples/select_disabled.rb +0 -18
  35. data/examples/select_disabled_paged.rb +0 -22
  36. data/examples/select_enum.rb +0 -8
  37. data/examples/select_filtered.rb +0 -11
  38. data/examples/select_paginated.rb +0 -11
  39. data/examples/select_wrapped.rb +0 -15
  40. data/examples/slider.rb +0 -6
  41. data/examples/validation.rb +0 -9
  42. data/examples/yes_no.rb +0 -7
  43. data/spec/spec_helper.rb +0 -61
  44. data/spec/unit/ask_spec.rb +0 -173
  45. data/spec/unit/block_paginator_spec.rb +0 -84
  46. data/spec/unit/choice/eql_spec.rb +0 -22
  47. data/spec/unit/choice/from_spec.rb +0 -130
  48. data/spec/unit/choices/add_spec.rb +0 -12
  49. data/spec/unit/choices/each_spec.rb +0 -13
  50. data/spec/unit/choices/find_by_spec.rb +0 -10
  51. data/spec/unit/choices/new_spec.rb +0 -10
  52. data/spec/unit/choices/pluck_spec.rb +0 -9
  53. data/spec/unit/collect_spec.rb +0 -96
  54. data/spec/unit/converters/convert_bool_spec.rb +0 -58
  55. data/spec/unit/converters/convert_char_spec.rb +0 -11
  56. data/spec/unit/converters/convert_custom_spec.rb +0 -14
  57. data/spec/unit/converters/convert_date_spec.rb +0 -34
  58. data/spec/unit/converters/convert_file_spec.rb +0 -18
  59. data/spec/unit/converters/convert_number_spec.rb +0 -39
  60. data/spec/unit/converters/convert_path_spec.rb +0 -15
  61. data/spec/unit/converters/convert_range_spec.rb +0 -22
  62. data/spec/unit/converters/convert_regex_spec.rb +0 -12
  63. data/spec/unit/converters/convert_string_spec.rb +0 -21
  64. data/spec/unit/converters/on_error_spec.rb +0 -9
  65. data/spec/unit/distance/distance_spec.rb +0 -73
  66. data/spec/unit/enum_select_spec.rb +0 -518
  67. data/spec/unit/error_spec.rb +0 -20
  68. data/spec/unit/evaluator_spec.rb +0 -67
  69. data/spec/unit/expand_spec.rb +0 -290
  70. data/spec/unit/keypress_spec.rb +0 -66
  71. data/spec/unit/mask_spec.rb +0 -140
  72. data/spec/unit/multi_select_spec.rb +0 -741
  73. data/spec/unit/multiline_spec.rb +0 -77
  74. data/spec/unit/new_spec.rb +0 -20
  75. data/spec/unit/ok_spec.rb +0 -10
  76. data/spec/unit/paginator_spec.rb +0 -92
  77. data/spec/unit/question/checks_spec.rb +0 -97
  78. data/spec/unit/question/default_spec.rb +0 -31
  79. data/spec/unit/question/echo_spec.rb +0 -38
  80. data/spec/unit/question/in_spec.rb +0 -115
  81. data/spec/unit/question/initialize_spec.rb +0 -12
  82. data/spec/unit/question/modifier/apply_to_spec.rb +0 -24
  83. data/spec/unit/question/modifier/letter_case_spec.rb +0 -41
  84. data/spec/unit/question/modifier/whitespace_spec.rb +0 -51
  85. data/spec/unit/question/modify_spec.rb +0 -41
  86. data/spec/unit/question/required_spec.rb +0 -92
  87. data/spec/unit/question/validate_spec.rb +0 -115
  88. data/spec/unit/question/validation/call_spec.rb +0 -31
  89. data/spec/unit/question/validation/coerce_spec.rb +0 -30
  90. data/spec/unit/result_spec.rb +0 -40
  91. data/spec/unit/say_spec.rb +0 -67
  92. data/spec/unit/select_spec.rb +0 -942
  93. data/spec/unit/slider_spec.rb +0 -142
  94. data/spec/unit/statement/initialize_spec.rb +0 -15
  95. data/spec/unit/subscribe_spec.rb +0 -22
  96. data/spec/unit/suggest_spec.rb +0 -28
  97. data/spec/unit/timer_spec.rb +0 -29
  98. data/spec/unit/warn_spec.rb +0 -21
  99. data/spec/unit/yes_no_spec.rb +0 -285
  100. data/tasks/console.rake +0 -11
  101. data/tasks/coverage.rake +0 -11
  102. data/tasks/spec.rake +0 -29
  103. data/tty-prompt.gemspec +0 -40
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe TTY::Prompt::Result do
4
- it "checks value to be invalid" do
5
- question = double(:question)
6
- result = TTY::Prompt::Result.new(question, nil)
7
-
8
- answer = result.with { |quest, value|
9
- if value.nil?
10
- [value, ["`#{value}` provided cannot be empty"]]
11
- else
12
- value
13
- end
14
- }
15
- expect(answer).to be_a(TTY::Prompt::Result::Failure)
16
- expect(answer.success?).to eq(false)
17
- expect(answer.errors).to eq(["`` provided cannot be empty"])
18
- end
19
-
20
- it "checks value to be valid" do
21
- question = double(:question)
22
- result = TTY::Prompt::Result.new(question, 'Piotr')
23
-
24
- CheckRequired = Class.new do
25
- def self.call(quest, value)
26
- if value.nil?
27
- [value, ["`#{value}` provided cannot be empty"]]
28
- else
29
- value
30
- end
31
- end
32
- end
33
-
34
- answer = result.with(CheckRequired)
35
- expect(answer).to be_a(TTY::Prompt::Result::Success)
36
- expect(answer.success?).to eq(true)
37
- expect(answer.value).to eq('Piotr')
38
- expect(answer.errors).to eq([])
39
- end
40
- end
@@ -1,67 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe TTY::Prompt, '#say' do
4
-
5
- subject(:prompt) { TTY::TestPrompt.new }
6
-
7
- it 'prints an empty message' do
8
- prompt.say('')
9
- expect(prompt.output.string).to eq('')
10
- end
11
-
12
- context 'with new line' do
13
- it 'prints a message with newline' do
14
- prompt.say("Hell yeah!\n")
15
- expect(prompt.output.string).to eq("Hell yeah!\n")
16
- end
17
-
18
- it 'prints a message with implicit newline' do
19
- prompt.say("Hell yeah!\n")
20
- expect(prompt.output.string).to eq("Hell yeah!\n")
21
- end
22
-
23
- it 'prints a message with newline within text' do
24
- prompt.say("Hell\n yeah!")
25
- expect(prompt.output.string).to eq("Hell\n yeah!\n")
26
- end
27
-
28
- it 'prints a message with newline within text and blank space' do
29
- prompt.say("Hell\n yeah! ")
30
- expect(prompt.output.string).to eq("Hell\n yeah! ")
31
- end
32
-
33
- it 'prints a message without newline' do
34
- prompt.say("Hell yeah!", newline: false)
35
- expect(prompt.output.string).to eq("Hell yeah!")
36
- end
37
- end
38
-
39
- context 'with tab or space' do
40
- it 'prints ' do
41
- prompt.say("Hell yeah!\t")
42
- expect(prompt.output.string).to eq("Hell yeah!\t")
43
- end
44
- end
45
-
46
- context 'with color' do
47
- it 'prints message with ansi color' do
48
- prompt.say('Hell yeah!', color: :green)
49
- expect(prompt.output.string).to eq("\e[32mHell yeah!\e[0m\n")
50
- end
51
-
52
- it 'prints message with ansi color without newline' do
53
- prompt.say('Hell yeah! ', color: :green)
54
- expect(prompt.output.string).to eq("\e[32mHell yeah! \e[0m")
55
- end
56
- end
57
-
58
- context 'without color' do
59
- it 'prints message without ansi' do
60
- prompt = TTY::TestPrompt.new(enable_color: false)
61
-
62
- prompt.say('Hell yeah!', color: :green)
63
-
64
- expect(prompt.output.string).to eq("Hell yeah!\n")
65
- end
66
- end
67
- end
@@ -1,942 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe TTY::Prompt, '#select' do
4
-
5
- subject(:prompt) { TTY::TestPrompt.new }
6
-
7
- let(:symbols) { TTY::Prompt::Symbols.symbols }
8
- let(:up_down) { "#{symbols[:arrow_up]}/#{symbols[:arrow_down]}" }
9
- let(:left_right) { "#{symbols[:arrow_left]}/#{symbols[:arrow_right]}"}
10
-
11
- def output_helper(prompt, choices, active, options = {})
12
- raise ":init requires :hint" if options[:init] && options[:hint].nil?
13
- hint = options[:hint]
14
- init = options.fetch(:init, false)
15
- enum = options[:enum]
16
-
17
- out = []
18
- out << "\e[?25l" if init
19
- out << prompt << " "
20
- out << "\e[90m(#{hint})\e[0m" if hint
21
- out << "\n"
22
- out << choices.map.with_index do |c, i|
23
- name = c.is_a?(Hash) ? c[:name] : c
24
- disabled = c.is_a?(Hash) ? c[:disabled] : false
25
- num = (i + 1).to_s + enum if enum
26
- if disabled
27
- "\e[31m#{symbols[:cross]}\e[0m #{num}#{name} #{disabled}"
28
- elsif name == active
29
- "\e[32m#{symbols[:marker]} #{num}#{name}\e[0m"
30
- else
31
- " #{num}#{name}"
32
- end
33
- end.join("\n")
34
- out << "\e[2K\e[1G\e[1A" * choices.count
35
- out << "\e[2K\e[1G"
36
- out << "\e[1A\e[2K\e[1G" if choices.empty?
37
- out.join
38
- end
39
-
40
- def exit_message(prompt, choice)
41
- "#{prompt} \e[32m#{choice}\e[0m\n\e[?25h"
42
- end
43
-
44
- # Ensure a wide prompt on CI
45
- before { allow(TTY::Screen).to receive(:width).and_return(200) }
46
-
47
- it "selects by default first option" do
48
- choices = %i(Large Medium Small)
49
- prompt.input << "\r"
50
- prompt.input.rewind
51
-
52
- expect(prompt.select('What size?', choices)).to eq(:Large)
53
- expected_output = [
54
- "\e[?25lWhat size? \e[90m(Use #{up_down} arrow keys, press Enter to select)\e[0m\n",
55
- "\e[32m#{symbols[:marker]} Large\e[0m\n",
56
- " Medium\n",
57
- " Small",
58
- "\e[2K\e[1G\e[1A" * 3,
59
- "\e[2K\e[1G",
60
- "What size? \e[32mLarge\e[0m\n\e[?25h"
61
- ].join
62
-
63
- expect(prompt.output.string).to eq(expected_output)
64
- end
65
-
66
- it "allows navigation using events without errors" do
67
- choices = %w(Large Medium Small)
68
- prompt.input << "j" << "\r"
69
- prompt.input.rewind
70
- prompt.on(:keypress) do |event|
71
- prompt.trigger(:keydown) if event.value == "j"
72
- end
73
- expect { prompt.select('What size?', choices) }.not_to output.to_stderr
74
- expect(prompt.output.string).to eq([
75
- "\e[?25lWhat size? \e[90m(Use #{up_down} arrow keys, press Enter to select)\e[0m\n",
76
- "\e[32m#{symbols[:marker]} Large\e[0m\n",
77
- " Medium\n",
78
- " Small",
79
- "\e[2K\e[1G\e[1A" * 3,
80
- "\e[2K\e[1G",
81
- "What size? \n",
82
- " Large\n",
83
- "\e[32m#{symbols[:marker]} Medium\e[0m\n",
84
- " Small",
85
- "\e[2K\e[1G\e[1A" * 3,
86
- "\e[2K\e[1G",
87
- "What size? \e[32mMedium\e[0m\n\e[?25h"
88
- ].join)
89
- end
90
-
91
- it "sets choice name and value" do
92
- choices = {large: 1, medium: 2, small: 3}
93
- prompt.input << " "
94
- prompt.input.rewind
95
- expect(prompt.select('What size?', choices, default: 1)).to eq(1)
96
- expect(prompt.output.string).to eq([
97
- "\e[?25lWhat size? \e[90m(Use #{up_down} arrow keys, press Enter to select)\e[0m\n",
98
- "\e[32m#{symbols[:marker]} large\e[0m\n",
99
- " medium\n",
100
- " small",
101
- "\e[2K\e[1G\e[1A" * 3,
102
- "\e[2K\e[1G",
103
- "What size? \e[32mlarge\e[0m\n\e[?25h"
104
- ].join)
105
- end
106
-
107
- it "sets choice name through DSL" do
108
- prompt.input << " "
109
- prompt.input.rewind
110
- value = prompt.select('What size?') do |menu|
111
- menu.symbols marker: '>'
112
-
113
- menu.choice "Large"
114
- menu.choice "Medium"
115
- menu.choice "Small"
116
- end
117
- expect(value).to eq('Large')
118
- expect(prompt.output.string).to eq([
119
- "\e[?25lWhat size? \e[90m(Use #{up_down} arrow keys, press Enter to select)\e[0m\n",
120
- "\e[32m> Large\e[0m\n",
121
- " Medium\n",
122
- " Small",
123
- "\e[2K\e[1G\e[1A" * 3,
124
- "\e[2K\e[1G",
125
- "What size? \e[32mLarge\e[0m\n\e[?25h"
126
- ].join)
127
- end
128
-
129
- it "sets choice name & value through DSL" do
130
- prompt = TTY::TestPrompt.new(symbols: {marker: '>'})
131
- prompt.input << " "
132
- prompt.input.rewind
133
- value = prompt.select('What size?') do |menu|
134
- menu.choice :large, 1
135
- menu.choice :medium, 2
136
- menu.choice :small, 3
137
- end
138
- expect(value).to eq(1)
139
- expect(prompt.output.string).to eq([
140
- "\e[?25lWhat size? \e[90m(Use #{up_down} arrow keys, press Enter to select)\e[0m\n",
141
- "\e[32m> large\e[0m\n",
142
- " medium\n",
143
- " small",
144
- "\e[2K\e[1G\e[1A" * 3,
145
- "\e[2K\e[1G",
146
- "What size? \e[32mlarge\e[0m\n\e[?25h"
147
- ].join)
148
- end
149
-
150
- it "sets choices and single choice through DSL" do
151
- prompt.input << " "
152
- prompt.input.rewind
153
- value = prompt.select('What size?') do |menu|
154
- menu.choice 'Large'
155
- menu.choices %w(Medium Small)
156
- end
157
- expect(value).to eq('Large')
158
- expect(prompt.output.string).to eq([
159
- "\e[?25lWhat size? \e[90m(Use #{up_down} arrow keys, press Enter to select)\e[0m\n",
160
- "\e[32m#{symbols[:marker]} Large\e[0m\n",
161
- " Medium\n",
162
- " Small",
163
- "\e[2K\e[1G\e[1A" * 3,
164
- "\e[2K\e[1G",
165
- "What size? \e[32mLarge\e[0m\n\e[?25h"
166
- ].join)
167
- end
168
-
169
- it "sets choice name & value through DSL" do
170
- prompt.input << " "
171
- prompt.input.rewind
172
- value = prompt.select('What size?') do |menu|
173
- menu.default 2
174
- menu.enum '.'
175
-
176
- menu.choice :large, 1
177
- menu.choice :medium, 2
178
- menu.choice :small, 3
179
- end
180
- expect(value).to eq(2)
181
- expect(prompt.output.string).to eq([
182
- "\e[?25lWhat size? \e[90m(Use #{up_down} arrow or number (1-3) keys, press Enter to select)\e[0m\n",
183
- " 1. large\n",
184
- "\e[32m#{symbols[:marker]} 2. medium\e[0m\n",
185
- " 3. small",
186
- "\e[2K\e[1G\e[1A" * 3,
187
- "\e[2K\e[1G",
188
- "What size? \e[32mmedium\e[0m\n\e[?25h"
189
- ].join)
190
- end
191
-
192
- it "sets choice value to proc and executes it" do
193
- prompt.input << " "
194
- prompt.input.rewind
195
- value = prompt.select('What size?', default: 2, enum: ')') do |menu|
196
- menu.choice :large, 1
197
- menu.choice :medium do 'Good choice!' end
198
- menu.choice :small, 3
199
- end
200
-
201
- expect(value).to eq('Good choice!')
202
- expect(prompt.output.string).to eq([
203
- "\e[?25lWhat size? \e[90m(Use #{up_down} arrow or number (1-3) keys, press Enter to select)\e[0m\n",
204
- " 1) large\n",
205
- "\e[32m#{symbols[:marker]} 2) medium\e[0m\n",
206
- " 3) small",
207
- "\e[2K\e[1G\e[1A" * 3,
208
- "\e[2K\e[1G",
209
- "What size? \e[32mmedium\e[0m\n\e[?25h"
210
- ].join)
211
- end
212
-
213
- it "sets default option through hash syntax" do
214
- choices = %w(Large Medium Small)
215
- prompt.input << " "
216
- prompt.input.rewind
217
- expect(prompt.select('What size?', choices, default: 2, enum: '.')).to eq('Medium')
218
- expect(prompt.output.string).to eq([
219
- "\e[?25lWhat size? \e[90m(Use #{up_down} arrow or number (1-3) keys, press Enter to select)\e[0m\n",
220
- " 1. Large\n",
221
- "\e[32m#{symbols[:marker]} 2. Medium\e[0m\n",
222
- " 3. Small",
223
- "\e[2K\e[1G\e[1A" * 3,
224
- "\e[2K\e[1G",
225
- "What size? \e[32mMedium\e[0m\n\e[?25h"
226
- ].join)
227
- end
228
-
229
- it "changes selected item color & marker" do
230
- choices = %w(Large Medium Small)
231
- prompt = TTY::TestPrompt.new(symbols: {marker: '>'})
232
- prompt.input << " "
233
- prompt.input.rewind
234
- options = {active_color: :blue, help_color: :red, symbols: {marker: '>' }}
235
-
236
- value = prompt.select('What size?', choices, **options)
237
-
238
- expect(value).to eq('Large')
239
- expect(prompt.output.string).to eq([
240
- "\e[?25lWhat size? \e[31m(Use #{up_down} arrow keys, press Enter to select)\e[0m\n",
241
- "\e[34m> Large\e[0m\n",
242
- " Medium\n",
243
- " Small",
244
- "\e[2K\e[1G\e[1A" * 3,
245
- "\e[2K\e[1G",
246
- "What size? \e[34mLarge\e[0m\n\e[?25h"
247
- ].join)
248
- end
249
-
250
- it "changes help text" do
251
- choices = %w(Large Medium Small)
252
- prompt.input << " "
253
- prompt.input.rewind
254
- value = prompt.select('What size?', choices, help: "(Bash keyboard)")
255
- expect(value).to eq('Large')
256
- expect(prompt.output.string).to eq([
257
- "\e[?25lWhat size? \e[90m(Bash keyboard)\e[0m\n",
258
- "\e[32m#{symbols[:marker]} Large\e[0m\n",
259
- " Medium\n",
260
- " Small",
261
- "\e[2K\e[1G\e[1A" * 3,
262
- "\e[2K\e[1G",
263
- "What size? \e[32mLarge\e[0m\n\e[?25h"
264
- ].join)
265
- end
266
-
267
- it "changes help text through DSL" do
268
- choices = %w(Large Medium Small)
269
- prompt.input << " "
270
- prompt.input.rewind
271
- value = prompt.select('What size?') do |menu|
272
- menu.help "(Bash keyboard)"
273
- menu.choices choices
274
- end
275
- expect(value).to eq('Large')
276
- expect(prompt.output.string).to eq([
277
- "\e[?25lWhat size? \e[90m(Bash keyboard)\e[0m\n",
278
- "\e[32m#{symbols[:marker]} Large\e[0m\n",
279
- " Medium\n",
280
- " Small",
281
- "\e[2K\e[1G\e[1A" * 3,
282
- "\e[2K\e[1G",
283
- "What size? \e[32mLarge\e[0m\n\e[?25h"
284
- ].join)
285
- end
286
-
287
- it "sets prompt prefix" do
288
- prompt = TTY::TestPrompt.new(prefix: '[?] ')
289
- choices = %w(Large Medium Small)
290
- prompt.input << "\r"
291
- prompt.input.rewind
292
- expect(prompt.select('What size?', choices)).to eq('Large')
293
- expect(prompt.output.string).to eq([
294
- "\e[?25l[?] What size? \e[90m(Use #{up_down} arrow keys, press Enter to select)\e[0m\n",
295
- "\e[32m#{symbols[:marker]} Large\e[0m\n",
296
- " Medium\n",
297
- " Small",
298
- "\e[2K\e[1G\e[1A" * 3,
299
- "\e[2K\e[1G",
300
- "[?] What size? \e[32mLarge\e[0m\n\e[?25h"
301
- ].join)
302
- end
303
-
304
- context "when paginated" do
305
- it "paginates long selections" do
306
- choices = %w(A B C D E F G H)
307
- prompt.input << "\r"
308
- prompt.input.rewind
309
-
310
- answer = prompt.select("What letter?", choices, per_page: 3, default: 4)
311
-
312
- expect(answer).to eq('D')
313
- expected_output = [
314
- "\e[?25lWhat letter? \e[90m(Use #{up_down} and #{left_right} arrow keys, press Enter to select)\e[0m\n",
315
- "\e[32m#{symbols[:marker]} D\e[0m\n",
316
- " E\n",
317
- " F",
318
- "\e[2K\e[1G\e[1A" * 3,
319
- "\e[2K\e[1G",
320
- "What letter? \e[32mD\e[0m\n\e[?25h",
321
- ].join
322
-
323
- expect(prompt.output.string).to eq(expected_output)
324
- end
325
-
326
- it "paginates choices as hash object" do
327
- prompt = TTY::TestPrompt.new
328
- choices = {A: 1, B: 2, C: 3, D: 4, E: 5, F: 6, G: 7, H: 8}
329
- prompt.input << "\r"
330
- prompt.input.rewind
331
-
332
- answer = prompt.select("What letter?", choices, per_page: 3, default: 4)
333
-
334
- expect(answer).to eq(4)
335
- expected_output = [
336
- "\e[?25lWhat letter? \e[90m(Use #{up_down} and #{left_right} arrow keys, press Enter to select)\e[0m\n",
337
- "\e[32m#{symbols[:marker]} D\e[0m\n",
338
- " E\n",
339
- " F",
340
- "\e[2K\e[1G\e[1A" * 3,
341
- "\e[2K\e[1G",
342
- "What letter? \e[32mD\e[0m\n\e[?25h",
343
- ].join
344
- expect(prompt.output.string).to eq(expected_output)
345
- end
346
-
347
- it "paginates long selections through DSL" do
348
- prompt = TTY::TestPrompt.new
349
- choices = %w(A B C D E F G H)
350
- prompt.input << "\r"
351
- prompt.input.rewind
352
-
353
- answer = prompt.select("What letter?") do |menu|
354
- menu.per_page 3
355
- menu.default 4
356
-
357
- menu.choices choices
358
- end
359
-
360
- expect(answer).to eq('D')
361
-
362
-
363
- expected_output = [
364
- "\e[?25lWhat letter? \e[90m(Use #{up_down} and #{left_right} arrow keys, press Enter to select)\e[0m\n",
365
- "\e[32m#{symbols[:marker]} D\e[0m\n",
366
- " E\n",
367
- " F",
368
- "\e[2K\e[1G\e[1A" * 3,
369
- "\e[2K\e[1G",
370
- "What letter? \e[32mD\e[0m\n\e[?25h",
371
- ].join
372
- expect(prompt.output.string).to eq(expected_output)
373
- end
374
-
375
- it "navigates evenly paged output with right arrow until end of selection" do
376
- prompt = TTY::TestPrompt.new
377
- choices = ('1'..'12').to_a
378
- prompt.on(:keypress) { |e| prompt.trigger(:keyright) if e.value == "l" }
379
- prompt.input << "l" << "l" << "l" << "\r"
380
- prompt.input.rewind
381
-
382
- answer = prompt.select("What number?", choices, per_page: 4)
383
-
384
- expect(answer).to eq('9')
385
-
386
- expected_output = [
387
- output_helper('What number?', choices[0..3], "1", init: true,
388
- hint: "Use #{up_down} and #{left_right} arrow keys, press Enter to select"),
389
- output_helper('What number?', choices[4..7], "5"),
390
- output_helper('What number?', choices[8..11], "9"),
391
- output_helper('What number?', choices[8..11], "9"),
392
- "What number? \e[32m9\e[0m\n\e[?25h",
393
- ].join
394
-
395
- expect(prompt.output.string).to eq(expected_output)
396
- end
397
-
398
- it "navigates unevenly paged output with right arrow until the end of selection" do
399
- prompt = TTY::TestPrompt.new
400
- choices = ('1'..'10').to_a
401
- prompt.on(:keypress) { |e| prompt.trigger(:keyright) if e.value == "l" }
402
- prompt.input << "l" << "l" << "l" << "\r"
403
- prompt.input.rewind
404
-
405
- answer = prompt.select("What number?", choices, default: 4, per_page: 4)
406
-
407
- expect(answer).to eq('10')
408
-
409
- expected_output = [
410
- output_helper('What number?', choices[3..6], "4", init: true,
411
- hint: "Use #{up_down} and #{left_right} arrow keys, press Enter to select"),
412
- output_helper('What number?', choices[4..7], "8"),
413
- output_helper('What number?', choices[8..9], "10"),
414
- output_helper('What number?', choices[8..9], "10"),
415
- "What number? \e[32m10\e[0m\n\e[?25h",
416
- ].join
417
-
418
- expect(prompt.output.string).to eq(expected_output)
419
- end
420
-
421
- it "navigates left and right" do
422
- prompt = TTY::TestPrompt.new
423
- choices = ('1'..'10').to_a
424
- prompt.on(:keypress) { |e|
425
- prompt.trigger(:keyright) if e.value == "l"
426
- prompt.trigger(:keyleft) if e.value == "h"
427
- }
428
- prompt.input << "l" << "l" << "h" << "\r"
429
- prompt.input.rewind
430
-
431
- answer = prompt.select("What number?", choices, default: 2, per_page: 4)
432
-
433
- expect(answer).to eq('6')
434
-
435
- expected_output = [
436
- output_helper('What number?', choices[0..3], "2", init: true,
437
- hint: "Use #{up_down} and #{left_right} arrow keys, press Enter to select"),
438
- output_helper('What number?', choices[4..7], "6"),
439
- output_helper('What number?', choices[8..9], "10"),
440
- output_helper('What number?', choices[4..7], "6"),
441
- "What number? \e[32m6\e[0m\n\e[?25h",
442
- ].join
443
-
444
- expect(prompt.output.string).to eq(expected_output)
445
- end
446
-
447
- it "combines up/down navigation with left/right" do
448
- prompt = TTY::TestPrompt.new
449
- choices = ('1'..'11').to_a
450
- prompt.on(:keypress) { |e|
451
- prompt.trigger(:keyup) if e.value == "k"
452
- prompt.trigger(:keydown) if e.value == "j"
453
- prompt.trigger(:keyright) if e.value == "l"
454
- prompt.trigger(:keyleft) if e.value == "h"
455
- }
456
- prompt.input << "j" << "l" << "k" << "k" << "h" << "\r"
457
- prompt.input.rewind
458
-
459
- answer = prompt.select("What number?", choices, default: 2, per_page: 4)
460
-
461
- expect(answer).to eq('1')
462
-
463
- expected_output = [
464
- output_helper('What number?', choices[0..3], "2", init: true,
465
- hint: "Use #{up_down} and #{left_right} arrow keys, press Enter to select"),
466
- output_helper('What number?', choices[0..3], "3"),
467
- output_helper('What number?', choices[4..7], "7"),
468
- output_helper('What number?', choices[4..7], "6"),
469
- output_helper('What number?', choices[3..6], "5"),
470
- output_helper('What number?', choices[0..3], "1"),
471
- "What number? \e[32m1\e[0m\n\e[?25h"
472
- ].join
473
-
474
- expect(prompt.output.string).to eq(expected_output)
475
- end
476
-
477
- it "navigates pages up/down with disabled items" do
478
- prompt = TTY::TestPrompt.new
479
- prompt.on(:keypress) { |e|
480
- prompt.trigger(:keyup) if e.value == "k"
481
- prompt.trigger(:keydown) if e.value == "j"
482
- }
483
- choices = [
484
- '1',
485
- {name: '2', disabled: 'out'},
486
- '3',
487
- {name: '4', disabled: 'out'},
488
- '5',
489
- {name: '6', disabled: 'out'},
490
- {name: '7', disabled: 'out'},
491
- '8',
492
- '9',
493
- {name: '10', disabled: 'out'},
494
- ]
495
-
496
- prompt.input << "j" << "j" << "j" << "j" << "\r"
497
- prompt.input.rewind
498
-
499
- answer = prompt.select("What number?", choices, per_page: 4)
500
-
501
- expect(answer).to eq('9')
502
-
503
- expected_output = [
504
- output_helper('What number?', choices[0..3], "1", init: true,
505
- hint: "Use #{up_down} and #{left_right} arrow keys, press Enter to select"),
506
- output_helper('What number?', choices[0..3], "3"),
507
- output_helper('What number?', choices[2..5], "5"),
508
- output_helper('What number?', choices[5..8], "8"),
509
- output_helper('What number?', choices[6..9], "9"),
510
- "What number? \e[32m9\e[0m\n\e[?25h"
511
- ].join('')
512
-
513
- expect(prompt.output.string).to eq(expected_output)
514
- end
515
-
516
- it "navigates pages left/right with disabled items" do
517
- prompt = TTY::TestPrompt.new
518
- prompt.on(:keypress) { |e|
519
- prompt.trigger(:keyright) if e.value == "l"
520
- prompt.trigger(:keyleft) if e.value == "h"
521
- }
522
- choices = [
523
- {name: '1', disabled: 'out'},
524
- '2',
525
- {name: '3', disabled: 'out'},
526
- '4',
527
- '5',
528
- {name: '6', disabled: 'out'},
529
- '7',
530
- '8',
531
- '9',
532
- {name: '10', disabled: 'out'}
533
- ]
534
-
535
- prompt.input << "l" << "l" << "l" << "h" << "h" << "h" << "\r"
536
- prompt.input.rewind
537
-
538
- answer = prompt.select("What number?", choices, per_page: 4)
539
-
540
- expect(answer).to eq('2')
541
-
542
- expected_output = [
543
- output_helper('What number?', choices[0..3], "2", init: true,
544
- hint: "Use #{up_down} and #{left_right} arrow keys, press Enter to select"),
545
- output_helper('What number?', choices[4..7], "7"),
546
- output_helper('What number?', choices[8..9], "9"),
547
- output_helper('What number?', choices[8..9], "9"),
548
- output_helper('What number?', choices[4..7], "5"),
549
- output_helper('What number?', choices[0..3], "2"),
550
- output_helper('What number?', choices[0..3], "2"),
551
- "What number? \e[32m2\e[0m\n\e[?25h"
552
- ].join('')
553
-
554
- expect(prompt.output.string).to eq(expected_output)
555
- end
556
- end
557
-
558
- context 'with :cycle option' do
559
- it "doesn't cycle by default" do
560
- prompt = TTY::TestPrompt.new
561
- choices = %w(A B C)
562
- prompt.on(:keypress) { |e| prompt.trigger(:keydown) if e.value == "j" }
563
- prompt.input << "j" << "j" << "j" << "\r"
564
- prompt.input.rewind
565
-
566
- value = prompt.select("What letter?", choices)
567
-
568
- expect(value).to eq("C")
569
- expected_output = [
570
- output_helper("What letter?", choices, "A", init: true,
571
- hint: "Use #{up_down} arrow keys, press Enter to select"),
572
- output_helper("What letter?", choices, "B"),
573
- output_helper("What letter?", choices, "C"),
574
- output_helper("What letter?", choices, "C"),
575
- "What letter? \e[32mC\e[0m\n\e[?25h"
576
- ].join
577
- expect(prompt.output.string).to eq(expected_output)
578
- end
579
-
580
- it "cycles around when configured to do so" do
581
- prompt = TTY::TestPrompt.new
582
- choices = %w(A B C)
583
- prompt.on(:keypress) { |e| prompt.trigger(:keydown) if e.value == "j" }
584
- prompt.input << "j" << "j" << "j" << "\r"
585
- prompt.input.rewind
586
-
587
- answer = prompt.select("What letter?", choices, cycle: true)
588
-
589
- expect(answer).to eq("A")
590
- expected_output = [
591
- output_helper("What letter?", choices, "A", init: true,
592
- hint: "Use #{up_down} arrow keys, press Enter to select"),
593
- output_helper("What letter?", choices, "B"),
594
- output_helper("What letter?", choices, "C"),
595
- output_helper("What letter?", choices, "A"),
596
- "What letter? \e[32mA\e[0m\n\e[?25h"
597
- ].join
598
- expect(prompt.output.string).to eq(expected_output)
599
- end
600
-
601
- it "cycles around disabled items" do
602
- prompt = TTY::TestPrompt.new
603
- choices = [
604
- {name: 'A', disabled: '(out)'},
605
- {name: 'B'},
606
- {name: 'C', disabled: '(out)'},
607
- {name: 'D'},
608
- {name: 'E', disabled: '(out)'},
609
- ]
610
- prompt.on(:keypress) { |e| prompt.trigger(:keydown) if e.value == "j" }
611
- prompt.input << "j" << "j" << "j" << "\r"
612
- prompt.input.rewind
613
- value = prompt.select("What letter?", choices, cycle: true, default: 2)
614
- expect(value).to eq("D")
615
-
616
- expected_output =
617
- output_helper("What letter?", choices, "B", init: true,
618
- hint: "Use #{up_down} arrow keys, press Enter to select") +
619
- output_helper("What letter?", choices, "D") +
620
- output_helper("What letter?", choices, "B") +
621
- output_helper("What letter?", choices, "D") +
622
- "What letter? \e[32mD\e[0m\n\e[?25h"
623
-
624
- expect(prompt.output.string).to eq(expected_output)
625
- end
626
-
627
- it "cycles choices using left/right arrows" do
628
- prompt = TTY::TestPrompt.new
629
- choices = ('1'..'10').to_a
630
- prompt.on(:keypress) { |e|
631
- prompt.trigger(:keyright) if e.value == "l"
632
- prompt.trigger(:keyleft) if e.value == "h"
633
- }
634
- prompt.input << "l" << "l" << "l" << "h" << "\r"
635
- prompt.input.rewind
636
-
637
- answer = prompt.select("What number?", choices, default: 2, per_page: 4, cycle: true)
638
-
639
- expect(answer).to eq('10')
640
-
641
- expected_output = [
642
- output_helper('What number?', choices[0..3], "2", init: true,
643
- hint: "Use #{up_down} and #{left_right} arrow keys, press Enter to select"),
644
- output_helper('What number?', choices[4..7], "6"),
645
- output_helper('What number?', choices[8..9], "10"),
646
- output_helper('What number?', choices[0..3], "2"),
647
- output_helper('What number?', choices[8..9], "10"),
648
- "What number? \e[32m10\e[0m\n\e[?25h",
649
- ].join
650
-
651
- expect(prompt.output.string).to eq(expected_output)
652
- end
653
-
654
- it "cycles pages left/right with disabled items" do
655
- prompt = TTY::TestPrompt.new
656
- prompt.on(:keypress) { |e|
657
- prompt.trigger(:keyright) if e.value == "l"
658
- prompt.trigger(:keyleft) if e.value == "h"
659
- }
660
- choices = [
661
- {name: '1', disabled: 'out'},
662
- '2',
663
- {name: '3', disabled: 'out'},
664
- '4',
665
- '5',
666
- {name: '6', disabled: 'out'},
667
- '7',
668
- '8',
669
- '9',
670
- {name: '10', disabled: 'out'}
671
- ]
672
-
673
- prompt.input << "l" << "l" << "l" << "h" << "h" << "h" << "\r"
674
- prompt.input.rewind
675
-
676
- answer = prompt.select("What number?", choices, per_page: 4, cycle: true)
677
-
678
- expect(answer).to eq('2')
679
-
680
- expected_output = [
681
- output_helper('What number?', choices[0..3], "2", init: true,
682
- hint: "Use #{up_down} and #{left_right} arrow keys, press Enter to select"),
683
- output_helper('What number?', choices[4..7], "7"),
684
- output_helper('What number?', choices[8..9], "9"),
685
- output_helper('What number?', choices[0..3], "2"),
686
- output_helper('What number?', choices[8..9], "9"),
687
- output_helper('What number?', choices[4..7], "5"),
688
- output_helper('What number?', choices[0..3], "2"),
689
- "What number? \e[32m2\e[0m\n\e[?25h"
690
- ].join('')
691
-
692
- expect(prompt.output.string).to eq(expected_output)
693
- end
694
- end
695
-
696
- it "verifies default index format" do
697
- prompt = TTY::TestPrompt.new
698
- choices = %w(Large Medium Small)
699
- prompt.input << "\r"
700
- prompt.input.rewind
701
-
702
- expect {
703
- prompt.select('What size?', choices, default: '')
704
- }.to raise_error(TTY::Prompt::ConfigurationError, /in range \(1 - 3\)/)
705
- end
706
-
707
- it "doesn't paginate short selections" do
708
- prompt = TTY::TestPrompt.new
709
- choices = %w(A B C D)
710
- prompt.input << "\r"
711
- prompt.input.rewind
712
- value = prompt.select("What letter?", choices, per_page: 4, default: 1)
713
- expect(value).to eq('A')
714
-
715
- expect(prompt.output.string).to eq([
716
- "\e[?25lWhat letter? \e[90m(Use #{up_down} arrow keys, press Enter to select)\e[0m\n",
717
- "\e[32m#{symbols[:marker]} A\e[0m\n",
718
- " B\n",
719
- " C\n",
720
- " D",
721
- "\e[2K\e[1G\e[1A" * 4,
722
- "\e[2K\e[1G",
723
- "What letter? \e[32mA\e[0m\n\e[?25h",
724
- ].join)
725
- end
726
-
727
- it "verifies default index range" do
728
- prompt = TTY::TestPrompt.new
729
- choices = %w(Large Medium Small)
730
- prompt.input << "\r"
731
- prompt.input.rewind
732
-
733
- expect {
734
- prompt.select("What size?", choices, default: 10)
735
- }.to raise_error(TTY::Prompt::ConfigurationError, /`10` out of range \(1 - 3\)/)
736
- end
737
-
738
- context "with filter" do
739
- it "doesn't allow mixing enumeration and filter" do
740
- prompt = TTY::TestPrompt.new
741
-
742
- expect {
743
- prompt.select("What size?", [], enum: '.', filter: true)
744
- }.to raise_error(TTY::Prompt::ConfigurationError, "Enumeration can't be used with filter")
745
- end
746
-
747
- it "filters and chooses a uniquely matching entry, ignoring case" do
748
- prompt = TTY::TestPrompt.new
749
- prompt.input << "U" << "g" << "\r"
750
- prompt.input.rewind
751
-
752
- answer = prompt.select("What size?", %w(Small Medium Large Huge), filter: true)
753
- expect(answer).to eql("Huge")
754
-
755
- actual_prompt_output = prompt.output.string
756
-
757
- expected_prompt_output =
758
- output_helper("What size?", %w(Small Medium Large Huge), "Small", init: true,
759
- hint: "Use #{up_down} arrow keys, press Enter to select, and letter keys to filter") +
760
- output_helper("What size?", %w(Medium Huge), "Medium", hint: 'Filter: "U"') +
761
- output_helper("What size?", %w(Huge), "Huge", hint: 'Filter: "Ug"') +
762
- exit_message("What size?", "Huge")
763
-
764
- expect(actual_prompt_output).to eql(expected_prompt_output)
765
- end
766
-
767
- it "filters and chooses the first of multiple matching entries" do
768
- prompt = TTY::TestPrompt.new
769
- prompt.input << "g" << "\r"
770
- prompt.input.rewind
771
-
772
- answer = prompt.select("What size?", %w(Small Medium Large Huge), filter: true)
773
- expect(answer).to eql("Large")
774
-
775
- actual_prompt_output = prompt.output.string
776
- expected_prompt_output =
777
- output_helper("What size?", %w(Small Medium Large Huge), "Small", init: true,
778
- hint: "Use #{up_down} arrow keys, press Enter to select, and letter keys to filter") +
779
- output_helper("What size?", %w(Large Huge), "Large", hint: 'Filter: "g"') +
780
- exit_message("What size?", "Large")
781
-
782
- expect(actual_prompt_output).to eql(expected_prompt_output)
783
- end
784
-
785
- it "filters based on alphanumeric and punctuation characters" do
786
- prompt = TTY::TestPrompt.new
787
- prompt.input << "p" << "*" << "2" << "\r"
788
- prompt.input.rewind
789
-
790
- answer = prompt.select("What email?", %w(p*1@mail.com p*2@mail.com p*3@mail.com), filter: true)
791
- expect(answer).to eql("p*2@mail.com")
792
-
793
- actual_prompt_output = prompt.output.string
794
- expected_prompt_output =
795
- output_helper("What email?", %w(p*1@mail.com p*2@mail.com p*3@mail.com), "p*1@mail.com", init: true,
796
- hint: "Use #{up_down} arrow keys, press Enter to select, and letter keys to filter") +
797
- output_helper("What email?", %w(p*1@mail.com p*2@mail.com p*3@mail.com), "p*1@mail.com", hint: 'Filter: "p"') +
798
- output_helper("What email?", %w(p*1@mail.com p*2@mail.com p*3@mail.com), "p*1@mail.com", hint: 'Filter: "p*"') +
799
- output_helper("What email?", %w(p*2@mail.com), "p*2@mail.com", hint: 'Filter: "p*2"') +
800
- exit_message("What email?", "p*2@mail.com")
801
-
802
- expect(actual_prompt_output).to eql(expected_prompt_output)
803
- end
804
-
805
- # This test can't be done in an exact way, at least, with the current framework
806
- it "doesn't exit when there are no matching entries" do
807
- prompt = TTY::TestPrompt.new
808
- prompt.on(:keypress) { |e| prompt.trigger(:keybackspace) if e.value == "a" }
809
- prompt.input << "z" << "\r" # shows no entry, blocking exit
810
- prompt.input << "a" << "\r" # triggers Backspace before `a` (see above)
811
- prompt.input.rewind
812
-
813
- answer = prompt.select("What size?", %w(Tiny Medium Large Huge), filter: true)
814
- expect(answer).to eql("Large")
815
-
816
- actual_prompt_output = prompt.output.string
817
- expected_prompt_output =
818
- output_helper("What size?", %w(Tiny Medium Large Huge), "Tiny", init: true,
819
- hint: "Use #{up_down} arrow keys, press Enter to select, and letter keys to filter") +
820
- output_helper("What size?", %w(), "", hint: 'Filter: "z"') +
821
- output_helper("What size?", %w(), "", hint: 'Filter: "z"') +
822
- output_helper("What size?", %w(Large), "Large", hint: 'Filter: "a"') +
823
- exit_message("What size?", "Large")
824
-
825
- expect(actual_prompt_output).to eql(expected_prompt_output)
826
- end
827
-
828
- it "cancels a selection" do
829
- prompt = TTY::TestPrompt.new
830
- prompt.on(:keypress) { |e| prompt.trigger(:keydelete) if e.value == "S" }
831
- prompt.input << "Hu"
832
- prompt.input << "S" # triggers Canc before `S` (see above)
833
- prompt.input << "\r"
834
- prompt.input.rewind
835
-
836
- answer = prompt.select("What size?", %w(Small Medium Large Huge), filter: true)
837
- expect(answer).to eql("Small")
838
-
839
- expected_prompt_output =
840
- output_helper("What size?", %w(Small Medium Large Huge), "Small", init: true,
841
- hint: "Use #{up_down} arrow keys, press Enter to select, and letter keys to filter") +
842
- output_helper("What size?", %w(Huge), "Huge", hint: 'Filter: "H"') +
843
- output_helper("What size?", %w(Huge), "Huge", hint: 'Filter: "Hu"') +
844
- output_helper("What size?", %w(Small), "Small", hint: 'Filter: "S"') +
845
- exit_message("What size?", "Small")
846
-
847
- expect(prompt.output.string).to eql(expected_prompt_output)
848
- end
849
- end
850
-
851
- context 'with :disabled choice' do
852
- it "omits disabled choice when navigating menu" do
853
- choices = [ 'Small', 'Medium', {name: 'Large', disabled: '(out of stock)'}, 'Huge' ]
854
- prompt = TTY::TestPrompt.new
855
- prompt.input << "j" << "j" << "\r"
856
- prompt.input.rewind
857
- prompt.on(:keypress) { |e| prompt.trigger(:keydown) if e.value == "j" }
858
-
859
- answer = prompt.select("What size?", choices)
860
- expect(answer).to eq('Huge')
861
-
862
- expected_output =
863
- output_helper("What size?", choices, "Small", init: true,
864
- hint: "Use #{up_down} arrow keys, press Enter to select") +
865
- output_helper("What size?", choices, "Medium") +
866
- output_helper("What size?", choices, "Huge") +
867
- "What size? \e[32mHuge\e[0m\n\e[?25h"
868
-
869
- expect(prompt.output.string).to eq(expected_output)
870
- end
871
-
872
- it "doesn't show disabled choice when filtering choices" do
873
- choices = [ 'A', 'B', {name: 'C', disabled: '(unavailable)'}, 'D' ]
874
- prompt = TTY::TestPrompt.new
875
- prompt.on(:keypress) { |e| prompt.trigger(:keybackspace) if e.value == "a" }
876
- prompt.input << "c" << "\r" # nothing matches
877
- prompt.input << "a" << "\r" # backtracks & chooses default option
878
- prompt.input.rewind
879
-
880
- answer = prompt.select("What letter?", choices, filter: true)
881
- expect(answer).to eq('A')
882
-
883
- expected_output =
884
- output_helper("What letter?", choices, "A", init: true,
885
- hint: "Use #{up_down} arrow keys, press Enter to select, and letter keys to filter") +
886
- output_helper("What letter?", [], "", hint: 'Filter: "c"') +
887
- output_helper("What letter?", [], "", hint: 'Filter: "c"') +
888
- output_helper("What letter?", ['A'], "A", hint: 'Filter: "a"') +
889
- exit_message("What letter?", "A")
890
-
891
- expect(prompt.output.string).to eq(expected_output)
892
- end
893
-
894
- it "omits disabled choice when number key is pressed" do
895
- choices = [ 'Small', {name: 'Medium', disabled: '(out of stock)'}, 'Large' ]
896
- prompt = TTY::TestPrompt.new
897
- prompt.input << "2" << "\r" << "\r"
898
- prompt.input.rewind
899
- answer = prompt.select('What size?') do |menu|
900
- menu.enum ')'
901
-
902
- menu.choice 'Small', 1
903
- menu.choice 'Medium', 2, disabled: '(out of stock)'
904
- menu.choice 'Large', 3
905
- end
906
- expect(answer).to eq(1)
907
-
908
- expected_output =
909
- output_helper("What size?", choices, "Small", init: true, enum: ') ',
910
- hint: "Use #{up_down} arrow or number (1-3) keys, press Enter to select") +
911
- output_helper("What size?", choices, "Small", enum: ') ') +
912
- "What size? \e[32mSmall\e[0m\n\e[?25h"
913
-
914
- expect(prompt.output.string).to eq(expected_output)
915
- end
916
-
917
- it "sets active to be first non-disabled choice" do
918
- choices = [
919
- {name: 'Small', disabled: '(out of stock)'}, 'Medium', 'Large', 'Huge'
920
- ]
921
- prompt = TTY::TestPrompt.new
922
- prompt.input << "\r"
923
- prompt.input.rewind
924
-
925
- answer = prompt.select("What size?", choices)
926
- expect(answer).to eq('Medium')
927
- end
928
-
929
- it "prevents setting default to disabled choice" do
930
- choices = [
931
- {name: 'Small', disabled: '(out of stock)'}, 'Medium', 'Large', 'Huge'
932
- ]
933
- prompt = TTY::TestPrompt.new
934
- prompt.input << "\r"
935
- prompt.input.rewind
936
-
937
- expect {
938
- prompt.select("What size?", choices, default: 1)
939
- }.to raise_error(TTY::Prompt::ConfigurationError, /default index `1` matches disabled choice item/)
940
- end
941
- end
942
- end