summaryrefslogtreecommitdiff
path: root/spec/pry_defaults_spec.rb
diff options
context:
space:
mode:
author☈king <rking@sharpsaw.org>2012-11-14 22:37:37 -0700
committerrking@sharpsaw.org <>2012-11-15 18:59:51 -0600
commit848b6bdbeb30115b537dc55b0eb07358b7d5534f (patch)
tree6af3c21188ad7a73d912406b6f3ddce75edaf3c4 /spec/pry_defaults_spec.rb
parent7a5d21ba746c49a0d3d344553e9c43bbb89cd57e (diff)
downloadpry-848b6bdbeb30115b537dc55b0eb07358b7d5534f.tar.gz
Rename for tabcompletion-friendliness.
Diffstat (limited to 'spec/pry_defaults_spec.rb')
-rw-r--r--spec/pry_defaults_spec.rb419
1 files changed, 419 insertions, 0 deletions
diff --git a/spec/pry_defaults_spec.rb b/spec/pry_defaults_spec.rb
new file mode 100644
index 00000000..e79706fa
--- /dev/null
+++ b/spec/pry_defaults_spec.rb
@@ -0,0 +1,419 @@
+require 'helper'
+
+version = 1
+
+describe "test Pry defaults" do
+ before do
+ @str_output = StringIO.new
+ end
+
+ after do
+ Pry.reset_defaults
+ Pry.color = false
+ end
+
+ describe "input" do
+ after do
+ Pry.reset_defaults
+ Pry.color = false
+ end
+
+ it 'should set the input default, and the default should be overridable' do
+ Pry.input = InputTester.new("5")
+
+ Pry.output = @str_output
+ Pry.new.rep
+ @str_output.string.should =~ /5/
+
+ Pry.new(:input => InputTester.new("6")).rep
+ @str_output.string.should =~ /6/
+ end
+
+ it 'should pass in the prompt if readline arity is 1' do
+ Pry.prompt = proc { "A" }
+
+ arity_one_input = Class.new do
+ attr_accessor :prompt
+ def readline(prompt)
+ @prompt = prompt
+ "exit-all"
+ end
+ end.new
+
+ Pry.start(self, :input => arity_one_input, :output => Pry::NullOutput)
+ arity_one_input.prompt.should == Pry.prompt.call
+ end
+
+ it 'should not pass in the prompt if the arity is 0' do
+ Pry.prompt = proc { "A" }
+
+ arity_zero_input = Class.new do
+ def readline
+ "exit-all"
+ end
+ end.new
+
+ lambda { Pry.start(self, :input => arity_zero_input, :output => Pry::NullOutput) }.should.not.raise Exception
+ end
+
+ it 'should not pass in the prompt if the arity is -1' do
+ Pry.prompt = proc { "A" }
+
+ arity_multi_input = Class.new do
+ attr_accessor :prompt
+
+ def readline(*args)
+ @prompt = args.first
+ "exit-all"
+ end
+ end.new
+
+ Pry.start(self, :input => arity_multi_input, :output => Pry::NullOutput)
+ arity_multi_input.prompt.should == nil
+ end
+
+ end
+
+ it 'should set the output default, and the default should be overridable' do
+ Pry.input = InputTester.new("5", "6", "7")
+
+ Pry.output = @str_output
+
+ Pry.new.rep
+ @str_output.string.should =~ /5/
+
+ Pry.new.rep
+ @str_output.string.should =~ /5\n.*6/
+
+ @str_output = StringIO.new
+ Pry.new(:output => @str_output).rep
+ @str_output.string.should.not =~ /5\n.*6/
+ @str_output.string.should =~ /7/
+ end
+
+ it "should set the print default, and the default should be overridable" do
+ new_print = proc { |out, value| out.puts "LOL" }
+ Pry.print = new_print
+
+ Pry.new.print.should == Pry.print
+ Pry.new(:input => InputTester.new("\"test\""), :output => @str_output).rep
+ @str_output.string.should == "=> LOL\n"
+
+ @str_output = StringIO.new
+ Pry.new(:input => InputTester.new("\"test\""), :output => @str_output,
+ :print => proc { |out, value| out.puts value.reverse }).rep
+ @str_output.string.should == "=> tset\n"
+
+ Pry.new.print.should == Pry.print
+ @str_output = StringIO.new
+ Pry.new(:input => InputTester.new("\"test\""), :output => @str_output).rep
+ @str_output.string.should == "=> LOL\n"
+ end
+
+ describe "pry return values" do
+ it 'should return nil' do
+ Pry.start(self, :input => StringIO.new("exit-all"), :output => Pry::NullOutput).should == nil
+ end
+
+ it 'should return the parameter given to exit-all' do
+ Pry.start(self, :input => StringIO.new("exit-all 10"), :output => Pry::NullOutput).should == 10
+ end
+
+ it 'should return the parameter (multi word string) given to exit-all' do
+ Pry.start(self, :input => StringIO.new("exit-all \"john mair\""), :output => Pry::NullOutput).should == "john mair"
+ end
+
+ it 'should return the parameter (function call) given to exit-all' do
+ Pry.start(self, :input => StringIO.new("exit-all 'abc'.reverse"), :output => Pry::NullOutput).should == 'cba'
+ end
+
+ it 'should return the parameter (self) given to exit-all' do
+ Pry.start("carl", :input => StringIO.new("exit-all self"), :output => Pry::NullOutput).should == "carl"
+ end
+ end
+
+ describe "prompts" do
+ before do
+ @empty_input_buffer = ""
+ @non_empty_input_buffer = "def hello"
+ @context = Pry.binding_for(0)
+ end
+
+ it 'should set the prompt default, and the default should be overridable (single prompt)' do
+ new_prompt = proc { "test prompt> " }
+ Pry.prompt = new_prompt
+
+ Pry.new.prompt.should == Pry.prompt
+ Pry.new.select_prompt(@empty_input_buffer, @context).should == "test prompt> "
+ Pry.new.select_prompt(@non_empty_input_buffer, @context).should == "test prompt> "
+
+ new_prompt = proc { "A" }
+ pry_tester = Pry.new(:prompt => new_prompt)
+ pry_tester.prompt.should == new_prompt
+ pry_tester.select_prompt(@empty_input_buffer, @context).should == "A"
+ pry_tester.select_prompt(@non_empty_input_buffer, @context).should == "A"
+
+ Pry.new.prompt.should == Pry.prompt
+ Pry.new.select_prompt(@empty_input_buffer, @context).should == "test prompt> "
+ Pry.new.select_prompt(@non_empty_input_buffer, @context).should == "test prompt> "
+ end
+
+ it 'should set the prompt default, and the default should be overridable (multi prompt)' do
+ new_prompt = [proc { "test prompt> " }, proc { "test prompt* " }]
+ Pry.prompt = new_prompt
+
+ Pry.new.prompt.should == Pry.prompt
+ Pry.new.select_prompt(@empty_input_buffer, @context).should == "test prompt> "
+ Pry.new.select_prompt(@non_empty_input_buffer, @context).should == "test prompt* "
+
+ new_prompt = [proc { "A" }, proc { "B" }]
+ pry_tester = Pry.new(:prompt => new_prompt)
+ pry_tester.prompt.should == new_prompt
+ pry_tester.select_prompt(@empty_input_buffer, @context).should == "A"
+ pry_tester.select_prompt(@non_empty_input_buffer, @context).should == "B"
+
+ Pry.new.prompt.should == Pry.prompt
+ Pry.new.select_prompt(@empty_input_buffer, @context).should == "test prompt> "
+ Pry.new.select_prompt(@non_empty_input_buffer, @context).should == "test prompt* "
+ end
+
+ describe 'storing and restoring the prompt' do
+ before do
+ make = lambda do |name,i|
+ prompt = [ proc { "#{i}>" } , proc { "#{i+1}>" } ]
+ (class << prompt; self; end).send(:define_method, :inspect) { "<Prompt-#{name}>" }
+ prompt
+ end
+ @a , @b , @c = make[:a,0] , make[:b,1] , make[:c,2]
+ @pry = Pry.new :prompt => @a
+ end
+ it 'should have a prompt stack' do
+ @pry.push_prompt @b
+ @pry.push_prompt @c
+ @pry.prompt.should == @c
+ @pry.pop_prompt
+ @pry.prompt.should == @b
+ @pry.pop_prompt
+ @pry.prompt.should == @a
+ end
+
+ it 'should restore overridden prompts when returning from file-mode' do
+ pry = Pry.new :input => InputTester.new('shell-mode', 'shell-mode'),
+ :prompt => [ proc { 'P>' } ] * 2
+ pry.select_prompt(@empty_input_buffer, @context).should == "P>"
+ pry.re
+ pry.select_prompt(@empty_input_buffer, @context).should =~ /\Apry .* \$ \z/
+ pry.re
+ pry.select_prompt(@empty_input_buffer, @context).should == "P>"
+ end
+
+ it '#pop_prompt should return the popped prompt' do
+ @pry.push_prompt @b
+ @pry.push_prompt @c
+ @pry.pop_prompt.should == @c
+ @pry.pop_prompt.should == @b
+ end
+
+ it 'should not pop the last prompt' do
+ @pry.push_prompt @b
+ @pry.pop_prompt.should == @b
+ @pry.pop_prompt.should == @a
+ @pry.pop_prompt.should == @a
+ @pry.prompt.should == @a
+ end
+
+ describe '#prompt= should replace the current prompt with the new prompt' do
+ it 'when only one prompt on the stack' do
+ @pry.prompt = @b
+ @pry.prompt.should == @b
+ @pry.pop_prompt.should == @b
+ @pry.pop_prompt.should == @b
+ end
+ it 'when several prompts on the stack' do
+ @pry.push_prompt @b
+ @pry.prompt = @c
+ @pry.pop_prompt.should == @c
+ @pry.pop_prompt.should == @a
+ end
+ end
+ end
+ end
+
+ describe "view_clip used for displaying an object in a truncated format" do
+
+ VC_MAX_LENGTH = 60
+
+ describe "given an object with an #inspect string" do
+ it "returns the #<> format of the object (never use inspect)" do
+ o = Object.new
+ def o.inspect; "a" * VC_MAX_LENGTH; end
+
+ Pry.view_clip(o, VC_MAX_LENGTH).should =~ /#<Object/
+ end
+ end
+
+ describe "given the 'main' object" do
+ it "returns the #to_s of main (special case)" do
+ o = TOPLEVEL_BINDING.eval('self')
+ Pry.view_clip(o, VC_MAX_LENGTH).should == o.to_s
+ end
+ end
+
+ describe "given the a Numeric, String or Symbol object" do
+ [1, 2.0, -5, "hello", :test].each do |o|
+ it "returns the #inspect of the special-cased immediate object: #{o}" do
+ Pry.view_clip(o, VC_MAX_LENGTH).should == o.inspect
+ end
+ end
+
+ # only testing with String here :)
+ it "returns #<> format of the special-cased immediate object if #inspect is longer than maximum" do
+ o = "o" * (VC_MAX_LENGTH + 1)
+ Pry.view_clip(o, VC_MAX_LENGTH).should =~ /#<String/
+ end
+ end
+
+ describe "given an object with an #inspect string as long as the maximum specified" do
+ it "returns the #<> format of the object (never use inspect)" do
+ o = Object.new
+ def o.inspect; "a" * VC_MAX_LENGTH; end
+
+ Pry.view_clip(o, VC_MAX_LENGTH).should =~ /#<Object/
+ end
+ end
+
+ describe "given a regular object with an #inspect string longer than the maximum specified" do
+
+ describe "when the object is a regular one" do
+ it "returns a string of the #<class name:object idish> format" do
+ o = Object.new
+ def o.inspect; "a" * (VC_MAX_LENGTH + 1); end
+
+ Pry.view_clip(o, VC_MAX_LENGTH).should =~ /#<Object/
+ end
+ end
+
+ describe "when the object is a Class or a Module" do
+ describe "without a name (usually a c = Class.new)" do
+ it "returns a string of the #<class name:object idish> format" do
+ c, m = Class.new, Module.new
+
+ Pry.view_clip(c, VC_MAX_LENGTH).should =~ /#<Class/
+ Pry.view_clip(m, VC_MAX_LENGTH).should =~ /#<Module/
+ end
+ end
+
+ describe "with a #name longer than the maximum specified" do
+ it "returns a string of the #<class name:object idish> format" do
+ c, m = Class.new, Module.new
+
+
+ def c.name; "a" * (VC_MAX_LENGTH + 1); end
+ def m.name; "a" * (VC_MAX_LENGTH + 1); end
+
+ Pry.view_clip(c, VC_MAX_LENGTH).should =~ /#<Class/
+ Pry.view_clip(m, VC_MAX_LENGTH).should =~ /#<Module/
+ end
+ end
+
+ describe "with a #name shorter than or equal to the maximum specified" do
+ it "returns a string of the #<class name:object idish> format" do
+ c, m = Class.new, Module.new
+
+ def c.name; "a" * VC_MAX_LENGTH; end
+ def m.name; "a" * VC_MAX_LENGTH; end
+
+ Pry.view_clip(c, VC_MAX_LENGTH).should == c.name
+ Pry.view_clip(m, VC_MAX_LENGTH).should == m.name
+ end
+ end
+
+ end
+
+ end
+
+ end
+
+ describe 'quiet' do
+ it 'should show whereami by default' do
+ Pry.start(binding, :input => InputTester.new("1", "exit-all"),
+ :output => @str_output,
+ :hooks => Pry::DEFAULT_HOOKS)
+
+ @str_output.string.should =~ /[w]hereami by default/
+ end
+
+ it 'should hide whereami if quiet is set' do
+ Pry.new(:input => InputTester.new("exit-all"),
+ :output => @str_output,
+ :quiet => true,
+ :hooks => Pry::DEFAULT_HOOKS)
+
+ @str_output.string.should == ""
+ end
+ end
+
+ describe 'toplevel_binding' do
+ it 'should be devoid of local variables' do
+ pry_eval(Pry.toplevel_binding, "ls -l").should.not =~ /version/
+ end
+
+ it 'should have self the same as TOPLEVEL_BINDING' do
+ Pry.toplevel_binding.eval('self').should.equal? TOPLEVEL_BINDING.eval('self')
+ end
+
+ # https://github.com/rubinius/rubinius/issues/1779
+ unless Pry::Helpers::BaseHelpers.rbx?
+ it 'should define private methods on Object' do
+ TOPLEVEL_BINDING.eval 'def gooey_fooey; end'
+ method(:gooey_fooey).owner.should == Object
+ Pry::Method(method(:gooey_fooey)).visibility.should == :private
+ end
+ end
+ end
+
+ it 'should set the hooks default, and the default should be overridable' do
+ Pry.input = InputTester.new("exit-all")
+ Pry.hooks = Pry::Hooks.new.
+ add_hook(:before_session, :my_name) { |out,_,_| out.puts "HELLO" }.
+ add_hook(:after_session, :my_name) { |out,_,_| out.puts "BYE" }
+
+ Pry.new(:output => @str_output).repl
+ @str_output.string.should =~ /HELLO/
+ @str_output.string.should =~ /BYE/
+
+ Pry.input.rewind
+
+ @str_output = StringIO.new
+ Pry.new(:output => @str_output,
+ :hooks => Pry::Hooks.new.
+ add_hook( :before_session, :my_name) { |out,_,_| out.puts "MORNING" }.
+ add_hook(:after_session, :my_name) { |out,_,_| out.puts "EVENING" }
+ ).repl
+
+ @str_output.string.should =~ /MORNING/
+ @str_output.string.should =~ /EVENING/
+
+ # try below with just defining one hook
+ Pry.input.rewind
+ @str_output = StringIO.new
+ Pry.new(:output => @str_output,
+ :hooks => Pry::Hooks.new.
+ add_hook(:before_session, :my_name) { |out,_,_| out.puts "OPEN" }
+ ).repl
+
+ @str_output.string.should =~ /OPEN/
+
+ Pry.input.rewind
+ @str_output = StringIO.new
+ Pry.new(:output => @str_output,
+ :hooks => Pry::Hooks.new.
+ add_hook(:after_session, :my_name) { |out,_,_| out.puts "CLOSE" }
+ ).repl
+
+ @str_output.string.should =~ /CLOSE/
+
+ Pry.reset_defaults
+ Pry.color = false
+ end
+end