From 80112d24bb414f24c2f753dcdb3c5e393b285cf1 Mon Sep 17 00:00:00 2001 From: Kyrylo Silin Date: Sat, 16 Jun 2012 21:12:10 +0300 Subject: [PATCH] Add unit tests for DEFAULT_CONTROL_D_HANDLER DEFAULT_CONTROL_D_HANDLER handles a user's Control-D (^D) presses. Add unit tests for ^D presses. Note that this commit doesn't include unit tests for the situation when ^D is being pressed in an expression[1]. [1]: Example of the untested situation: % pry [1] pry(main)> class Foo [1] pry(main)* ^D [2] pry(main)> Signed-off-by: Kyrylo Silin --- lib/pry.rb | 2 +- test/test_control_d_handler.rb | 45 ++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 test/test_control_d_handler.rb diff --git a/lib/pry.rb b/lib/pry.rb index e1fadffa..13445352 100644 --- a/lib/pry.rb +++ b/lib/pry.rb @@ -106,7 +106,7 @@ class Pry # clear input buffer eval_string.replace("") elsif _pry_.binding_stack.one? - # ^D at top-level breaks out of loop + # ^D at top-level breaks out of a REPL loop _pry_.binding_stack.clear throw(:breakout) else diff --git a/test/test_control_d_handler.rb b/test/test_control_d_handler.rb new file mode 100644 index 00000000..51a38d6d --- /dev/null +++ b/test/test_control_d_handler.rb @@ -0,0 +1,45 @@ +require 'helper' + +describe Pry::DEFAULT_CONTROL_D_HANDLER do + describe 'control-d press' do + before do + @control_d = "Pry::DEFAULT_CONTROL_D_HANDLER.call('', _pry_)" + @binding_stack = "self.binding_stack = _pry_.binding_stack.dup" + end + + describe 'in an expression' do + it 'should clear out passed string' do + str = "hello world" + Pry::DEFAULT_CONTROL_D_HANDLER.call(str, nil) + str.should == "" + end + end + + describe 'at top-level session' do + it 'should break out of a REPL loop' do + instance = nil + redirect_pry_io(InputTester.new(@control_d)) do + instance = Pry.new + instance.repl + end + + instance.binding_stack.should.be.empty + end + end + + describe 'in a nested session' do + it 'should pop last binding from the binding stack' do + base = OpenStruct.new + base.obj = OpenStruct.new + + redirect_pry_io(InputTester.new("cd obj", "self.stack_size = _pry_.binding_stack.size", + @control_d, "self.stack_size = _pry_.binding_stack.size", "exit-all")) do + Pry.start(base) + end + + base.obj.stack_size.should == 2 + base.stack_size.should == 1 + end + end + end +end