Runtime assertions for Ruby literal.fun
ruby
at main 118 lines 2.8 kB view raw
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