summaryrefslogtreecommitdiff
path: root/spec/hashie/dash_spec.rb
blob: c80068193406b25a1f3604bb65d1faea408336e4 (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
require File.dirname(__FILE__) + '/../spec_helper'

class DashTest < Hashie::Dash
  property :first_name
  property :email
  property :count, :default => 0
end

class Subclassed < DashTest
end

describe Hashie::Dash do
  it 'should be a subclass of Hashie::Hash' do
    (Hashie::Dash < Hash).should be_true
  end
  
  it '#inspect should be ok!' do
    dash = DashTest.new
    dash.email = "abd@abc.com"
    dash.inspect.should == "<#DashTest count=0 email=\"abd@abc.com\" first_name=nil>"
  end
   
  describe ' creating properties' do
    it 'should add the property to the list' do
      DashTest.property :not_an_att
      DashTest.properties.include?('not_an_att').should be_true
    end
    
    it 'should create a method for reading the property' do
      DashTest.new.respond_to?(:first_name).should be_true
    end
    
    it 'should create a method for writing the property' do
      DashTest.new.respond_to?(:first_name=).should be_true
    end
  end
  
  describe 'reading properties' do
    it 'should raise an error when reading a non-existent property' do 
      lambda{@dash['abc']}.should raise_error(NoMethodError)
    end
  end
  
  describe ' writing to properties' do
    before do
      @dash = DashTest.new
    end
    
    it 'should not be able to write to a non-existent property using []=' do
      lambda{@dash['abc'] = 123}.should raise_error(NoMethodError)
    end
    
    it 'should be able to write to an existing property using []=' do
      lambda{@dash['first_name'] = 'Bob'}.should_not raise_error
    end
    
    it 'should be able to read/write to an existing property using a method call' do
      @dash.first_name = 'Franklin'
      @dash.first_name.should == 'Franklin'
    end
  end
  
  describe ' initializing with a Hash' do
    it 'should not be able to initialize non-existent properties' do
      lambda{DashTest.new(:bork => 'abc')}.should raise_error(NoMethodError)
    end
    
    it 'should set properties that it is able to' do
      DashTest.new(:first_name => 'Michael').first_name.should == 'Michael'
    end
  end
  
  describe ' defaults' do
    before do
      @dash = DashTest.new
    end
    
    it 'should return the default value for defaulted' do
      DashTest.property :defaulted, :default => 'abc'
      DashTest.new.defaulted.should == 'abc'
    end
  end
end

describe Subclassed do
  it "should inherit all properties from DashTest" do
    Subclassed.properties.size.should == 5
  end
  
  it "should inherit all defaults from DashTest" do
    Subclassed.defaults.size.should == 5
  end
  
  it "should init without raising" do
    lambda { Subclassed.new }.should_not raise_error
  end
end