From aabf2ce181053d37cbf1d6db55ff533055c96d83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ondruch?= Date: Tue, 28 Nov 2023 15:38:51 +0100 Subject: [PATCH] [rubygems/rubygems] Use globals variables for standard input/output Replace use of `STDIN`, `STDOUT` and `STDERR` constants by their `$stdin`, `$stdout` and `$stderr` global variable equivalents. This enables easier testing via standard means, such as `assert_output` for minitest or `expect { print 'foo' }.to output.to_stdout` for RSpec test suites. https://github.com/rubygems/rubygems/commit/a0a6fc1b76 --- lib/rubygems/user_interaction.rb | 8 ++++---- test/rubygems/test_gem_console_ui.rb | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 test/rubygems/test_gem_console_ui.rb diff --git a/lib/rubygems/user_interaction.rb b/lib/rubygems/user_interaction.rb index 1cee1555a0..0172c4ee89 100644 --- a/lib/rubygems/user_interaction.rb +++ b/lib/rubygems/user_interaction.rb @@ -193,7 +193,7 @@ class Gem::StreamUI # then special operations (like asking for passwords) will use the TTY # commands to disable character echo. - def initialize(in_stream, out_stream, err_stream=STDERR, usetty=true) + def initialize(in_stream, out_stream, err_stream=$stderr, usetty=true) @ins = in_stream @outs = out_stream @errs = err_stream @@ -591,8 +591,8 @@ class Gem::StreamUI end ## -# Subclass of StreamUI that instantiates the user interaction using STDIN, -# STDOUT, and STDERR. +# Subclass of StreamUI that instantiates the user interaction using $stdin, +# $stdout, and $stderr. class Gem::ConsoleUI < Gem::StreamUI ## @@ -600,7 +600,7 @@ class Gem::ConsoleUI < Gem::StreamUI # stdin, output to stdout and warnings or errors to stderr. def initialize - super STDIN, STDOUT, STDERR, true + super $stdin, $stdout, $stderr, true end end diff --git a/test/rubygems/test_gem_console_ui.rb b/test/rubygems/test_gem_console_ui.rb new file mode 100644 index 0000000000..b8a619625f --- /dev/null +++ b/test/rubygems/test_gem_console_ui.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +require_relative "helper" +require "rubygems/user_interaction" + +class TestGemConsoleUI < Gem::TestCase + def test_output_can_be_captured_by_test_unit + output = capture_output do + ui = Gem::ConsoleUI.new + + ui.alert_error "test error" + ui.alert_warning "test warning" + ui.alert "test alert" + end + + assert_equal "INFO: test alert\n", output.first + assert_equal "ERROR: test error\n" + "WARNING: test warning\n", output.last + end +end