highline 1.7.10 → 2.0.0.pre.develop.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.simplecov +5 -0
  4. data/.travis.yml +11 -6
  5. data/Changelog.md +112 -20
  6. data/Gemfile +8 -7
  7. data/README.rdoc +3 -0
  8. data/Rakefile +7 -2
  9. data/appveyor.yml +19 -0
  10. data/examples/asking_for_arrays.rb +3 -0
  11. data/examples/basic_usage.rb +3 -0
  12. data/examples/get_character.rb +3 -0
  13. data/examples/limit.rb +3 -0
  14. data/examples/menus.rb +3 -0
  15. data/examples/overwrite.rb +3 -0
  16. data/examples/password.rb +3 -0
  17. data/examples/repeat_entry.rb +4 -1
  18. data/lib/highline.rb +182 -704
  19. data/lib/highline/builtin_styles.rb +109 -0
  20. data/lib/highline/color_scheme.rb +4 -1
  21. data/lib/highline/compatibility.rb +2 -0
  22. data/lib/highline/custom_errors.rb +19 -0
  23. data/lib/highline/import.rb +4 -2
  24. data/lib/highline/list.rb +93 -0
  25. data/lib/highline/list_renderer.rb +232 -0
  26. data/lib/highline/menu.rb +20 -20
  27. data/lib/highline/paginator.rb +43 -0
  28. data/lib/highline/question.rb +157 -97
  29. data/lib/highline/question/answer_converter.rb +84 -0
  30. data/lib/highline/question_asker.rb +147 -0
  31. data/lib/highline/simulate.rb +5 -1
  32. data/lib/highline/statement.rb +58 -0
  33. data/lib/highline/string.rb +34 -0
  34. data/lib/highline/string_extensions.rb +3 -28
  35. data/lib/highline/style.rb +18 -8
  36. data/lib/highline/template_renderer.rb +38 -0
  37. data/lib/highline/terminal.rb +78 -0
  38. data/lib/highline/terminal/io_console.rb +98 -0
  39. data/lib/highline/terminal/ncurses.rb +38 -0
  40. data/lib/highline/terminal/unix_stty.rb +94 -0
  41. data/lib/highline/version.rb +3 -1
  42. data/lib/highline/wrapper.rb +43 -0
  43. data/test/acceptance/acceptance.rb +62 -0
  44. data/test/acceptance/acceptance_test.rb +69 -0
  45. data/test/acceptance/at_color_output_using_erb_templates.rb +17 -0
  46. data/test/acceptance/at_echo_false.rb +23 -0
  47. data/test/acceptance/at_readline.rb +37 -0
  48. data/test/io_console_compatible.rb +37 -0
  49. data/test/string_methods.rb +3 -0
  50. data/test/test_answer_converter.rb +26 -0
  51. data/test/{tc_color_scheme.rb → test_color_scheme.rb} +7 -9
  52. data/test/test_helper.rb +26 -0
  53. data/test/{tc_highline.rb → test_highline.rb} +193 -136
  54. data/test/{tc_import.rb → test_import.rb} +5 -2
  55. data/test/test_list.rb +60 -0
  56. data/test/{tc_menu.rb → test_menu.rb} +6 -3
  57. data/test/test_paginator.rb +73 -0
  58. data/test/test_question_asker.rb +20 -0
  59. data/test/test_simulator.rb +24 -0
  60. data/test/test_string_extension.rb +72 -0
  61. data/test/{tc_string_highline.rb → test_string_highline.rb} +7 -3
  62. data/test/{tc_style.rb → test_style.rb} +70 -35
  63. data/test/test_wrapper.rb +188 -0
  64. metadata +57 -22
  65. data/lib/highline/system_extensions.rb +0 -254
  66. data/test/tc_simulator.rb +0 -33
  67. data/test/tc_string_extension.rb +0 -33
@@ -0,0 +1,69 @@
1
+ # coding: utf-8
2
+
3
+ require 'highline/import'
4
+
5
+ class HighLine::AcceptanceTest
6
+ @@answers ||= {}
7
+
8
+ def self.check(&block)
9
+ caller_file = File.basename(caller[0].split(":")[-3])
10
+
11
+ test = new
12
+ yield test
13
+ test.caller_file = caller_file
14
+ test.check
15
+ end
16
+
17
+ def self.answers
18
+ @@answers
19
+ end
20
+
21
+ def self.answers_for_report
22
+ answers.map do |file, answer|
23
+ "#{file}: #{answer}"
24
+ end.join("\n")
25
+ end
26
+
27
+ # A test description to be shown to user.
28
+ # It should express what the user is
29
+ # expected to check.
30
+ attr_accessor :desc
31
+
32
+ # A test action to be checked by the user
33
+ attr_accessor :action
34
+
35
+ # A text asking the confirmation if
36
+ # the action worked (y) or not (n).
37
+ attr_accessor :question
38
+
39
+ # Automatically filled attribute pointing
40
+ # to the file where the current test
41
+ # source is located. So we could check
42
+ # at the report what tests passed or failed.
43
+ attr_accessor :caller_file
44
+
45
+ def check
46
+ # Print a header with the test description
47
+ puts "====="
48
+ puts " #{caller_file}"
49
+ puts "====="
50
+ puts
51
+ puts desc
52
+
53
+ # Execute the proc/lambda assigned to action
54
+ puts "---"
55
+ puts
56
+ action.call
57
+ puts
58
+ puts "---"
59
+ puts
60
+
61
+ # Gather the user feedback about the test
62
+ print question
63
+ answer = STDIN.gets.chomp
64
+ answer = "y" if answer.empty?
65
+ @@answers[caller_file] = answer
66
+
67
+ puts
68
+ end
69
+ end
@@ -0,0 +1,17 @@
1
+ # coding: utf-8
2
+
3
+ require_relative 'acceptance_test'
4
+
5
+ HighLine::AcceptanceTest.check do |t|
6
+ t.desc =
7
+ "This step checks if coloring " \
8
+ "with erb templates is working ok.\n" \
9
+ "You should see the word _grass_ " \
10
+ "colored in green color"
11
+
12
+ t.action = Proc.new do
13
+ say "The <%= color('grass', :green) %> should be green!"
14
+ end
15
+
16
+ t.question = "Do you see the word 'grass' on green color (y/n)? "
17
+ end
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+
3
+ require_relative 'acceptance_test'
4
+
5
+ HighLine::AcceptanceTest.check do |t|
6
+ t.desc =
7
+ "This step checks if the 'echo = false' " \
8
+ "setting is effective in hiding the user " \
9
+ "typed characters.\n" \
10
+ "This functionality is useful when asking " \
11
+ "for passwords.\n" \
12
+ "When typing the characters you should not " \
13
+ "see any of them on the screen."
14
+
15
+ t.action = Proc.new do
16
+ answer = ask "Enter some characters and press <enter>: " do |q|
17
+ q.echo = false
18
+ end
19
+ puts "You've entered -> #{answer} <-"
20
+ end
21
+
22
+ t.question = "Were the characters adequately hidden when you typed them (y/n)? "
23
+ end
@@ -0,0 +1,37 @@
1
+ # coding: utf-8
2
+
3
+ require_relative 'acceptance_test'
4
+
5
+ HighLine::AcceptanceTest.check do |t|
6
+ t.desc =
7
+ "This step checks if the readline autocomplete " \
8
+ "feature is working. \n" \
9
+ "The test has 5 options you can choose from: " \
10
+ "save, sample, exec, exit and load.\n" \
11
+ "If you type the first character of one of them and then press \n" \
12
+ "the <TAB> key you should see the options available for autocomplete.\n\n" \
13
+ "For example, if I type 's' and then I press <TAB> I should see a list\n" \
14
+ "with 'save' and 'sample' as possible options for autocomplete.\n\n" \
15
+ "Although, if I type 'l' and then press the <TAB> key it should be \n" \
16
+ "readly autcompleted as 'load', because 'load' is the only option\n" \
17
+ "that begins with the 'l' letter in this particular case.\n\n" \
18
+ "If I don't type any character but press <TAB> two times, I should\n" \
19
+ "be able to see ALL available options.\n\n" \
20
+ "Please, play with Readline autocomplete for a while, pressing <ENTER>\n" \
21
+ "to see that it really gets the selected answer.\n" \
22
+ "When ready, just type 'exit' and the loop will finish.\n\n" \
23
+ "Don't forget to answer 'y' (yes) or 'n' (no) to the question at the end."
24
+
25
+ t.action = Proc.new do
26
+ loop do
27
+ cmd =
28
+ ask "Enter command: ", %w{ save sample exec exit load } do |q|
29
+ q.readline = true
30
+ end
31
+ say("Executing \"#{cmd}\"...")
32
+ break if cmd == "exit"
33
+ end
34
+ end
35
+
36
+ t.question = "Did the Readline autocomplete work fine (y/n)? "
37
+ end
@@ -0,0 +1,37 @@
1
+ # coding: utf-8
2
+
3
+ require 'stringio'
4
+ require 'tempfile'
5
+
6
+ #
7
+ # On tests, we try to simulate input output with
8
+ # StringIO, Tempfile and File objects.
9
+ #
10
+ # For this to be accomplished, we have to do some
11
+ # tweaking so that they respond adequately to the
12
+ # called methods during tests.
13
+ #
14
+
15
+ module IOConsoleCompatible
16
+ def getch
17
+ getc
18
+ end
19
+
20
+ attr_accessor :echo
21
+
22
+ def winsize
23
+ [24, 80]
24
+ end
25
+ end
26
+
27
+ class Tempfile
28
+ include IOConsoleCompatible
29
+ end
30
+
31
+ class File
32
+ include IOConsoleCompatible
33
+ end
34
+
35
+ class StringIO
36
+ include IOConsoleCompatible
37
+ end
@@ -1,3 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # coding: utf-8
3
+
1
4
  # string_methods.rb
2
5
  #
3
6
  # Created by Richard LeBer 2011-06-27
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ require "test_helper"
5
+
6
+ require "highline/question"
7
+
8
+ class TestAnswerConverter < Minitest::Test
9
+ def test_integer_convertion
10
+ question = HighLine::Question.new("What's your age?", Integer)
11
+ question.answer = "18"
12
+ answer_converter = HighLine::Question::AnswerConverter.new(question)
13
+
14
+ refute_equal "18", answer_converter.convert
15
+ assert_equal 18, answer_converter.convert
16
+ end
17
+
18
+ def test_float_convertion
19
+ question = HighLine::Question.new("Write PI", Float)
20
+ question.answer = "3.14159"
21
+ answer_converter = HighLine::Question::AnswerConverter.new(question)
22
+
23
+ refute_equal "3.14159", answer_converter.convert
24
+ assert_equal 3.14159, answer_converter.convert
25
+ end
26
+ end
@@ -1,3 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # coding: utf-8
3
+
1
4
  # tc_color_scheme.rb
2
5
  #
3
6
  # Created by Jeremy Hinegardner on 2007-01-24.
@@ -5,22 +8,17 @@
5
8
  #
6
9
  # This is Free Software. See LICENSE and COPYING for details.
7
10
 
8
- require "test/unit"
11
+ require "test_helper"
9
12
 
10
13
  require "highline"
11
14
  require "stringio"
12
15
 
13
- class TestColorScheme < Test::Unit::TestCase
16
+ class TestColorScheme < Minitest::Test
14
17
  def setup
18
+ HighLine.reset
15
19
  @input = StringIO.new
16
20
  @output = StringIO.new
17
21
  @terminal = HighLine.new(@input, @output)
18
-
19
- @old_color_scheme = HighLine.color_scheme
20
- end
21
-
22
- def teardown
23
- HighLine.color_scheme = @old_color_scheme
24
22
  end
25
23
 
26
24
  def test_using_color_scheme
@@ -88,7 +86,7 @@ class TestColorScheme < Test::Unit::TestCase
88
86
  assert_equal [:bold, :yellow], HighLine.color_scheme.definition(:warning)
89
87
 
90
88
  # turn it back off, should raise an exception
91
- HighLine.color_scheme = @old_color_scheme
89
+ HighLine.color_scheme = nil
92
90
  assert_raises(NameError) {
93
91
  @terminal.say("This should be <%= color('nothing at all', :error) %>.")
94
92
  }
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ require 'simplecov'
5
+
6
+ if ENV['CODECLIMATE_REPO_TOKEN']
7
+ require "codeclimate-test-reporter"
8
+ CodeClimate::TestReporter.start
9
+ end
10
+
11
+ # Compatibility module for StringIO, File
12
+ # and Tempfile. Necessary for some tests.
13
+ require "io_console_compatible"
14
+
15
+ require 'highline'
16
+ debug_message = "Tests will be run under:\n"
17
+ debug_message << " - #{HighLine.new.terminal.class}\n"
18
+ debug_message << " - HighLine::VERSION #{HighLine::VERSION}\n"
19
+
20
+ if defined? RUBY_DESCRIPTION
21
+ debug_message << " - #{RUBY_DESCRIPTION}\n"
22
+ end
23
+
24
+ puts debug_message
25
+
26
+ require "minitest/autorun"
@@ -1,4 +1,6 @@
1
- # encoding: utf-8
1
+ #!/usr/bin/env ruby
2
+ # coding: utf-8
3
+
2
4
  # tc_highline.rb
3
5
  #
4
6
  # Created by James Edward Gray II on 2005-04-26.
@@ -6,13 +8,14 @@
6
8
  #
7
9
  # This is Free Software. See LICENSE and COPYING for details.
8
10
 
9
- require "test/unit"
11
+ require "test_helper"
10
12
 
11
13
  require "highline"
12
14
  require "stringio"
13
15
  require "readline"
14
16
  require "tempfile"
15
17
 
18
+ =begin
16
19
  if HighLine::CHARACTER_MODE == "Win32API"
17
20
  class HighLine
18
21
  # Override Windows' character reading so it's not tied to STDIN.
@@ -21,9 +24,11 @@ if HighLine::CHARACTER_MODE == "Win32API"
21
24
  end
22
25
  end
23
26
  end
27
+ =end
24
28
 
25
- class TestHighLine < Test::Unit::TestCase
29
+ class TestHighLine < Minitest::Test
26
30
  def setup
31
+ HighLine.reset
27
32
  @input = StringIO.new
28
33
  @output = StringIO.new
29
34
  @terminal = HighLine.new(@input, @output)
@@ -60,7 +65,7 @@ class TestHighLine < Test::Unit::TestCase
60
65
 
61
66
  assert_equal(name, @terminal.ask("What is your name? "))
62
67
 
63
- assert_raise(EOFError) { @terminal.ask("Any input left? ") }
68
+ assert_raises(EOFError) { @terminal.ask("Any input left? ") }
64
69
  end
65
70
 
66
71
  def test_ask_string
@@ -70,7 +75,25 @@ class TestHighLine < Test::Unit::TestCase
70
75
 
71
76
  assert_equal(name, @terminal.ask("What is your name? ", String))
72
77
 
73
- assert_raise(EOFError) { @terminal.ask("Any input left? ", String) }
78
+ assert_raises(EOFError) { @terminal.ask("Any input left? ", String) }
79
+ end
80
+
81
+ def test_ask_string_converting
82
+ name = "James Edward Gray II"
83
+ @input << name << "\n"
84
+ @input.rewind
85
+
86
+ answer = @terminal.ask("What is your name? ", String)
87
+
88
+ assert_instance_of HighLine::String, answer
89
+
90
+ @input.rewind
91
+
92
+ answer = @terminal.ask("What is your name? ", HighLine::String)
93
+
94
+ assert_instance_of HighLine::String, answer
95
+
96
+ assert_raises(EOFError) { @terminal.ask("Any input left? ", HighLine::String) }
74
97
  end
75
98
 
76
99
  def test_indent
@@ -91,28 +114,29 @@ class TestHighLine < Test::Unit::TestCase
91
114
  assert_equal(' '*10+text, @output.string)
92
115
 
93
116
  @output.truncate(@output.rewind)
117
+ @terminal.indent_level=0
94
118
  @terminal.indent_size=4
95
119
  @terminal.indent {
96
- @terminal.say(text)
120
+ @terminal.say(text)
97
121
  }
98
122
  assert_equal(' '*4+text, @output.string)
99
123
 
100
124
  @output.truncate(@output.rewind)
101
125
  @terminal.indent_size=2
102
126
  @terminal.indent(3) { |t|
103
- t.say(text)
127
+ t.say(text)
104
128
  }
105
129
  assert_equal(' '*6+text, @output.string)
106
130
 
107
131
  @output.truncate(@output.rewind)
108
132
  @terminal.indent { |t|
133
+ t.indent {
109
134
  t.indent {
110
- t.indent {
111
- t.indent { |tt|
112
- tt.say(text)
113
- }
114
- }
135
+ t.indent { |tt|
136
+ tt.say(text)
137
+ }
115
138
  }
139
+ }
116
140
  }
117
141
  assert_equal(' '*8+text, @output.string)
118
142
 
@@ -194,6 +218,35 @@ class TestHighLine < Test::Unit::TestCase
194
218
  assert_equal("crazy", answer)
195
219
  end
196
220
 
221
+ def test_ask_with_overwrite
222
+ @input << "Yes, sure!\n"
223
+ @input.rewind
224
+
225
+ answer = @terminal.ask("Do you like Ruby? ") do |q|
226
+ q.overwrite = true
227
+ q.echo = false
228
+ end
229
+
230
+ assert_equal("Yes, sure!", answer)
231
+ erase_sequence = "\r#{HighLine.Style(:erase_line).code}"
232
+ assert_equal("Do you like Ruby? #{erase_sequence}", @output.string)
233
+ end
234
+
235
+ def test_ask_with_overwrite_and_character_mode
236
+ @input << "Y"
237
+ @input.rewind
238
+
239
+ answer = @terminal.ask("Do you like Ruby (Y/N)? ") do |q|
240
+ q.overwrite = true
241
+ q.echo = false
242
+ q.character = true
243
+ end
244
+
245
+ assert_equal("Y", answer)
246
+ erase_sequence = "\r#{HighLine.Style(:erase_line).code}"
247
+ assert_equal("Do you like Ruby (Y/N)? #{erase_sequence}", @output.string)
248
+ end
249
+
197
250
  def test_character_echo
198
251
  @input << "password\r"
199
252
  @input.rewind
@@ -249,12 +302,20 @@ class TestHighLine < Test::Unit::TestCase
249
302
  end
250
303
 
251
304
  def test_readline_mode
252
- # Rubinius seems to be ignoring Readline input
253
- # and output assignments. This ruins testing.
254
- # but it doesn't mean readline is not working
255
- # properly on rubinius.
256
-
257
- return if RUBY_ENGINE == "rbx"
305
+ #
306
+ # Rubinius (and JRuby) seems to be ignoring
307
+ # Readline input and output assignments. This
308
+ # ruins testing.
309
+ #
310
+ # But it doesn't mean readline is not working
311
+ # properly on rubinius or jruby.
312
+ #
313
+
314
+ terminal = @terminal.terminal
315
+
316
+ if terminal.jruby? or terminal.rubinius? or terminal.windows?
317
+ skip "We can't test Readline on JRuby, Rubinius and Windows yet"
318
+ end
258
319
 
259
320
  # Creating Tempfiles here because Readline.input
260
321
  # and Readline.output only accepts a File object
@@ -381,6 +442,14 @@ class TestHighLine < Test::Unit::TestCase
381
442
  @terminal.say("This should be <%= ON_RGB_C06030 %>on_rgb_c06030<%= CLEAR %>!")
382
443
  assert_equal("This should be \e[48;5;173mon_rgb_c06030\e[0m!\n", @output.string)
383
444
 
445
+ # Relying on const_missing
446
+ assert_instance_of HighLine::Style, HighLine::ON_RGB_C06031_STYLE
447
+ assert_instance_of String , HighLine::ON_RGB_C06032
448
+ assert_raises(NameError) { HighLine::ON_RGB_ZZZZZZ }
449
+
450
+ # Retrieving color_code from a style
451
+ assert_equal "\e[41m", @terminal.color_code([HighLine::ON_RED_STYLE])
452
+
384
453
  @output.truncate(@output.rewind)
385
454
 
386
455
  # Does class method work, too?
@@ -392,7 +461,7 @@ class TestHighLine < Test::Unit::TestCase
392
461
 
393
462
  # turn off color
394
463
  old_setting = HighLine.use_color?
395
- assert_nothing_raised(Exception) { HighLine.use_color = false }
464
+ HighLine.use_color = false
396
465
  @terminal.say("This should be <%= color('cyan', CYAN) %>!")
397
466
  assert_equal("This should be cyan!\n", @output.string)
398
467
  HighLine.use_color = old_setting
@@ -448,7 +517,7 @@ class TestHighLine < Test::Unit::TestCase
448
517
  @input.rewind
449
518
 
450
519
  answer = @terminal.ask("Enter a filename: ") do |q|
451
- q.confirm = "Are you sure you want to overwrite <%= @answer %>? "
520
+ q.confirm = "Are you sure you want to overwrite <%= answer %>? "
452
521
  q.responses[:ask_on_error] = :question
453
522
  end
454
523
  assert_equal("save.txt", answer)
@@ -464,7 +533,7 @@ class TestHighLine < Test::Unit::TestCase
464
533
  @output.truncate(@output.rewind)
465
534
 
466
535
  answer = @terminal.ask("Enter a filename: ") do |q|
467
- q.confirm = "Are you sure you want to overwrite <%= @answer %>? "
536
+ q.confirm = "Are you sure you want to overwrite <%= answer %>? "
468
537
  end
469
538
  assert_equal("junk.txt", answer)
470
539
  assert_equal( "Enter a filename: " +
@@ -472,6 +541,35 @@ class TestHighLine < Test::Unit::TestCase
472
541
  @output.string )
473
542
  end
474
543
 
544
+ def test_generic_confirm_with_true
545
+ @input << "junk.txt\nno\nsave.txt\ny\n"
546
+ @input.rewind
547
+
548
+ answer = @terminal.ask("Enter a filename: ") do |q|
549
+ q.confirm = true
550
+ q.responses[:ask_on_error] = :question
551
+ end
552
+ assert_equal("save.txt", answer)
553
+ assert_equal( "Enter a filename: " +
554
+ "Are you sure? " +
555
+ "Enter a filename: " +
556
+ "Are you sure? ",
557
+ @output.string )
558
+
559
+ @input.truncate(@input.rewind)
560
+ @input << "junk.txt\nyes\nsave.txt\nn\n"
561
+ @input.rewind
562
+ @output.truncate(@output.rewind)
563
+
564
+ answer = @terminal.ask("Enter a filename: ") do |q|
565
+ q.confirm = true
566
+ end
567
+ assert_equal("junk.txt", answer)
568
+ assert_equal( "Enter a filename: " +
569
+ "Are you sure? ",
570
+ @output.string )
571
+ end
572
+
475
573
  def test_defaults
476
574
  @input << "\nNo Comment\n"
477
575
  @input.rewind
@@ -576,10 +674,10 @@ class TestHighLine < Test::Unit::TestCase
576
674
  end
577
675
 
578
676
  def test_files
579
- @input << "#{File.basename(__FILE__)[0, 5]}\n"
677
+ @input << "#{File.basename(__FILE__)[0, 7]}\n"
580
678
  @input.rewind
581
679
 
582
- assert_equal "tc_hi\n",@input.read
680
+ assert_equal "test_hi\n",@input.read
583
681
  @input.rewind
584
682
 
585
683
  file = @terminal.ask("Select a file: ", File) do |q|
@@ -587,7 +685,7 @@ class TestHighLine < Test::Unit::TestCase
587
685
  q.glob = "*.rb"
588
686
  end
589
687
  assert_instance_of(File, file)
590
- assert_equal("# encoding: utf-8\n", file.gets)
688
+ assert_equal("#!/usr/bin/env ruby\n", file.gets)
591
689
  file.close
592
690
 
593
691
  @input.rewind
@@ -600,7 +698,7 @@ class TestHighLine < Test::Unit::TestCase
600
698
  assert_equal(File.size(__FILE__), pathname.size)
601
699
  end
602
700
 
603
- def test_gather
701
+ def test_gather_with_integer
604
702
  @input << "James\nDana\nStorm\nGypsy\n\n"
605
703
  @input.rewind
606
704
 
@@ -610,27 +708,33 @@ class TestHighLine < Test::Unit::TestCase
610
708
  assert_equal(%w{James Dana Storm Gypsy}, answers)
611
709
  assert_equal("\n", @input.gets)
612
710
  assert_equal("Enter four names:\n", @output.string)
711
+ end
613
712
 
713
+ def test_gather_with_an_empty_string
714
+ @input << "James\nDana\nStorm\nGypsy\n\n"
614
715
  @input.rewind
615
716
 
616
717
  answers = @terminal.ask("Enter four names:") do |q|
617
718
  q.gather = ""
618
719
  end
619
720
  assert_equal(%w{James Dana Storm Gypsy}, answers)
721
+ end
620
722
 
723
+ def test_gather_with_regexp
724
+ @input << "James\nDana\nStorm\nGypsy\n\n"
621
725
  @input.rewind
622
726
 
623
727
  answers = @terminal.ask("Enter four names:") do |q|
624
728
  q.gather = /^\s*$/
625
729
  end
626
730
  assert_equal(%w{James Dana Storm Gypsy}, answers)
731
+ end
627
732
 
628
- @input.truncate(@input.rewind)
733
+ def test_gather_with_hash
629
734
  @input << "29\n49\n30\n"
630
735
  @input.rewind
631
- @output.truncate(@output.rewind)
632
736
 
633
- answers = @terminal.ask("<%= @key %>: ", Integer) do |q|
737
+ answers = @terminal.ask("<%= key %>: ", Integer) do |q|
634
738
  q.gather = { "Age" => 0, "Wife's Age" => 0, "Father's Age" => 0}
635
739
  end
636
740
  assert_equal( { "Age" => 29, "Wife's Age" => 30, "Father's Age" => 49},
@@ -669,7 +773,7 @@ class TestHighLine < Test::Unit::TestCase
669
773
  @input.rewind
670
774
  @output.truncate(@output.rewind)
671
775
 
672
- answer = @terminal.ask("<%= @key %>: ") do |q|
776
+ answer = @terminal.ask("<%= key %>: ") do |q|
673
777
  q.verify_match = true
674
778
  q.gather = {"Enter a password" => '', "Please type it again" => ''}
675
779
  end
@@ -680,7 +784,7 @@ class TestHighLine < Test::Unit::TestCase
680
784
  @input.rewind
681
785
  @output.truncate(@output.rewind)
682
786
 
683
- answer = @terminal.ask("<%= @key %>: ") do |q|
787
+ answer = @terminal.ask("<%= key %>: ") do |q|
684
788
  q.verify_match = true
685
789
  q.responses[:mismatch] = 'Typing mismatch!'
686
790
  q.responses[:ask_on_error] = ''
@@ -855,8 +959,8 @@ class TestHighLine < Test::Unit::TestCase
855
959
  end
856
960
 
857
961
  def test_mode
858
- assert(%w[Win32API termios ncurses stty jline].include?(HighLine::CHARACTER_MODE),
859
- "#{HighLine::CHARACTER_MODE} not in list")
962
+ assert(%w[io_console Win32API termios ncurses stty unix_stty jline].include?(@terminal.terminal.character_mode),
963
+ "#{@terminal.terminal.character_mode} not in list")
860
964
  end
861
965
 
862
966
  class NameClass
@@ -924,7 +1028,7 @@ class TestHighLine < Test::Unit::TestCase
924
1028
  end
925
1029
 
926
1030
  assert_equal "ação", answer
927
- assert_equal Encoding::default_external, answer.encoding
1031
+ assert_equal Encoding::UTF_8, answer.encoding
928
1032
  end
929
1033
 
930
1034
  def test_backspace_with_ascii_when_echo_false
@@ -935,7 +1039,7 @@ class TestHighLine < Test::Unit::TestCase
935
1039
  q.echo = false
936
1040
  end
937
1041
 
938
- assert_not_equal("password", answer)
1042
+ refute_equal("password", answer)
939
1043
  assert_equal("passwor", answer)
940
1044
  end
941
1045
 
@@ -947,7 +1051,7 @@ class TestHighLine < Test::Unit::TestCase
947
1051
  q.echo = false
948
1052
  end
949
1053
 
950
- assert_not_equal("maçã", answer)
1054
+ refute_equal("maçã", answer)
951
1055
  assert_equal("maç", answer)
952
1056
  end
953
1057
 
@@ -962,63 +1066,6 @@ class TestHighLine < Test::Unit::TestCase
962
1066
  assert_equal("Type: ****\n", @output.string)
963
1067
  assert_equal("maçã", answer)
964
1068
  end
965
-
966
- def test_paging
967
- @terminal.page_at = 22
968
-
969
- @input << "\n\n"
970
- @input.rewind
971
-
972
- @terminal.say((1..50).map { |n| "This is line #{n}.\n"}.join)
973
- assert_equal( (1..22).map { |n| "This is line #{n}.\n"}.join +
974
- "\n-- press enter/return to continue or q to stop -- \n\n" +
975
- (23..44).map { |n| "This is line #{n}.\n"}.join +
976
- "\n-- press enter/return to continue or q to stop -- \n\n" +
977
- (45..50).map { |n| "This is line #{n}.\n"}.join,
978
- @output.string )
979
- end
980
-
981
- def test_statement_lines_count_equal_to_page_at_shouldnt_paginate
982
- @terminal.page_at = 6
983
-
984
- @input << "\n"
985
- @input.rewind
986
-
987
- list = "a\nb\nc\nd\ne\nf\n"
988
-
989
- @terminal.say(list)
990
- assert_equal(list, @output.string)
991
- end
992
-
993
- def test_statement_with_one_line_bigger_than_page_at_should_paginate
994
- @terminal.page_at = 6
995
-
996
- @input << "\n"
997
- @input.rewind
998
-
999
- list = "a\nb\nc\nd\ne\nf\ng\n"
1000
-
1001
- paginated =
1002
- "a\nb\nc\nd\ne\nf\n" \
1003
- "\n-- press enter/return to continue or q to stop -- \n\n" \
1004
- "g\n"
1005
-
1006
- @terminal.say(list)
1007
- assert_equal(paginated, @output.string)
1008
- end
1009
-
1010
- def test_quiting_paging_shouldnt_raise
1011
- # See https://github.com/JEG2/highline/issues/168
1012
-
1013
- @terminal.page_at = 6
1014
-
1015
- @input << "q"
1016
- @input.rewind
1017
-
1018
- list = "a\nb\nc\nd\ne\nf\n"
1019
-
1020
- assert_nothing_raised { @terminal.say(list) }
1021
- end
1022
1069
 
1023
1070
  def test_range_requirements
1024
1071
  @input << "112\n-541\n28\n"
@@ -1070,6 +1117,24 @@ class TestHighLine < Test::Unit::TestCase
1070
1117
  "(below 0).\n" +
1071
1118
  "? ", @output.string )
1072
1119
 
1120
+ @input.truncate(@input.rewind)
1121
+ @input << "-541\n11\n6\n"
1122
+ @input.rewind
1123
+ @output.truncate(@output.rewind)
1124
+
1125
+ answer = @terminal.ask("Enter a low even number: ", Integer) do |q|
1126
+ q.above = 0
1127
+ q.below = 10
1128
+ end
1129
+ assert_equal(6, answer)
1130
+ assert_equal( "Enter a low even number: " +
1131
+ "Your answer isn't within the expected range " +
1132
+ "(above 0 and below 10).\n" +
1133
+ "? " +
1134
+ "Your answer isn't within the expected range " +
1135
+ "(above 0 and below 10).\n" +
1136
+ "? ", @output.string )
1137
+
1073
1138
  @input.truncate(@input.rewind)
1074
1139
  @input << "1\n-541\n6\n"
1075
1140
  @input.rewind
@@ -1137,8 +1202,8 @@ class TestHighLine < Test::Unit::TestCase
1137
1202
 
1138
1203
  answer = @terminal.ask("Tell me your age.", Integer) do |q|
1139
1204
  q.in = 0..105
1140
- q.responses[:not_in_range] = "Need a <%= @question.answer_type %>" +
1141
- " <%= @question.expected_range %>."
1205
+ q.responses[:not_in_range] = "Need a #{q.answer_type}" +
1206
+ " #{q.expected_range}."
1142
1207
  end
1143
1208
  assert_equal(28, answer)
1144
1209
  assert_equal( "Tell me your age.\n" +
@@ -1162,6 +1227,11 @@ class TestHighLine < Test::Unit::TestCase
1162
1227
  @terminal.say("This will not have a newline. ")
1163
1228
  assert_equal("This will not have a newline. ", @output.string)
1164
1229
 
1230
+ @output.truncate(@output.rewind)
1231
+
1232
+ @terminal.say("This will not have a newline.\t")
1233
+ assert_equal("This will not have a newline.\t", @output.string)
1234
+
1165
1235
  @output.truncate(@output.rewind)
1166
1236
 
1167
1237
  @terminal.say("This will not\n end with a newline. ")
@@ -1186,7 +1256,7 @@ class TestHighLine < Test::Unit::TestCase
1186
1256
 
1187
1257
  @output.truncate(@output.rewind)
1188
1258
 
1189
- assert_nothing_raised { @terminal.say(nil) }
1259
+ @terminal.say(nil)
1190
1260
  assert_equal("", @output.string)
1191
1261
  end
1192
1262
 
@@ -1194,18 +1264,18 @@ class TestHighLine < Test::Unit::TestCase
1194
1264
  integer = 10
1195
1265
  hash = { :a => 20 }
1196
1266
 
1197
- assert_nothing_raised { @terminal.say(integer) }
1267
+ @terminal.say(integer)
1198
1268
  assert_equal String(integer), @output.string.chomp
1199
1269
 
1200
1270
  @output.truncate(@output.rewind)
1201
1271
 
1202
- assert_nothing_raised { @terminal.say(hash) }
1272
+ @terminal.say(hash)
1203
1273
  assert_equal String(hash), @output.string.chomp
1204
1274
  end
1205
1275
 
1206
1276
  def test_terminal_size
1207
- assert_instance_of(Fixnum, @terminal.terminal_size[0])
1208
- assert_instance_of(Fixnum, @terminal.terminal_size[1])
1277
+ assert_instance_of(Fixnum, @terminal.terminal.terminal_size[0])
1278
+ assert_instance_of(Fixnum, @terminal.terminal.terminal_size[1])
1209
1279
  end
1210
1280
 
1211
1281
  def test_type_conversion
@@ -1320,6 +1390,20 @@ class TestHighLine < Test::Unit::TestCase
1320
1390
 
1321
1391
  @input.rewind
1322
1392
 
1393
+ answer = @terminal.ask("Enter a whitespace filled string: ") do |q|
1394
+ q.whitespace = :strip
1395
+ end
1396
+ assert_equal("A lot\tof \t space\t \there!", answer)
1397
+
1398
+ @input.rewind
1399
+
1400
+ answer = @terminal.ask("Enter a whitespace filled string: ") do |q|
1401
+ q.whitespace = :collapse
1402
+ end
1403
+ assert_equal(" A lot of space here! ", answer)
1404
+
1405
+ @input.rewind
1406
+
1323
1407
  answer = @terminal.ask("Enter a whitespace filled string: ")
1324
1408
  assert_equal("A lot\tof \t space\t \there!", answer)
1325
1409
 
@@ -1343,60 +1427,33 @@ class TestHighLine < Test::Unit::TestCase
1343
1427
  q.whitespace = :none
1344
1428
  end
1345
1429
  assert_equal(" A lot\tof \t space\t \there! \n", answer)
1346
- end
1347
-
1348
- def test_wrap
1349
- @terminal.wrap_at = 80
1350
-
1351
- @terminal.say("This is a very short line.")
1352
- assert_equal("This is a very short line.\n", @output.string)
1353
-
1354
- @output.truncate(@output.rewind)
1355
1430
 
1356
- @terminal.say( "This is a long flowing paragraph meant to span " +
1357
- "several lines. This text should definitely be " +
1358
- "wrapped at the set limit, in the result. Your code " +
1359
- "does well with things like this.\n\n" +
1360
- " * This is a simple embedded list.\n" +
1361
- " * You're code should not mess with this...\n" +
1362
- " * Because it's already formatted correctly and " +
1363
- "does not\n" +
1364
- " exceed the limit!" )
1365
- assert_equal( "This is a long flowing paragraph meant to span " +
1366
- "several lines. This text should\n" +
1367
- "definitely be wrapped at the set limit, in the " +
1368
- "result. Your code does well with\n" +
1369
- "things like this.\n\n" +
1370
- " * This is a simple embedded list.\n" +
1371
- " * You're code should not mess with this...\n" +
1372
- " * Because it's already formatted correctly and does " +
1373
- "not\n" +
1374
- " exceed the limit!\n", @output.string )
1375
-
1376
- @output.truncate(@output.rewind)
1431
+ @input.rewind
1377
1432
 
1378
- @terminal.say("-=" * 50)
1379
- assert_equal(("-=" * 40 + "\n") + ("-=" * 10 + "\n"), @output.string)
1433
+ answer = @terminal.ask("Enter a whitespace filled string: ") do |q|
1434
+ q.whitespace = nil
1435
+ end
1436
+ assert_equal(" A lot\tof \t space\t \there! \n", answer)
1380
1437
  end
1381
1438
 
1382
1439
  def test_track_eof
1383
- assert_raise(EOFError) { @terminal.ask("Any input left? ") }
1440
+ assert_raises(EOFError) { @terminal.ask("Any input left? ") }
1384
1441
 
1385
1442
  # turn EOF tracking
1386
1443
  old_setting = HighLine.track_eof?
1387
- assert_nothing_raised(Exception) { HighLine.track_eof = false }
1444
+ HighLine.track_eof = false
1388
1445
  begin
1389
1446
  @terminal.ask("And now? ") # this will still blow up, nothing available
1390
1447
  rescue
1391
- assert_not_equal(EOFError, $!.class) # but HighLine's safe guards are off
1448
+ refute_equal(EOFError, $!.class) # but HighLine's safe guards are off
1392
1449
  end
1393
1450
  HighLine.track_eof = old_setting
1394
1451
  end
1395
1452
 
1396
1453
  def test_version
1397
- assert_not_nil(HighLine::VERSION)
1454
+ refute_nil(HighLine::VERSION)
1398
1455
  assert_instance_of(String, HighLine::VERSION)
1399
1456
  assert(HighLine::VERSION.frozen?)
1400
- assert_match(/\A\d+\.\d+\.\d+\Z/, HighLine::VERSION)
1457
+ assert_match(/\A\d+\.\d+\.\d+(-.*)?/, HighLine::VERSION)
1401
1458
  end
1402
1459
  end