File: eql.rb

package info (click to toggle)
jruby 1.7.26-1%2Bdeb9u1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 84,572 kB
  • sloc: ruby: 669,910; java: 253,056; xml: 35,152; ansic: 9,187; yacc: 7,267; cpp: 5,244; sh: 1,036; makefile: 345; jsp: 48; tcl: 40
file content (131 lines) | stat: -rw-r--r-- 4,129 bytes parent folder | download
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
require File.expand_path('../../../../spec_helper', __FILE__)
require File.expand_path('../../fixtures/classes', __FILE__)

describe :method_equal, :shared => true do
  before(:each) do
    @m = MethodSpecs::Methods.new
    @m_foo = @m.method(:foo)
    @m2 = MethodSpecs::Methods.new
    @a = MethodSpecs::A.new
  end

  it "returns true if methods are the same" do
    m2 = @m.method(:foo)

    @m_foo.send(@method, @m_foo).should be_true
    @m_foo.send(@method, m2).should be_true
  end

  it "returns true on aliased methods" do
    m_bar = @m.method(:bar)

    m_bar.send(@method, @m_foo).should be_true
  end

  ruby_version_is "1.9" do
    it "returns true if the two core methods are aliases" do
      s = "hello"
      a = s.method(:size)
      b = s.method(:length)
      a.send(@method, b).should be_true
    end
  end

  it "returns false on a method which is neither aliased nor the same method" do
    m2 = @m.method(:zero)

    @m_foo.send(@method, m2).should be_false
  end

  it "returns false for a method which is not bound to the same object" do
    m2_foo = @m2.method(:foo)
    a_baz = @a.method(:baz)

    @m_foo.send(@method, m2_foo).should be_false
    @m_foo.send(@method, a_baz).should be_false
  end

  it "returns false if the two methods are bound to the same object but were defined independently" do
    m2 = @m.method(:same_as_foo)
    @m_foo.send(@method, m2).should be_false
  end

  ruby_version_is "1.9" do
    it "returns true if a method was defined using the other one" do
      MethodSpecs::Methods.send :define_method, :defined_foo, MethodSpecs::Methods.instance_method(:foo)
      m2 = @m.method(:defined_foo)
      @m_foo.send(@method, m2).should be_true
    end

    ruby_version_is ""..."2.0" do
      it "returns true for methods defined using the same block/proc" do
        class MethodSpecs::Methods
          p = Proc.new { :cool }
          define_method :proc1, p
          define_method :proc2, p

          define_method :block1, &p
          define_method :block2, &p
        end
        proc1 = @m.method :proc1
        proc2 = @m.method :proc2
        block1 = @m.method :proc1
        block2 = @m.method :proc2

        proc1.send(@method, proc2).should be_true
        block1.send(@method, block2).should be_true
        proc1.send(@method, block1).should be_true
      end

      it "returns true for methods defined using equivalent blocks" do
        class MethodSpecs::Methods
          p1 = Proc.new { :cool }
          p2 = Proc.new { :cool }
          define_method :proc1, p1
          define_method :proc2, p2

          define_method :block1, &p1
          define_method :block2, &p2
        end
        proc1 = @m.method :proc1
        proc2 = @m.method :proc2
        block1 = @m.method :proc1
        block2 = @m.method :proc2

        proc1.send(@method, proc2).should be_true
        block1.send(@method, block2).should be_true
        proc1.send(@method, block1).should be_true
      end
    end

    describe 'missing methods' do
      it "returns true for the same method missing" do
        miss1 = @m.method(:handled_via_method_missing)
        miss1bis = @m.method(:handled_via_method_missing)
        miss2 = @m.method(:also_handled)

        miss1.send(@method, miss1bis).should be_true
        miss1.send(@method, miss2).should be_false
      end

      it 'calls respond_to_missing? with true to include private methods' do
        @m.should_receive(:respond_to_missing?).with(:some_missing_method, true).and_return(true)
        @m.method(:some_missing_method)
      end
    end
  end

  it "returns false if the two methods are bound to different objects, have the same names, and identical bodies" do
    a = MethodSpecs::Eql.instance_method(:same_body)
    b = MethodSpecs::Eql2.instance_method(:same_body)
    a.send(@method, b).should be_false
  end

  it "returns false if the argument is not a Method object" do
    String.instance_method(:size).send(@method, 7).should be_false
  end

  it "returns false if the argument is an unbound version of self" do
    method(:load).send(@method, method(:load).unbind).should be_false
  end
end