File: attr_spec.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 (136 lines) | stat: -rw-r--r-- 3,426 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
132
133
134
135
136
require File.expand_path('../../../spec_helper', __FILE__)
require File.expand_path('../fixtures/classes', __FILE__)

describe "Module#attr" do
  it "creates a getter for the given attribute name" do
    c = Class.new do
      attr :attr
      attr "attr3"

      def initialize
        @attr, @attr2, @attr3 = "test", "test2", "test3"
      end
    end

    o = c.new

    %w{attr attr3}.each do |a|
      o.respond_to?(a).should == true
      o.respond_to?("#{a}=").should == false
    end

    o.attr.should  == "test"
    o.attr3.should == "test3"
    o.send(:attr).should == "test"
    o.send(:attr3).should == "test3"
  end

  it "creates a setter for the given attribute name if writable is true" do
    c = Class.new do
      attr :attr, true
      attr "attr3", true

      def initialize
        @attr, @attr2, @attr3 = "test", "test2", "test3"
      end
    end

    o = c.new

    %w{attr attr3}.each do |a|
      o.respond_to?(a).should == true
      o.respond_to?("#{a}=").should == true
    end

    o.attr = "test updated"
    o.attr3 = "test3 updated"
  end

  it "creates a getter and setter for the given attribute name if called with and without writeable is true" do
    c = Class.new do
      attr :attr, true
      attr :attr

      attr "attr3", true
      attr "attr3"

      def initialize
        @attr, @attr2, @attr3 = "test", "test2", "test3"
      end
    end

    o = c.new

    %w{attr attr3}.each do |a|
      o.respond_to?(a).should == true
      o.respond_to?("#{a}=").should == true
    end

    o.attr.should == "test"
    o.attr = "test updated"
    o.attr.should == "test updated"

    o.attr3.should == "test3"
    o.attr3 = "test3 updated"
    o.attr3.should == "test3 updated"
  end

  it "applies current visibility to methods created" do
    c = Class.new do
      protected
      attr :foo, true
    end

    lambda { c.new.foo }.should raise_error(NoMethodError)
    lambda { c.new.foo=1 }.should raise_error(NoMethodError)
  end

  ruby_version_is "1.9" do
    it "creates a getter but no setter for all given attribute names" do
      c = Class.new do
        attr :attr, "attr2", "attr3"

        def initialize
          @attr, @attr2, @attr3 = "test", "test2", "test3"
        end
      end

      o = c.new

      %w{attr attr2 attr3}.each do |a|
        o.respond_to?(a).should == true
        o.respond_to?("#{a}=").should == false
      end

      o.attr.should  == "test"
      o.attr2.should == "test2"
      o.attr3.should == "test3"
    end

    it "applies current visibility to methods created" do
      c = Class.new do
        protected
        attr :foo, :bar
      end

      lambda { c.new.foo }.should raise_error(NoMethodError)
      lambda { c.new.bar }.should raise_error(NoMethodError)
    end
  end

  it "converts non string/symbol/fixnum names to strings using to_str" do
    (o = mock('test')).should_receive(:to_str).any_number_of_times.and_return("test")
    Class.new { attr o }.new.respond_to?("test").should == true
  end

  it "raises a TypeError when the given names can't be converted to strings using to_str" do
    o = mock('o')
    lambda { Class.new { attr o } }.should raise_error(TypeError)
    (o = mock('123')).should_receive(:to_str).and_return(123)
    lambda { Class.new { attr o } }.should raise_error(TypeError)
  end

  it "is a private method" do
    lambda { Class.new.attr(:foo) }.should raise_error(NoMethodError)
  end
end