2023-06-09 23:59:54 +00:00
|
|
|
# SPDX-FileCopyrightText: ☭ Emery Hemingway
|
|
|
|
# SPDX-License-Identifier: Unlicense
|
|
|
|
|
2023-10-15 11:11:10 +00:00
|
|
|
import std/[tables, unittest]
|
2023-06-09 23:59:54 +00:00
|
|
|
|
|
|
|
import preserves, syndicate
|
|
|
|
from syndicate/protocols/dataspace import Observe
|
2023-07-24 15:13:36 +00:00
|
|
|
type Observe = dataspace.Observe[Cap]
|
2023-06-09 23:59:54 +00:00
|
|
|
|
|
|
|
import ./test_schema
|
|
|
|
|
|
|
|
|
|
|
|
test "patterns":
|
|
|
|
let observerPat = ?Observe(pattern: !Foo) ?? {0: grab()}
|
|
|
|
check($observerPat == """<rec Observe [<rec rec [<lit foo> <arr [<bind <_>> <_> <_>]>]> <_>]>""")
|
|
|
|
|
|
|
|
let
|
|
|
|
value = @["alles", "in", "ordnung"]
|
2023-07-24 15:13:36 +00:00
|
|
|
observer = toPreserve(Observe(pattern: inject(?Foo, { 0: ?value })), Cap)
|
|
|
|
have = capture(observerPat, observer).toPreserve(Cap).unpackLiterals
|
|
|
|
want = [value.toPreserve(Cap)].toPreserve(Cap)
|
2023-06-09 23:59:54 +00:00
|
|
|
check(have == want)
|
2023-07-23 07:30:45 +00:00
|
|
|
|
|
|
|
type Record {.preservesDictionary.} = object
|
|
|
|
a, b, c: int
|
|
|
|
|
|
|
|
test "dictionaries":
|
|
|
|
let pat = ?Record
|
|
|
|
echo pat
|
2023-07-24 15:13:36 +00:00
|
|
|
var source = initDictionary(Cap)
|
|
|
|
source["b".toSymbol(Cap)] = 2.toPreserve(Cap)
|
|
|
|
source["c".toSymbol(Cap)] = 3.toPreserve(Cap)
|
|
|
|
source["a".toSymbol(Cap)] = 1.toPreserve(Cap)
|
2023-07-23 07:30:45 +00:00
|
|
|
|
|
|
|
let values = capture(pat, source)
|
|
|
|
check $values == "@[1, 2, 3]"
|
2023-10-15 11:11:10 +00:00
|
|
|
|
|
|
|
type
|
|
|
|
File {.preservesDictionary.} = object
|
|
|
|
name: string
|
|
|
|
path: string
|
|
|
|
size: BiggestInt
|
|
|
|
`type`: string
|
|
|
|
Files = Table[Symbol, File]
|
|
|
|
Fields = Table[Symbol, string]
|
|
|
|
|
|
|
|
Request {.preservesRecord: "request".} = object
|
|
|
|
seq: BiggestInt
|
|
|
|
fields: Fields
|
|
|
|
files: Files
|
|
|
|
|
|
|
|
test "literals":
|
|
|
|
const txt = """<rec request [<lit 3> <dict {artists: <lit "kyyyyym"> date: <lit "2023-10-14"> notes: <lit "Lots of stuff"> title: <lit "Domes show">}> <dict {front-cover: <dict {name: <lit "ADULT_TIME_Glielmi.jpg"> path: <lit "/tmp/652adad1b3d2b666dcc8d857.jpg"> size: <lit 255614> type: <lit "image/jpeg">}>}>]>"""
|
|
|
|
var pr = parsePreserves(txt, Cap)
|
|
|
|
|
|
|
|
var capture: Literal[Request]
|
|
|
|
check capture.fromPreserve(pr)
|
|
|
|
echo capture.value
|