2012-04-05 14:01:45 -05:00
|
|
|
require 'helper'
|
|
|
|
|
2012-06-10 16:31:06 +03:00
|
|
|
describe 'Pry::DefaultCommands::Cd' do
|
2012-06-27 14:54:07 +03:00
|
|
|
before do
|
2012-06-27 18:01:29 +03:00
|
|
|
@o, @obj = Object.new, Object.new
|
|
|
|
@obj.instance_variable_set(:@x, 66)
|
|
|
|
@obj.instance_variable_set(:@y, 79)
|
|
|
|
@o.instance_variable_set(:@obj, @obj)
|
2012-06-27 14:54:07 +03:00
|
|
|
|
2012-07-12 00:32:35 +03:00
|
|
|
# Shortcuts. They save a lot of typing.
|
|
|
|
@bs1 = "Pad.bs1 = _pry_.binding_stack.dup"
|
|
|
|
@bs2 = "Pad.bs2 = _pry_.binding_stack.dup"
|
|
|
|
@bs3 = "Pad.bs3 = _pry_.binding_stack.dup"
|
2012-06-27 14:54:07 +03:00
|
|
|
|
2012-07-12 00:32:35 +03:00
|
|
|
@os1 = "Pad.os1 = _pry_.command_state['cd'].old_stack.dup"
|
|
|
|
@os2 = "Pad.os2 = _pry_.command_state['cd'].old_stack.dup"
|
2012-06-27 18:01:29 +03:00
|
|
|
|
|
|
|
@self = "Pad.self = self"
|
|
|
|
@inner = "Pad.inner = self"
|
|
|
|
@outer = "Pad.outer = self"
|
2012-06-27 14:54:07 +03:00
|
|
|
end
|
|
|
|
|
2012-06-10 16:31:06 +03:00
|
|
|
after do
|
2012-06-27 14:54:07 +03:00
|
|
|
Pad.clear
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
|
|
|
|
2012-06-16 02:10:56 +03:00
|
|
|
describe 'state' do
|
|
|
|
it 'should not to be set up in fresh instance' do
|
2012-07-12 00:32:35 +03:00
|
|
|
redirect_pry_io(InputTester.new(@os1, "exit-all")) do
|
2012-06-27 14:54:07 +03:00
|
|
|
Pry.start(@o)
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
Pad.os1.should == nil
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
describe 'old stack toggling with `cd -`' do
|
|
|
|
describe 'in fresh pry instance' do
|
|
|
|
it 'should not toggle when there is no old stack' do
|
2012-07-12 00:32:35 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd -", @bs1, "cd -",
|
|
|
|
@bs2, "exit-all")) do
|
2012-06-27 14:54:07 +03:00
|
|
|
Pry.start(@o)
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
Pad.bs1.map { |v| v.eval("self") }.should == [@o]
|
|
|
|
Pad.bs2.map { |v| v.eval("self") }.should == [@o]
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
describe 'when an error was raised' do
|
|
|
|
it 'should ensure cd @ raises SyntaxError' do
|
|
|
|
mock_pry("cd @").should =~ /SyntaxError/
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
it 'should not toggle and should keep correct old stack' do
|
2012-07-12 00:32:35 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd @", @os1, "cd -", @os2, "exit-all")) do
|
2012-06-27 14:54:07 +03:00
|
|
|
Pry.start(@o)
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
Pad.os1.should == []
|
|
|
|
Pad.os2.should == []
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
it 'should not toggle and should keep correct current binding stack' do
|
2012-07-12 00:32:35 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd @", @bs1, "cd -", @bs2, "exit-all")) do
|
2012-06-27 14:54:07 +03:00
|
|
|
Pry.start(@o)
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
Pad.bs1.map { |v| v.eval("self") }.should == [@o]
|
|
|
|
Pad.bs2.map { |v| v.eval("self") }.should == [@o]
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
describe 'when using simple cd syntax' do
|
|
|
|
it 'should toggle' do
|
2012-07-12 00:32:35 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd :mon_dogg", "cd -", @bs1,
|
|
|
|
"cd -", @bs2, "exit-all")) do
|
2012-06-27 14:54:07 +03:00
|
|
|
Pry.start(@o)
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
Pad.bs1.map { |v| v.eval("self") }.should == [@o]
|
|
|
|
Pad.bs2.map { |v| v.eval("self") }.should == [@o, :mon_dogg]
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
2012-06-27 14:54:07 +03:00
|
|
|
end
|
2012-06-16 02:10:56 +03:00
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
describe "when using complex cd syntax" do
|
|
|
|
it 'should toggle with a complex path (simple case)' do
|
2012-07-12 00:32:35 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd 1/2/3", "cd -", @bs1,
|
|
|
|
"cd -", @bs2, "exit-all")) do
|
2012-06-27 14:54:07 +03:00
|
|
|
Pry.start(@o)
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
Pad.bs1.map { |v| v.eval('self') }.should == [@o]
|
|
|
|
Pad.bs2.map { |v| v.eval('self') }.should == [@o, 1, 2, 3]
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
it 'should toggle with a complex path (more complex case)' do
|
|
|
|
redirect_pry_io(InputTester.new("cd 1/2/3", "cd ../4", "cd -",
|
2012-07-12 00:32:35 +03:00
|
|
|
@bs1, "cd -", @bs2, "exit-all")) do
|
2012-06-27 14:54:07 +03:00
|
|
|
Pry.start(@o)
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
Pad.bs1.map { |v| v.eval('self') }.should == [@o, 1, 2, 3]
|
|
|
|
Pad.bs2.map { |v| v.eval('self') }.should == [@o, 1, 2, 4]
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
2012-06-27 14:54:07 +03:00
|
|
|
end
|
2012-06-16 02:10:56 +03:00
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
describe 'series of cd calls' do
|
2012-06-16 02:10:56 +03:00
|
|
|
it 'should toggle with fuzzy `cd -` calls' do
|
2012-06-27 14:54:07 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd :mon_dogg", "cd -", "cd 42", "cd -",
|
2012-07-12 00:32:35 +03:00
|
|
|
@bs1, "cd -", @bs2, "exit-all")) do
|
2012-06-27 14:54:07 +03:00
|
|
|
Pry.start(@o)
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
Pad.bs1.map { |v| v.eval('self') }.should == [@o]
|
|
|
|
Pad.bs2.map { |v| v.eval('self') }.should == [@o, 42]
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'when using cd ..' do
|
2012-06-27 14:54:07 +03:00
|
|
|
it 'should toggle with a simple path' do
|
2012-07-12 00:32:35 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd :john_dogg", "cd ..", @bs1,
|
|
|
|
"cd -", @bs2, "exit-all")) do
|
2012-06-27 14:54:07 +03:00
|
|
|
Pry.start(@o)
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
Pad.bs1.map { |v| v.eval('self') }.should == [@o]
|
|
|
|
Pad.bs2.map { |v| v.eval('self') }.should == [@o, :john_dogg]
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
it 'should toggle with a complex path' do
|
2012-07-12 00:32:35 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd 1/2/3/../4", "cd -", @bs1,
|
|
|
|
"cd -", @bs2, "exit-all")) do
|
2012-06-27 14:54:07 +03:00
|
|
|
Pry.start(@o)
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
Pad.bs1.map { |v| v.eval('self') }.should == [@o]
|
|
|
|
Pad.bs2.map { |v| v.eval('self') }.should == [@o, 1, 2, 4]
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'when using cd ::' do
|
2012-06-27 14:54:07 +03:00
|
|
|
it 'should toggle' do
|
2012-07-12 00:32:35 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd ::", "cd -", @bs1,
|
|
|
|
"cd -", @bs2, "exit-all")) do
|
2012-06-27 14:54:07 +03:00
|
|
|
Pry.start(@o)
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
Pad.bs1.map { |v| v.eval('self') }.should == [@o]
|
|
|
|
Pad.bs2.map { |v| v.eval('self') }.should == [@o, TOPLEVEL_BINDING.eval("self")]
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'when using cd /' do
|
2012-06-27 14:54:07 +03:00
|
|
|
it 'should toggle' do
|
2012-07-12 00:32:35 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd /", "cd -", @bs1, "cd :john_dogg",
|
|
|
|
"cd /", "cd -", @bs2, "exit-all")) do
|
2012-06-27 14:54:07 +03:00
|
|
|
Pry.start(@o)
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
Pad.bs1.map { |v| v.eval('self') }.should == [@o]
|
|
|
|
Pad.bs2.map { |v| v.eval('self') }.should == [@o, :john_dogg]
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'when using ^D (Control-D) key press' do
|
|
|
|
before do
|
|
|
|
@control_d = "Pry::DEFAULT_CONTROL_D_HANDLER.call('', _pry_)"
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should keep correct old binding' do
|
|
|
|
redirect_pry_io(InputTester.new("cd :john_dogg", "cd :mon_dogg",
|
2012-07-12 00:32:35 +03:00
|
|
|
"cd :kyr_dogg", @control_d, @bs1,
|
|
|
|
"cd -", @bs2, "cd -", @bs3, "exit-all")) do
|
2012-06-27 14:54:07 +03:00
|
|
|
Pry.start(@o)
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
|
2012-06-27 14:54:07 +03:00
|
|
|
Pad.bs1.map { |v| v.eval('self') }.should == [@o, :john_dogg, :mon_dogg]
|
|
|
|
Pad.bs2.map { |v| v.eval('self') }.should == [@o, :john_dogg, :mon_dogg, :kyr_dogg]
|
|
|
|
Pad.bs3.map { |v| v.eval('self') }.should == [@o, :john_dogg, :mon_dogg]
|
2012-06-16 02:10:56 +03:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-06-10 16:31:06 +03:00
|
|
|
it 'should cd into simple input' do
|
2012-06-27 18:01:29 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd :mon_ouie", @inner, "exit-all")) do
|
|
|
|
Pry.start(@o)
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
|
|
|
|
2012-06-27 18:01:29 +03:00
|
|
|
Pad.inner.should == :mon_ouie
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should break out of session with cd ..' do
|
2012-06-27 18:01:29 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd :inner", @inner, "cd ..", @outer, "exit-all")) do
|
|
|
|
Pry.start(:outer)
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
2012-06-27 18:01:29 +03:00
|
|
|
|
|
|
|
Pad.inner.should == :inner
|
|
|
|
Pad.outer.should == :outer
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
it "should not leave the REPL session when given 'cd ..'" do
|
2012-06-27 18:01:29 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd ..", @self, "exit-all")) do
|
|
|
|
Pry.start(@o)
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
|
|
|
|
2012-06-27 18:01:29 +03:00
|
|
|
Pad.self.should == @o
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should break out to outer-most session with cd /' do
|
2012-06-27 18:01:29 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd :inner", @inner, "cd 5", "Pad.five = self",
|
|
|
|
"cd /", @outer, "exit-all")) do
|
|
|
|
Pry.start(:outer)
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
2012-06-27 18:01:29 +03:00
|
|
|
|
|
|
|
Pad.inner.should == :inner
|
|
|
|
Pad.five.should == 5
|
|
|
|
Pad.outer.should == :outer
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should break out to outer-most session with just cd (no args)' do
|
2012-06-27 18:01:29 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd :inner", @inner, "cd 5", "Pad.five = self",
|
|
|
|
"cd", @outer, "exit-all")) do
|
|
|
|
Pry.start(:outer)
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
2012-06-27 18:01:29 +03:00
|
|
|
|
|
|
|
Pad.inner.should == :inner
|
|
|
|
Pad.five.should == 5
|
|
|
|
Pad.outer.should == :outer
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should cd into an object and its ivar using cd obj/@ivar syntax' do
|
2012-07-12 00:32:35 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd @obj/@x", @bs1, "exit-all")) do
|
2012-06-27 18:01:29 +03:00
|
|
|
Pry.start(@o)
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
2012-06-27 18:01:29 +03:00
|
|
|
|
|
|
|
Pad.bs1.map { |v| v.eval("self") }.should == [@o, @obj, 66]
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should cd into an object and its ivar using cd obj/@ivar/ syntax (note following /)' do
|
2012-07-12 00:32:35 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd @obj/@x/", @bs1, "exit-all")) do
|
2012-06-27 18:01:29 +03:00
|
|
|
Pry.start(@o)
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
2012-06-27 18:01:29 +03:00
|
|
|
|
|
|
|
Pad.bs1.map { |v| v.eval("self") }.should == [@o, @obj, 66]
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should cd into previous object and its local using cd ../local syntax' do
|
2012-06-27 18:01:29 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd @obj", "local = :local", "cd @x",
|
2012-07-12 00:32:35 +03:00
|
|
|
"cd ../local", @bs1, "exit-all")) do
|
2012-06-27 18:01:29 +03:00
|
|
|
Pry.start(@o)
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
2012-06-27 18:01:29 +03:00
|
|
|
|
|
|
|
Pad.bs1.map { |v| v.eval("self") }.should == [@o, @obj, :local]
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should cd into an object and its ivar and back again using cd obj/@ivar/.. syntax' do
|
2012-07-12 00:32:35 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd @obj/@x/..", @bs1, "exit-all")) do
|
2012-06-27 18:01:29 +03:00
|
|
|
Pry.start(@o)
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
2012-06-27 18:01:29 +03:00
|
|
|
|
|
|
|
Pad.bs1.map { |v| v.eval("self") }.should == [@o, @obj]
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should cd into an object and its ivar and back and then into another ivar using cd obj/@ivar/../@y syntax' do
|
2012-07-12 00:32:35 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd @obj/@x/../@y", @bs1, "exit-all")) do
|
2012-06-27 18:01:29 +03:00
|
|
|
Pry.start(@o)
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
2012-06-27 18:01:29 +03:00
|
|
|
|
|
|
|
Pad.bs1.map { |v| v.eval("self") }.should == [@o, @obj, 79]
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should cd back to top-level and then into another ivar using cd /@ivar/ syntax' do
|
2012-07-11 21:34:44 +03:00
|
|
|
redirect_pry_io(InputTester.new("@z = 20", "cd @obj/@x/", "cd /@z",
|
2012-07-12 00:32:35 +03:00
|
|
|
@bs1, "exit-all")) do
|
2012-06-27 18:01:29 +03:00
|
|
|
Pry.start(@o)
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
2012-06-27 18:01:29 +03:00
|
|
|
|
|
|
|
Pad.bs1.map { |v| v.eval("self") }.should == [@o, 20]
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should start a session on TOPLEVEL_BINDING with cd ::' do
|
2012-06-27 18:01:29 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd ::", @self, "exit-all")) do
|
|
|
|
Pry.start(@o)
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
2012-06-27 18:01:29 +03:00
|
|
|
|
|
|
|
Pad.self.should == TOPLEVEL_BINDING.eval("self")
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should cd into complex input (with spaces)' do
|
2012-06-27 18:01:29 +03:00
|
|
|
def @o.hello(x, y, z)
|
2012-06-10 16:31:06 +03:00
|
|
|
:mon_ouie
|
|
|
|
end
|
|
|
|
|
2012-06-27 18:01:29 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd hello 1, 2, 3", @self, "exit-all")) do
|
|
|
|
Pry.start(@o)
|
2012-04-05 14:01:45 -05:00
|
|
|
end
|
2012-06-27 18:01:29 +03:00
|
|
|
|
|
|
|
Pad.self.should == :mon_ouie
|
2012-06-10 16:31:06 +03:00
|
|
|
end
|
|
|
|
|
2012-06-30 19:59:23 +03:00
|
|
|
it 'should not cd into complex input when it encounters an exception' do
|
2012-07-11 21:34:44 +03:00
|
|
|
redirect_pry_io(InputTester.new("cd 1/2/swoop_a_doop/3",
|
2012-07-12 00:32:35 +03:00
|
|
|
@bs1, "exit-all")) do
|
2012-06-30 19:59:23 +03:00
|
|
|
Pry.start(@o)
|
|
|
|
end
|
|
|
|
|
|
|
|
Pad.bs1.map { |v| v.eval("self") }.should == [@o]
|
|
|
|
end
|
|
|
|
|
2012-06-10 16:31:06 +03:00
|
|
|
# Regression test for ticket #516.
|
|
|
|
#it 'should be able to cd into the Object BasicObject.' do
|
|
|
|
# mock_pry('cd BasicObject.new').should.not =~ /\Aundefined method `__binding__'/
|
|
|
|
#end
|
|
|
|
|
|
|
|
# Regression test for ticket #516
|
|
|
|
# Possibly move higher up.
|
|
|
|
it 'should not fail with undefined BasicObject#is_a?' do
|
|
|
|
mock_pry('cd BasicObject.new').should.not =~ /undefined method `is_a\?'/
|
2012-04-05 14:01:45 -05:00
|
|
|
end
|
|
|
|
end
|