Runtime assertions for Ruby
literal.fun
ruby
1# frozen_string_literal: true
2
3class Person < Literal::Struct
4 prop :name, String
5end
6
7class Student < Person
8 prop :final_grade, Integer
9end
10
11test do
12 person = Person.new(name: "Joel")
13 assert_equal person.name, "Joel"
14end
15
16test do
17 person = Person.new(name: "Joel")
18 person.name = "Jill"
19
20 assert_equal person.name, "Jill"
21end
22
23test do
24 person = Person.new(name: "Joel")
25 assert_equal person.to_h, { name: "Joel" }
26end
27
28test do
29 a = Person.new(name: "Joel")
30 b = Person.new(name: "Joel")
31
32 assert_equal a, b
33end
34
35test do
36 a = Person.new(name: "Joel")
37 b = Person.new(name: "Jill")
38
39 refute_equal a, b
40end
41
42test do
43 a = Person.new(name: "Joel")
44 b = Student.new(name: "Joel", final_grade: 90)
45
46 refute_equal a, b
47end
48
49# Marshal doesn't work with anonymous classes
50class ::RootStruct < Literal::Struct
51 prop :name, String
52end
53
54test "marshalling" do
55 a = RootStruct.new(name: "Joel")
56 b = Marshal.load(Marshal.dump(a))
57
58 assert_equal b, a
59end
60
61test "marshalling a frozen struct" do
62 a = RootStruct.new(name: "Joel")
63 a.freeze
64
65 b = Marshal.load(Marshal.dump(a))
66
67 assert_equal b, a
68 assert b.frozen?
69end
70
71test "as_pack/from_pack" do
72 a = RootStruct.new(name: "Joel")
73 a.freeze
74
75 b = RootStruct.from_pack(a.as_pack)
76
77 assert_equal b, a
78 assert b.frozen?
79end
80
81test "can be deconstructed" do
82 person = Person.new(name: "Joel")
83 assert_equal person.deconstruct, ["Joel"]
84end
85
86test "can be deconstructed with keys" do
87 person = Person.new(name: "Joel")
88
89 assert_equal person.deconstruct_keys([:name]), { name: "Joel" }
90 assert_equal person.deconstruct_keys(nil), { name: "Joel" }
91end
92
93test "can be indexed" do
94 person = Person.new(name: "Joel")
95 assert_equal person[:name], "Joel"
96end
97
98test "returns nil for unknown keys" do
99 person = Person.new(name: "Joel")
100
101 assert_raises(NameError) { person[:age] }
102 assert_equal "Joel", person["name"]
103 assert_raises(TypeError) { person[0] }
104end
105
106class WithKeywordPropertyNames < Literal::Struct
107 prop :begin, String
108 prop :end, String
109 prop :module, _Nilable(Module)
110end
111
112test do
113 with_keyword_property_names = WithKeywordPropertyNames.new(begin: "start", end: "finish")
114 assert_equal(with_keyword_property_names.to_h, { :begin => "start", :end => "finish", :module => nil })
115 assert_equal(with_keyword_property_names, with_keyword_property_names)
116 assert_equal(with_keyword_property_names, with_keyword_property_names.dup)
117 assert_equal(with_keyword_property_names.hash, with_keyword_property_names.dup.hash)
118 assert_equal(with_keyword_property_names[:begin], "start")
119 assert_equal(with_keyword_property_names[:end], "finish")
120 assert_equal(with_keyword_property_names[:module], nil)
121 assert_equal(with_keyword_property_names["begin"], "start")
122 assert_equal(with_keyword_property_names["end"], "finish")
123 assert_equal(with_keyword_property_names["module"], nil)
124 assert_equal(with_keyword_property_names.begin, "start")
125 assert_equal(with_keyword_property_names.end, "finish")
126 assert_equal(with_keyword_property_names.module, nil)
127 with_keyword_property_names[:begin] = "start2"
128 with_keyword_property_names.end = "finish2"
129 assert_equal(with_keyword_property_names.to_h, { :begin => "start2", :end => "finish2", :module => nil })
130end