2023-06-09 23:59:54 +00:00
|
|
|
# SPDX-FileCopyrightText: ☭ Emery Hemingway
|
|
|
|
# SPDX-License-Identifier: Unlicense
|
|
|
|
|
2024-01-01 18:18:30 +00:00
|
|
|
import std/[options, tables, unittest]
|
2023-06-09 23:59:54 +00:00
|
|
|
|
2024-01-06 14:48:12 +00:00
|
|
|
import preserves, syndicate, syndicate/protocols/gatekeeper
|
2023-06-09 23:59:54 +00:00
|
|
|
|
|
|
|
import ./test_schema
|
|
|
|
|
|
|
|
test "patterns":
|
2023-12-29 19:38:03 +00:00
|
|
|
let
|
2024-01-01 18:18:30 +00:00
|
|
|
pat = ?Observe(pattern: !Foo) ?? {0: grab()}
|
2023-12-29 19:38:03 +00:00
|
|
|
text = """<rec Observe [<rec rec [<lit foo> <arr [<bind <_>> <_> <_>]>]> <_>]>"""
|
2024-01-01 18:18:30 +00:00
|
|
|
check($pat == text)
|
2023-06-09 23:59:54 +00:00
|
|
|
|
|
|
|
let
|
2023-12-29 19:38:03 +00:00
|
|
|
worte = @["alles", "in", "ordnung"]
|
2023-12-31 17:15:06 +00:00
|
|
|
observer = Observe(pattern: inject(?:Foo, { 0: ?worte })).toPreserves
|
2024-01-01 18:18:30 +00:00
|
|
|
have = capture(pat, observer).toPreserves.unpackLiterals
|
2023-12-31 17:15:06 +00:00
|
|
|
want = [worte.toPreserves].toPreserves
|
2023-06-09 23:59:54 +00:00
|
|
|
check(have == want)
|
2023-07-23 07:30:45 +00:00
|
|
|
|
2023-12-29 19:38:03 +00:00
|
|
|
type Obj {.preservesDictionary.} = object
|
2023-07-23 07:30:45 +00:00
|
|
|
a, b, c: int
|
|
|
|
|
|
|
|
test "dictionaries":
|
2023-12-29 19:38:03 +00:00
|
|
|
let pat = ?:Obj
|
2023-07-24 15:13:36 +00:00
|
|
|
var source = initDictionary(Cap)
|
2023-12-31 17:15:06 +00:00
|
|
|
source["b".toSymbol] = 2.toPreserves
|
|
|
|
source["c".toSymbol] = 3.toPreserves
|
|
|
|
source["a".toSymbol] = 1.toPreserves
|
2023-07-23 07:30:45 +00:00
|
|
|
|
|
|
|
let values = capture(pat, source)
|
2023-12-29 19:38:03 +00:00
|
|
|
check values.len == 3
|
2023-12-31 17:15:06 +00:00
|
|
|
check values[0] == 1.toPreserves
|
|
|
|
check values[1] == 2.toPreserves
|
|
|
|
check values[2] == 3.toPreserves
|
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">}>}>]>"""
|
2024-01-01 18:18:30 +00:00
|
|
|
var pr = parsePreserves(txt)
|
2023-10-15 11:11:10 +00:00
|
|
|
|
|
|
|
var capture: Literal[Request]
|
2023-12-31 17:15:06 +00:00
|
|
|
check capture.fromPreserves(pr)
|
2024-01-01 18:18:30 +00:00
|
|
|
|
|
|
|
suite "captures":
|
|
|
|
for txt in [
|
|
|
|
"#f",
|
|
|
|
"#t",
|
|
|
|
"0",
|
|
|
|
"-1",
|
|
|
|
"foo",
|
|
|
|
"<foo>",
|
|
|
|
"[0, 1, 2]",
|
|
|
|
]:
|
|
|
|
test txt:
|
|
|
|
let
|
|
|
|
pr = parsePreserves txt
|
|
|
|
pat = grab pr
|
|
|
|
checkpoint $pat
|
|
|
|
check pat.matches pr
|
|
|
|
|
2024-01-06 14:48:12 +00:00
|
|
|
suite "protocol":
|
|
|
|
test "Observe":
|
|
|
|
let pat = ?:Observe
|
|
|
|
const text = """<rec Observe [<bind <_>> <bind <_>>]>"""
|
|
|
|
check $pat == text
|
|
|
|
|
|
|
|
test "later-than":
|
|
|
|
let
|
2024-01-18 22:04:27 +00:00
|
|
|
obsA = parsePreserves"""<Observe <rec later-than [<lit 1704113731.419243>]> #f>"""
|
|
|
|
obsB = parsePreserves"""<Observe <rec Observe [<rec rec [<lit later-than> <arr [<rec lit [<bind <_>>]>]>]> <_>]> #f>"""
|
2024-01-06 14:48:12 +00:00
|
|
|
patA = """<rec later-than [<lit 1704113731.419243>]>""".parsePreserves.preservesTo(Pattern).get
|
|
|
|
patB = """<rec Observe [<rec rec [<lit later-than> <arr [<rec lit [<bind <_>>]>]>]> <_>]>""".parsePreserves.preservesTo(Pattern).get
|
|
|
|
|
|
|
|
patC = grab obsA
|
|
|
|
|
|
|
|
test $patC:
|
|
|
|
check patC.matches obsA
|
|
|
|
|
|
|
|
test $patB:
|
|
|
|
checkpoint $obsA
|
|
|
|
check patB.matches obsA
|
|
|
|
|
|
|
|
test "TransportConnection":
|
|
|
|
let
|
|
|
|
pat = TransportConnection ?: { 2: ?:Rejected}
|
|
|
|
text = """<rec connect-transport [<_> <_> <rec rejected [<bind <_>>]>]>"""
|
|
|
|
check $pat == text
|