2012-09-15 17:50:15 -04:00
|
|
|
describe 'cd' do
|
2012-06-27 07:54:07 -04:00
|
|
|
before do
|
2019-03-02 06:21:04 -05:00
|
|
|
@o = Object.new
|
|
|
|
@obj = Object.new
|
2012-06-27 11:01:29 -04:00
|
|
|
@obj.instance_variable_set(:@x, 66)
|
|
|
|
@obj.instance_variable_set(:@y, 79)
|
|
|
|
@o.instance_variable_set(:@obj, @obj)
|
2012-06-27 07:54:07 -04:00
|
|
|
|
2012-07-24 04:36:53 -04:00
|
|
|
@t = pry_tester(@o) do
|
2015-01-23 04:30:41 -05:00
|
|
|
def mapped_binding_stack
|
|
|
|
binding_stack.map { |b| b.eval('self') }
|
2012-07-24 04:36:53 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def binding_stack
|
2013-12-07 21:23:51 -05:00
|
|
|
pry.binding_stack.dup
|
2012-07-24 04:36:53 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def command_state
|
2013-12-07 21:23:51 -05:00
|
|
|
pry.command_state["cd"]
|
2012-07-24 04:36:53 -04:00
|
|
|
end
|
|
|
|
|
2012-08-17 02:31:03 -04:00
|
|
|
def old_stack
|
2013-12-07 21:23:51 -05:00
|
|
|
pry.command_state['cd'].old_stack.dup
|
2012-08-17 02:31:03 -04:00
|
|
|
end
|
2012-07-24 04:36:53 -04:00
|
|
|
end
|
2012-06-10 09:31:06 -04:00
|
|
|
end
|
|
|
|
|
2012-06-15 19:10:56 -04:00
|
|
|
describe 'state' do
|
|
|
|
it 'should not to be set up in fresh instance' do
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.command_state).to equal nil
|
2012-06-15 19:10:56 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-06-27 07:54:07 -04: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-23 04:03:05 -04:00
|
|
|
2.times do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd -'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o]
|
2012-06-15 19:10:56 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-08-17 02:31:03 -04:00
|
|
|
describe 'when an error was raised' do
|
|
|
|
it 'should not toggle and should keep correct stacks' do
|
Switch test suite to RSpec
Removes Bacon and Mocha
Reasoning explained in this comment: https://github.com/pry/pry/issues/277#issuecomment-51708712
Mostly this went smoothly. There were a few errors that I fixed along
the way, e.g. tests that were failing but for various reasons still
passed. Should have documented them, but didn't think about it until
very near the end. But generaly, I remember 2 reasons this would happen:
`lambda { raise "omg" }.should.raise(RuntimeError, /not-omg/)` will pass
because the second argument is ignored by Bacon. And `1.should == 2`
will return false instead of raising an error when it is not in an it
block (e.g. if stuck in a describe block, that would just return false)
The only one that I felt unsure about was spec/helpers/table_spec.rb
`Pry::Helpers.tablify_or_one_line('head', %w(ing)).should == 'head: ing'`
This is wrong, but was not failing because it was in a describe block
instead of an it block. In reality, it returns `"head: ing\n"`,
I updated the test to reflect this, though I don't know for sure
this is the right thing to do
This will fail on master until https://github.com/pry/pry/pull/1281 is merged.
This makes https://github.com/pry/pry/pull/1278 unnecessary.
2014-08-10 18:26:47 -04:00
|
|
|
expect { @t.eval 'cd %' }.to raise_error Pry::CommandError
|
2012-06-15 19:10:56 -04:00
|
|
|
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.old_stack).to eq []
|
|
|
|
expect(@t.mapped_binding_stack).to eq [@o]
|
2012-06-15 19:10:56 -04:00
|
|
|
|
2012-08-17 02:31:03 -04:00
|
|
|
@t.eval 'cd -'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.old_stack).to eq []
|
|
|
|
expect(@t.mapped_binding_stack).to eq [@o]
|
2012-08-17 02:31:03 -04:00
|
|
|
end
|
|
|
|
end
|
2012-06-15 19:10:56 -04:00
|
|
|
|
2012-06-27 07:54:07 -04:00
|
|
|
describe 'when using simple cd syntax' do
|
|
|
|
it 'should toggle' do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd :mon_dogg', 'cd -'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o]
|
2012-06-15 19:10:56 -04:00
|
|
|
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd -'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o, :mon_dogg]
|
2012-06-15 19:10:56 -04:00
|
|
|
end
|
2012-06-27 07:54:07 -04:00
|
|
|
end
|
2012-06-15 19:10:56 -04:00
|
|
|
|
2012-06-27 07:54:07 -04:00
|
|
|
describe "when using complex cd syntax" do
|
|
|
|
it 'should toggle with a complex path (simple case)' do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd 1/2/3', 'cd -'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o]
|
2012-06-15 19:10:56 -04:00
|
|
|
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd -'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o, 1, 2, 3]
|
2012-06-15 19:10:56 -04:00
|
|
|
end
|
|
|
|
|
2012-06-27 07:54:07 -04:00
|
|
|
it 'should toggle with a complex path (more complex case)' do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd 1/2/3', 'cd ../4', 'cd -'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o, 1, 2, 3]
|
2012-06-15 19:10:56 -04:00
|
|
|
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd -'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o, 1, 2, 4]
|
2012-06-15 19:10:56 -04:00
|
|
|
end
|
2012-06-27 07:54:07 -04:00
|
|
|
end
|
2012-06-15 19:10:56 -04:00
|
|
|
|
2012-06-27 07:54:07 -04:00
|
|
|
describe 'series of cd calls' do
|
2012-06-15 19:10:56 -04:00
|
|
|
it 'should toggle with fuzzy `cd -` calls' do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd :mon_dogg', 'cd -', 'cd 42', 'cd -'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o]
|
2012-06-15 19:10:56 -04:00
|
|
|
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd -'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o, 42]
|
2012-06-15 19:10:56 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'when using cd ..' do
|
2012-06-27 07:54:07 -04:00
|
|
|
it 'should toggle with a simple path' do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd :john_dogg', 'cd ..'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o]
|
2012-06-15 19:10:56 -04:00
|
|
|
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd -'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o, :john_dogg]
|
2012-06-15 19:10:56 -04:00
|
|
|
end
|
|
|
|
|
2012-06-27 07:54:07 -04:00
|
|
|
it 'should toggle with a complex path' do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd 1/2/3/../4', 'cd -'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o]
|
2012-06-15 19:10:56 -04:00
|
|
|
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd -'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o, 1, 2, 4]
|
2012-06-15 19:10:56 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'when using cd ::' do
|
2012-06-27 07:54:07 -04:00
|
|
|
it 'should toggle' do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd ::', 'cd -'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o]
|
2012-06-15 19:10:56 -04:00
|
|
|
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd -'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o, TOPLEVEL_BINDING.eval('self')]
|
2012-06-15 19:10:56 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'when using cd /' do
|
2012-06-27 07:54:07 -04:00
|
|
|
it 'should toggle' do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd /', 'cd -'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o]
|
2012-06-15 19:10:56 -04:00
|
|
|
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd :john_dogg', 'cd /', 'cd -'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o, :john_dogg]
|
2012-06-15 19:10:56 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'when using ^D (Control-D) key press' do
|
|
|
|
it 'should keep correct old binding' do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd :john_dogg', 'cd :mon_dogg', 'cd :kyr_dogg',
|
2019-03-08 19:08:53 -05:00
|
|
|
'Pry::Config.defaults.control_d_handler.call("", _pry_)'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o, :john_dogg, :mon_dogg]
|
2012-07-23 04:03:05 -04:00
|
|
|
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd -'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o, :john_dogg, :mon_dogg, :kyr_dogg]
|
2012-06-15 19:10:56 -04:00
|
|
|
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd -'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o, :john_dogg, :mon_dogg]
|
2012-06-15 19:10:56 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-06-10 09:31:06 -04:00
|
|
|
it 'should cd into simple input' do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd :mon_ouie'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.eval('self')).to eq :mon_ouie
|
2012-06-10 09:31:06 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should break out of session with cd ..' do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd :outer', 'cd :inner'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.eval('self')).to eq :inner
|
2012-06-27 11:01:29 -04:00
|
|
|
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd ..'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.eval('self')).to eq :outer
|
2012-06-10 09:31:06 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it "should not leave the REPL session when given 'cd ..'" do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd ..'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.eval('self')).to eq @o
|
2012-06-10 09:31:06 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should break out to outer-most session with cd /' do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd :inner'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.eval('self')).to eq :inner
|
2012-06-27 11:01:29 -04:00
|
|
|
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd 5'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.eval('self')).to eq 5
|
2012-07-23 04:03:05 -04:00
|
|
|
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd /'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.eval('self')).to eq @o
|
2012-06-10 09:31:06 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should break out to outer-most session with just cd (no args)' do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd :inner'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.eval('self')).to eq :inner
|
2012-06-27 11:01:29 -04:00
|
|
|
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd 5'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.eval('self')).to eq 5
|
2012-07-23 04:03:05 -04:00
|
|
|
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.eval('self')).to eq @o
|
2012-06-10 09:31:06 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should cd into an object and its ivar using cd obj/@ivar syntax' do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd @obj/@x'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o, @obj, 66]
|
2012-06-10 09:31:06 -04:00
|
|
|
end
|
|
|
|
|
2019-03-03 10:37:58 -05:00
|
|
|
it 'cds into an object and its ivar using cd obj/@ivar/ syntax (note following /)' do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd @obj/@x/'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o, @obj, 66]
|
2012-06-10 09:31:06 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should cd into previous object and its local using cd ../local syntax' do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd @obj', 'local = :local', 'cd @x', 'cd ../local'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o, @obj, :local]
|
2012-06-10 09:31:06 -04:00
|
|
|
end
|
|
|
|
|
2019-03-03 10:37:58 -05:00
|
|
|
it 'cds into an object and its ivar and back again using cd obj/@ivar/.. syntax' do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd @obj/@x/..'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o, @obj]
|
2012-06-10 09:31:06 -04:00
|
|
|
end
|
|
|
|
|
2019-03-03 10:37:58 -05:00
|
|
|
it(
|
|
|
|
'cds into an object and its ivar and back and then into another ivar ' \
|
|
|
|
'using cd obj/@ivar/../@y syntax'
|
|
|
|
) do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd @obj/@x/../@y'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o, @obj, 79]
|
2012-06-10 09:31:06 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should cd back to top-level and then into another ivar using cd /@ivar/ syntax' do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval '@z = 20', 'cd @obj/@x/', 'cd /@z'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o, 20]
|
2012-06-10 09:31:06 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should start a session on TOPLEVEL_BINDING with cd ::' do
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd ::'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.eval('self')).to eq TOPLEVEL_BINDING.eval('self')
|
2012-06-10 09:31:06 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'should cd into complex input (with spaces)' do
|
2018-10-14 02:56:53 -04:00
|
|
|
def @o.hello(_x, _y, _z)
|
2012-06-10 09:31:06 -04:00
|
|
|
:mon_ouie
|
|
|
|
end
|
|
|
|
|
2012-07-24 04:36:53 -04:00
|
|
|
@t.eval 'cd hello 1, 2, 3'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.eval('self')).to eq :mon_ouie
|
2012-06-10 09:31:06 -04:00
|
|
|
end
|
|
|
|
|
2012-06-30 12:59:23 -04:00
|
|
|
it 'should not cd into complex input when it encounters an exception' do
|
Switch test suite to RSpec
Removes Bacon and Mocha
Reasoning explained in this comment: https://github.com/pry/pry/issues/277#issuecomment-51708712
Mostly this went smoothly. There were a few errors that I fixed along
the way, e.g. tests that were failing but for various reasons still
passed. Should have documented them, but didn't think about it until
very near the end. But generaly, I remember 2 reasons this would happen:
`lambda { raise "omg" }.should.raise(RuntimeError, /not-omg/)` will pass
because the second argument is ignored by Bacon. And `1.should == 2`
will return false instead of raising an error when it is not in an it
block (e.g. if stuck in a describe block, that would just return false)
The only one that I felt unsure about was spec/helpers/table_spec.rb
`Pry::Helpers.tablify_or_one_line('head', %w(ing)).should == 'head: ing'`
This is wrong, but was not failing because it was in a describe block
instead of an it block. In reality, it returns `"head: ing\n"`,
I updated the test to reflect this, though I don't know for sure
this is the right thing to do
This will fail on master until https://github.com/pry/pry/pull/1281 is merged.
This makes https://github.com/pry/pry/pull/1278 unnecessary.
2014-08-10 18:26:47 -04:00
|
|
|
expect { @t.eval 'cd 1/2/swoop_a_doop/3' }.to raise_error Pry::CommandError
|
2012-06-30 12:59:23 -04:00
|
|
|
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.mapped_binding_stack).to eq [@o]
|
2012-06-30 12:59:23 -04:00
|
|
|
end
|
|
|
|
|
2014-04-28 03:08:23 -04:00
|
|
|
it 'can cd into an expression containing a string with slashes in it' do
|
|
|
|
@t.eval 'cd ["http://google.com"]'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.eval('self')).to eq ["http://google.com"]
|
2014-04-28 03:08:23 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'can cd into an expression with division in it' do
|
|
|
|
@t.eval 'cd (10/2)/even?'
|
2015-03-10 16:49:29 -04:00
|
|
|
expect(@t.eval('self')).to eq false
|
2014-04-28 03:08:23 -04:00
|
|
|
end
|
|
|
|
|
2012-06-10 09:31:06 -04:00
|
|
|
# Regression test for ticket #516.
|
2014-04-28 03:50:29 -04:00
|
|
|
it 'should be able to cd into the Object BasicObject' do
|
Switch test suite to RSpec
Removes Bacon and Mocha
Reasoning explained in this comment: https://github.com/pry/pry/issues/277#issuecomment-51708712
Mostly this went smoothly. There were a few errors that I fixed along
the way, e.g. tests that were failing but for various reasons still
passed. Should have documented them, but didn't think about it until
very near the end. But generaly, I remember 2 reasons this would happen:
`lambda { raise "omg" }.should.raise(RuntimeError, /not-omg/)` will pass
because the second argument is ignored by Bacon. And `1.should == 2`
will return false instead of raising an error when it is not in an it
block (e.g. if stuck in a describe block, that would just return false)
The only one that I felt unsure about was spec/helpers/table_spec.rb
`Pry::Helpers.tablify_or_one_line('head', %w(ing)).should == 'head: ing'`
This is wrong, but was not failing because it was in a describe block
instead of an it block. In reality, it returns `"head: ing\n"`,
I updated the test to reflect this, though I don't know for sure
this is the right thing to do
This will fail on master until https://github.com/pry/pry/pull/1281 is merged.
This makes https://github.com/pry/pry/pull/1278 unnecessary.
2014-08-10 18:26:47 -04:00
|
|
|
expect { @t.eval 'cd BasicObject.new' }.to_not raise_error
|
2014-04-28 03:50:29 -04:00
|
|
|
end
|
2018-10-17 10:57:15 -04:00
|
|
|
|
|
|
|
# https://github.com/pry/pry/issues/1596
|
|
|
|
it "can cd into objects that redefine #respond_to? to return true" do
|
|
|
|
expect { @t.eval('cd Class.new { def respond_to?(m) true end }.new') }
|
|
|
|
.to_not raise_error
|
|
|
|
end
|
2012-04-05 15:01:45 -04:00
|
|
|
end
|