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
|
require_relative '../../spec_helper'
describe "Struct#deconstruct_keys" do
it "returns a hash of attributes" do
struct = Struct.new(:x, :y)
s = struct.new(1, 2)
s.deconstruct_keys([:x, :y]).should == {x: 1, y: 2}
end
it "requires one argument" do
struct = Struct.new(:x)
obj = struct.new(1)
-> {
obj.deconstruct_keys
}.should raise_error(ArgumentError, /wrong number of arguments \(given 0, expected 1\)/)
end
it "returns only specified keys" do
struct = Struct.new(:x, :y, :z)
s = struct.new(1, 2, 3)
s.deconstruct_keys([:x, :y]).should == {x: 1, y: 2}
s.deconstruct_keys([:x] ).should == {x: 1}
s.deconstruct_keys([] ).should == {}
end
it "accepts string attribute names" do
struct = Struct.new(:x, :y)
s = struct.new(1, 2)
s.deconstruct_keys(['x', 'y']).should == {'x' => 1, 'y' => 2}
end
it "accepts argument position number as well but returns them as keys" do
struct = Struct.new(:x, :y, :z)
s = struct.new(10, 20, 30)
s.deconstruct_keys([0, 1, 2]).should == {0 => 10, 1 => 20, 2 => 30}
s.deconstruct_keys([0, 1] ).should == {0 => 10, 1 => 20}
s.deconstruct_keys([0] ).should == {0 => 10}
end
it "returns an empty hash when there are more keys than attributes" do
struct = Struct.new(:x, :y)
s = struct.new(1, 2)
s.deconstruct_keys([:x, :y, :a]).should == {}
end
it "returns at first not existing attribute name" do
struct = Struct.new(:x, :y)
s = struct.new(1, 2)
s.deconstruct_keys([:a, :x]).should == {}
s.deconstruct_keys([:x, :a]).should == {x: 1}
end
it "accepts nil argument and return all the attributes" do
struct = Struct.new(:x, :y)
obj = struct.new(1, 2)
obj.deconstruct_keys(nil).should == {x: 1, y: 2}
end
it "raise TypeError if passed anything except nil or array" do
struct = Struct.new(:x, :y)
s = struct.new(1, 2)
-> { s.deconstruct_keys('x') }.should raise_error(TypeError, /expected Array or nil/)
-> { s.deconstruct_keys(1) }.should raise_error(TypeError, /expected Array or nil/)
-> { s.deconstruct_keys(:x) }.should raise_error(TypeError, /expected Array or nil/)
-> { s.deconstruct_keys({}) }.should raise_error(TypeError, /expected Array or nil/)
end
end
|