crystal-cbor/spec/cbor_discrimination.cr

66 lines
1.6 KiB
Crystal
Raw Normal View History

2021-06-21 18:26:15 +02:00
require "./spec_helper"
class Game
include CBOR::Serializable
abstract class Player
include CBOR::Serializable
@[CBOR::Field(key: "hp")]
property health_points : Int32 = 100
@[CBOR::Field(key: "dp")]
property defense_points : Int32 = 5
use_cbor_discriminator "type", {
magician: Magician,
warrior: Warrior
}
def initialize
end
end
class Magician < Player
property wand_level : Int32 = 1
def initialize
@type = "magician"
end
end
class Warrior < Player
def initialize
@defense_points = 20
@type = "warrior"
end
end
property players : Array(Magician | Warrior)
def initialize
@players = [] of (Magician | Warrior)
end
end
describe CBOR do
describe "Complex object representations" do
it "Game#to_cbor with use_cbor_discriminator" do
game = Game.new
magician = Game::Magician.new
magician.wand_level = 5
game.players << magician
game.players << Game::Warrior.new
game.to_cbor.hexstring.should eq "a167706c617965727382a46268701864626470056a77616e645f6c6576656c056474797065686d6167696369616ea362687018646264701464747970656777617272696f72"
end
it "Game#from_cbor with use_cbor_discriminator" do
game = Game.new
magician = Game::Magician.new
magician.wand_level = 5
game.players << magician
game.players << Game::Warrior.new
new_game = Game.from_cbor game.to_cbor
new_game.to_cbor.hexstring.should eq "a167706c617965727382a46268701864626470056a77616e645f6c6576656c056474797065686d6167696369616ea362687018646264701464747970656777617272696f72"
end
end
end