2011-08-17 00:53:20 -04:00
|
|
|
require 'helper'
|
|
|
|
|
2012-08-12 00:38:32 -04:00
|
|
|
def completer_test(bind, pry=nil, assert_flag=true)
|
2012-12-28 18:19:21 -05:00
|
|
|
test = proc {|symbol|
|
|
|
|
Pry::InputCompleter.call(symbol[0..-2], :target => Pry.binding_for(bind), :pry => pry).include?(symbol).should == assert_flag}
|
2012-08-12 00:38:32 -04:00
|
|
|
return proc {|*symbols| symbols.each(&test) }
|
|
|
|
end
|
|
|
|
|
2012-10-21 01:54:33 -04:00
|
|
|
if defined?(Bond) && Readline::VERSION !~ /editline/i
|
2012-09-06 01:39:29 -04:00
|
|
|
describe 'bond-based completion' do
|
|
|
|
it 'should pull in Bond by default' do
|
|
|
|
Pry.config.completer.should == Pry::BondCompleter
|
|
|
|
end
|
2012-08-18 18:49:20 -04:00
|
|
|
end
|
|
|
|
end
|
2012-08-12 00:38:32 -04:00
|
|
|
|
2011-08-17 00:53:20 -04:00
|
|
|
describe Pry::InputCompleter do
|
|
|
|
|
|
|
|
before do
|
|
|
|
# The AMQP gem has some classes like this:
|
|
|
|
# pry(main)> AMQP::Protocol::Test::ContentOk.name
|
|
|
|
# => :content_ok
|
|
|
|
module SymbolyName
|
|
|
|
def self.name; :symboly_name; end
|
|
|
|
end
|
2012-08-18 18:49:20 -04:00
|
|
|
|
|
|
|
$default_completer = Pry.config.completer
|
|
|
|
Pry.config.completer = Pry::InputCompleter
|
2011-08-17 00:53:20 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
after do
|
2012-08-18 18:49:20 -04:00
|
|
|
Pry.config.completer = $default_completer
|
2011-08-17 00:53:20 -04:00
|
|
|
Object.remove_const :SymbolyName
|
|
|
|
end
|
|
|
|
|
2011-09-06 13:20:04 -04:00
|
|
|
# another jruby hack :((
|
2011-12-27 17:38:25 -05:00
|
|
|
if !Pry::Helpers::BaseHelpers.jruby?
|
2011-09-06 13:20:04 -04:00
|
|
|
it "should not crash if there's a Module that has a symbolic name." do
|
2012-12-28 18:19:21 -05:00
|
|
|
lambda{ Pry::InputCompleter.call "a.to_s.", :target => Pry.binding_for(Object.new) }.should.not.raise Exception
|
2011-09-06 13:20:04 -04:00
|
|
|
end
|
2011-08-17 00:53:20 -04:00
|
|
|
end
|
2012-06-19 06:32:03 -04:00
|
|
|
|
2012-06-19 05:40:58 -04:00
|
|
|
it 'should take parenthesis and other characters into account for symbols' do
|
2012-12-28 18:19:21 -05:00
|
|
|
lambda { Pry::InputCompleter.call(":class)", :target => Pry.binding_for(Object.new)) }.should.not.raise(RegexpError)
|
2012-06-19 05:40:58 -04:00
|
|
|
end
|
2012-06-19 09:47:52 -04:00
|
|
|
|
2012-06-19 06:32:03 -04:00
|
|
|
it 'should complete instance variables' do
|
2012-09-06 01:56:45 -04:00
|
|
|
object = Class.new.new
|
2012-06-19 06:32:03 -04:00
|
|
|
|
2012-08-12 00:38:32 -04:00
|
|
|
# set variables in appropriate scope
|
2012-06-19 06:32:03 -04:00
|
|
|
object.instance_variable_set(:'@name', 'Pry')
|
2012-06-19 07:09:55 -04:00
|
|
|
object.class.send(:class_variable_set, :'@@number', 10)
|
2012-06-19 06:32:03 -04:00
|
|
|
|
2012-08-12 00:38:32 -04:00
|
|
|
# check to see if variables are in scope
|
|
|
|
object.instance_variables.
|
|
|
|
map { |v| v.to_sym }.
|
|
|
|
include?(:'@name').should == true
|
2012-08-09 22:32:23 -04:00
|
|
|
|
2012-08-12 00:38:32 -04:00
|
|
|
object.class.class_variables.
|
|
|
|
map { |v| v.to_sym }.
|
|
|
|
include?(:'@@number').should == true
|
2012-06-19 06:32:03 -04:00
|
|
|
|
|
|
|
# Complete instance variables.
|
2012-08-12 00:38:32 -04:00
|
|
|
b = Pry.binding_for(object)
|
|
|
|
completer_test(b).call('@name', '@name.downcase')
|
2012-06-19 06:32:03 -04:00
|
|
|
|
|
|
|
# Complete class variables.
|
2012-08-12 00:38:32 -04:00
|
|
|
b = Pry.binding_for(object.class)
|
|
|
|
completer_test(b).call('@@number', '@@number.class')
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
it 'should complete for stdlib symbols' do
|
|
|
|
|
|
|
|
o = Object.new
|
|
|
|
# Regexp
|
|
|
|
completer_test(o).call('/foo/.extend')
|
|
|
|
|
|
|
|
# Array
|
|
|
|
completer_test(o).call('[1].push')
|
2013-01-14 07:36:57 -05:00
|
|
|
|
2012-08-12 00:38:32 -04:00
|
|
|
# Hash
|
|
|
|
completer_test(o).call('{"a" => "b"}.keys')
|
2013-01-14 07:36:57 -05:00
|
|
|
|
2012-08-12 00:38:32 -04:00
|
|
|
# Proc
|
|
|
|
completer_test(o).call('{2}.call')
|
|
|
|
|
|
|
|
# Symbol
|
|
|
|
completer_test(o).call(':symbol.to_s')
|
|
|
|
|
|
|
|
# Absolute Constant
|
|
|
|
completer_test(o).call('::IndexError')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should complete for target symbols' do
|
|
|
|
o = Object.new
|
|
|
|
|
|
|
|
# Constant
|
|
|
|
module Mod
|
|
|
|
Con = 'Constant'
|
|
|
|
module Mod2
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
completer_test(Mod).call('Con')
|
|
|
|
|
|
|
|
# Constants or Class Methods
|
|
|
|
completer_test(o).call('Mod::Con')
|
|
|
|
|
|
|
|
# Symbol
|
|
|
|
foo = :symbol
|
|
|
|
completer_test(o).call(':symbol')
|
2012-06-19 06:32:03 -04:00
|
|
|
|
2012-08-12 00:38:32 -04:00
|
|
|
# Variables
|
|
|
|
class << o
|
|
|
|
attr_accessor :foo
|
|
|
|
end
|
|
|
|
o.foo = 'bar'
|
|
|
|
completer_test(binding).call('o.foo')
|
|
|
|
|
|
|
|
# trailing slash
|
2012-12-28 18:19:21 -05:00
|
|
|
Pry::InputCompleter.call('Mod2/', :target => Pry.binding_for(Mod)).include?('Mod2/').should == true
|
2012-06-19 06:32:03 -04:00
|
|
|
end
|
2012-08-12 00:38:32 -04:00
|
|
|
|
|
|
|
it 'should complete for arbitrary scopes' do
|
|
|
|
module Bar
|
|
|
|
@barvar = :bar
|
|
|
|
end
|
|
|
|
|
|
|
|
module Baz
|
|
|
|
@bar = Bar
|
|
|
|
@bazvar = :baz
|
|
|
|
Con = :constant
|
|
|
|
end
|
|
|
|
|
2012-12-18 03:10:00 -05:00
|
|
|
pry = Pry.new(:target => Baz)
|
|
|
|
pry.push_binding(Bar)
|
2012-08-12 00:38:32 -04:00
|
|
|
|
|
|
|
b = Pry.binding_for(Bar)
|
|
|
|
completer_test(b, pry).call("../@bazvar")
|
|
|
|
completer_test(b, pry).call('/Con')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should complete for stdlib symbols' do
|
|
|
|
|
|
|
|
o = Object.new
|
|
|
|
# Regexp
|
|
|
|
completer_test(o).call('/foo/.extend')
|
|
|
|
|
|
|
|
# Array
|
|
|
|
completer_test(o).call('[1].push')
|
2013-01-14 07:36:57 -05:00
|
|
|
|
2012-08-12 00:38:32 -04:00
|
|
|
# Hash
|
|
|
|
completer_test(o).call('{"a" => "b"}.keys')
|
2013-01-14 07:36:57 -05:00
|
|
|
|
2012-08-12 00:38:32 -04:00
|
|
|
# Proc
|
|
|
|
completer_test(o).call('{2}.call')
|
|
|
|
|
|
|
|
# Symbol
|
|
|
|
completer_test(o).call(':symbol.to_s')
|
|
|
|
|
|
|
|
# Absolute Constant
|
|
|
|
completer_test(o).call('::IndexError')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should complete for target symbols' do
|
|
|
|
o = Object.new
|
|
|
|
|
|
|
|
# Constant
|
|
|
|
module Mod
|
|
|
|
Con = 'Constant'
|
|
|
|
module Mod2
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
completer_test(Mod).call('Con')
|
|
|
|
|
|
|
|
# Constants or Class Methods
|
|
|
|
completer_test(o).call('Mod::Con')
|
|
|
|
|
|
|
|
# Symbol
|
|
|
|
foo = :symbol
|
|
|
|
completer_test(o).call(':symbol')
|
|
|
|
|
|
|
|
# Variables
|
|
|
|
class << o
|
|
|
|
attr_accessor :foo
|
|
|
|
end
|
|
|
|
o.foo = 'bar'
|
|
|
|
completer_test(binding).call('o.foo')
|
|
|
|
|
|
|
|
# trailing slash
|
2012-12-28 18:19:21 -05:00
|
|
|
Pry::InputCompleter.call('Mod2/', :target => Pry.binding_for(Mod)).include?('Mod2/').should == true
|
2012-08-12 00:38:32 -04:00
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should complete for arbitrary scopes' do
|
|
|
|
module Bar
|
|
|
|
@barvar = :bar
|
|
|
|
end
|
|
|
|
|
|
|
|
module Baz
|
|
|
|
@bar = Bar
|
|
|
|
@bazvar = :baz
|
|
|
|
Con = :constant
|
|
|
|
end
|
|
|
|
|
2012-12-18 03:10:00 -05:00
|
|
|
pry = Pry.new(:target => Baz)
|
|
|
|
pry.push_binding(Bar)
|
2012-08-12 00:38:32 -04:00
|
|
|
|
|
|
|
b = Pry.binding_for(Bar)
|
|
|
|
completer_test(b, pry).call("../@bazvar")
|
|
|
|
completer_test(b, pry).call('/Con')
|
|
|
|
end
|
|
|
|
|
2013-01-14 07:36:57 -05:00
|
|
|
it 'should not return nil in its output' do
|
|
|
|
pry = Pry.new
|
2013-01-18 02:56:07 -05:00
|
|
|
Pry::InputCompleter.call("pry.", :target => binding).should.not.include nil
|
2013-01-14 07:36:57 -05:00
|
|
|
end
|
2011-08-17 00:53:20 -04:00
|
|
|
end
|