From 60d154c36bbd6773bbed44da82b17f211604c4b4 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Sat, 14 Dec 2019 17:55:31 +0100 Subject: union codecs, error messages --- src/util/codec-test.ts | 47 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) (limited to 'src/util/codec-test.ts') diff --git a/src/util/codec-test.ts b/src/util/codec-test.ts index d7edd545f..0d1ab5603 100644 --- a/src/util/codec-test.ts +++ b/src/util/codec-test.ts @@ -19,14 +19,34 @@ */ import test from "ava"; -import { stringCodec, objectCodec } from "./codec"; +import { + stringCodec, + objectCodec, + unionCodec, + Codec, + stringConstCodec, +} from "./codec"; interface MyObj { foo: string; } -test("basic codec", (t) => { - const myObjCodec = objectCodec().property("foo", stringCodec).build("MyObj"); +interface AltOne { + type: "one"; + foo: string; +} + +interface AltTwo { + type: "two"; + bar: string; +} + +type MyUnion = AltOne | AltTwo; + +test("basic codec", t => { + const myObjCodec = objectCodec() + .property("foo", stringCodec) + .build("MyObj"); const res = myObjCodec.decode({ foo: "hello" }); t.assert(res.foo === "hello"); @@ -34,3 +54,24 @@ test("basic codec", (t) => { const res2 = myObjCodec.decode({ foo: 123 }); }); }); + +test("union", t => { + const altOneCodec: Codec = objectCodec() + .property("type", stringConstCodec("one")) + .property("foo", stringCodec) + .build("AltOne"); + const altTwoCodec: Codec = objectCodec() + .property("type", stringConstCodec("two")) + .property("bar", stringCodec) + .build("AltTwo"); + const myUnionCodec: Codec = unionCodec("type") + .alternative("one", altOneCodec) + .alternative("two", altTwoCodec) + .build("MyUnion"); + + const res = myUnionCodec.decode({ type: "one", foo: "bla" }); + t.is(res.type, "one"); + if (res.type == "one") { + t.is(res.foo, "bla"); + } +}); -- cgit v1.2.3