From 9d2fed2ccd1724d1cf42a3075c20dcc418082761 Mon Sep 17 00:00:00 2001 From: Steven Willis Date: Wed, 20 Mar 2019 14:50:05 -0400 Subject: Don't echo results of assignment expressions --- test/irb/test_context.rb | 125 ++++++++++++++++++++++++++ test/irb/test_raise_no_backtrace_exception.rb | 1 + 2 files changed, 126 insertions(+) (limited to 'test') diff --git a/test/irb/test_context.rb b/test/irb/test_context.rb index df9edcc63f..c55de4f84e 100644 --- a/test/irb/test_context.rb +++ b/test/irb/test_context.rb @@ -26,6 +26,10 @@ module TestIRB def encoding Encoding.default_external end + + def reset + @line_no = 0 + end end def setup @@ -84,5 +88,126 @@ module TestIRB def test_default_config assert_equal(true, @context.use_colorize?) end + + def test_assignment_expression + input = TestInputMethod.new + irb = IRB::Irb.new(IRB::WorkSpace.new(Object.new), input) + [ + "foo = bar", + "@foo = bar", + "$foo = bar", + "@@foo = bar", + "::Foo = bar", + "a::Foo = bar", + "Foo = bar", + "foo.bar = 1", + "foo[1] = bar", + "foo += bar", + "foo -= bar", + "foo ||= bar", + "foo &&= bar", + "foo, bar = 1, 2", + "foo.bar=(1)", + "foo; foo = bar", + "foo; foo = bar; ;\n ;", + "foo\nfoo = bar", + ].each do |exp| + assert( + irb.assignment_expression?(exp), + "#{exp.inspect}: should be an assignment expression" + ) + end + + [ + "foo", + "foo.bar", + "foo[0]", + "foo = bar; foo", + "foo = bar\nfoo", + ].each do |exp| + refute( + irb.assignment_expression?(exp), + "#{exp.inspect}: should not be an assignment expression" + ) + end + end + + def test_echo_on_assignment + input = TestInputMethod.new([ + "a = 1\n", + "a\n", + "a, b = 2, 3\n", + "a\n", + "b\n", + "b = 4\n", + "_\n" + ]) + irb = IRB::Irb.new(IRB::WorkSpace.new(Object.new), input) + + # The default + irb.context.echo = true + irb.context.echo_on_assignment = false + out, err = capture_io do + irb.eval_input + end + assert_empty err + assert_equal("=> 1\n=> 2\n=> 3\n=> 4\n", out) + + # Everything is output, like before echo_on_assignment was introduced + input.reset + irb.context.echo = true + irb.context.echo_on_assignment = true + out, err = capture_io do + irb.eval_input + end + assert_empty err + assert_equal("=> 1\n=> 1\n=> [2, 3]\n=> 2\n=> 3\n=> 4\n=> 4\n", out) + + # Nothing is output when echo is false + input.reset + irb.context.echo = false + irb.context.echo_on_assignment = false + out, err = capture_io do + irb.eval_input + end + assert_empty err + assert_equal("", out) + + # Nothing is output when echo is false even if echo_on_assignment is true + input.reset + irb.context.echo = false + irb.context.echo_on_assignment = true + out, err = capture_io do + irb.eval_input + end + assert_empty err + assert_equal("", out) + end + + def test_echo_on_assignment_conf + # Default + IRB.conf[:ECHO] = nil + IRB.conf[:ECHO_ON_ASSIGNMENT] = nil + input = TestInputMethod.new() + irb = IRB::Irb.new(IRB::WorkSpace.new(Object.new), input) + + assert(irb.context.echo?, "echo? should be true by default") + refute(irb.context.echo_on_assignment?, "echo_on_assignment? should be false by default") + + # Explicitly set :ECHO to false + IRB.conf[:ECHO] = false + irb = IRB::Irb.new(IRB::WorkSpace.new(Object.new), input) + + refute(irb.context.echo?, "echo? should be false when IRB.conf[:ECHO] is set to false") + refute(irb.context.echo_on_assignment?, "echo_on_assignment? should be false by default") + + # Explicitly set :ECHO_ON_ASSIGNMENT to true + IRB.conf[:ECHO] = nil + IRB.conf[:ECHO_ON_ASSIGNMENT] = true + irb = IRB::Irb.new(IRB::WorkSpace.new(Object.new), input) + + assert(irb.context.echo?, "echo? should be true by default") + assert(irb.context.echo_on_assignment?, "echo_on_assignment? should be true when IRB.conf[:ECHO_ON_ASSIGNMENT] is set to true") + end end end diff --git a/test/irb/test_raise_no_backtrace_exception.rb b/test/irb/test_raise_no_backtrace_exception.rb index e92d8dc970..2174600082 100644 --- a/test/irb/test_raise_no_backtrace_exception.rb +++ b/test/irb/test_raise_no_backtrace_exception.rb @@ -7,6 +7,7 @@ module TestIRB bundle_exec = ENV.key?('BUNDLE_GEMFILE') ? ['-rbundler/setup'] : [] assert_in_out_err(bundle_exec + %w[-rirb -W0 -e IRB.start(__FILE__) -- -f --], <<-IRB, /Exception: foo/, []) e = Exception.new("foo") + puts e.inspect def e.backtrace; nil; end raise e IRB -- cgit v1.2.3