aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/test/core_ext/class/delegating_attributes_test.rb
blob: 59c0a6f63c05db549138f192f03820814f013ebe (plain) (blame)
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
require File.dirname(__FILE__) + '/../../abstract_unit'

module DelegatingFixtures
  class Parent
  end

  class Child < Parent
    superclass_delegating_accessor :some_attribute
  end

  class Mokopuna < Child
  end
end

class DelegatingAttributesTest < Test::Unit::TestCase
  include DelegatingFixtures
  attr_reader :single_class

  def setup
    @single_class = Class.new(Object)
  end

  def test_simple_reader_declaration
    single_class.superclass_delegating_reader   :only_reader
    # The class and instance should have an accessor, but there
    # should be no mutator
    assert single_class.respond_to?(:only_reader)
    assert single_class.public_instance_methods.include?("only_reader")
    assert !single_class.respond_to?(:only_reader=)
  end

  def test_simple_writer_declaration
    single_class.superclass_delegating_writer   :only_writer
    # The class should have a mutator, the instances shouldn't
    # neither should have an accessor
    assert single_class.respond_to?(:only_writer=)
    assert !single_class.public_instance_methods.include?("only_writer=")
    assert !single_class.public_instance_methods.include?("only_writer")
    assert !single_class.respond_to?(:only_writer)
  end

  def test_simple_accessor_declaration
    single_class.superclass_delegating_accessor :both
    # Class should have accessor and mutator
    # the instance should have an accessor only
    assert single_class.respond_to?(:both)
    assert single_class.respond_to?(:both=)
    assert single_class.public_instance_methods.include?("both")
    assert !single_class.public_instance_methods.include?("both=")
  end

  def test_working_with_simple_attributes
    single_class.superclass_delegating_accessor :both
    single_class.both= "HMMM"
    assert_equal "HMMM", single_class.both
    assert_equal "HMMM", single_class.new.both
  end

  def test_working_with_accessors
    single_class.superclass_delegating_reader   :only_reader
    single_class.instance_variable_set("@only_reader", "reading only")
    assert_equal "reading only", single_class.only_reader
    assert_equal "reading only", single_class.new.only_reader
  end

  def test_working_with_simple_mutators
    single_class.superclass_delegating_writer   :only_writer
    single_class.only_writer="written"
    assert_equal "written", single_class.instance_variable_get("@only_writer")
  end

  def test_child_class_delegates_to_parent_but_can_be_overridden
    parent = Class.new
    parent.superclass_delegating_accessor :both
    child = Class.new(parent)
    parent.both= "1"
    assert_equal "1", child.both

    child.both="2"
    assert_equal "1", parent.both
    assert_equal "2", child.both

    parent.both="3"
    assert_equal "3", parent.both
    assert_equal "2", child.both
  end

  def test_delegation_stops_at_the_right_level
    assert_nil Mokopuna.some_attribute
    assert_nil Child.some_attribute
    Child.some_attribute="1"
    assert_equal "1", Mokopuna.some_attribute
  ensure
    Child.some_attribute=nil
  end
  
  def test_delegation_stops_for_nil
    Mokopuna.some_attribute = nil
    Child.some_attribute="1"
    
    assert_equal "1", Child.some_attribute
    assert_nil Mokopuna.some_attribute
  end

end