Runtime assertions for Ruby
literal.fun
ruby
1# frozen_string_literal: true
2
3class Person < Literal::Data
4 prop :name, String
5end
6
7class Empty < Literal::Data
8end
9
10class ReaderlessExample < Literal::Data
11 prop :name, String, reader: false
12end
13
14test "== comparison with readerless properties" do
15 a = ReaderlessExample.new(name: "John")
16 b = ReaderlessExample.new(name: "John")
17 c = ReaderlessExample.new(name: "Bob")
18
19 assert_equal(a, b)
20 refute_equal(a, c)
21end
22
23test "properties have readers by default" do
24 person = Person.new(name: "John")
25 assert_equal(person.name, "John")
26end
27
28test "data objects are frozen" do
29 person = Person.new(name: "John")
30 assert_equal(person.frozen?, true)
31end
32
33test "immutable attributes are not duplicated" do
34 name = "John"
35 person = Person.new(name:)
36
37 assert_equal(person.name.frozen?, true)
38 assert_equal(person.name, name)
39end
40
41test "to_h" do
42 person = Person.new(name: "John")
43 assert_equal(person.to_h, { name: "John" })
44end
45
46test "can be deconstructed" do
47 person = Person.new(name: "John")
48 assert_equal(person.deconstruct, ["John"])
49end
50
51test "can be deconstructed with keys" do
52 person = Person.new(name: "John")
53 assert_equal(person.deconstruct_keys([:name]), { name: "John" })
54end
55
56test "can be implicitly coerced to Hash" do
57 person = Person.new(name: "John")
58
59 assert_equal({ last_name: "Doe" }.merge(person), { last_name: "Doe", name: "John" })
60end
61
62test "can be used as a hash key" do
63 person = Person.new(name: "John")
64 person2 = Person.new(name: "Bob")
65 hash = { person => "John", person2 => "Bob" }
66 assert_equal(hash[person], "John")
67 assert_equal(hash[person2], "Bob")
68 assert_equal(hash[Person.new(name: "John")], "John")
69end
70
71test "empty" do
72 empty = Empty.new
73 assert_equal(empty.to_h, {})
74
75 other = Empty.new
76 assert_equal(empty, other)
77 assert_equal(empty.eql?(other), true)
78 assert_equal(empty.hash, other.hash)
79
80 other_empty = Class.new(Literal::Data).new
81 assert_equal(empty != other_empty, true)
82 assert_equal(empty.eql?(other_empty), false)
83 assert_equal(empty.hash != other_empty.hash, true)
84end
85
86test "define" do
87 person_with_define = Literal::Data.define(name: String).new(name: "John")
88 person = Person.new(name: "John")
89
90 assert_equal(person_with_define.to_h, person.to_h)
91end
92
93test "initialize with [] method" do
94 person_a = Person.new(name: "John")
95 person_b = Person[name: "John"]
96
97 assert_equal(person_a, person_b)
98end
99
100test "can be indexed" do
101 person = Person.new(name: "John")
102 assert_equal(person[:name], "John")
103end
104
105test "indexed access supports string keys" do
106 person = Person.new(name: "John")
107 assert_equal(person["name"], "John")
108end
109
110test "indexed access raises for unknown keys" do
111 person = Person.new(name: "John")
112 assert_raises(NameError) { person[:age] }
113end
114
115test "indexed access raises for invalid key types" do
116 person = Person.new(name: "John")
117 assert_raises(TypeError) { person[0] }
118end