on master help sign in
Read my-app's sources on the test desk instead of copies

The jibb-dev desk had no my-app, so the suites and golden cases that check my-app's files read 33 copies of them under tests/: 14 golden sources and modules, and 19 suite fixtures, five of them marks with their /- line cut out. This is review question 31 (A108, A109): the desk now holds my-app's ui/, sur/ and mar/ under /my-app, and the tests read them there. - The 19 suite fixtures are gone. The suites bind /my-app/... with /*, and the ones that ride a mark drop its /- line with a +mark-text arm, since ride can't parse Ford's runes. - The 14 golden copies are symlinks to the my-app files. tools/golden reads them through the link. Desk assembly leaves a link out when the desk holds its target through another folder, and gen-tests binds the target there, as /my-app/ui/theme/jibb. - jibb-buttons read a golden source that is now a link; it reads /my-app/ui/components/buttons/jibb. - tests/my-app-copies.txt lists only the 16 copies of my-app/mar/label.hoon, which leave out its first line; question 34 moves that file off my-app. The ship self-test checks that my-app is on the test desk without its desk files, and that a linked golden file is read from /my-app. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U4FzmSdubYxmZGDp2VJRAQ

commit81252879171346c370a5e7ff55650ccbda64092a authorClaude <noreply@anthropic.com> dateTue 3 Nov 2026, 02:04 (17 hours ago) parent933bc83
57 files changed+240−562
README.md+3−3 docs/development.md+2−2 docs/status.md+1−1 tests/golden/doc-grammar-02-buttons/source.jibb+1−7 tests/golden/doc-grammar-06-cart-store/source.jibb+1−12 tests/golden/doc-grammar-07-basket/source.jibb+1−32 tests/golden/doc-overview-02-theme/source.jibb+1−8 tests/golden/doc-overview-04-todo-api/source.jibb+1−13 tests/golden/doc-overview-08-about/source.jibb+1−7 tests/golden/doc-overview-09-blog-index/source.jibb+1−9 tests/golden/doc-overview-10-todo-list/source.jibb+1−40 tests/golden/doc-overview-11-index/source.jibb+1−10 tests/golden/fixture-blog-api/source.jibb+1−5 tests/golden/fixture-blog-card/source.jibb+1−5 tests/golden/types-module-fixtures/modules/ui/api/blog.jibb+1−5 tests/golden/types-module-fixtures/modules/ui/components/card.jibb+1−5 tests/golden/types-module-fixtures/source.jibb+1−9 tests/lib/jibb-api-evidence.hoon+12−6 tests/lib/jibb-api-paths.hoon+13−7 tests/lib/jibb-buttons.hoon+1−1 tests/lib/jibb-doc-examples.hoon+11−5 tests/lib/jibb-gate-free-source.hoon+14−8 tests/lib/jibb-page-main.hoon+21−15 tests/lib/jibb-program-watch.hoon+13−7 tests/lib/jibb-store.hoon+2−2 tests/lib/jibb-theme.hoon+1−1 tests/lib/jibb-todo-api.hoon+13−7 tests/lib/jibb-todo-full.hoon+19−13 tests/lib/jibb-todo-partial.hoon+14−8 tests/my-app-copies.txt+5−36 tests/type-api-paths/api.txt−13 tests/type-api-paths/todo-action.txt−6 tests/type-api-paths/todo-item.txt−6 tests/type-api-paths/todo-sur.txt−12 tests/type-api-paths/todo-update.txt−6 tests/type-api-paths/todos.txt−6 tests/type-gate-free/about.txt+1−1 tests/type-gate-free/todo.txt−40 tests/type-page-main/about.txt+1−1 tests/type-page-main/blog-api.txt−5 tests/type-page-main/blog-index.txt−9 tests/type-page-main/blog-sur.txt−6 tests/type-page-main/card.txt−5 tests/type-page-main/index.txt−10 tests/type-page-main/posts-mark.txt−6 tests/type-page-main/static.txt−7 tests/type-page-main/todo-api.txt−13 tests/type-page-main/todo-island.txt−40 tests/type-store/basket.txt−32 tests/type-store/cart.txt−12 tests/type-theme/source.txt−8 tests/type-todo-api/about.txt+1−1 tests/type-todo-full/about.txt+1−1 tests/type-todo-partial/about.txt+1−1 tools/ship+47−11 tools/test-arms+2−2 tools/testdata/ship-selftest+27−13
README.md+3−3
@@ -10,7 +10,7 @@ Milestone 1 of the doc's eight, the parser and the `%jibb` mark, is done; milest
1010- `jibb/`: the `%jibb` desk, for the shared host (milestone 4).
1111- `my-app/`: an example app desk built from the doc's worked examples.
1212- `vendor/`: pinned copies of the base-dev and landscape files the desks need.
13−- `tests/`: golden cases in `golden/<case>/`, test suites in `lib/` and their fixtures, for `tools/test-arms` and the ship's `-test` thread, and `my-app-copies.txt`, the list of fixtures copied from `my-app/`. `lib/jibb.hoon`, which runs the golden cases on the ship, is generated.
13+- `tests/`: golden cases in `golden/<case>/`, test suites in `lib/` and their fixtures, for `tools/test-arms` and the ship's `-test` thread, and `my-app-copies.txt`, the list of fixtures that copy `my-app/mar/label.hoon`. `lib/jibb.hoon`, which runs the golden cases on the ship, is generated.
1414- `tools/`: dev tooling: `golden`, `test-arms`, `hoon` and `doc-blocks`, with their self-test in `testdata/`, `ship`, and `check`, which runs every check.
1515- `docs/`: the doc's tabs as Markdown in `spec/`, the status, the open questions, the development guide, the compiler's map, and briefs for milestones in `prompts/`.
1616
@@ -90,7 +90,7 @@ Many suites share one eval, so the library is built once per eval, not once per
9090
9191A golden-report suite has a `report` arm and a `/*` file bound to the face `expected`; when one of its arms fails, the runner prints a diff between that file and the report. Before any eval, the runner checks the golden files of the suites it runs, the `%txt` files bound to a face containing `expected`: each must end in exactly one newline, which an arm can't see in the file's wain, and hold no line that starts `BAD ` or ends `: BAD`. `--update` won't write a report that breaks either rule.
9292
93−Some fixtures in `tests/` are byte copies of `my-app` files, because the `jibb-dev` desk has no `my-app`. `tests/my-app-copies.txt` lists each copy with its source; a copy may leave out one line of its source, such as a mark's `/-` import. `tools/test-arms` checks every pair when it runs with no suite or shard named, and with `--copies`, which `tools/check` runs as `my-app-copies`. The suites below that check byte-identical `my-app` files read these copies.
93+The `jibb-dev` desk holds `my-app`'s sources under `/my-app`, without its desk files, so the suites below that check `my-app` files read them there, and a golden case that uses one links to it: `tests/golden/doc-overview-02-theme/source.jibb` is a symlink to `my-app/ui/theme.jibb`. The fixtures that copy `my-app/mar/label.hoon` leave out its first line, a comment; `tests/my-app-copies.txt` lists them, and `tools/test-arms` checks every pair when it runs with no suite or shard named, and with `--copies`, which `tools/check` runs as `my-app-copies`.
9494
9595`tools/test-arms --list` lists every suite, and [The test suites](docs/development.md#the-test-suites) in the development guide says what each one checks. Each suite it lists runs under eval and on the fake ship, with the same fixtures. The `jibb-import` suite compares the partial Hoon importer's fixture projections against their golden file. The suites `jibb-bridge`, `jibb-import-overlap`, `jibb-import-structural`, `jibb-union-source`, `jibb-union-alias-overlap`, `jibb-full-overlap-basic`, `jibb-full-overlap-graph`, `jibb-generic-recursion`, `jibb-generic-construction`, `jibb-generic-pattern`, `jibb-deferred`, `jibb-deferred-prepared`, `jibb-deferred-resolver`, `jibb-deferred-context`, `jibb-empty`, `jibb-cell-branch`, `jibb-tlon-bridge`, `jibb-mark-bridge`, `jibb-poke-bridge` and `jibb-api-paths` check importer/checker, prelude and partial API path analysis boundaries.
9696
@@ -129,7 +129,7 @@ tools/ship stop
129129| `jibb` | `vendor/*`, then `jibb` |
130130| `jibb-dev` | `vendor/*`, then `jibb-dev`, then `tests/`, with `tests/lib/jibb.hoon` generated, and `jibb/sys.kelvin` |
131131
132−The `jibb-dev` desk runs the golden cases on the ship, as `-test` arms. `tools/ship gen-tests` writes `tests/lib/jibb.hoon` from `tests/golden`: for each case it imports `source.jibb`, `tokens.txt` and `tree.txt` with `/*`, and its `test-` arm compares `golden:jibb` with them. Cases opted into `types.txt` also compare the partial inference output. The file is generated, not committed (review question 32): desk assembly writes it afresh, and `.gitignore` lists it. `tools/ship test` regenerates it, syncs the desk and runs `-test /=jibb-dev=/tests`, printing each case's OK, FAILED or CRASHED and the reason. It exits 0 only when every case passes.
132+The `jibb-dev` desk runs the golden cases on the ship, as `-test` arms. `tools/ship gen-tests` writes `tests/lib/jibb.hoon` from `tests/golden`: for each case it imports `source.jibb`, `tokens.txt` and `tree.txt` with `/*`, reading a `source.jibb` that links to a `my-app` file from `/my-app`, and its `test-` arm compares `golden:jibb` with them. Cases opted into `types.txt` also compare the partial inference output. The file is generated, not committed (review question 32): desk assembly writes it afresh, and `.gitignore` lists it. `tools/ship test` regenerates it, syncs the desk and runs `-test /=jibb-dev=/tests`, printing each case's OK, FAILED or CRASHED and the reason. It exits 0 only when every case passes.
133133
134134```
135135tools/ship test # the library and tests/golden
docs/development.md+2−2
@@ -89,7 +89,7 @@ Each file in `tests/lib` is a suite: a core of `test-` arms, with the libraries
8989
9090A golden-report suite has a `report` arm and a golden file bound to the face `expected`; its test arm compares the report with that file, and `tools/test-arms --list` marks it `, report`. `tools/test-arms --report <suite>` prints the report, and `tools/test-arms --update <suite>` writes it to the file; with no suite named, `--update` writes every golden-report suite's. When such a suite's arm fails, `tools/test-arms` prints a unified diff between the file and the report. `jibb-buttons` and `jibb-deferred-prepared` have golden files too, but compare them inside helpers over several cases and have no `report` arm. Every golden file, a `/*` `%txt` file bound to a face containing `expected`, must end in exactly one newline (a suite compares `wain`s, which can't show a missing one) and hold no line that starts `BAD ` or ends `: BAD`; `tools/test-arms` checks that before any eval, and `--update` won't write a report that breaks it.
9191
92−The `jibb-dev` desk has no `my-app`, so the suites that check `my-app` files read byte copies of them kept under `tests/`, as do some golden cases. `tests/my-app-copies.txt` lists every such copy, one per line, as `COPY SOURCE`, or `COPY SOURCE without LINE` for a copy that leaves out one line of its source, such as `/- blog`. `tools/test-arms` checks every pair when run with no suite or shard named, and `tools/test-arms --copies`, the `my-app-copies` check, checks only them. Where the table below calls a `my-app` file byte-identical or unchanged, it is one of these copies.
92+The `jibb-dev` desk holds `my-app`'s `ui/`, `sur/` and `mar/` under `/my-app` (review question 31), so the suites that check `my-app` files bind them there, as `/* sur %txt /my-app/sur/todo/hoon`, and keep no copies. A mark's `/-` line is Ford's, which `ride` can't parse, so the suites that ride a mark drop it with their `+mark-text` arm. Where the table below calls a `my-app` file byte-identical or unchanged, the suite reads that file itself. The fixtures that copy `my-app/mar/label.hoon` leave out its first line, a comment; `tests/my-app-copies.txt` lists them, one per line, as `COPY SOURCE without LINE`. `tools/test-arms` checks every pair when run with no suite or shard named, and `tools/test-arms --copies`, the `my-app-copies` check, checks only them.
9393
9494| Suite | What it checks | Golden files |
9595| --- | --- | --- |
@@ -174,7 +174,7 @@ CI, [.github/workflows/check.yml](../.github/workflows/check.yml), builds the de
174174
175175A case is a folder `tests/golden/<name>/` holding:
176176
177−- `source.jibb`, the input, ending in one newline;
177+- `source.jibb`, the input, ending in one newline. A case whose input is a `my-app` file, such as a doc block that `my-app` holds, makes it a symlink to that file; desk assembly leaves the link out, and `tools/ship gen-tests` reads the file from `/my-app`. A file under `modules/` may link to `my-app` the same way;
178178- `about.txt`: a `source:` line with the doc's words or block it comes from, a `tests:` line saying what it exercises, and an `expect:` line, either `parses` or `error at <line>:<col>` and why (one case, `inline-leftout-signed-float-auras`, says `unclear`: see grammar question 13 in [open-questions.md](open-questions.md));
179179- the expected outputs, `tokens.txt` and `tree.txt`, each the output plus one newline.
180180- optionally, `path.txt`, the logical `/ui/.../*.jibb` path to pass to the compiler; the source remains `source.jibb`.
docs/status.md+1−1
@@ -253,7 +253,7 @@ On a machine set up as [development.md](development.md) says:
253253tools/golden # 660 cases under urbit eval
254254tools/test-arms # the my-app copies, then every tests/lib suite under urbit eval
255255tools/test-arms --list # the suites and their arms; ", report" marks a golden report
256−tools/test-arms --copies # the tests/ copies of my-app files in tests/my-app-copies.txt match my-app
256+tools/test-arms --copies # the copies of my-app/mar/label.hoon in tests/my-app-copies.txt match it
257257tools/test-arms --report jibb-import # print a golden-report suite's report
258258tools/test-arms --update jibb-import # write it to the suite's expected file
259259tools/test-arms jibb-import # the Hoon importer fixture projection
tests/golden/doc-grammar-02-buttons/source.jibbmode 100644 → 120000+1−7
@@ -1,7 +0,0 @@
1−:: /ui/components/buttons.jibb, a library with no main
2−++ add-button |= label=@t
3− button label %add :: error: nothing fixes the union of %add
4−++ labelled |= [label=@t msg=M]
5− button label msg :: fine: the caller's union
6−++ wide ^- (list attr)
7− ~[width+[%fill 1] pad+%s2] :: fine: the cast fixes the tags
@@ -0,0 +1 @@
1+../../../my-app/ui/components/buttons.jibb
tests/golden/doc-grammar-06-cart-store/source.jibbmode 100644 → 120000+1−12
@@ -1,12 +0,0 @@
1−:: /ui/stores/cart.jibb
2−+$ state [items=(list @t) open=?]
3−+$ poke
4− [%add item=@t]
5− %toggle
6−
7−++ main (store init update)
8−++ init ^- state [~ %.n]
9−++ update |= [a=poke s=state]
10− ?- a
11− [%add item] s(items=[item items.s])
12− %toggle s(open=(not open.s))
@@ -0,0 +1 @@
1+../../../my-app/ui/stores/cart.jibb
tests/golden/doc-grammar-07-basket/source.jibbmode 100644 → 120000+1−32
@@ -1,32 +0,0 @@
1−:: /ui/basket.jibb
2−/= cart /ui/stores/cart
3−
4−++ main (program init update view subs)
5−
6−+$ model [cart=state.cart note=@t]
7−+$ msg
8− [%noted text=@t]
9− %add
10− %toggle
11− [%got cart=state.cart]
12− [%acked err=(unit @t)]
13−
14−++ init |= ~
15− [[~ %.n] ""]
16−
17−++ update |= [=msg m=model]
18− ?- msg
19− [%noted t] [m(note=t) ~]
20− %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
21− %toggle [m ~[(poke.cart %toggle |=%acked)]]
22− [%got c] [m(cart=c) ~]
23− [%acked err] [m ~]
24−
25−++ subs |= m=model
26− ~[[%watch (state.cart |=%got)]]
27−
28−++ view |= m=model
29− column ~[gap+%s1] ~[
30− (text "{(lent items.cart.m)} items")
31− field "Item" note.m |=%noted
32− button "Add" %add
@@ -0,0 +1 @@
1+../../../my-app/ui/basket.jibb
tests/golden/doc-overview-02-theme/source.jibbmode 100644 → 120000+1−8
@@ -1,8 +0,0 @@
1−++ theme ^- theme
2− [ space=[s1="4px" s2="8px" s3="16px"]
3− tones=[normal="#222" background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
4− wide="60rem"
5− lang="en"
6− zone="UTC"
7− font=`%/static/fonts/inter.woff2
8− dark=`[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
@@ -0,0 +1 @@
1+../../../my-app/ui/theme.jibb
tests/golden/doc-overview-04-todo-api/source.jibbmode 100644 → 120000+1−13
@@ -1,13 +0,0 @@
1−:: /ui/api/todo.jibb
2−/- todo
3−/% %todo-action
4−/% %todos
5−/% %todo-update
6−/% %todo-item
7−
8−+$ item item.todo
9−+$ poke todo-action
10−+$ paths
11− [%todos /todos todos]
12− [%changes /changes (facts todos todo-update)]
13− [%todo-by-id /todo/[id=@ud] todo-item]
@@ -0,0 +1 @@
1+../../../my-app/ui/api/todo.jibb
tests/golden/doc-overview-08-about/source.jibbmode 100644 → 120000+1−7
@@ -1,7 +0,0 @@
1−++ main view
2−
3−++ view
4− column ~[width+[%fill 1] pad+%s3 gap+%s2] ~[
5− heading 1 "About this ship"
6− para ~[(text "Hosted on Urbit. This page ships no JavaScript.")]
7− el ~[tone+%accent] (link %/blog "Read the blog")
@@ -0,0 +1 @@
1+../../../my-app/ui/about.jibb
tests/golden/doc-overview-09-blog-index/source.jibbmode 100644 → 120000+1−9
@@ -1,9 +0,0 @@
1−/- blog
2−/= api /ui/api/blog
3−/= card /ui/components/card
4−
5−++ main (page load view)
6−++ load |=(~ (posts.api same))
7−
8−++ view |= ps=(list post.blog)
9− column ~[gap+%s2] (turn ps card.card)
@@ -0,0 +1 @@
1+../../../my-app/ui/blog/index.jibb
tests/golden/doc-overview-10-todo-list/source.jibbmode 100644 → 120000+1−40
@@ -1,40 +0,0 @@
1−/= todo /ui/api/todo
2−
3−++ main (program init update view subs)
4−
5−+$ model [todos=(list item.todo) draft=@t error=(unit @t)]
6−+$ msg
7− [%typed text=@t]
8− %submit
9− [%toggled id=@ud]
10− [%got todos=(list item.todo)]
11− [%acked err=(unit @t)]
12−
13−++ init |= ts=(list item.todo)
14− [ts "" ~]
15−
16−++ update |= [=msg m=model]
17− ?- msg
18− [%typed t]
19− ?- (gth (lent (tuba (trip t))) 80)
20− %.y [m(draft=t error=`"Too long") ~]
21− %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23− [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24− [%got ts] [m(todos=ts) ~]
25− [%acked err] [m(error=err) ~]
26−
27−++ subs |= m=model
28− ~[[%watch (todos.todo |=%got)]]
29−
30−++ view |= m=model
31− column ~[gap+%s2] ~[
32− heading 2 "Todos"
33− each (turn todos.m row-of)
34− row ~[gap+%s1] ~[
35− el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
36− button "Add" %submit
37− el ~[tone+%danger] (text (fall error.m ""))
38−
39−++ row-of |= t=item.todo
40− [id.t (toggle done.t text.t [%toggled id.t])]
@@ -0,0 +1 @@
1+../../../my-app/ui/todo-list.jibb
tests/golden/doc-overview-11-index/source.jibbmode 100644 → 120000+1−10
@@ -1,10 +0,0 @@
1−/= todo /ui/api/todo
2−/= todo-list /ui/todo-list
3−
4−++ main (page load view)
5−++ load |=(~ (todos.todo same))
6−
7−++ view |= ts=(list item.todo)
8− column ~[pad+%s3] ~[
9− heading 1 "My ship"
10− island main.todo-list ts
@@ -0,0 +1 @@
1+../../../my-app/ui/index.jibb
tests/golden/fixture-blog-api/source.jibbmode 100644 → 120000+1−5
@@ -1,5 +0,0 @@
1−:: Fixture for the documented examples; not supplied by the design doc.
2−/% %posts
3−
4−+$ paths
5− [%posts /posts posts]
@@ -0,0 +1 @@
1+../../../my-app/ui/api/blog.jibb
tests/golden/fixture-blog-card/source.jibbmode 100644 → 120000+1−5
@@ -1,5 +0,0 @@
1−:: Fixture for the documented examples; not supplied by the design doc.
2−/- blog
3−
4−++ card |= p=post.blog
5− text title.p
@@ -0,0 +1 @@
1+../../../my-app/ui/components/card.jibb
tests/golden/types-module-fixtures/modules/ui/api/blog.jibbmode 100644 → 120000+1−5
@@ -1,5 +0,0 @@
1−:: Fixture for the documented examples; not supplied by the design doc.
2−/% %posts
3−
4−+$ paths
5− [%posts /posts posts]
@@ -0,0 +1 @@
1+../../../../../../my-app/ui/api/blog.jibb
tests/golden/types-module-fixtures/modules/ui/components/card.jibbmode 100644 → 120000+1−5
@@ -1,5 +0,0 @@
1−:: Fixture for the documented examples; not supplied by the design doc.
2−/- blog
3−
4−++ card |= p=post.blog
5− text title.p
@@ -0,0 +1 @@
1+../../../../../../my-app/ui/components/card.jibb
tests/golden/types-module-fixtures/source.jibbmode 100644 → 120000+1−9
@@ -1,9 +0,0 @@
1−/- blog
2−/= api /ui/api/blog
3−/= card /ui/components/card
4−
5−++ main (page load view)
6−++ load |=(~ (posts.api same))
7−
8−++ view |= ps=(list post.blog)
9− column ~[gap+%s2] (turn ps card.card)
@@ -0,0 +1 @@
1+../../../my-app/ui/blog/index.jibb
tests/lib/jibb-api-evidence.hoon+12−6
@@ -2,17 +2,23 @@
22/+ jibb, jibb-import
33/* prelude %jibb /lib/jibb/prelude/jibb
44/* internal %jibb /lib/jibb/internal/jibb
5−/* sur %txt /tests/type-api-paths/todo-sur/txt
6−/* action %txt /tests/type-api-paths/todo-action/txt
7−/* todos %txt /tests/type-api-paths/todos/txt
8−/* update %txt /tests/type-api-paths/todo-update/txt
9−/* item %txt /tests/type-api-paths/todo-item/txt
5+/* sur %txt /my-app/sur/todo/hoon
6+/* action %txt /my-app/mar/todo-action/hoon
7+/* todos %txt /my-app/mar/todos/hoon
8+/* update %txt /my-app/mar/todo-update/hoon
9+/* item %txt /my-app/mar/todo-item/hoon
1010/* api %txt /tests/type-api-paths/scry/txt
1111|%
1212++ text
1313 |= lines=wain
1414 ^- @t
1515 (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
16+:: A mark's text without its /- lines, which Ford resolves and ride
17+:: can't parse.
18+++ mark-text
19+ |= lines=wain
20+ ^- @t
21+ (text (skip lines |=(line=@t =('/-' (end [3 2] line)))))
1622++ synthetic-evidence-status
1723 ^- @t
1824 :: A deliberately partial prelude preserves names even when inference fails.
@@ -252,7 +258,7 @@
252258 ?~ update ~[leaf+"API evidence fixture update is missing"]
253259 ?~ item ~[leaf+"API evidence fixture item is missing"]
254260 ?~ api ~[leaf+"API evidence fixture api is missing"]
255− =/ outcome=@t (real-evidence-status prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api))
261+ =/ outcome=@t (real-evidence-status prelude internal (text sur) (mark-text action) (mark-text todos) (mark-text update) (mark-text item) (text api))
256262 ?: =(outcome 'real todo path evidence passed') ~
257263 ~[leaf+(trip outcome)]
258264--
tests/lib/jibb-api-paths.hoon+13−7
@@ -2,12 +2,12 @@
22/+ jibb, jibb-import
33/* prelude %jibb /lib/jibb/prelude/jibb
44/* internal %jibb /lib/jibb/internal/jibb
5−/* sur %txt /tests/type-api-paths/todo-sur/txt
6−/* action %txt /tests/type-api-paths/todo-action/txt
7−/* todos %txt /tests/type-api-paths/todos/txt
8−/* update %txt /tests/type-api-paths/todo-update/txt
9−/* item %txt /tests/type-api-paths/todo-item/txt
10−/* api %txt /tests/type-api-paths/api/txt
5+/* sur %txt /my-app/sur/todo/hoon
6+/* action %txt /my-app/mar/todo-action/hoon
7+/* todos %txt /my-app/mar/todos/hoon
8+/* update %txt /my-app/mar/todo-update/hoon
9+/* item %txt /my-app/mar/todo-item/hoon
10+/* api %txt /my-app/ui/api/todo/jibb
1111/* missing-decl %txt /tests/type-api-paths/missing-decl/txt
1212/* value-clash %txt /tests/type-api-paths/value-clash/txt
1313/* poke-clash %txt /tests/type-api-paths/poke-clash/txt
@@ -19,9 +19,15 @@
1919 |= lines=wain
2020 ^- @t
2121 (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
22+:: A mark's text without its /- lines, which Ford resolves and ride
23+:: can't parse.
24+++ mark-text
25+ |= lines=wain
26+ ^- @t
27+ (text (skip lines |=(line=@t =('/-' (end [3 2] line)))))
2228++ report
2329 ^- @t
24− (of-wain:format (fixture-output prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api) (text missing-decl) (text value-clash) (text poke-clash) (text scry) (text scry-bad)))
30+ (of-wain:format (fixture-output prelude internal (text sur) (mark-text action) (mark-text todos) (mark-text update) (mark-text item) (text api) (text missing-decl) (text value-clash) (text poke-clash) (text scry) (text scry-bad)))
2531++ test-api-path-analysis
2632 ^- tang
2733 ?~ sur ~[leaf+"API path fixture sur is missing"]
tests/lib/jibb-buttons.hoon+1−1
@@ -2,7 +2,7 @@
22/+ jibb
33/* prelude %jibb /lib/jibb/prelude/jibb
44/* internal %jibb /lib/jibb/internal/jibb
5−/* source %jibb /tests/golden/doc-grammar-02-buttons/source/jibb
5+/* source %jibb /my-app/ui/components/buttons/jibb
66/* valid %txt /tests/type-buttons/valid/txt
77/* expected %txt /tests/type-buttons/expected/txt
88/* error %txt /tests/type-buttons/error/txt
tests/lib/jibb-doc-examples.hoon+11−5
@@ -6,15 +6,21 @@
66/* view-day %jibb /tests/golden/doc-grammar-03-view-day/source/jibb
77/* step %jibb /tests/golden/doc-grammar-04-step/source/jibb
88/* cmd-sub %jibb /tests/golden/doc-overview-01-cmd-sub/source/jibb
9−/* todo-sur %txt /tests/type-api-paths/todo-sur/txt
10−/* todo-action %txt /tests/type-api-paths/todo-action/txt
11−/* blog-sur %txt /tests/type-page-main/blog-sur/txt
12−/* card %txt /tests/type-page-main/card/txt
9+/* todo-sur %txt /my-app/sur/todo/hoon
10+/* todo-action %txt /my-app/mar/todo-action/hoon
11+/* blog-sur %txt /my-app/sur/blog/hoon
12+/* card %txt /my-app/ui/components/card/jibb
1313|%
1414++ text
1515 |= lines=wain
1616 ^- @t
1717 (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
18+:: A mark's text without its /- lines, which Ford resolves and ride
19+:: can't parse.
20+++ mark-text
21+ |= lines=wain
22+ ^- @t
23+ (text (skip lines |=(line=@t =('/-' (end [3 2] line)))))
1824::
1925++ doc-detailed
2026 |= [at=path src=@t externals=iexternals:jibb marks=imark-externals:jibb modules=jbundle:jibb prepared=iprelude:jibb]
@@ -161,6 +167,6 @@
161167++ test-doc-examples
162168 ^- tang
163169 =/ failures=(list tape)
164− (doc-examples-errors prelude internal imports view-day step cmd-sub (text todo-sur) (text todo-action) (text blog-sur) (text card))
170+ (doc-examples-errors prelude internal imports view-day step cmd-sub (text todo-sur) (mark-text todo-action) (text blog-sur) (text card))
165171 (turn failures |=(reason=tape leaf+reason))
166172--
tests/lib/jibb-gate-free-source.hoon+14−8
@@ -2,13 +2,13 @@
22/+ jibb, jibb-import
33/* prelude %jibb /lib/jibb/prelude/jibb
44/* internal %jibb /lib/jibb/internal/jibb
5−/* sur %txt /tests/type-api-paths/todo-sur/txt
6−/* action %txt /tests/type-api-paths/todo-action/txt
7−/* todos %txt /tests/type-api-paths/todos/txt
8−/* update %txt /tests/type-api-paths/todo-update/txt
9−/* item %txt /tests/type-api-paths/todo-item/txt
10−/* api %txt /tests/type-api-paths/api/txt
11−/* source %txt /tests/type-gate-free/todo/txt
5+/* sur %txt /my-app/sur/todo/hoon
6+/* action %txt /my-app/mar/todo-action/hoon
7+/* todos %txt /my-app/mar/todos/hoon
8+/* update %txt /my-app/mar/todo-update/hoon
9+/* item %txt /my-app/mar/todo-item/hoon
10+/* api %txt /my-app/ui/api/todo/jibb
11+/* source %txt /my-app/ui/todo-list/jibb
1212/* gate-source %txt /tests/type-gate-free/todo-gate/txt
1313/* noun-source %txt /tests/type-gate-free/todo-noun/txt
1414/* expected %txt /tests/type-gate-free/expected/txt
@@ -17,6 +17,12 @@
1717 |= lines=wain
1818 ^- @t
1919 (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
20+:: A mark's text without its /- lines, which Ford resolves and ride
21+:: can't parse.
22+++ mark-text
23+ |= lines=wain
24+ ^- @t
25+ (text (skip lines |=(line=@t =('/-' (end [3 2] line)))))
2026++ gate-free-source-report
2127 |= [public=@t private=@t sur-text=@t action-text=@t todos-text=@t update-text=@t item-text=@t api-text=@t source-text=@t gate-text=@t noun-text=@t]
2228 ^- @t
@@ -89,7 +95,7 @@
8995 'todo model: gate-free\0acallback model: gate at callback\0anoun model: unknown\0azero fuel: unknown\0aoversized fuel: capped\0ainvalid inputs: rejected\0asource evidence: retained\0amatching root and unused sur: accepted\0aroot import cycle: rejected'
9096++ report
9197 ^- @t
92− (gate-free-source-report prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api) (text source) (text gate-source) (text noun-source))
98+ (gate-free-source-report prelude internal (text sur) (mark-text action) (mark-text todos) (mark-text update) (mark-text item) (text api) (text source) (text gate-source) (text noun-source))
9399++ test-gate-free-source
94100 ^- tang
95101 =/ actual=@t report
tests/lib/jibb-page-main.hoon+21−15
@@ -2,20 +2,20 @@
22/+ jibb, jibb-import
33/* prelude %jibb /lib/jibb/prelude/jibb
44/* internal %jibb /lib/jibb/internal/jibb
5−/* sur %txt /tests/type-api-paths/todo-sur/txt
6−/* action %txt /tests/type-api-paths/todo-action/txt
7−/* todos %txt /tests/type-api-paths/todos/txt
8−/* update %txt /tests/type-api-paths/todo-update/txt
9−/* item %txt /tests/type-api-paths/todo-item/txt
10−/* todo-api %txt /tests/type-page-main/todo-api/txt
11−/* todo-island %txt /tests/type-page-main/todo-island/txt
12−/* blog-sur %txt /tests/type-page-main/blog-sur/txt
13−/* posts %txt /tests/type-page-main/posts-mark/txt
14−/* blog-api %txt /tests/type-page-main/blog-api/txt
15−/* card %txt /tests/type-page-main/card/txt
16−/* about %txt /tests/type-page-main/static/txt
17−/* blog-index %txt /tests/type-page-main/blog-index/txt
18−/* index %txt /tests/type-page-main/index/txt
5+/* sur %txt /my-app/sur/todo/hoon
6+/* action %txt /my-app/mar/todo-action/hoon
7+/* todos %txt /my-app/mar/todos/hoon
8+/* update %txt /my-app/mar/todo-update/hoon
9+/* item %txt /my-app/mar/todo-item/hoon
10+/* todo-api %txt /my-app/ui/api/todo/jibb
11+/* todo-island %txt /my-app/ui/todo-list/jibb
12+/* blog-sur %txt /my-app/sur/blog/hoon
13+/* posts %txt /my-app/mar/posts/hoon
14+/* blog-api %txt /my-app/ui/api/blog/jibb
15+/* card %txt /my-app/ui/components/card/jibb
16+/* about %txt /my-app/ui/about/jibb
17+/* blog-index %txt /my-app/ui/blog/index/jibb
18+/* index %txt /my-app/ui/index/jibb
1919/* ctor-page %txt /tests/type-page-main/ctor-page/txt
2020/* wrong-static %txt /tests/type-page-main/wrong-static/txt
2121/* arbitrary-main %txt /tests/type-page-main/arbitrary-main/txt
@@ -30,6 +30,12 @@
3030 |= lines=wain
3131 ^- @t
3232 (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
33+:: A mark's text without its /- lines, which Ford resolves and ride
34+:: can't parse.
35+++ mark-text
36+ |= lines=wain
37+ ^- @t
38+ (text (skip lines |=(line=@t =('/-' (end [3 2] line)))))
3339::
3440++ page-main-detailed
3541 |= [at=path src=@t externals=iexternals:jibb marks=imark-externals:jibb modules=jbundle:jibb prepared=iprelude:jibb]
@@ -163,6 +169,6 @@
163169 ['diff load' (text diff-load)]
164170 ==
165171 =/ failures=(list tape)
166− (page-main-errors prelude internal (text sur) (text action) (text todos) (text update) (text item) (text todo-api) (text todo-island) (text blog-sur) (text posts) (text blog-api) (text card) (text about) (text blog-index) (text index) (text ctor-page) negatives)
172+ (page-main-errors prelude internal (text sur) (mark-text action) (mark-text todos) (mark-text update) (mark-text item) (text todo-api) (text todo-island) (text blog-sur) (mark-text posts) (text blog-api) (text card) (text about) (text blog-index) (text index) (text ctor-page) negatives)
167173 (turn failures |=(reason=tape leaf+reason))
168174--
tests/lib/jibb-program-watch.hoon+13−7
@@ -2,17 +2,23 @@
22/+ jibb, jibb-import
33/* prelude %jibb /lib/jibb/prelude/jibb
44/* internal %jibb /lib/jibb/internal/jibb
5−/* sur %txt /tests/type-api-paths/todo-sur/txt
6−/* action %txt /tests/type-api-paths/todo-action/txt
7−/* todos %txt /tests/type-api-paths/todos/txt
8−/* update %txt /tests/type-api-paths/todo-update/txt
9−/* item %txt /tests/type-api-paths/todo-item/txt
10−/* api %txt /tests/type-api-paths/api/txt
5+/* sur %txt /my-app/sur/todo/hoon
6+/* action %txt /my-app/mar/todo-action/hoon
7+/* todos %txt /my-app/mar/todos/hoon
8+/* update %txt /my-app/mar/todo-update/hoon
9+/* item %txt /my-app/mar/todo-item/hoon
10+/* api %txt /my-app/ui/api/todo/jibb
1111|%
1212++ text
1313 |= lines=wain
1414 ^- @t
1515 (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
16+:: A mark's text without its /- lines, which Ford resolves and ride
17+:: can't parse.
18+++ mark-text
19+ |= lines=wain
20+ ^- @t
21+ (text (skip lines |=(line=@t =('/-' (end [3 2] line)))))
1622::
1723++ program-watch-prepared
1824 |= [public=@t private=@t]
@@ -204,6 +210,6 @@
204210 ?~ item ~[leaf+"program-watch fixture item is missing"]
205211 ?~ api ~[leaf+"program-watch fixture api is missing"]
206212 =/ failures=(list tape)
207− (program-watch-errors prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api))
213+ (program-watch-errors prelude internal (text sur) (mark-text action) (mark-text todos) (mark-text update) (mark-text item) (text api))
208214 (turn failures |=(reason=tape leaf+reason))
209215--
tests/lib/jibb-store.hoon+2−2
@@ -2,8 +2,8 @@
22/+ jibb
33/* prelude %jibb /lib/jibb/prelude/jibb
44/* internal %jibb /lib/jibb/internal/jibb
5−/* cart %txt /tests/type-store/cart/txt
6−/* basket %txt /tests/type-store/basket/txt
5+/* cart %txt /my-app/ui/stores/cart/jibb
6+/* basket %txt /my-app/ui/basket/jibb
77|%
88++ text
99 |= lines=wain
tests/lib/jibb-theme.hoon+1−1
@@ -2,7 +2,7 @@
22/+ jibb
33/* prelude %jibb /lib/jibb/prelude/jibb
44/* internal %jibb /lib/jibb/internal/jibb
5−/* source %txt /tests/type-theme/source/txt
5+/* source %txt /my-app/ui/theme/jibb
66/* dark-absent %txt /tests/type-theme/dark-absent/txt
77/* wrong-nested-aura %txt /tests/type-theme/wrong-nested-aura/txt
88/* missing-field %txt /tests/type-theme/missing-field/txt
tests/lib/jibb-todo-api.hoon+13−7
@@ -2,12 +2,12 @@
22/+ jibb, jibb-import
33/* prelude %jibb /lib/jibb/prelude/jibb
44/* internal %jibb /lib/jibb/internal/jibb
5−/* sur %txt /tests/type-api-paths/todo-sur/txt
6−/* action %txt /tests/type-api-paths/todo-action/txt
7−/* todos %txt /tests/type-api-paths/todos/txt
8−/* update %txt /tests/type-api-paths/todo-update/txt
9−/* item %txt /tests/type-api-paths/todo-item/txt
10−/* api %txt /tests/type-api-paths/api/txt
5+/* sur %txt /my-app/sur/todo/hoon
6+/* action %txt /my-app/mar/todo-action/hoon
7+/* todos %txt /my-app/mar/todos/hoon
8+/* update %txt /my-app/mar/todo-update/hoon
9+/* item %txt /my-app/mar/todo-item/hoon
10+/* api %txt /my-app/ui/api/todo/jibb
1111/* source %txt /tests/type-todo-api/source/txt
1212/* negative %txt /tests/type-todo-api/negative/txt
1313/* unsupported %txt /tests/type-todo-api/unsupported/txt
@@ -18,6 +18,12 @@
1818 |= lines=wain
1919 ^- @t
2020 (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
21+:: A mark's text without its /- lines, which Ford resolves and ride
22+:: can't parse.
23+++ mark-text
24+ |= lines=wain
25+ ^- @t
26+ (text (skip lines |=(line=@t =('/-' (end [3 2] line)))))
2127++ todo-run
2228 |= [prelude=@t internal=@t sur=@t action=@t todos=@t update=@t item=@t api=@t source=@t negative=@t unsupported=@t]
2329 ^- [report=@t bad-report=@t guards=@t]
@@ -74,7 +80,7 @@
7480 [report bad-report guards]
7581++ todo-out
7682 ^- [report=@t bad-report=@t guards=@t]
77− (todo-run prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api) (text source) (text negative) (text unsupported))
83+ (todo-run prelude internal (text sur) (mark-text action) (mark-text todos) (mark-text update) (mark-text item) (text api) (text source) (text negative) (text unsupported))
7884++ report
7985 ^- @t
8086 report:todo-out
tests/lib/jibb-todo-full.hoon+19−13
@@ -2,13 +2,13 @@
22/+ jibb, jibb-import
33/* prelude %jibb /lib/jibb/prelude/jibb
44/* internal %jibb /lib/jibb/internal/jibb
5−/* sur %txt /tests/type-api-paths/todo-sur/txt
6−/* action %txt /tests/type-api-paths/todo-action/txt
7−/* todos %txt /tests/type-api-paths/todos/txt
8−/* update %txt /tests/type-api-paths/todo-update/txt
9−/* item %txt /tests/type-api-paths/todo-item/txt
10−/* api %txt /tests/type-api-paths/api/txt
11−/* source %txt /tests/type-gate-free/todo/txt
5+/* sur %txt /my-app/sur/todo/hoon
6+/* action %txt /my-app/mar/todo-action/hoon
7+/* todos %txt /my-app/mar/todos/hoon
8+/* update %txt /my-app/mar/todo-update/hoon
9+/* item %txt /my-app/mar/todo-item/hoon
10+/* api %txt /my-app/ui/api/todo/jibb
11+/* source %txt /my-app/ui/todo-list/jibb
1212/* wrong-model %txt /tests/type-todo-full/wrong-model/txt
1313/* wrong-message %txt /tests/type-todo-full/wrong-message/txt
1414/* wrong-result %txt /tests/type-todo-full/wrong-result/txt
@@ -24,6 +24,12 @@
2424 |= lines=wain
2525 ^- @t
2626 (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
27+:: A mark's text without its /- lines, which Ford resolves and ride
28+:: can't parse.
29+++ mark-text
30+ |= lines=wain
31+ ^- @t
32+ (text (skip lines |=(line=@t =('/-' (end [3 2] line)))))
2733::
2834++ todo-full-detailed
2935 |= [at=path src=@t externals=iexternals:jibb marks=imark-externals:jibb modules=jbundle:jibb prepared=iprelude:jibb]
@@ -65,7 +71,7 @@
6571::
6672++ report
6773 ^- @t
68− (todo-full-report prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api) (text source))
74+ (todo-full-report prelude internal (text sur) (mark-text action) (mark-text todos) (mark-text update) (mark-text item) (text api) (text source))
6975::
7076++ todo-full-legacy-report
7177 |= [public=@t private=@t sur=@t action=@t todos=@t update=@t item=@t api=@t src=@t]
@@ -131,19 +137,19 @@
131137 ?. =((to-wain:format (cat 3 got '\0a')) expected)
132138 ~[leaf+"full todo report differs"]
133139 =/ legacy=@t
134− (todo-full-legacy-report prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api) (text source))
140+ (todo-full-legacy-report prelude internal (text sur) (mark-text action) (mark-text todos) (mark-text update) (mark-text item) (text api) (text source))
135141 ?. =((to-wain:format (cat 3 legacy '\0a')) expected)
136142 ~[leaf+"legacy full todo report differs"]
137143 =/ cast-report=@t
138− (todo-full-report prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api) (text cast-init))
144+ (todo-full-report prelude internal (text sur) (mark-text action) (mark-text todos) (mark-text update) (mark-text item) (text api) (text cast-init))
139145 ?. =((to-wain:format (cat 3 cast-report '\0a')) expected)
140146 ~[leaf+"ordinary annotated initializer was rejected"]
141147 =/ cast-legacy=@t
142− (todo-full-legacy-report prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api) (text cast-init))
148+ (todo-full-legacy-report prelude internal (text sur) (mark-text action) (mark-text todos) (mark-text update) (mark-text item) (text api) (text cast-init))
143149 ?. =((to-wain:format (cat 3 cast-legacy '\0a')) expected)
144150 ~[leaf+"legacy ordinary annotated initializer was rejected"]
145151 =/ imported=@t
146− (todo-full-import-report prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api) (text source))
152+ (todo-full-import-report prelude internal (text sur) (mark-text action) (mark-text todos) (mark-text update) (mark-text item) (text api) (text source))
147153 ?. =(imported 'downstream import accepted')
148154 ~[leaf+"downstream full todo import differs"]
149155 =/ negatives=(list [label=@t src=@t])
@@ -161,7 +167,7 @@
161167 |= c=[label=@t src=@t]
162168 =/ expected=@t (cat 3 label.c ': rejected')
163169 =/ actual=@t
164− (todo-full-negative-report prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api) label.c src.c)
170+ (todo-full-negative-report prelude internal (text sur) (mark-text action) (mark-text todos) (mark-text update) (mark-text item) (text api) label.c src.c)
165171 ?. =(expected actual) `actual
166172 ~
167173 ?^ bad (turn bad |=(reason=@t leaf+(trip reason)))
tests/lib/jibb-todo-partial.hoon+14−8
@@ -2,19 +2,25 @@
22/+ jibb, jibb-import
33/* prelude %jibb /lib/jibb/prelude/jibb
44/* internal %jibb /lib/jibb/internal/jibb
5−/* sur %txt /tests/type-api-paths/todo-sur/txt
6−/* action %txt /tests/type-api-paths/todo-action/txt
7−/* todos %txt /tests/type-api-paths/todos/txt
8−/* update %txt /tests/type-api-paths/todo-update/txt
9−/* item %txt /tests/type-api-paths/todo-item/txt
10−/* api %txt /tests/type-api-paths/api/txt
11−/* source %txt /tests/type-gate-free/todo/txt
5+/* sur %txt /my-app/sur/todo/hoon
6+/* action %txt /my-app/mar/todo-action/hoon
7+/* todos %txt /my-app/mar/todos/hoon
8+/* update %txt /my-app/mar/todo-update/hoon
9+/* item %txt /my-app/mar/todo-item/hoon
10+/* api %txt /my-app/ui/api/todo/jibb
11+/* source %txt /my-app/ui/todo-list/jibb
1212/* expected %txt /tests/type-todo-partial/expected/txt
1313|%
1414++ text
1515 |= lines=wain
1616 ^- @t
1717 (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
18+:: A mark's text without its /- lines, which Ford resolves and ride
19+:: can't parse.
20+++ mark-text
21+ |= lines=wain
22+ ^- @t
23+ (text (skip lines |=(line=@t =('/-' (end [3 2] line)))))
1824++ todo-island-report
1925 |= [public=@t private=@t sur-text=@t action-text=@t todos-text=@t update-text=@t item-text=@t api-text=@t source-text=@t]
2026 ^- @t
@@ -49,7 +55,7 @@
4955 (of-wain:format (weld ~['unchanged todo: partial inference only' normal 'negative API imports'] (weld failures ~['missing module: partial report' missing-module])))
5056++ report
5157 ^- @t
52− (todo-island-report prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api) (text source))
58+ (todo-island-report prelude internal (text sur) (mark-text action) (mark-text todos) (mark-text update) (mark-text item) (text api) (text source))
5359++ test-todo-partial
5460 ^- tang
5561 ?~ source ~[leaf+"todo source fixture is missing"]
tests/my-app-copies.txt+5−36
@@ -1,21 +1,12 @@
1−# Files under tests/ that copy a my-app source, for the checks that
2−# cannot read my-app, which is not on the jibb-dev desk. tools/test-arms
3−# checks every pair before it runs anything (--copies runs only that).
1+# Files under tests/ that copy my-app/mar/label.hoon without its first
2+# line, a comment. Tests read my-app's other sources where the jibb-dev
3+# desk holds them, under /my-app, and golden cases link to them.
4+# tools/test-arms checks every pair before it runs anything (--copies
5+# runs only that).
46#
57# COPY SOURCE [without LINE]: the copy equals the source, or the source
68# with the first occurrence of LINE and its newline removed.
79
8−tests/golden/doc-grammar-02-buttons/source.jibb my-app/ui/components/buttons.jibb
9−tests/golden/doc-grammar-06-cart-store/source.jibb my-app/ui/stores/cart.jibb
10−tests/golden/doc-grammar-07-basket/source.jibb my-app/ui/basket.jibb
11−tests/golden/doc-overview-02-theme/source.jibb my-app/ui/theme.jibb
12−tests/golden/doc-overview-04-todo-api/source.jibb my-app/ui/api/todo.jibb
13−tests/golden/doc-overview-08-about/source.jibb my-app/ui/about.jibb
14−tests/golden/doc-overview-09-blog-index/source.jibb my-app/ui/blog/index.jibb
15−tests/golden/doc-overview-10-todo-list/source.jibb my-app/ui/todo-list.jibb
16−tests/golden/doc-overview-11-index/source.jibb my-app/ui/index.jibb
17−tests/golden/fixture-blog-api/source.jibb my-app/ui/api/blog.jibb
18−tests/golden/fixture-blog-card/source.jibb my-app/ui/components/card.jibb
1910tests/golden/module-import-api-derived-clash/mar/full.txt my-app/mar/label.hoon without :: Fixture for the Hoon mark importer; not supplied by the design doc.
2011tests/golden/module-import-api-import-error/mar/full.txt my-app/mar/label.hoon without :: Fixture for the Hoon mark importer; not supplied by the design doc.
2112tests/golden/module-import-api-mark-prelude-value/mar/same.txt my-app/mar/label.hoon without :: Fixture for the Hoon mark importer; not supplied by the design doc.
@@ -29,28 +20,6 @@ tests/golden/module-import-api-request-reason/mar/full.txt my-app/mar/l
2920tests/golden/module-import-api-scope-conflict/mar/full.txt my-app/mar/label.hoon without :: Fixture for the Hoon mark importer; not supplied by the design doc.
3021tests/golden/module-import-root-import-shadow/mar/label.txt my-app/mar/label.hoon without :: Fixture for the Hoon mark importer; not supplied by the design doc.
3122tests/golden/types-import-mark/mar/label.txt my-app/mar/label.hoon without :: Fixture for the Hoon mark importer; not supplied by the design doc.
32−tests/golden/types-module-fixtures/modules/ui/api/blog.jibb my-app/ui/api/blog.jibb
33−tests/golden/types-module-fixtures/modules/ui/components/card.jibb my-app/ui/components/card.jibb
34−tests/golden/types-module-fixtures/source.jibb my-app/ui/blog/index.jibb
3523tests/golden/types-module-mixed/mar/label.txt my-app/mar/label.hoon without :: Fixture for the Hoon mark importer; not supplied by the design doc.
3624tests/golden/types-request-normal/mar/full.txt my-app/mar/label.hoon without :: Fixture for the Hoon mark importer; not supplied by the design doc.
37−tests/type-api-paths/api.txt my-app/ui/api/todo.jibb
38−tests/type-api-paths/todo-action.txt my-app/mar/todo-action.hoon without /- todo
39−tests/type-api-paths/todo-item.txt my-app/mar/todo-item.hoon without /- todo
40−tests/type-api-paths/todo-sur.txt my-app/sur/todo.hoon
41−tests/type-api-paths/todo-update.txt my-app/mar/todo-update.hoon without /- todo
42−tests/type-api-paths/todos.txt my-app/mar/todos.hoon without /- todo
43−tests/type-gate-free/todo.txt my-app/ui/todo-list.jibb
44−tests/type-page-main/blog-api.txt my-app/ui/api/blog.jibb
45−tests/type-page-main/blog-index.txt my-app/ui/blog/index.jibb
46−tests/type-page-main/blog-sur.txt my-app/sur/blog.hoon
47−tests/type-page-main/card.txt my-app/ui/components/card.jibb
48−tests/type-page-main/index.txt my-app/ui/index.jibb
49−tests/type-page-main/posts-mark.txt my-app/mar/posts.hoon without /- blog
50−tests/type-page-main/static.txt my-app/ui/about.jibb
51−tests/type-page-main/todo-api.txt my-app/ui/api/todo.jibb
52−tests/type-page-main/todo-island.txt my-app/ui/todo-list.jibb
5325tests/type-poke/mark.txt my-app/mar/label.hoon without :: Fixture for the Hoon mark importer; not supplied by the design doc.
54−tests/type-store/basket.txt my-app/ui/basket.jibb
55−tests/type-store/cart.txt my-app/ui/stores/cart.jibb
56−tests/type-theme/source.txt my-app/ui/theme.jibb
tests/type-api-paths/api.txtdeleted−13
@@ -1,13 +0,0 @@
1−:: /ui/api/todo.jibb
2−/- todo
3−/% %todo-action
4−/% %todos
5−/% %todo-update
6−/% %todo-item
7−
8−+$ item item.todo
9−+$ poke todo-action
10−+$ paths
11− [%todos /todos todos]
12− [%changes /changes (facts todos todo-update)]
13− [%todo-by-id /todo/[id=@ud] todo-item]
tests/type-api-paths/todo-action.txtdeleted−6
@@ -1,6 +0,0 @@
1−:: Fixture for the documented examples; not supplied by the design doc.
2−|_ a=action:todo
3−++ grab |% ++ noun action:todo --
4−++ grow |% ++ noun a --
5−++ grad %noun
6−--
tests/type-api-paths/todo-item.txtdeleted−6
@@ -1,6 +0,0 @@
1−:: Fixture for the documented examples; not supplied by the design doc.
2−|_ a=item:todo
3−++ grab |% ++ noun item:todo --
4−++ grow |% ++ noun a --
5−++ grad %noun
6−--
tests/type-api-paths/todo-sur.txtdeleted−12
@@ -1,12 +0,0 @@
1−:: Fixture for the documented examples; not supplied by the design doc.
2−|%
3−+$ item [id=@ud done=? text=@t]
4−+$ action
5− $% [%add text=@t]
6− [%toggle id=@ud]
7− ==
8−+$ update
9− $% [%added item=item]
10− [%toggled id=@ud]
11− ==
12−--
tests/type-api-paths/todo-update.txtdeleted−6
@@ -1,6 +0,0 @@
1−:: Fixture for the documented examples; not supplied by the design doc.
2−|_ a=update:todo
3−++ grab |% ++ noun update:todo --
4−++ grow |% ++ noun a --
5−++ grad %noun
6−--
tests/type-api-paths/todos.txtdeleted−6
@@ -1,6 +0,0 @@
1−:: Fixture for the documented examples; not supplied by the design doc.
2−|_ a=(list item:todo)
3−++ grab |% ++ noun (list item:todo) --
4−++ grow |% ++ noun a --
5−++ grad %noun
6−--
tests/type-gate-free/about.txt+1−1
@@ -1 +1 @@
1−The unchanged todo island source is used only to resolve its model mold through the actual todo API, /sur and mark readers. tools/test-arms checks its copy against the application source through tests/my-app-copies.txt. Controls also add a callback or noun field and exercise unavailable, malformed and ambiguous input. This is partial mold analysis only: no complete module, island kind, runtime or watchability claim is made.
1+The unchanged todo island source is used only to resolve its model mold through the actual todo API, /sur and mark readers. The suites read it from my-app/ui/todo-list.jibb on the jibb-dev desk. Controls also add a callback or noun field and exercise unavailable, malformed and ambiguous input. This is partial mold analysis only: no complete module, island kind, runtime or watchability claim is made.
tests/type-gate-free/todo.txtdeleted−40
@@ -1,40 +0,0 @@
1−/= todo /ui/api/todo
2−
3−++ main (program init update view subs)
4−
5−+$ model [todos=(list item.todo) draft=@t error=(unit @t)]
6−+$ msg
7− [%typed text=@t]
8− %submit
9− [%toggled id=@ud]
10− [%got todos=(list item.todo)]
11− [%acked err=(unit @t)]
12−
13−++ init |= ts=(list item.todo)
14− [ts "" ~]
15−
16−++ update |= [=msg m=model]
17− ?- msg
18− [%typed t]
19− ?- (gth (lent (tuba (trip t))) 80)
20− %.y [m(draft=t error=`"Too long") ~]
21− %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23− [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24− [%got ts] [m(todos=ts) ~]
25− [%acked err] [m(error=err) ~]
26−
27−++ subs |= m=model
28− ~[[%watch (todos.todo |=%got)]]
29−
30−++ view |= m=model
31− column ~[gap+%s2] ~[
32− heading 2 "Todos"
33− each (turn todos.m row-of)
34− row ~[gap+%s1] ~[
35− el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
36− button "Add" %submit
37− el ~[tone+%danger] (text (fall error.m ""))
38−
39−++ row-of |= t=item.todo
40− [id.t (toggle done.t text.t [%toggled id.t])]
tests/type-page-main/about.txt+1−1
@@ -1,3 +1,3 @@
1−source: my-app/ui/about.jibb, my-app/ui/blog/index.jibb and my-app/ui/index.jibb; their fixtures and real API/UI/reader sources must remain byte-identical.
1+source: my-app/ui/about.jibb, my-app/ui/blog/index.jibb and my-app/ui/index.jibb, with the API, UI, /sur and mark sources they use, all read from my-app on the jibb-dev desk.
22tests: Shared eval and ship full checks for static and direct data pages, exact closed main types, a direct-constructor reply, structural downstream imports, and rejection of wrong/arbitrary mains, page aliases, indirect, pure, hand-built, typed and diff loads, missing evidence and store paths. No rendering or runtime request execution is claimed.
33expect: shared eval and ship guards
tests/type-page-main/blog-api.txtdeleted−5
@@ -1,5 +0,0 @@
1−:: Fixture for the documented examples; not supplied by the design doc.
2−/% %posts
3−
4−+$ paths
5− [%posts /posts posts]
tests/type-page-main/blog-index.txtdeleted−9
@@ -1,9 +0,0 @@
1−/- blog
2−/= api /ui/api/blog
3−/= card /ui/components/card
4−
5−++ main (page load view)
6−++ load |=(~ (posts.api same))
7−
8−++ view |= ps=(list post.blog)
9− column ~[gap+%s2] (turn ps card.card)
tests/type-page-main/blog-sur.txtdeleted−6
@@ -1,6 +0,0 @@
1−:: Fixture for the documented examples; not supplied by the design doc.
2−|%
3−+$ title @t
4−+$ post [title=title slug=@ta]
5−+$ chain $@(~ [value=@ud next=chain])
6−--
tests/type-page-main/card.txtdeleted−5
@@ -1,5 +0,0 @@
1−:: Fixture for the documented examples; not supplied by the design doc.
2−/- blog
3−
4−++ card |= p=post.blog
5− text title.p
tests/type-page-main/index.txtdeleted−10
@@ -1,10 +0,0 @@
1−/= todo /ui/api/todo
2−/= todo-list /ui/todo-list
3−
4−++ main (page load view)
5−++ load |=(~ (todos.todo same))
6−
7−++ view |= ts=(list item.todo)
8− column ~[pad+%s3] ~[
9− heading 1 "My ship"
10− island main.todo-list ts
tests/type-page-main/posts-mark.txtdeleted−6
@@ -1,6 +0,0 @@
1−:: Fixture for the documented examples; not supplied by the design doc.
2−|_ a=(list post:blog)
3−++ grab |% ++ noun (list post:blog) --
4−++ grow |% ++ noun a --
5−++ grad %noun
6−--
tests/type-page-main/static.txtdeleted−7
@@ -1,7 +0,0 @@
1−++ main view
2−
3−++ view
4− column ~[width+[%fill 1] pad+%s3 gap+%s2] ~[
5− heading 1 "About this ship"
6− para ~[(text "Hosted on Urbit. This page ships no JavaScript.")]
7− el ~[tone+%accent] (link %/blog "Read the blog")
tests/type-page-main/todo-api.txtdeleted−13
@@ -1,13 +0,0 @@
1−:: /ui/api/todo.jibb
2−/- todo
3−/% %todo-action
4−/% %todos
5−/% %todo-update
6−/% %todo-item
7−
8−+$ item item.todo
9−+$ poke todo-action
10−+$ paths
11− [%todos /todos todos]
12− [%changes /changes (facts todos todo-update)]
13− [%todo-by-id /todo/[id=@ud] todo-item]
tests/type-page-main/todo-island.txtdeleted−40
@@ -1,40 +0,0 @@
1−/= todo /ui/api/todo
2−
3−++ main (program init update view subs)
4−
5−+$ model [todos=(list item.todo) draft=@t error=(unit @t)]
6−+$ msg
7− [%typed text=@t]
8− %submit
9− [%toggled id=@ud]
10− [%got todos=(list item.todo)]
11− [%acked err=(unit @t)]
12−
13−++ init |= ts=(list item.todo)
14− [ts "" ~]
15−
16−++ update |= [=msg m=model]
17− ?- msg
18− [%typed t]
19− ?- (gth (lent (tuba (trip t))) 80)
20− %.y [m(draft=t error=`"Too long") ~]
21− %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23− [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24− [%got ts] [m(todos=ts) ~]
25− [%acked err] [m(error=err) ~]
26−
27−++ subs |= m=model
28− ~[[%watch (todos.todo |=%got)]]
29−
30−++ view |= m=model
31− column ~[gap+%s2] ~[
32− heading 2 "Todos"
33− each (turn todos.m row-of)
34− row ~[gap+%s1] ~[
35− el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
36− button "Add" %submit
37− el ~[tone+%danger] (text (fall error.m ""))
38−
39−++ row-of |= t=item.todo
40− [id.t (toggle done.t text.t [%toggled id.t])]
tests/type-store/basket.txtdeleted−32
@@ -1,32 +0,0 @@
1−:: /ui/basket.jibb
2−/= cart /ui/stores/cart
3−
4−++ main (program init update view subs)
5−
6−+$ model [cart=state.cart note=@t]
7−+$ msg
8− [%noted text=@t]
9− %add
10− %toggle
11− [%got cart=state.cart]
12− [%acked err=(unit @t)]
13−
14−++ init |= ~
15− [[~ %.n] ""]
16−
17−++ update |= [=msg m=model]
18− ?- msg
19− [%noted t] [m(note=t) ~]
20− %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
21− %toggle [m ~[(poke.cart %toggle |=%acked)]]
22− [%got c] [m(cart=c) ~]
23− [%acked err] [m ~]
24−
25−++ subs |= m=model
26− ~[[%watch (state.cart |=%got)]]
27−
28−++ view |= m=model
29− column ~[gap+%s1] ~[
30− (text "{(lent items.cart.m)} items")
31− field "Item" note.m |=%noted
32− button "Add" %add
tests/type-store/cart.txtdeleted−12
@@ -1,12 +0,0 @@
1−:: /ui/stores/cart.jibb
2−+$ state [items=(list @t) open=?]
3−+$ poke
4− [%add item=@t]
5− %toggle
6−
7−++ main (store init update)
8−++ init ^- state [~ %.n]
9−++ update |= [a=poke s=state]
10− ?- a
11− [%add item] s(items=[item items.s])
12− %toggle s(open=(not open.s))
tests/type-theme/source.txtdeleted−8
@@ -1,8 +0,0 @@
1−++ theme ^- theme
2− [ space=[s1="4px" s2="8px" s3="16px"]
3− tones=[normal="#222" background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
4− wide="60rem"
5− lang="en"
6− zone="UTC"
7− font=`%/static/fonts/inter.woff2
8− dark=`[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
tests/type-todo-api/about.txt+1−1
@@ -1 +1 @@
1−The exact my-app todo API is checked with its actual /sur and mark reader fixtures. tools/test-arms checks the API fixture against the application source through tests/my-app-copies.txt. Positive and negative reports cover request callback polymorphism, the named one-diff fold, typed path arguments, poke, exported molds and a typed subscription expression. The interface guards check source and request evidence and reject missing or duplicate inputs, unsupported sibling declarations and private imports. Reports are partial inference, not a complete module check or runtime/watchability proof.
1+The exact my-app todo API is checked with its actual /sur and mark reader fixtures. The suite reads the API, /sur and marks from my-app on the jibb-dev desk. Positive and negative reports cover request callback polymorphism, the named one-diff fold, typed path arguments, poke, exported molds and a typed subscription expression. The interface guards check source and request evidence and reject missing or duplicate inputs, unsupported sibling declarations and private imports. Reports are partial inference, not a complete module check or runtime/watchability proof.
tests/type-todo-full/about.txt+1−1
@@ -1,3 +1,3 @@
1−source: docs/spec/overview.md, worked example 3; my-app/ui/todo-list.jibb must remain byte-identical to tests/type-gate-free/todo.txt, which tools/test-arms checks through tests/my-app-copies.txt.
1+source: docs/spec/overview.md, worked example 3, as my-app/ui/todo-list.jibb, which the suite reads from my-app on the jibb-dev desk.
22tests: Full detailed and legacy checking of the unchanged todo island through the real Hoon readers and API. Assert the exact closed main type and structural downstream import, plus a variant whose initializer is a gate cast to its full type, which only ordinary inference accepts, so it fails if a keyed view skips ordinary inference again, and wrong model/message/result, ambiguous or open mapper, aliased mapper, non-gate view, and wrong watch rejection. The report does not execute Jibb or establish runtime watching.
33expect: shared eval and ship guards
tests/type-todo-partial/about.txt+1−1
@@ -1,4 +1,4 @@
11source: Overview, Worked examples: “`main.todo-list` is a record of exactly `init`, `update`, `view` and `subs`, whose types fix the data, model and messages.”
2−tests: The unchanged todo island is resolved using the real prelude, todo API, source-aware Hoon `/sur`, and mark readers. The report records partial inference only; it does not claim the module, island kind, gate-free conditions, runtime, or watchability were checked. Missing and duplicate marks, an unavailable selected `/sur` mold, and an unavailable API module remain rejected or explicitly unavailable. `tools/test-arms` checks the mounted todo and API fixtures against their app sources through `tests/my-app-copies.txt`.
2+tests: The unchanged todo island is resolved using the real prelude, todo API, source-aware Hoon `/sur`, and mark readers. The report records partial inference only; it does not claim the module, island kind, gate-free conditions, runtime, or watchability were checked. Missing and duplicate marks, an unavailable selected `/sur` mold, and an unavailable API module remain rejected or explicitly unavailable. The suite reads the todo island and API from `my-app` on the `jibb-dev` desk.
33expect: parses
44expect-types: a partial inference report
tools/ship+47−11
@@ -59,11 +59,15 @@ TESTS_LIB = os.path.join(ROOT, 'tests', 'lib', 'jibb.hoon')
5959
6060# Desks the repo builds, and the folders each is assembled from, in
6161# order. Every desk gets every package under vendor/. A folder is
62−# (repo folder, desk folder, folders left out).
62+# (repo folder, desk folder, folders and files left out). The test
63+# desk holds my-app's sources under /my-app, so tests read them there
64+# instead of keeping copies.
6365DESKS = {
6466 'my-app': [('jibb-dev', '', ['tests']), ('my-app', '', [])],
6567 'jibb': [('jibb', '', [])],
66− 'jibb-dev': [('jibb-dev', '', []), ('tests', 'tests', [])],
68+ 'jibb-dev': [('jibb-dev', '', []), ('tests', 'tests', []),
69+ ('my-app', 'my-app',
70+ ['desk.bill', 'desk.docket-0', 'sys.kelvin'])],
6771}
6872# The test desk has no sys.kelvin of its own; Clay refuses a commit
6973# without one, so it gets the %jibb desk's.
@@ -861,7 +865,7 @@ class Assembly:
861865 if fn.startswith('.'):
862866 continue
863867 rel = os.path.join(rel_dir, fn)
864− if drop and drop(rel):
868+ if rel in skip or (drop and drop(rel)):
865869 continue
866870 desk_rel = os.path.join(into, rel) if into else rel
867871 with open(os.path.join(dirpath, fn), 'rb') as f:
@@ -903,7 +907,11 @@ def assemble(desk, lib=None, golden=None):
903907 (isolated and rel.startswith('lib' + os.sep) and
904908 rel.endswith('.hoon')))
905909 if os.path.isdir(golden):
906− a.add_tree(golden, os.path.join('tests', 'golden'))
910+ # A case file that links to a file the desk already
911+ # holds, such as one of my-app's, is read from there.
912+ a.add_tree(golden, os.path.join('tests', 'golden'),
913+ drop=lambda rel: linked_desk_path(
914+ desk, os.path.join(golden, rel)) is not None)
907915 a.add(os.path.join('tests', 'lib', 'jibb.hoon'),
908916 generate_tests(golden).encode(),
909917 'tools/ship gen-tests --golden %s' % show(golden))
@@ -921,6 +929,30 @@ def assemble(desk, lib=None, golden=None):
921929 return a
922930
923931
932+def linked_desk_path(desk, path):
933+ """The desk path of the file a symlink names, when the desk holds
934+ that file through another of its folders, or None."""
935+ if not os.path.islink(path):
936+ return None
937+ real = os.path.realpath(path)
938+ for folder, into, skip in DESKS[desk]:
939+ if folder == 'tests':
940+ continue
941+ rel = os.path.relpath(real, os.path.realpath(os.path.join(ROOT, folder)))
942+ if rel.startswith('..') or any(rel == s or rel.startswith(s + os.sep)
943+ for s in skip):
944+ continue
945+ return os.path.join(into, rel) if into else rel
946+ return None
947+
948+
949+def clay_file(desk, path, default):
950+ """How a generated /* names a golden case file: by the desk path
951+ of the file it links to, as linked_desk_path finds it, or default."""
952+ rel = linked_desk_path(desk, path)
953+ return '/' + '/'.join(clay_path(rel)) if rel is not None else default
954+
955+
924956def check_assembly(a):
925957 problems = []
926958 for rel in sorted(a.files):
@@ -956,6 +988,7 @@ TESTS_HEADER = """\
956988:: Each file holds the output plus one newline. An expect-types: line
957989:: or types.txt opts a case into golden-types and its types.txt output.
958990:: Files come in through /*; a missing expected output fails its case.
991+:: A case file that links to one of my-app's is read from /my-app.
959992:: tools/ship test syncs the desk and runs -test /=jibb-dev=/tests.
960993::
961994:: The .txt files reach Clay through the %txt mark, as lines, so the
@@ -1093,7 +1126,9 @@ def generate_tests(golden):
10931126 for i, ((name, folder), arm) in enumerate(
10941127 zip(cases, arm_names([c[0] for c in cases])), 1):
10951128 base = '/tests/golden/%s' % name
1096− lines.append('/* src-%d %%jibb %s/source/jibb' % (i, base))
1129+ lines.append('/* src-%d %%jibb %s' % (i, clay_file(
1130+ 'jibb-dev', os.path.join(folder, 'source.jibb'),
1131+ '%s/source/jibb' % base)))
10971132 # a knot literal: a case's name may hold . and _, which a
10981133 # path literal in Hoon can't, though /* takes them
10991134 try:
@@ -1117,10 +1152,10 @@ def generate_tests(golden):
11171152 args.append('~')
11181153 call = '(%s %s)' % ('check-at' if logical else 'check', ' '.join(args))
11191154 module_fixtures = []
1120− for j, (module, at, _) in enumerate(modules, 1):
1155+ for j, (module, at, fixture) in enumerate(modules, 1):
11211156 face = 'mod-%d-%d' % (i, j)
1122− lines.append('/* %s %%jibb %s/modules%s/jibb' %
1123− (face, base, module[:-5]))
1157+ lines.append('/* %s %%jibb %s' % (face, clay_file(
1158+ 'jibb-dev', fixture, '%s/modules%s/jibb' % (base, module[:-5]))))
11241159 module_fixtures.append('[%s %s %s]' % (hoon_cord(module.encode()), at, face))
11251160 if golden_case.wants_types(folder):
11261161 if os.path.isfile(os.path.join(folder, 'types.txt')):
@@ -2286,9 +2321,10 @@ EPILOG = """\
22862321desks:
22872322 my-app vendor/* + jibb-dev (without any tests/) + my-app
22882323 jibb vendor/* + jibb
2289− jibb-dev vendor/* + jibb-dev + tests, the test desk: tests/golden from
2290− --golden, tests/lib/jibb.hoon generated from it, and sys.kelvin
2291− from jibb/
2324+ jibb-dev vendor/* + jibb-dev + tests + my-app (under /my-app, without
2325+ its desk files), the test desk: tests/golden from --golden,
2326+ less the case files that link to my-app, tests/lib/jibb.hoon
2327+ generated from it, and sys.kelvin from jibb/
22922328A sync creates the desk if it's missing (as |new-desk does), mounts it at
22932329<pier>/<desk>, makes the mount hold exactly the desk's files, runs
22942330|commit, and waits until the desk matches the repo, checking every file.
tools/test-arms+2−2
@@ -30,8 +30,8 @@ Golden files, the /* %txt files bound to a face with "expected" in its
3030name, must end in exactly one newline (a wain can't show it) and hold no
3131line that starts "BAD " or ends ": BAD" (a check's own failure marker).
3232That is checked before any eval, as are, when no suite or shard is named,
33−the files tests/my-app-copies.txt lists, which must match their my-app
34−sources (the jibb-dev desk has no my-app; --copies checks only them).
33+the copies of my-app/mar/label.hoon that tests/my-app-copies.txt lists,
34+which must match it (--copies checks only them).
3535
3636Exit status: 0 when every arm passes, 1 when one fails, 2 on a usage
3737error.
tools/testdata/ship-selftest+27−13
@@ -408,10 +408,13 @@ def generator_checks(tmp):
408408 check('static and data page sources and shared fixture are assembled',
409409 {'tests/lib/jibb-page-main.hoon', 'tests/type-page-main/about.txt',
410410 *(f'tests/type-page-main/{name}.txt' for name in (
411− 'static', 'blog-index', 'index', 'ctor-page', 'blog-api', 'card', 'blog-sur',
412− 'posts-mark', 'todo-api', 'todo-island', 'wrong-static',
413− 'arbitrary-main', 'page-alias', 'indirect-load', 'pure-load',
414− 'hand-built-load', 'typed-load', 'diff-load'))}
411+ 'ctor-page', 'wrong-static', 'arbitrary-main', 'page-alias',
412+ 'indirect-load', 'pure-load', 'hand-built-load', 'typed-load',
413+ 'diff-load')),
414+ *(f'my-app/{name}' for name in (
415+ 'ui/about.jibb', 'ui/blog/index.jibb', 'ui/index.jibb',
416+ 'ui/api/blog.jibb', 'ui/components/card.jibb', 'sur/blog.hoon',
417+ 'mar/posts.hoon', 'ui/api/todo.jibb', 'ui/todo-list.jibb'))}
415418 <= set(normal.files))
416419 check('program main sources and shared fixture are assembled',
417420 {f'tests/type-program-main/{name}.txt' for name in (
@@ -432,29 +435,40 @@ def generator_checks(tmp):
432435 {'tests/lib/jibb-program-watch.hoon', 'tests/type-program-watch/about.txt'}
433436 <= set(normal.files))
434437 check('unchanged cart store and basket fixtures are assembled',
435− {'tests/lib/jibb-store.hoon', 'tests/type-store/cart.txt',
436− 'tests/type-store/basket.txt'} <= set(normal.files))
438+ {'tests/lib/jibb-store.hoon', 'my-app/ui/stores/cart.jibb',
439+ 'my-app/ui/basket.jibb'} <= set(normal.files))
437440 check('full todo sources and exact main report are assembled',
438− {'tests/lib/jibb-todo-full.hoon', 'tests/type-gate-free/todo.txt',
439− 'tests/type-api-paths/api.txt', 'tests/type-todo-full/expected.txt',
441+ {'tests/lib/jibb-todo-full.hoon', 'my-app/ui/todo-list.jibb',
442+ 'my-app/ui/api/todo.jibb', 'tests/type-todo-full/expected.txt',
440443 *(f'tests/type-todo-full/{name}.txt' for name in (
441444 'wrong-model', 'wrong-message', 'wrong-result', 'ambiguous-mapper',
442445 'open-key', 'alias', 'wrong-watch', 'non-gate-view'))}
443446 <= set(normal.files))
444447 check('buttons sources, schemes and exact error are assembled',
445448 {'tests/lib/jibb-buttons.hoon',
446− 'tests/golden/doc-grammar-02-buttons/source.jibb',
449+ 'my-app/ui/components/buttons.jibb',
447450 'tests/type-buttons/valid.txt', 'tests/type-buttons/expected.txt',
448451 'tests/type-buttons/error.txt'} <= set(normal.files))
449452 check('theme sources and shared fixture are assembled',
450− {'tests/lib/jibb-theme.hoon',
453+ {'tests/lib/jibb-theme.hoon', 'my-app/ui/theme.jibb',
451454 *(f'tests/type-theme/{name}.txt' for name in (
452− 'source', 'dark-absent', 'wrong-nested-aura', 'missing-field',
455+ 'dark-absent', 'wrong-nested-aura', 'missing-field',
453456 'wrong-font', 'wrong-dark'))}
454457 <= set(normal.files))
455458 check('todo partial golden and reused sources are assembled',
456− {'tests/type-todo-partial/expected.txt', 'tests/type-gate-free/todo.txt',
457− 'tests/type-api-paths/api.txt'} <= set(normal.files))
459+ {'tests/type-todo-partial/expected.txt', 'my-app/ui/todo-list.jibb',
460+ 'my-app/ui/api/todo.jibb'} <= set(normal.files))
461+ linked = 'tests/golden/doc-overview-02-theme/source.jibb'
462+ check('my-app is on the test desk, without its desk files',
463+ {'my-app/ui/theme.jibb', 'my-app/sur/todo.hoon',
464+ 'my-app/mar/todos.hoon'} <= set(normal.files) and
465+ not {'my-app/desk.bill', 'my-app/desk.docket-0',
466+ 'my-app/sys.kelvin'} & set(normal.files))
467+ check('a golden case file that links to my-app is read from /my-app',
468+ os.path.islink(os.path.join(ship.ROOT, linked)) and
469+ linked not in normal.files and
470+ '/my-app/ui/theme/jibb' in
471+ normal.files['tests/lib/jibb.hoon'][0].decode())
458472 for label, kwargs in (('custom library', {'lib': STUB}),
459473 ('custom goldens', {'golden': CASES}),
460474 ('both overrides', {'lib': STUB, 'golden': CASES})):