Changesets can be listed by changeset number.
The Git repository is here.
- Revision:
- 373
- Log:
Initial import of Radiant 0.9.1, which is now packaged as a gem. This is an
import of the tagged 0.9.1 source checked out from GitHub, which isn't quite
the same as the gem distribution - but it doesn't seem to be available in an
archived form and the installed gem already has modifications, so this is
the closest I can get.
- Author:
- rool
- Date:
- Mon Mar 21 13:40:05 +0000 2011
- Size:
- 25472 Bytes
1 | #!/usr/local/bin/ruby -w |
2 | |
3 | # tc_highline.rb |
4 | # |
5 | # Created by James Edward Gray II on 2005-04-26. |
6 | # Copyright 2005 Gray Productions. All rights reserved. |
7 | # |
8 | # This is Free Software. See LICENSE and COPYING for details. |
9 | |
10 | require "test/unit" |
11 | |
12 | require "highline" |
13 | require "stringio" |
14 | |
15 | if HighLine::CHARACTER_MODE == "Win32API" |
16 | class HighLine |
17 | # Override Windows' character reading so it's not tied to STDIN. |
18 | def get_character( input = STDIN ) |
19 | input.getc |
20 | end |
21 | end |
22 | end |
23 | |
24 | class TestHighLine < Test::Unit::TestCase |
25 | def setup |
26 | @input = StringIO.new |
27 | @output = StringIO.new |
28 | @terminal = HighLine.new(@input, @output) |
29 | end |
30 | |
31 | def test_agree |
32 | @input << "y\nyes\nYES\nHell no!\nNo\n" |
33 | @input.rewind |
34 | |
35 | assert_equal(true, @terminal.agree("Yes or no? ")) |
36 | assert_equal(true, @terminal.agree("Yes or no? ")) |
37 | assert_equal(true, @terminal.agree("Yes or no? ")) |
38 | assert_equal(false, @terminal.agree("Yes or no? ")) |
39 | |
40 | @input.truncate(@input.rewind) |
41 | @input << "yellow" |
42 | @input.rewind |
43 | |
44 | assert_equal(true, @terminal.agree("Yes or no? ", :getc)) |
45 | end |
46 | |
47 | def test_agree_with_block |
48 | @input << "\n\n" |
49 | @input.rewind |
50 | |
51 | assert_equal(true, @terminal.agree("Yes or no? ") { |q| q.default = "y" }) |
52 | assert_equal(false, @terminal.agree("Yes or no? ") { |q| q.default = "n" }) |
53 | end |
54 | |
55 | def test_ask |
56 | name = "James Edward Gray II" |
57 | @input << name << "\n" |
58 | @input.rewind |
59 | |
60 | assert_equal(name, @terminal.ask("What is your name? ")) |
61 | |
62 | assert_raise(EOFError) { @terminal.ask("Any input left? ") } |
63 | end |
64 | |
65 | def test_bug_fixes |
66 | # auto-complete bug |
67 | @input << "ruby\nRuby\n" |
68 | @input.rewind |
69 | |
70 | languages = [:Perl, :Python, :Ruby] |
71 | answer = @terminal.ask( "What is your favorite programming language? ", |
72 | languages ) |
73 | assert_equal(languages.last, answer) |
74 | |
75 | @input.truncate(@input.rewind) |
76 | @input << "ruby\n" |
77 | @input.rewind |
78 | |
79 | answer = @terminal.ask( "What is your favorite programming language? ", |
80 | languages ) do |q| |
81 | q.case = :capitalize |
82 | end |
83 | assert_equal(languages.last, answer) |
84 | |
85 | # poor auto-complete error message |
86 | @input.truncate(@input.rewind) |
87 | @input << "lisp\nruby\n" |
88 | @input.rewind |
89 | @output.truncate(@output.rewind) |
90 | |
91 | answer = @terminal.ask( "What is your favorite programming language? ", |
92 | languages ) do |q| |
93 | q.case = :capitalize |
94 | end |
95 | assert_equal(languages.last, answer) |
96 | assert_equal( "What is your favorite programming language? " + |
97 | "You must choose one of [:Perl, :Python, :Ruby].\n" + |
98 | "? ", @output.string ) |
99 | end |
100 | |
101 | def test_case_changes |
102 | @input << "jeg2\n" |
103 | @input.rewind |
104 | |
105 | answer = @terminal.ask("Enter your initials ") do |q| |
106 | q.case = :up |
107 | end |
108 | assert_equal("JEG2", answer) |
109 | |
110 | @input.truncate(@input.rewind) |
111 | @input << "cRaZY\n" |
112 | @input.rewind |
113 | |
114 | answer = @terminal.ask("Enter a search string: ") do |q| |
115 | q.case = :down |
116 | end |
117 | assert_equal("crazy", answer) |
118 | end |
119 | |
120 | def test_character_echo |
121 | @input << "password\r" |
122 | @input.rewind |
123 | |
124 | answer = @terminal.ask("Please enter your password: ") do |q| |
125 | q.echo = "*" |
126 | end |
127 | assert_equal("password", answer) |
128 | assert_equal("Please enter your password: ********\n", @output.string) |
129 | |
130 | @input.truncate(@input.rewind) |
131 | @input << "2" |
132 | @input.rewind |
133 | @output.truncate(@output.rewind) |
134 | |
135 | answer = @terminal.ask( "Select an option (1, 2 or 3): ", |
136 | Integer ) do |q| |
137 | q.echo = "*" |
138 | q.character = true |
139 | end |
140 | assert_equal(2, answer) |
141 | assert_equal("Select an option (1, 2 or 3): *\n", @output.string) |
142 | end |
143 | |
144 | def test_backspace_does_not_enter_prompt |
145 | @input << "\b\b" |
146 | @input.rewind |
147 | answer = @terminal.ask("Please enter your password: ") do |q| |
148 | q.echo = "*" |
149 | end |
150 | assert_equal("", answer) |
151 | assert_equal("Please enter your password: \n",@output.string) |
152 | end |
153 | |
154 | def test_readline_on_non_echo_question_has_prompt |
155 | @input << "you can't see me" |
156 | @input.rewind |
157 | answer = @terminal.ask("Please enter some hidden text: ") do |q| |
158 | q.readline = true |
159 | q.echo = "*" |
160 | end |
161 | assert_equal("you can't see me", answer) |
162 | assert_equal("Please enter some hidden text: ****************\n",@output.string) |
163 | end |
164 | |
165 | def test_character_reading |
166 | # WARNING: This method does NOT cover Unix and Windows savvy testing! |
167 | @input << "12345" |
168 | @input.rewind |
169 | |
170 | answer = @terminal.ask("Enter a single digit: ", Integer) do |q| |
171 | q.character = :getc |
172 | end |
173 | assert_equal(1, answer) |
174 | end |
175 | |
176 | def test_color |
177 | @terminal.say("This should be <%= BLUE %>blue<%= CLEAR %>!") |
178 | assert_equal("This should be \e[34mblue\e[0m!\n", @output.string) |
179 | |
180 | @output.truncate(@output.rewind) |
181 | |
182 | @terminal.say( "This should be " + |
183 | "<%= BOLD + ON_WHITE %>bold on white<%= CLEAR %>!" ) |
184 | assert_equal( "This should be \e[1m\e[47mbold on white\e[0m!\n", |
185 | @output.string ) |
186 | |
187 | @output.truncate(@output.rewind) |
188 | |
189 | @terminal.say("This should be <%= color('cyan', CYAN) %>!") |
190 | assert_equal("This should be \e[36mcyan\e[0m!\n", @output.string) |
191 | |
192 | @output.truncate(@output.rewind) |
193 | |
194 | @terminal.say( "This should be " + |
195 | "<%= color('blinking on red', :blink, :on_red) %>!" ) |
196 | assert_equal( "This should be \e[5m\e[41mblinking on red\e[0m!\n", |
197 | @output.string ) |
198 | |
199 | @output.truncate(@output.rewind) |
200 | |
201 | # turn off color |
202 | old_setting = HighLine.use_color? |
203 | assert_nothing_raised(Exception) { HighLine.use_color = false } |
204 | @terminal.say("This should be <%= color('cyan', CYAN) %>!") |
205 | assert_equal("This should be cyan!\n", @output.string) |
206 | HighLine.use_color = old_setting |
207 | end |
208 | |
209 | def test_confirm |
210 | @input << "junk.txt\nno\nsave.txt\ny\n" |
211 | @input.rewind |
212 | |
213 | answer = @terminal.ask("Enter a filename: ") do |q| |
214 | q.confirm = "Are you sure you want to overwrite <%= @answer %>? " |
215 | q.responses[:ask_on_error] = :question |
216 | end |
217 | assert_equal("save.txt", answer) |
218 | assert_equal( "Enter a filename: " + |
219 | "Are you sure you want to overwrite junk.txt? " + |
220 | "Enter a filename: " + |
221 | "Are you sure you want to overwrite save.txt? ", |
222 | @output.string ) |
223 | |
224 | @input.truncate(@input.rewind) |
225 | @input << "junk.txt\nyes\nsave.txt\nn\n" |
226 | @input.rewind |
227 | @output.truncate(@output.rewind) |
228 | |
229 | answer = @terminal.ask("Enter a filename: ") do |q| |
230 | q.confirm = "Are you sure you want to overwrite <%= @answer %>? " |
231 | end |
232 | assert_equal("junk.txt", answer) |
233 | assert_equal( "Enter a filename: " + |
234 | "Are you sure you want to overwrite junk.txt? ", |
235 | @output.string ) |
236 | end |
237 | |
238 | def test_defaults |
239 | @input << "\nNo Comment\n" |
240 | @input.rewind |
241 | |
242 | answer = @terminal.ask("Are you sexually active? ") do |q| |
243 | q.validate = /\Ay(?:es)?|no?|no comment\Z/i |
244 | end |
245 | assert_equal("No Comment", answer) |
246 | |
247 | @input.truncate(@input.rewind) |
248 | @input << "\nYes\n" |
249 | @input.rewind |
250 | @output.truncate(@output.rewind) |
251 | |
252 | answer = @terminal.ask("Are you sexually active? ") do |q| |
253 | q.default = "No Comment" |
254 | q.validate = /\Ay(?:es)?|no?|no comment\Z/i |
255 | end |
256 | assert_equal("No Comment", answer) |
257 | assert_equal( "Are you sexually active? |No Comment| ", |
258 | @output.string ) |
259 | end |
260 | |
261 | def test_empty |
262 | @input << "\n" |
263 | @input.rewind |
264 | |
265 | answer = @terminal.ask("") do |q| |
266 | q.default = "yes" |
267 | q.validate = /\Ay(?:es)?|no?\Z/i |
268 | end |
269 | assert_equal("yes", answer) |
270 | end |
271 | |
272 | def test_erb |
273 | @terminal.say( "The integers from 1 to 10 are:\n" + |
274 | "% (1...10).each do |n|\n" + |
275 | "\t<%= n %>,\n" + |
276 | "% end\n" + |
277 | "\tand 10" ) |
278 | assert_equal( "The integers from 1 to 10 are:\n" + |
279 | "\t1,\n\t2,\n\t3,\n\t4,\n\t5,\n" + |
280 | "\t6,\n\t7,\n\t8,\n\t9,\n\tand 10\n", |
281 | @output.string ) |
282 | end |
283 | |
284 | def test_files |
285 | @input << "#{File.basename(__FILE__)[0, 5]}\n" |
286 | @input.rewind |
287 | |
288 | file = @terminal.ask("Select a file: ", File) do |q| |
289 | q.directory = File.expand_path(File.dirname(__FILE__)) |
290 | q.glob = "*.rb" |
291 | end |
292 | assert_instance_of(File, file) |
293 | assert_equal("#!/usr/local/bin/ruby -w\n", file.gets) |
294 | assert_equal("\n", file.gets) |
295 | assert_equal("# tc_highline.rb\n", file.gets) |
296 | file.close |
297 | |
298 | @input.rewind |
299 | |
300 | pathname = @terminal.ask("Select a file: ", Pathname) do |q| |
301 | q.directory = File.expand_path(File.dirname(__FILE__)) |
302 | q.glob = "*.rb" |
303 | end |
304 | assert_instance_of(Pathname, pathname) |
305 | assert_equal(File.size(__FILE__), pathname.size) |
306 | end |
307 | |
308 | def test_gather |
309 | @input << "James\nDana\nStorm\nGypsy\n\n" |
310 | @input.rewind |
311 | |
312 | answers = @terminal.ask("Enter four names:") do |q| |
313 | q.gather = 4 |
314 | end |
315 | assert_equal(%w{James Dana Storm Gypsy}, answers) |
316 | assert_equal("\n", @input.gets) |
317 | assert_equal("Enter four names:\n", @output.string) |
318 | |
319 | @input.rewind |
320 | |
321 | answers = @terminal.ask("Enter four names:") do |q| |
322 | q.gather = "" |
323 | end |
324 | assert_equal(%w{James Dana Storm Gypsy}, answers) |
325 | |
326 | @input.rewind |
327 | |
328 | answers = @terminal.ask("Enter four names:") do |q| |
329 | q.gather = /^\s*$/ |
330 | end |
331 | assert_equal(%w{James Dana Storm Gypsy}, answers) |
332 | |
333 | @input.truncate(@input.rewind) |
334 | @input << "29\n49\n30\n" |
335 | @input.rewind |
336 | @output.truncate(@output.rewind) |
337 | |
338 | answers = @terminal.ask("<%= @key %>: ", Integer) do |q| |
339 | q.gather = { "Age" => 0, "Wife's Age" => 0, "Father's Age" => 0} |
340 | end |
341 | assert_equal( { "Age" => 29, "Wife's Age" => 30, "Father's Age" => 49}, |
342 | answers ) |
343 | assert_equal("Age: Father's Age: Wife's Age: ", @output.string) |
344 | end |
345 | |
346 | def test_lists |
347 | digits = %w{Zero One Two Three Four Five Six Seven Eight Nine} |
348 | erb_digits = digits.dup |
349 | erb_digits[erb_digits.index("Five")] = "<%= color('Five', :blue) %%>" |
350 | |
351 | @terminal.say("<%= list(#{digits.inspect}) %>") |
352 | assert_equal(digits.map { |d| "#{d}\n" }.join, @output.string) |
353 | |
354 | @output.truncate(@output.rewind) |
355 | |
356 | @terminal.say("<%= list(#{digits.inspect}, :inline) %>") |
357 | assert_equal( digits[0..-2].join(", ") + " or #{digits.last}\n", |
358 | @output.string ) |
359 | |
360 | @output.truncate(@output.rewind) |
361 | |
362 | @terminal.say("<%= list(#{digits.inspect}, :inline, ' and ') %>") |
363 | assert_equal( digits[0..-2].join(", ") + " and #{digits.last}\n", |
364 | @output.string ) |
365 | |
366 | @output.truncate(@output.rewind) |
367 | |
368 | @terminal.say("<%= list(#{digits.inspect}, :columns_down, 3) %>") |
369 | assert_equal( "Zero Four Eight\n" + |
370 | "One Five Nine \n" + |
371 | "Two Six \n" + |
372 | "Three Seven\n", |
373 | @output.string ) |
374 | |
375 | @output.truncate(@output.rewind) |
376 | |
377 | @terminal.say("<%= list(#{erb_digits.inspect}, :columns_down, 3) %>") |
378 | assert_equal( "Zero Four Eight\n" + |
379 | "One \e[34mFive\e[0m Nine \n" + |
380 | "Two Six \n" + |
381 | "Three Seven\n", |
382 | @output.string ) |
383 | |
384 | colums_of_twenty = ["12345678901234567890"] * 5 |
385 | |
386 | @output.truncate(@output.rewind) |
387 | |
388 | @terminal.say("<%= list(#{colums_of_twenty.inspect}, :columns_down) %>") |
389 | assert_equal( "12345678901234567890 12345678901234567890 " + |
390 | "12345678901234567890\n" + |
391 | "12345678901234567890 12345678901234567890\n", |
392 | @output.string ) |
393 | |
394 | @output.truncate(@output.rewind) |
395 | |
396 | @terminal.say("<%= list(#{digits.inspect}, :columns_across, 3) %>") |
397 | assert_equal( "Zero One Two \n" + |
398 | "Three Four Five \n" + |
399 | "Six Seven Eight\n" + |
400 | "Nine \n", |
401 | @output.string ) |
402 | |
403 | colums_of_twenty.pop |
404 | |
405 | @output.truncate(@output.rewind) |
406 | |
407 | @terminal.say("<%= list( #{colums_of_twenty.inspect}, :columns_across ) %>") |
408 | assert_equal( "12345678901234567890 12345678901234567890 " + |
409 | "12345678901234567890\n" + |
410 | "12345678901234567890\n", |
411 | @output.string ) |
412 | end |
413 | |
414 | def test_mode |
415 | assert(%w[Win32API termios stty].include?(HighLine::CHARACTER_MODE)) |
416 | end |
417 | |
418 | class NameClass |
419 | def self.parse( string ) |
420 | if string =~ /^\s*(\w+),\s*(\w+)\s+(\w+)\s*$/ |
421 | self.new($2, $3, $1) |
422 | else |
423 | raise ArgumentError, "Invalid name format." |
424 | end |
425 | end |
426 | |
427 | def initialize(first, middle, last) |
428 | @first, @middle, @last = first, middle, last |
429 | end |
430 | |
431 | attr_reader :first, :middle, :last |
432 | end |
433 | |
434 | def test_my_class_conversion |
435 | @input << "Gray, James Edward\n" |
436 | @input.rewind |
437 | |
438 | answer = @terminal.ask("Your name? ", NameClass) do |q| |
439 | q.validate = lambda do |name| |
440 | names = name.split(/,\s*/) |
441 | return false unless names.size == 2 |
442 | return false if names.first =~ /\s/ |
443 | names.last.split.size == 2 |
444 | end |
445 | end |
446 | assert_instance_of(NameClass, answer) |
447 | assert_equal("Gray", answer.last) |
448 | assert_equal("James", answer.first) |
449 | assert_equal("Edward", answer.middle) |
450 | end |
451 | |
452 | def test_no_echo |
453 | @input << "password\r" |
454 | @input.rewind |
455 | |
456 | answer = @terminal.ask("Please enter your password: ") do |q| |
457 | q.echo = false |
458 | end |
459 | assert_equal("password", answer) |
460 | assert_equal("Please enter your password: \n", @output.string) |
461 | |
462 | @input.rewind |
463 | @output.truncate(@output.rewind) |
464 | |
465 | answer = @terminal.ask("Pick a letter or number: ") do |q| |
466 | q.character = true |
467 | q.echo = false |
468 | end |
469 | assert_equal("p", answer) |
470 | assert_equal("a", @input.getc.chr) |
471 | assert_equal("Pick a letter or number: \n", @output.string) |
472 | end |
473 | |
474 | def test_paging |
475 | @terminal.page_at = 22 |
476 | |
477 | @input << "\n\n" |
478 | @input.rewind |
479 | |
480 | @terminal.say((1..50).map { |n| "This is line #{n}.\n"}.join) |
481 | assert_equal( (1..22).map { |n| "This is line #{n}.\n"}.join + |
482 | "\n-- press enter/return to continue or q to stop -- \n\n" + |
483 | (23..44).map { |n| "This is line #{n}.\n"}.join + |
484 | "\n-- press enter/return to continue or q to stop -- \n\n" + |
485 | (45..50).map { |n| "This is line #{n}.\n"}.join, |
486 | @output.string ) |
487 | end |
488 | |
489 | def test_range_requirements |
490 | @input << "112\n-541\n28\n" |
491 | @input.rewind |
492 | |
493 | answer = @terminal.ask("Tell me your age.", Integer) do |q| |
494 | q.in = 0..105 |
495 | end |
496 | assert_equal(28, answer) |
497 | assert_equal( "Tell me your age.\n" + |
498 | "Your answer isn't within the expected range " + |
499 | "(included in 0..105).\n" + |
500 | "? " + |
501 | "Your answer isn't within the expected range " + |
502 | "(included in 0..105).\n" + |
503 | "? ", @output.string ) |
504 | |
505 | @input.truncate(@input.rewind) |
506 | @input << "1\n-541\n28\n" |
507 | @input.rewind |
508 | @output.truncate(@output.rewind) |
509 | |
510 | answer = @terminal.ask("Tell me your age.", Integer) do |q| |
511 | q.above = 3 |
512 | end |
513 | assert_equal(28, answer) |
514 | assert_equal( "Tell me your age.\n" + |
515 | "Your answer isn't within the expected range " + |
516 | "(above 3).\n" + |
517 | "? " + |
518 | "Your answer isn't within the expected range " + |
519 | "(above 3).\n" + |
520 | "? ", @output.string ) |
521 | |
522 | @input.truncate(@input.rewind) |
523 | @input << "1\n28\n-541\n" |
524 | @input.rewind |
525 | @output.truncate(@output.rewind) |
526 | |
527 | answer = @terminal.ask("Lowest numer you can think of?", Integer) do |q| |
528 | q.below = 0 |
529 | end |
530 | assert_equal(-541, answer) |
531 | assert_equal( "Lowest numer you can think of?\n" + |
532 | "Your answer isn't within the expected range " + |
533 | "(below 0).\n" + |
534 | "? " + |
535 | "Your answer isn't within the expected range " + |
536 | "(below 0).\n" + |
537 | "? ", @output.string ) |
538 | |
539 | @input.truncate(@input.rewind) |
540 | @input << "1\n-541\n6\n" |
541 | @input.rewind |
542 | @output.truncate(@output.rewind) |
543 | |
544 | answer = @terminal.ask("Enter a low even number: ", Integer) do |q| |
545 | q.above = 0 |
546 | q.below = 10 |
547 | q.in = [2, 4, 6, 8] |
548 | end |
549 | assert_equal(6, answer) |
550 | assert_equal( "Enter a low even number: " + |
551 | "Your answer isn't within the expected range " + |
552 | "(above 0, below 10, and included in [2, 4, 6, 8]).\n" + |
553 | "? " + |
554 | "Your answer isn't within the expected range " + |
555 | "(above 0, below 10, and included in [2, 4, 6, 8]).\n" + |
556 | "? ", @output.string ) |
557 | end |
558 | |
559 | def test_reask |
560 | number = 61676 |
561 | @input << "Junk!\n" << number << "\n" |
562 | @input.rewind |
563 | |
564 | answer = @terminal.ask("Favorite number? ", Integer) |
565 | assert_kind_of(Integer, number) |
566 | assert_instance_of(Fixnum, number) |
567 | assert_equal(number, answer) |
568 | assert_equal( "Favorite number? " + |
569 | "You must enter a valid Integer.\n" + |
570 | "? ", @output.string ) |
571 | |
572 | @input.rewind |
573 | @output.truncate(@output.rewind) |
574 | |
575 | answer = @terminal.ask("Favorite number? ", Integer) do |q| |
576 | q.responses[:ask_on_error] = :question |
577 | q.responses[:invalid_type] = "Not a valid number!" |
578 | end |
579 | assert_kind_of(Integer, number) |
580 | assert_instance_of(Fixnum, number) |
581 | assert_equal(number, answer) |
582 | assert_equal( "Favorite number? " + |
583 | "Not a valid number!\n" + |
584 | "Favorite number? ", @output.string ) |
585 | |
586 | @input.truncate(@input.rewind) |
587 | @input << "gen\ngene\n" |
588 | @input.rewind |
589 | @output.truncate(@output.rewind) |
590 | |
591 | answer = @terminal.ask("Select a mode: ", [:generate, :gentle]) |
592 | assert_instance_of(Symbol, answer) |
593 | assert_equal(:generate, answer) |
594 | assert_equal( "Select a mode: " + |
595 | "Ambiguous choice. " + |
596 | "Please choose one of [:generate, :gentle].\n" + |
597 | "? ", @output.string ) |
598 | end |
599 | |
600 | def test_response_embedding |
601 | @input << "112\n-541\n28\n" |
602 | @input.rewind |
603 | |
604 | answer = @terminal.ask("Tell me your age.", Integer) do |q| |
605 | q.in = 0..105 |
606 | q.responses[:not_in_range] = "Need a <%= @question.answer_type %>" + |
607 | " <%= @question.expected_range %>." |
608 | end |
609 | assert_equal(28, answer) |
610 | assert_equal( "Tell me your age.\n" + |
611 | "Need a Integer included in 0..105.\n" + |
612 | "? " + |
613 | "Need a Integer included in 0..105.\n" + |
614 | "? ", @output.string ) |
615 | end |
616 | |
617 | def test_say |
618 | @terminal.say("This will have a newline.") |
619 | assert_equal("This will have a newline.\n", @output.string) |
620 | |
621 | @output.truncate(@output.rewind) |
622 | |
623 | @terminal.say("This will also have one newline.\n") |
624 | assert_equal("This will also have one newline.\n", @output.string) |
625 | |
626 | @output.truncate(@output.rewind) |
627 | |
628 | @terminal.say("This will not have a newline. ") |
629 | assert_equal("This will not have a newline. ", @output.string) |
630 | end |
631 | |
632 | def test_type_conversion |
633 | number = 61676 |
634 | @input << number << "\n" |
635 | @input.rewind |
636 | |
637 | answer = @terminal.ask("Favorite number? ", Integer) |
638 | assert_kind_of(Integer, answer) |
639 | assert_instance_of(Fixnum, answer) |
640 | assert_equal(number, answer) |
641 | |
642 | @input.truncate(@input.rewind) |
643 | number = 1_000_000_000_000_000_000_000_000_000_000 |
644 | @input << number << "\n" |
645 | @input.rewind |
646 | |
647 | answer = @terminal.ask("Favorite number? ", Integer) |
648 | assert_kind_of(Integer, answer) |
649 | assert_instance_of(Bignum, answer) |
650 | assert_equal(number, answer) |
651 | |
652 | @input.truncate(@input.rewind) |
653 | number = 10.5002 |
654 | @input << number << "\n" |
655 | @input.rewind |
656 | |
657 | answer = @terminal.ask( "Favorite number? ", |
658 | lambda { |n| n.to_f.abs.round } ) |
659 | assert_kind_of(Integer, answer) |
660 | assert_instance_of(Fixnum, answer) |
661 | assert_equal(11, answer) |
662 | |
663 | @input.truncate(@input.rewind) |
664 | animal = :dog |
665 | @input << animal << "\n" |
666 | @input.rewind |
667 | |
668 | answer = @terminal.ask("Favorite animal? ", Symbol) |
669 | assert_instance_of(Symbol, answer) |
670 | assert_equal(animal, answer) |
671 | |
672 | @input.truncate(@input.rewind) |
673 | @input << "16th June 1976\n" |
674 | @input.rewind |
675 | |
676 | answer = @terminal.ask("Enter your birthday.", Date) |
677 | assert_instance_of(Date, answer) |
678 | assert_equal(16, answer.day) |
679 | assert_equal(6, answer.month) |
680 | assert_equal(1976, answer.year) |
681 | |
682 | @input.truncate(@input.rewind) |
683 | pattern = "^yes|no$" |
684 | @input << pattern << "\n" |
685 | @input.rewind |
686 | |
687 | answer = @terminal.ask("Give me a pattern to match with: ", Regexp) |
688 | assert_instance_of(Regexp, answer) |
689 | assert_equal(/#{pattern}/, answer) |
690 | |
691 | @input.truncate(@input.rewind) |
692 | @input << "gen\n" |
693 | @input.rewind |
694 | |
695 | answer = @terminal.ask("Select a mode: ", [:generate, :run]) |
696 | assert_instance_of(Symbol, answer) |
697 | assert_equal(:generate, answer) |
698 | end |
699 | |
700 | def test_validation |
701 | @input << "system 'rm -rf /'\n105\n0b101_001\n" |
702 | @input.rewind |
703 | |
704 | answer = @terminal.ask("Enter a binary number: ") do |q| |
705 | q.validate = /\A(?:0b)?[01_]+\Z/ |
706 | end |
707 | assert_equal("0b101_001", answer) |
708 | assert_equal( "Enter a binary number: " + |
709 | "Your answer isn't valid " + |
710 | "(must match /\\A(?:0b)?[01_]+\\Z/).\n" + |
711 | "? " + |
712 | "Your answer isn't valid " + |
713 | "(must match /\\A(?:0b)?[01_]+\\Z/).\n" + |
714 | "? ", @output.string ) |
715 | |
716 | @input.truncate(@input.rewind) |
717 | @input << "Gray II, James Edward\n" + |
718 | "Gray, Dana Ann Leslie\n" + |
719 | "Gray, James Edward\n" |
720 | @input.rewind |
721 | |
722 | answer = @terminal.ask("Your name? ") do |q| |
723 | q.validate = lambda do |name| |
724 | names = name.split(/,\s*/) |
725 | return false unless names.size == 2 |
726 | return false if names.first =~ /\s/ |
727 | names.last.split.size == 2 |
728 | end |
729 | end |
730 | assert_equal("Gray, James Edward", answer) |
731 | end |
732 | |
733 | def test_whitespace |
734 | @input << " A lot\tof \t space\t \there! \n" |
735 | @input.rewind |
736 | |
737 | answer = @terminal.ask("Enter a whitespace filled string: ") do |q| |
738 | q.whitespace = :chomp |
739 | end |
740 | assert_equal(" A lot\tof \t space\t \there! ", answer) |
741 | |
742 | @input.rewind |
743 | |
744 | answer = @terminal.ask("Enter a whitespace filled string: ") |
745 | assert_equal("A lot\tof \t space\t \there!", answer) |
746 | |
747 | @input.rewind |
748 | |
749 | answer = @terminal.ask("Enter a whitespace filled string: ") do |q| |
750 | q.whitespace = :strip_and_collapse |
751 | end |
752 | assert_equal("A lot of space here!", answer) |
753 | |
754 | @input.rewind |
755 | |
756 | answer = @terminal.ask("Enter a whitespace filled string: ") do |q| |
757 | q.whitespace = :remove |
758 | end |
759 | assert_equal("Alotofspacehere!", answer) |
760 | |
761 | @input.rewind |
762 | |
763 | answer = @terminal.ask("Enter a whitespace filled string: ") do |q| |
764 | q.whitespace = :none |
765 | end |
766 | assert_equal(" A lot\tof \t space\t \there! \n", answer) |
767 | end |
768 | |
769 | def test_wrap |
770 | @terminal.wrap_at = 80 |
771 | |
772 | @terminal.say("This is a very short line.") |
773 | assert_equal("This is a very short line.\n", @output.string) |
774 | |
775 | @output.truncate(@output.rewind) |
776 | |
777 | @terminal.say( "This is a long flowing paragraph meant to span " + |
778 | "several lines. This text should definitely be " + |
779 | "wrapped at the set limit, in the result. Your code " + |
780 | "does well with things like this.\n\n" + |
781 | " * This is a simple embedded list.\n" + |
782 | " * You're code should not mess with this...\n" + |
783 | " * Because it's already formatted correctly and " + |
784 | "does not\n" + |
785 | " exceed the limit!" ) |
786 | assert_equal( "This is a long flowing paragraph meant to span " + |
787 | "several lines. This text should\n" + |
788 | "definitely be wrapped at the set limit, in the " + |
789 | "result. Your code does well with\n" + |
790 | "things like this.\n\n" + |
791 | " * This is a simple embedded list.\n" + |
792 | " * You're code should not mess with this...\n" + |
793 | " * Because it's already formatted correctly and does " + |
794 | "not\n" + |
795 | " exceed the limit!\n", @output.string ) |
796 | |
797 | @output.truncate(@output.rewind) |
798 | |
799 | @terminal.say("-=" * 50) |
800 | assert_equal(("-=" * 40 + "\n") + ("-=" * 10 + "\n"), @output.string) |
801 | end |
802 | |
803 | def test_track_eof |
804 | assert_raise(EOFError) { @terminal.ask("Any input left? ") } |
805 | |
806 | # turn EOF tracking |
807 | old_setting = HighLine.track_eof? |
808 | assert_nothing_raised(Exception) { HighLine.track_eof = false } |
809 | begin |
810 | @terminal.ask("And now? ") # this will still blow up, nothing available |
811 | rescue |
812 | assert_not_equal(EOFError, $!.class) # but HighLine's safe guards are off |
813 | end |
814 | HighLine.track_eof = old_setting |
815 | end |
816 | |
817 | def test_version |
818 | assert_not_nil(HighLine::VERSION) |
819 | assert_instance_of(String, HighLine::VERSION) |
820 | assert(HighLine::VERSION.frozen?) |
821 | assert_match(/\A\d\.\d\.\d\Z/, HighLine::VERSION) |
822 | end |
823 | end |