File: deconstruct_keys_spec.rb

package info (click to toggle)
jruby 9.3.9.0%2Bds-8
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 80,856 kB
  • sloc: ruby: 517,823; java: 260,094; xml: 31,930; ansic: 5,777; yacc: 4,973; sh: 1,163; makefile: 105; jsp: 48; tcl: 40; exp: 11
file content (78 lines) | stat: -rw-r--r-- 2,452 bytes parent folder | download | duplicates (2)
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
require_relative '../../spec_helper'

ruby_version_is "2.7" do
  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 accept 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
end