aboutsummaryrefslogtreecommitdiffstats
path: root/test/irb/test_color_printer.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/irb/test_color_printer.rb')
-rw-r--r--test/irb/test_color_printer.rb71
1 files changed, 71 insertions, 0 deletions
diff --git a/test/irb/test_color_printer.rb b/test/irb/test_color_printer.rb
new file mode 100644
index 0000000000..b42048c1da
--- /dev/null
+++ b/test/irb/test_color_printer.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: false
+require 'test/unit'
+require 'irb/color_printer'
+require 'rubygems'
+require 'stringio'
+
+module TestIRB
+ class TestColorPrinter < Test::Unit::TestCase
+ CLEAR = "\e[0m"
+ BOLD = "\e[1m"
+ UNDERLINE = "\e[4m"
+ REVERSE = "\e[7m"
+ RED = "\e[31m"
+ GREEN = "\e[32m"
+ YELLOW = "\e[33m"
+ BLUE = "\e[34m"
+ MAGENTA = "\e[35m"
+ CYAN = "\e[36m"
+
+ def setup
+ @get_screen_size = Reline.method(:get_screen_size)
+ Reline.instance_eval { undef :get_screen_size }
+ def Reline.get_screen_size
+ [36, 80]
+ end
+ end
+
+ def teardown
+ Reline.instance_eval { undef :get_screen_size }
+ Reline.define_singleton_method(:get_screen_size, @get_screen_size)
+ end
+
+ IRBTestColorPrinter = Struct.new(:a)
+
+ def test_color_printer
+ unless ripper_lexer_scan_supported?
+ skip 'Ripper::Lexer#scan is supported in Ruby 2.7+'
+ end
+ {
+ 1 => "#{BLUE}#{BOLD}1#{CLEAR}\n",
+ IRBTestColorPrinter.new('test') => "#{GREEN}#<struct TestIRB::TestColorPrinter::IRBTestColorPrinter#{CLEAR} a#{GREEN}=#{CLEAR}#{RED}#{BOLD}\"#{CLEAR}#{RED}test#{CLEAR}#{RED}#{BOLD}\"#{CLEAR}#{GREEN}>#{CLEAR}\n",
+ Ripper::Lexer.new('1').scan => "[#{GREEN}#<Ripper::Lexer::Elem:#{CLEAR} on_int@1:0 END token: #{RED}#{BOLD}\"#{CLEAR}#{RED}1#{CLEAR}#{RED}#{BOLD}\"#{CLEAR}#{GREEN}>#{CLEAR}]\n",
+ Class.new{define_method(:pretty_print){|q| q.text("[__FILE__, __LINE__, __ENCODING__]")}}.new => "[#{CYAN}#{BOLD}__FILE__#{CLEAR}, #{CYAN}#{BOLD}__LINE__#{CLEAR}, #{CYAN}#{BOLD}__ENCODING__#{CLEAR}]\n",
+ }.each do |object, result|
+ actual = with_term { IRB::ColorPrinter.pp(object, '') }
+ assert_equal(result, actual, "Case: IRB::ColorPrinter.pp(#{object.inspect}, '')")
+ end
+ end
+
+ private
+
+ def ripper_lexer_scan_supported?
+ Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.7.0')
+ end
+
+ def with_term
+ stdout = $stdout
+ io = StringIO.new
+ def io.tty?; true; end
+ $stdout = io
+
+ env = ENV.to_h.dup
+ ENV['TERM'] = 'xterm-256color'
+
+ yield
+ ensure
+ $stdout = stdout
+ ENV.replace(env) if env
+ end
+ end
+end