@@ -0,0 +1,132 @@
1+:: Source-proven generic recursive patterns; no backend/runtime claim.
2+/+ jibb
3+/* real-prelude %jibb /lib/jibb/prelude/jibb
4+/* real-internal %jibb /lib/jibb/internal/jibb
5+/* tree %txt /tests/type-generic-construction/tree/txt
6+/* alias %txt /tests/type-generic-construction/alias/txt
7+/* tree-no-event %txt /tests/type-generic-construction/tree-no-event/txt
8+/* client %txt /tests/type-generic-pattern/client/txt
9+/* no-event %txt /tests/type-generic-pattern/no-event/txt
10+/* values %txt /tests/type-generic-pattern/values/txt
11+/* poly-values %txt /tests/type-generic-pattern/poly-values/txt
12+/* owner %txt /tests/type-generic-pattern/owner/txt
13+/* owner-bad %txt /tests/type-generic-pattern/owner-bad/txt
14+/* expected %txt /tests/type-generic-pattern/expected/txt
15+|%
16+++ text
17+ |= lines=wain
18+ ^- @t
19+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
20+++ line
21+ |= [label=@t ok=?]
22+ ^- @t
23+ (crip "{(trip label)}: {?:(ok "ok" "BAD")}")
24+++ pattern-output
25+ |= [pre=@t internal=@t tree=@t alias=@t tree-no-event=@t client=@t no-event=@t values=@t poly-values=@t owner=@t owner-bad=@t]
26+ ^- @t
27+ =/ prep=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb pre internal)
28+ ?~ prep 'BAD prelude preparation'
29+ =/ checked=jfile-result:jibb
30+ (infer-jibb-file:jibb /ui/tree/jibb owner ~ ~ ~ ~[/ui/tree/jibb] values.u.prep molds.u.prep ~ `iface.u.prep)
31+ ?: ?=(%| -.checked) 'BAD valid owner'
32+ =/ bad-parse=(each module:jibb error:jibb) (parse:jibb /ui/tree/jibb owner-bad)
33+ =/ bad=jfile-result:jibb
34+ (infer-jibb-file:jibb /ui/tree/jibb owner-bad ~ ~ ~ ~[/ui/tree/jibb] values.u.prep molds.u.prep ~ `iface.u.prep)
35+ =/ mold=(unit ischeme:jibb) (find-jibb-mold:jibb %element iface.p.checked)
36+ ?~ mold 'BAD owner mold'
37+ ?. ?=(%grec -.typ.u.mold) 'BAD nominal owner'
38+ =/ target=itype:jibb typ.u.mold(args ~[[%atom %t]])
39+ =/ generic=itype:jibb typ.u.mold(args ~[[%var 42]])
40+ ?> ?=(%grec -.target)
41+ ?> ?=(%grec -.generic)
42+ =/ desc=(unit ischeme:jibb) (ienv-lookup:jibb %describe values.iface.p.checked)
43+ =/ children=(unit ischeme:jibb) (ienv-lookup:jibb %children values.iface.p.checked)
44+ =/ rebuild=(unit ischeme:jibb) (ienv-lookup:jibb %rebuild values.iface.p.checked)
45+ ?~ desc 'BAD owner describe missing'
46+ ?~ children 'BAD owner children missing'
47+ ?~ rebuild 'BAD owner rebuild missing'
48+ ?. &(?=(%fn -.typ.u.desc) ?=(%fn -.typ.u.children) ?=(%fn -.typ.u.rebuild)) 'BAD owner gate types'
49+ ?. ?=([@ ~] vars.u.children) 'BAD owner children quantification'
50+ =/ desc-sample=itype:jibb sample.typ.u.desc
51+ =/ children-sample=itype:jibb sample.typ.u.children
52+ =/ rebuild-sample=itype:jibb sample.typ.u.rebuild
53+ =? desc-sample ?=(%face -.desc-sample) body.desc-sample
54+ =? children-sample ?=(%face -.children-sample) body.children-sample
55+ =? rebuild-sample ?=(%face -.rebuild-sample) body.rebuild-sample
56+ =/ quantified=itype:jibb typ.u.mold(args ~[[%var i.vars.u.children]])
57+ =/ parsed=(each module:jibb error:jibb) (parse:jibb /tests/tree/values/jibb values)
58+ ?: ?=(%| -.parsed) 'BAD values parse'
59+ =/ ds=(list def:jibb) defs.p.parsed
60+ ?. ?=([* [* ~]] ds) 'BAD value count'
61+ =/ a=def:jibb i.ds
62+ =/ b=def:jibb i.t.ds
63+ ?. &(?=(%value -.a) ?=(%value -.b)) 'BAD value declarations'
64+ =/ parsed-poly=(each module:jibb error:jibb) (parse:jibb /tests/tree/poly/jibb poly-values)
65+ ?: ?=(%| -.parsed-poly) 'BAD polymorphic values parse'
66+ =/ ps=(list def:jibb) defs.p.parsed-poly
67+ ?. ?=([* ~] ps) 'BAD polymorphic value count'
68+ =/ p=def:jibb i.ps
69+ ?. ?=(%value -.p) 'BAD polymorphic value'
70+ ?. ?=(%branch -.val.p) 'BAD polymorphic branch'
71+ =/ env=ienv:jibb ~[[%x [target ~]]]
72+ =/ poly=ienv:jibb ~[[%x [generic ~[42]]]]
73+ =/ tag=ipending:jibb [100 [%term %tas %unrelated '%unrelated']]
74+ =/ projection=iwprojection:jibb *iwprojection:jibb
75+ =/ st=istate:jibb *istate:jibb
76+ =. st st(next 201, prelude `iface.u.prep, tags ~[tag], holes ~[[99 (span-of:jibb val.a)]], projections ~[projection])
77+ =/ zero=iresult:jibb (infer-fragment:jibb val.a env st(jrec-fuel 0))
78+ =/ one=iresult:jibb (infer-fragment:jibb val.a env st(jrec-fuel 1))
79+ =/ short=iresult:jibb (infer-fragment:jibb val.b env st(jrec-fuel 1))
80+ =/ nested=iresult:jibb (infer-fragment:jibb val.b env st(jrec-fuel 2))
81+ =/ retry=iresult:jibb (infer-fragment:jibb val.a env st(jrec-fuel 1))
82+ =/ hidden=ienv:jibb ~[[%x [[%var 200] ~]]]
83+ =/ hidden-result=iresult:jibb (infer-fragment:jibb val.a hidden st(sub ~[[200 target]], jrec-fuel 2))
84+ =/ first=(unit iresult:jibb) (grec-single-wing-subject:jibb subject.val.p poly st(jrec-fuel 4))
85+ =/ second=(unit iresult:jibb) (grec-single-wing-subject:jibb subject.val.p poly st(next 202, jrec-fuel 4))
86+ ?~ first 'BAD first scheme lookup'
87+ ?~ second 'BAD second scheme lookup'
88+ ?. &(?=(%& -.u.first) ?=(%& -.u.second)) 'BAD scheme inference'
89+ =/ ft=itype:jibb typ.p.u.first
90+ =/ stype=itype:jibb typ.p.u.second
91+ ?. &(?=(%grec -.ft) ?=(%grec -.stype)) 'BAD scheme nominal identity'
92+ ?. &(?=([* ~] args.ft) ?=([* ~] args.stype)) 'BAD scheme argument count'
93+ =/ pmissing=iresult:jibb (infer-fragment:jibb val.p poly st(jrec-fuel 4))
94+ =/ checks=(list [label=@t ok=?])
95+ :~ ['owner describe has nominal sample and text result' &(=(target desc-sample) =([%atom %t] product.typ.u.desc))]
96+ ['owner rebuild preserves nominal identity' &(=(target rebuild-sample) =(target product.typ.u.rebuild))]
97+ ['owner children preserves quantified recursive identity' &(=(quantified children-sample) =([%collection %list ~[quantified]] product.typ.u.children))]
98+ ['invalid owner parses and is rejected' &(?=(%& -.bad-parse) ?=(%| -.bad))]
99+ ['zero fuel declined' ?=(%| -.zero)]
100+ ['one-step match' ?:(?=(%& -.one) &(=([%atom %t] typ.p.one) =(0 jrec-fuel.state.p.one)) |)]
101+ ['nested match requires two steps' &(?=(%| -.short) ?:(?=(%& -.nested) =(0 jrec-fuel.state.p.nested) |))]
102+ ['same-state retry agrees' =(one retry)]
103+ ['pending tag retained' ?:(?=(%& -.one) (lien tags.state.p.one |=(entry=ipending:jibb =(entry tag))) |)]
104+ ['pending hole retained' ?:(?=(%& -.one) =(holes.st holes.state.p.one) |)]
105+ ['projection evidence retained' ?:(?=(%& -.one) =(projections.st projections.state.p.one) |)]
106+ ['raw bound variable declined' ?=(%| -.hidden-result)]
107+ ['polymorphic scheme gets fresh identities' &(=([%var 201] i.args.ft) =([%var 202] i.args.stype) =(at.ft at.stype) =(name.ft name.stype) =(proof.ft proof.stype))]
108+ ['polymorphic missing arm declined' ?=(%| -.pmissing)]
109+ ==
110+ =/ modules=jbundle:jibb ~[[/ui/tree/jibb tree] [/ui/tree-two/jibb tree] [/ui/tree-alias/jibb alias]]
111+ =/ small=jbundle:jibb ~[[/ui/tree/jibb tree-no-event]]
112+ =/ report=@t (golden-types-with-prepared-prelude:jibb /tests/tree/client/jibb client ~ ~ modules prep)
113+ =/ noreport=@t (golden-types-with-prepared-prelude:jibb /tests/tree/no-event/jibb no-event ~ ~ small prep)
114+ (cat 3 (of-wain:format (turn checks line)) (cat 3 '\0a' (cat 3 report (cat 3 '\0a' noreport))))
115+++ test-generic-pattern
116+ ^- tang
117+ ?~ tree ~[leaf+"tree source missing"]
118+ ?~ alias ~[leaf+"alias source missing"]
119+ ?~ tree-no-event ~[leaf+"tree without event missing"]
120+ ?~ client ~[leaf+"client source missing"]
121+ ?~ no-event ~[leaf+"no-event client missing"]
122+ ?~ values ~[leaf+"values source missing"]
123+ ?~ poly-values ~[leaf+"polymorphic values source missing"]
124+ ?~ owner ~[leaf+"owner source missing"]
125+ ?~ owner-bad ~[leaf+"invalid owner source missing"]
126+ ?~ expected ~[leaf+"expected output missing"]
127+ =/ actual=@t
128+ (pattern-output real-prelude real-internal (text tree) (text alias) (text tree-no-event) (text client) (text no-event) (text values) (text poly-values) (text owner) (text owner-bad))
129+ ?. =((to-wain:format (cat 3 actual '\0a')) expected)
130+ ~[leaf+"generic pattern output differs from expected"]
131+ ~
132+--