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.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.simplecov +5 -0
- data/.travis.yml +11 -6
- data/Changelog.md +112 -20
- data/Gemfile +8 -7
- data/README.rdoc +3 -0
- data/Rakefile +7 -2
- data/appveyor.yml +19 -0
- data/examples/asking_for_arrays.rb +3 -0
- data/examples/basic_usage.rb +3 -0
- data/examples/get_character.rb +3 -0
- data/examples/limit.rb +3 -0
- data/examples/menus.rb +3 -0
- data/examples/overwrite.rb +3 -0
- data/examples/password.rb +3 -0
- data/examples/repeat_entry.rb +4 -1
- data/lib/highline.rb +182 -704
- data/lib/highline/builtin_styles.rb +109 -0
- data/lib/highline/color_scheme.rb +4 -1
- data/lib/highline/compatibility.rb +2 -0
- data/lib/highline/custom_errors.rb +19 -0
- data/lib/highline/import.rb +4 -2
- data/lib/highline/list.rb +93 -0
- data/lib/highline/list_renderer.rb +232 -0
- data/lib/highline/menu.rb +20 -20
- data/lib/highline/paginator.rb +43 -0
- data/lib/highline/question.rb +157 -97
- data/lib/highline/question/answer_converter.rb +84 -0
- data/lib/highline/question_asker.rb +147 -0
- data/lib/highline/simulate.rb +5 -1
- data/lib/highline/statement.rb +58 -0
- data/lib/highline/string.rb +34 -0
- data/lib/highline/string_extensions.rb +3 -28
- data/lib/highline/style.rb +18 -8
- data/lib/highline/template_renderer.rb +38 -0
- data/lib/highline/terminal.rb +78 -0
- data/lib/highline/terminal/io_console.rb +98 -0
- data/lib/highline/terminal/ncurses.rb +38 -0
- data/lib/highline/terminal/unix_stty.rb +94 -0
- data/lib/highline/version.rb +3 -1
- data/lib/highline/wrapper.rb +43 -0
- data/test/acceptance/acceptance.rb +62 -0
- data/test/acceptance/acceptance_test.rb +69 -0
- data/test/acceptance/at_color_output_using_erb_templates.rb +17 -0
- data/test/acceptance/at_echo_false.rb +23 -0
- data/test/acceptance/at_readline.rb +37 -0
- data/test/io_console_compatible.rb +37 -0
- data/test/string_methods.rb +3 -0
- data/test/test_answer_converter.rb +26 -0
- data/test/{tc_color_scheme.rb → test_color_scheme.rb} +7 -9
- data/test/test_helper.rb +26 -0
- data/test/{tc_highline.rb → test_highline.rb} +193 -136
- data/test/{tc_import.rb → test_import.rb} +5 -2
- data/test/test_list.rb +60 -0
- data/test/{tc_menu.rb → test_menu.rb} +6 -3
- data/test/test_paginator.rb +73 -0
- data/test/test_question_asker.rb +20 -0
- data/test/test_simulator.rb +24 -0
- data/test/test_string_extension.rb +72 -0
- data/test/{tc_string_highline.rb → test_string_highline.rb} +7 -3
- data/test/{tc_style.rb → test_style.rb} +70 -35
- data/test/test_wrapper.rb +188 -0
- metadata +57 -22
- data/lib/highline/system_extensions.rb +0 -254
- data/test/tc_simulator.rb +0 -33
- 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
         | 
    
        data/test/string_methods.rb
    CHANGED
    
    
| @@ -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 " | 
| 11 | 
            +
            require "test_helper"
         | 
| 9 12 |  | 
| 10 13 | 
             
            require "highline"
         | 
| 11 14 | 
             
            require "stringio"
         | 
| 12 15 |  | 
| 13 | 
            -
            class TestColorScheme < Test | 
| 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 =  | 
| 89 | 
            +
                HighLine.color_scheme = nil
         | 
| 92 90 | 
             
                assert_raises(NameError) {
         | 
| 93 91 | 
             
                  @terminal.say("This should be <%= color('nothing at all', :error) %>.")
         | 
| 94 92 | 
             
                }
         | 
    
        data/test/test_helper.rb
    ADDED
    
    | @@ -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 | 
            -
             | 
| 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 " | 
| 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 | 
| 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 | 
            -
                 | 
| 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 | 
            -
                 | 
| 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 | 
            -
             | 
| 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 | 
            -
             | 
| 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 | 
            -
             | 
| 111 | 
            -
             | 
| 112 | 
            -
             | 
| 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 | 
            -
                # | 
| 253 | 
            -
                # and  | 
| 254 | 
            -
                #  | 
| 255 | 
            -
                #  | 
| 256 | 
            -
             | 
| 257 | 
            -
                 | 
| 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 | 
            -
                 | 
| 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 <%=  | 
| 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 <%=  | 
| 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,  | 
| 677 | 
            +
                @input << "#{File.basename(__FILE__)[0, 7]}\n"
         | 
| 580 678 | 
             
                @input.rewind
         | 
| 581 679 |  | 
| 582 | 
            -
                assert_equal " | 
| 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(" | 
| 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  | 
| 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 | 
            -
             | 
| 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("<%=  | 
| 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("<%=  | 
| 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("<%=  | 
| 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?( | 
| 859 | 
            -
                       "#{ | 
| 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:: | 
| 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 | 
            -
                 | 
| 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 | 
            -
                 | 
| 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  | 
| 1141 | 
            -
                                               "  | 
| 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 | 
            -
                 | 
| 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 | 
            -
                 | 
| 1267 | 
            +
                @terminal.say(integer)
         | 
| 1198 1268 | 
             
                assert_equal String(integer), @output.string.chomp
         | 
| 1199 1269 |  | 
| 1200 1270 | 
             
                @output.truncate(@output.rewind)
         | 
| 1201 1271 |  | 
| 1202 | 
            -
                 | 
| 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 | 
            -
                @ | 
| 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. | 
| 1379 | 
            -
             | 
| 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 | 
            -
                 | 
| 1440 | 
            +
                assert_raises(EOFError) { @terminal.ask("Any input left?  ") }
         | 
| 1384 1441 |  | 
| 1385 1442 | 
             
                # turn EOF tracking
         | 
| 1386 1443 | 
             
                old_setting = HighLine.track_eof?
         | 
| 1387 | 
            -
                 | 
| 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 | 
            -
                   | 
| 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 | 
            -
                 | 
| 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 | 
| 1457 | 
            +
                assert_match(/\A\d+\.\d+\.\d+(-.*)?/, HighLine::VERSION)
         | 
| 1401 1458 | 
             
              end
         | 
| 1402 1459 | 
             
            end
         |