summaryrefslogtreecommitdiff
path: root/spec/pry_output_spec.rb
blob: 557d53e00f0122bc51d4c5eff6678d7b2ad99e8a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
require_relative 'helper'

describe Pry do
  describe "output failsafe" do
    after do
      Pry.config.print = Pry::DEFAULT_PRINT
    end

    it "should catch serialization exceptions" do
      Pry.config.print = lambda { |*a| raise "catch-22" }

      lambda {
        mock_pry("1")
      }.should.not.raise
    end

    it "should display serialization exceptions" do
      Pry.config.print = lambda { |*a| raise "catch-22" }

      mock_pry("1").should =~ /\(pry\) output error: #<RuntimeError: catch-22>/
    end

    it "should catch errors serializing exceptions" do
      Pry.config.print = lambda do |*a|
        raise Exception.new("catch-22").tap{ |e| class << e; def inspect; raise e; end; end }
      end

      mock_pry("1").should =~ /\(pry\) output error: failed to show result/
    end
  end

  describe "DEFAULT_PRINT" do
    it "should output the right thing" do
      mock_pry("[1]").should =~ /^=> \[1\]/
    end

    it "should include the =>" do
      pry = Pry.new
      accumulator = StringIO.new
      pry.config.print.call(accumulator, [1], pry)
      accumulator.string.should == "=> \[1\]\n"
    end

    it "should not be phased by un-inspectable things" do
      mock_pry("class NastyClass; undef pretty_inspect; end", "NastyClass.new").should =~ /#<.*NastyClass:0x.*?>/
    end

    it "doesn't leak colour for object literals" do
      mock_pry("Object.new").should =~ /=> #<Object:0x[a-z0-9]+>\n/
    end
  end

  describe "output_prefix" do
    it "should be able to change output_prefix" do
      pry = Pry.new
      accumulator = StringIO.new
      pry.config.output_prefix = "-> "
      pry.config.print.call(accumulator, [1], pry)
      accumulator.string.should == "-> \[1\]\n"
    end
  end

  describe "color" do
    before do
      Pry.color = true
    end

    after do
      Pry.color = false
    end

    it "should colorize strings as though they were ruby" do
      pry = Pry.new
      accumulator = StringIO.new
      colorized   = CodeRay.scan("[1]", :ruby).term
      pry.config.print.call(accumulator, [1], pry)
      accumulator.string.should == "=> #{colorized}\n"
    end

    it "should not colorize strings that already include color" do
      pry = Pry.new
      f = Object.new
      def f.inspect
        "\e[1;31mFoo\e[0m"
      end
      accumulator = StringIO.new
      pry.config.print.call(accumulator, f, pry)
      # We add an extra \e[0m to prevent color leak
      accumulator.string.should == "=> \e[1;31mFoo\e[0m\e[0m\n"
    end
  end

  describe "output suppression" do
    before do
      @t = pry_tester
    end
    it "should normally output the result" do
      mock_pry("1 + 2").should == "=> 3\n"
    end

    it "should not output anything if the input ends with a semicolon" do
      mock_pry("1 + 2;").should == ""
    end

    it "should output something if the input ends with a comment" do
      mock_pry("1 + 2 # basic addition").should == "=> 3\n"
    end

    it "should not output something if the input is only a comment" do
      mock_pry("# basic addition").should == ""
    end
  end
end