diff --git a/spec/cbor_discrimination.cr b/spec/cbor_discrimination.cr new file mode 100644 index 0000000..16fec58 --- /dev/null +++ b/spec/cbor_discrimination.cr @@ -0,0 +1,65 @@ +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