File: inheritable_attr_test.rb

package info (click to toggle)
ruby-uber 0.1.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 216 kB
  • sloc: ruby: 466; makefile: 4
file content (91 lines) | stat: -rw-r--r-- 2,402 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
require 'test_helper'
require "uber/inheritable_attr"

class InheritableAttrTest < Minitest::Spec
  describe "::inheritable_attr" do
    subject {
      Class.new(Object) do
        extend Uber::InheritableAttribute
        inheritable_attr :drinks
        inheritable_attr :glass
        inheritable_attr :guests, clone: false
      end
    }

    def assert_nothing_raised(*)
      yield
    end

    it "provides a reader with empty inherited attributes, already" do
      assert_equal nil, subject.drinks
    end

    it "provides a reader with empty inherited attributes in a derived class" do
      assert_equal nil, Class.new(subject).drinks
      #subject.drinks = true
      #Class.new(subject).drinks # TODO: crashes.
    end

    it "provides an attribute copy in subclasses" do
      subject.drinks = []
      assert subject.drinks.object_id != Class.new(subject).drinks.object_id
    end

    it "provides a writer" do
      subject.drinks = [:cabernet]
      assert_equal [:cabernet], subject.drinks
    end

    it "inherits attributes" do
      subject.drinks = [:cabernet]

      subklass_a = Class.new(subject)
      subklass_a.drinks << :becks

      subklass_b = Class.new(subject)

      assert_equal [:cabernet],         subject.drinks
      assert_equal [:cabernet, :becks], subklass_a.drinks
      assert_equal [:cabernet],         subklass_b.drinks
    end

    it "does not inherit attributes if we set explicitely" do
      subject.drinks = [:cabernet]
      subklass = Class.new(subject)

      subklass.drinks = [:merlot] # we only want merlot explicitely.
      assert_equal [:merlot], subklass.drinks # no :cabernet, here
    end

    it "respects clone: false" do
      subject.guests = 2
      subklass_a = Class.new(subject)
      subklass_b = Class.new(subject)
      subklass_a.guests = 13

      assert_equal 2,  subklass_b.guests
      assert_equal 13, subklass_a.guests
    end

    it "does not attempt to clone symbols" do
      subject.glass = :highball
      subklass = Class.new(subject)

      subklass.glass.must_equal :highball
    end

    it "does not attempt to clone true" do
      subject.glass = true
      subklass = Class.new(subject)

      subklass.glass.must_equal true
    end

    it "does not attempt to clone false" do
      subject.glass = false
      subklass = Class.new(subject)

      subklass.glass.must_equal false
    end
  end
end