Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
01419f9
Add plan for running smoke tests against a built Quarto version
claude Jul 17, 2026
0929a57
Revise built-version test plan per maintainer decisions
claude Jul 17, 2026
dca3286
Add binary-mode classification results for all 133 smoke test files
claude Jul 17, 2026
26c200e
Rewrite built-version test plan as grounded v2 design
claude Jul 17, 2026
d32aa4d
Fold adversarial review findings into built-version test plan (v3)
claude Jul 17, 2026
302dacf
Relax dev-only quarto-required fixtures and fix drafts-env env mutation
claude Jul 17, 2026
fe74931
Add binary mode (QUARTO_TEST_BIN) to the smoke test harness
claude Jul 17, 2026
fc68b34
Migrate direct quarto() call sites to the runQuarto dispatch helper
claude Jul 17, 2026
ec1c50e
Add built-version smoke testing CI: parameterize test-smokes.yml, add…
claude Jul 17, 2026
49efd63
Apply binary-mode env hygiene to subprocess-spawning tests
claude Jul 17, 2026
7242576
Fix binary-mode issues found by code review
claude Jul 17, 2026
477c30d
Allow partial runs of the built-version smoke workflow via a buckets …
claude Jul 17, 2026
f662c9e
Extract shared build-dist-tarball composite action
claude Jul 17, 2026
ebaa61c
Add nightly mode: test the signed artifacts of a no-publish create-re…
claude Jul 17, 2026
5f51b85
Document nightly mode and shared build action in the plan
claude Jul 17, 2026
db39e30
Add isBinaryMode()/quartoTestBin() predicates for readable mode checks
claude Jul 17, 2026
783ca7f
Doc audit for binary-mode testing (part 1)
claude Jul 17, 2026
0f8db07
Add architecture diagrams for the test harness and CI modes
claude Jul 17, 2026
53b5d52
Simplify built-version workflow: schedule uses nightly artifacts, gh …
claude Jul 17, 2026
c17f4f8
Plan: record that the weekly schedule uses nightly mode
claude Jul 17, 2026
52042a2
Built-version testing goes daily with three-OS coverage
claude Jul 17, 2026
5557cec
Document the macOS-runner policy on the runners input
claude Jul 17, 2026
d095fc6
docs: purge stale weekly-cron wording after workflow_run migration
claude Jul 17, 2026
b67212d
Use gh api for release-tag preflight check
cderv Jul 17, 2026
cb41c6c
docs: add built-version testing architecture doc with design decision…
claude Jul 17, 2026
d35cb96
docs: add practical when-to-trigger guidance for built-version modes
claude Jul 17, 2026
68027c5
ci: harden built-version workflows against review findings
claude Jul 17, 2026
0c7195b
tests: sanitize env for QUARTO_TEST_BIN --version probes
claude Jul 17, 2026
f9906c0
docs: drop the historical plan doc, point to the ADR instead
cderv Jul 17, 2026
45a5045
tests: surface swallowed failures in custom-execute tests
claude Jul 17, 2026
82fda18
tests: make editor-support and logging json-stream tests failable
claude Jul 17, 2026
63890ef
tests: close silent-green paths found by testQuartoCmd call-site audit
claude Jul 17, 2026
14d039a
tests: fix latent bugs the hardening commits surfaced
cderv Jul 17, 2026
51ca96e
tests: stop teardown ENOENT from masking render-failure reports
cderv Jul 17, 2026
d2018f4
tests: clean prepost artifacts in setup so verifyPath proves creation
cderv Jul 17, 2026
d518f52
tests: split runQuarto by mode and add withCwd for chdir safety
cderv Jul 17, 2026
d095740
ci: TEMP push trigger + small bucket for branch shakedown
cderv Jul 17, 2026
b1287c2
ci: remove PR-branch shakedown scaffolding from built-version workflow
cderv Jul 20, 2026
d1c7c23
tests: create the caller log even when a built quarto logs nothing
cderv Jul 20, 2026
c7bcb27
tests: keep a failed process-tree kill from crashing the test process
cderv Jul 20, 2026
4c1faae
tests: tolerate a torn log line so a timeout reports as a timeout
cderv Jul 20, 2026
84f026e
tests: fall back to a direct kill when taskkill cannot be spawned
cderv Jul 20, 2026
39c3434
tests: strip a torn log line at the source instead of loosening the r…
cderv Jul 20, 2026
e729525
ci: run smoke + playwright + ff-matrix legs against the built quarto
claude Jul 20, 2026
4756973
docs: propagate the multi-leg built-version CI change everywhere it i…
claude Jul 20, 2026
d475c52
ci: apply multi-persona review findings to the multi-leg built-versio…
claude Jul 20, 2026
64e9a9f
ci: gate julia-engine subtree tests out of binary mode + follow-up plan
claude Jul 20, 2026
43668f8
Cap dist-tarball artifact retention and skip re-compression
cderv Jul 24, 2026
f49f957
Scope tarball retention cap to the intra-run build path
cderv Jul 24, 2026
e842bf5
ci: use a bash 3.2-compatible loop for the Linux/macOS bucket runner
cderv Sep 10, 2026
307ce18
tests: check taskkill's exit code, not just its throw, before falling…
cderv Sep 10, 2026
c4507d6
docs: stop claiming the scheduled nightly build signs Windows
cderv Sep 10, 2026
f3f5766
tests: run axe smoke tests against the built binary in binary mode
cderv Sep 10, 2026
8f8782e
style: streamline built-version testing guidance and comments
cderv Sep 10, 2026
bcc3b65
docs: route built-version doc reads by edit scope, not whole file
cderv Sep 10, 2026
c418439
ci: extract the Windows artifact with Expand-Archive, not bash tar
cderv Sep 10, 2026
ef2210e
ci: harden dispatch inputs and preflight reporting in built-version CI
cderv Sep 10, 2026
6c785a4
tests: guard harness setup() and clarify RunQuartoResult in dev mode
cderv Sep 10, 2026
912f7f7
tests: restore a dropped comment, rename a shadowing helper, fix a st…
cderv Sep 10, 2026
7b9bf48
tests: drop the unused requiresDevQuarto escape hatch
cderv Sep 10, 2026
c8f6751
ci: close remaining dispatch-input injection gaps in built-version CI
cderv Sep 10, 2026
f27f977
tests: restore the harness cwd even when teardown throws
cderv Sep 10, 2026
fa012b2
Revert "tests: drop the unused requiresDevQuarto escape hatch"
cderv Sep 10, 2026
1c4c9c5
ci: clarify built-version dispatch buckets input description
cderv Sep 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .claude/rules/llm-docs-maintenance.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,5 @@ So a relevant deep-dive actually gets read when a matching task comes up, each `
Granularity rule: the pointer inherits its host rule's `paths:`, so it must live in a rule scoped **no broader than the doc's topic** — otherwise it loads on unrelated work (a reveal.js pointer does not belong in a rule scoped to all of `src/format/**`). If the best existing rule is too generic, create a small dedicated rule scoped to that doc's source instead.

**When adding a new `llm-docs/*.md`:** add its discovery pointer to a matching path-scoped rule, or create a narrowly-scoped rule for it.

**When renaming an `##`/`###` heading:** discovery pointers may quote that heading text to route readers to a specific section (e.g. `built-version-ci.md` → `"Design decisions"`). Grep `.claude/rules/` for the old heading text and update any matching pointer — a stale quote fails loudly (grep/search finds nothing) but still needs fixing.
26 changes: 26 additions & 0 deletions .claude/rules/testing/built-version-ci.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
paths:
- .github/workflows/test-smokes.yml
- .github/workflows/test-smokes-built.yml
- .github/workflows/test-ff-matrix.yml
- .github/workflows/create-release.yml
- .github/actions/build-dist-tarball/**
- .github/actions/merge-extension-tests/**
---

# Built-Version CI Workflows

`llm-docs/built-version-testing-architecture.md` is the deep dive. Read only what the edit needs:

- OS lists, bucket globs, concurrency-group suffixes, `runners:` inputs → "Built-mode test legs" (scheduler layout).
- Adding/reordering a leg, changing `quarto-install` resolution or artifact plumbing → "Flow diagrams" + "Built-mode test legs".
- Removing, inverting, or "simplifying" an existing mechanism → "Design decisions" (D1-D11) first — each records why the obvious alternative was rejected.

Trivial one-line YAML edits: the invariants below plus the doc's "Document map" intro paragraph are enough.

Invariants when editing:

- Playwright and ff-matrix legs in `test-smokes-built.yml` must check both the source mode and `github.event.inputs.buckets == ''`.
- `test-ff-matrix.yml` owns the ff-matrix bucket glob.
- Scheduler jobs in `test-smokes-built.yml` set per-leg OS scope through their `runners:` inputs.
- Keep the per-call suffix in `test-ff-matrix.yml`'s concurrency group so sibling calls cannot cancel one another.
37 changes: 22 additions & 15 deletions .claude/rules/testing/overview.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
---
paths:
- "tests/**"
- tests/**
---

# Test Infrastructure

Quarto's test suite lives in `tests/`. For comprehensive documentation, see `tests/README.md`.
Quarto's test suite lives in `tests/`.
For comprehensive documentation, see `tests/README.md`.

## Running Tests

Expand All @@ -28,18 +29,23 @@ QUARTO_TESTS_NO_CONFIG="true" ./run-tests.sh test.ts # Linux/macOS
$env:QUARTO_TESTS_NO_CONFIG=$true; .\run-tests.ps1 # Windows
```

**Binary mode:** set `QUARTO_TEST_BIN` to an installed Quarto outside the checkout.
With no test arguments, binary mode runs `smoke/`; pass Playwright or feature-format targets explicitly.
See `tests/README.md` and `llm-docs/built-version-testing-architecture.md`.

## Test Types

| Type | Location | File Pattern | Details |
|------|----------|--------------|---------|
| Unit | `tests/unit/` | `*.test.ts` | `.claude/rules/testing/typescript-tests.md` |
| Smoke | `tests/smoke/` | `*.test.ts` | `.claude/rules/testing/typescript-tests.md` |
| Smoke-all | `tests/docs/smoke-all/` | `*.qmd` | `.claude/rules/testing/smoke-all-tests.md` |
| Playwright | `tests/integration/playwright/` | `*.spec.ts` | `.claude/rules/testing/playwright-tests.md` |
| Type | Location | File Pattern | Details |
| ---------- | ------------------------------- | ------------ | ------------------------------------------- |
| Unit | `tests/unit/` | `*.test.ts` | `.claude/rules/testing/typescript-tests.md` |
| Smoke | `tests/smoke/` | `*.test.ts` | `.claude/rules/testing/typescript-tests.md` |
| Smoke-all | `tests/docs/smoke-all/` | `*.qmd` | `.claude/rules/testing/smoke-all-tests.md` |
| Playwright | `tests/integration/playwright/` | `*.spec.ts` | `.claude/rules/testing/playwright-tests.md` |

## Dependencies

Tests require R, Python, and Julia. Run configuration script to set up:
Tests require R, Python, and Julia.
Run configuration script to set up:

```bash
# Linux/macOS
Expand All @@ -56,12 +62,13 @@ Managed via:

## Core Files

| File | Purpose |
|------|---------|
| `test.ts` | Test infrastructure (`testQuartoCmd`, `unitTest`) |
| `verify.ts` | Verification functions |
| `utils.ts` | Path utilities (`docs()`, `outputForInput()`) |
| `README.md` | Comprehensive documentation |
| File | Purpose |
| --------------- | ----------------------------------------------------------------------------------------- |
| `test.ts` | Test infrastructure (`testQuartoCmd`, `unitTest`) |
| `quarto-cmd.ts` | Quarto invocation dispatch (`runQuarto`; in-process dev vs `QUARTO_TEST_BIN` binary mode) |
| `verify.ts` | Verification functions |
| `utils.ts` | Path utilities (`docs()`, `outputForInput()`) |
| `README.md` | Comprehensive documentation |

## Debugging

Expand Down
20 changes: 14 additions & 6 deletions .claude/rules/testing/playwright-tests.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
---
paths:
- "tests/integration/playwright/**/*.spec.ts"
- "tests/integration/playwright/**/*.ts"
- tests/integration/playwright/**/*.spec.ts
- tests/integration/playwright/**/*.ts
---

# Playwright Tests

Browser-based tests for interactive features. Tests live in `tests/integration/playwright/tests/`.
Browser-based tests for interactive features.
Tests live in `tests/integration/playwright/tests/`.

## Local Development Workflow

Expand Down Expand Up @@ -44,6 +45,10 @@ The wrapper (`playwright-tests.test.ts`):
3. Runs `npx playwright test`
4. Cleans up rendered output

The suite runs in dev and binary-mode CI.
Render spawns must use `quartoSpawnEnvOptions()` so a built Quarto cannot inherit dev-tree paths.
Browser assertions are ignored on Windows CI, so built-version CI has no Windows Playwright leg.

## Test Structure

Tests use `@playwright/test` framework:
Expand All @@ -63,7 +68,8 @@ test("Feature description", async ({ page }) => {

### Parameterized Tests

When testing the same behavior across multiple formats or configurations, use `test.describe` with a test cases array instead of separate spec files. See `html-math-katex.spec.ts` and `axe-accessibility.spec.ts` for examples.
When testing the same behavior across multiple formats or configurations, use `test.describe` with a test cases array instead of separate spec files.
See `html-math-katex.spec.ts` and `axe-accessibility.spec.ts` for examples.

```typescript
const testCases = [
Expand All @@ -81,11 +87,13 @@ test.describe('Feature across formats', () => {
});
```

**When to use:** Same assertion logic applied to multiple formats, output modes, or configurations. Reduces file count and centralizes shared helpers.
**When to use:** Same assertion logic applied to multiple formats, output modes, or configurations.
Reduces file count and centralizes shared helpers.

### Expected Failures

Use `test.fail()` to document known failures. Playwright inverts the result: the test passes if it fails, and flags if it unexpectedly passes (signaling the fix landed).
Use `test.fail()` to document known failures.
Playwright inverts the result: the test passes if it fails, and flags if it unexpectedly passes (signaling the fix landed).

```typescript
test('Feature that is known broken', async ({ page }) => {
Expand Down
22 changes: 18 additions & 4 deletions .claude/rules/testing/test-anti-patterns.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,25 @@
---
paths:
- "tests/**/*.ts"
- "tests/**/*.test.ts"
- tests/**/*.ts
- tests/**/*.test.ts
---

# Test Anti-Patterns

## Don't: Rely on `execute()` Throwing to Fail a Test

The harness converts errors from `TestDescriptor.execute` into log records.
Put assertions in `verify`, and include a log-reading verifier such as `noErrors` when using `runQuarto(..., { throwOnFailure: false })`.

## Don't: Import `src/quarto.ts` in Tests

Importing `src/quarto.ts` bypasses binary mode.
Use `testQuartoCmd()`/`runQuarto()` and resolve direct subprocess spawns with `quartoDevCmd()`.

## Don't: Modify Environment Variables

`Deno.env.set()` modifies process-global state. Deno runs test files in parallel by default, so other tests can see modified values.
`Deno.env.set()` modifies process-global state.
Deno runs test files in parallel by default, so other tests can see modified values.

**Details:** `llm-docs/testing-patterns.md` → "Environment Variable Testing Pitfalls"

Expand All @@ -20,6 +31,9 @@ Never create `Project.toml`, `.venv/`, or `renv.lock` in test fixture directorie

## Don't: `Deno.chdir()` inside the test body

`Deno.chdir()` mutates process-global cwd, so a test that changes it can leak into other tests in the same process. The harness already changes and restores the working directory: return the directory from `TestContext.cwd`, create fixtures in `setup`, clean up in `teardown` (examples: `tests/unit/dotenv-config.test.ts`, `tests/smoke/use/template.test.ts`). For a temp directory you don't need to run *from*, use `withTempDir` (`tests/utils.ts`). A test that only needs a *relative* input can pass a path relative to the current cwd without changing it.
`Deno.chdir()` mutates process-global cwd, so a test that changes it can leak into other tests in the same process.
The harness already changes and restores the working directory: return the directory from `TestContext.cwd`, create fixtures in `setup`, clean up in `teardown` (examples: `tests/unit/dotenv-config.test.ts`, `tests/smoke/use/template.test.ts`).
For a temp directory you don't need to run *from*, use `withTempDir` (`tests/utils.ts`).
A test that only needs a *relative* input can pass a path relative to the current cwd without changing it.

**Details:** `llm-docs/testing-patterns.md` → "Working-Directory-Sensitive Tests"
47 changes: 28 additions & 19 deletions .claude/rules/testing/typescript-tests.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
---
paths:
- "tests/smoke/**/*.test.ts"
- "tests/unit/**/*.test.ts"
- tests/smoke/**/*.test.ts
- tests/unit/**/*.test.ts
---

# TypeScript Tests

TypeScript-based tests using Deno. Smoke tests render documents; unit tests verify isolated functionality.
TypeScript-based tests using Deno.
Smoke tests render documents; unit tests verify isolated functionality.

## Running Tests

Expand All @@ -22,17 +23,22 @@ TypeScript-based tests using Deno. Smoke tests render documents; unit tests veri

## Core Infrastructure

Core test files (`test.ts`, `verify.ts`, `utils.ts`) are described in `.claude/rules/testing/overview.md` § Core Files.
Core test files (`test.ts`, `quarto-cmd.ts`, `verify.ts`, `utils.ts`) are described in `.claude/rules/testing/overview.md` § Core Files.

### Binary mode compatibility

Smoke tests must work with either the dev sources or `QUARTO_TEST_BIN`:

- Never `import { quarto } from "../../src/quarto.ts"` in tests — invoke quarto via `testQuartoCmd()`/`runQuarto()`.
- For subprocesses, use `quartoDevCmd()` or `quartoDevBinCmd()` and pass `quartoSpawnEnvOptions()`.
- `TestContext.requiresDevQuarto: true` ignores a test in binary mode — rare escape hatch for tests exercising quarto internals in-process.

### Search for an existing verifier before writing one

`verify.ts` already covers many output shapes — including parsed-content
verifiers, not just raw-text regex (e.g. `ensureIpynbCellMatches` JSON-parses a
notebook and matches against joined cell source; `ensureHtmlElements` /
`ensureHtmlSelectorSatisfies` parse the DOM). Before adding a new `Verify`,
grep `verify.ts` for the format or assertion you need. Reuse or extend the
existing helper rather than hand-rolling a near-duplicate. Same applies to
mock-context and fixture helpers in `tests/unit/**` and `tests/utils.ts`.
`verify.ts` already covers many output shapes — including parsed-content verifiers, not just raw-text regex (e.g. `ensureIpynbCellMatches` JSON-parses a notebook and matches against joined cell source; `ensureHtmlElements` / `ensureHtmlSelectorSatisfies` parse the DOM).
Before adding a new `Verify`, grep `verify.ts` for the format or assertion you need.
Reuse or extend the existing helper rather than hand-rolling a near-duplicate.
Same applies to mock-context and fixture helpers in `tests/unit/**` and `tests/utils.ts`.

## Smoke Tests (`tests/smoke/`)

Expand Down Expand Up @@ -112,11 +118,14 @@ const markdownWithContent = asMappedString("# Title\nSome content");

**Mock Contexts:**

Several subsystems use context interfaces passed to functions. For unit tests, create `createMock*()` helpers with no-op stubs. Key pattern: async callbacks (like `withSpinner`) should just `await op()` so errors propagate normally. Check existing test files for helpers before writing new ones.

| Context | Interface | Existing helpers |
|---------|-----------|-----------------|
| `ProjectContext` | `src/project/types.ts` | `tests/unit/project/utils.ts` → `createMockProjectContext()` |
| `InstallContext` | `src/tools/types.ts` | `tests/unit/tools/chrome-headless-shell.test.ts` → `createMockContext()` |
| `Format` | `src/config/types.ts` | `tests/unit/format-utils.ts` → `createMockFormat()` (wraps the real `createFormat()` from `src/format/formats-shared.ts` — no hand-rolled cast) |
| `TempContext` | `src/core/temp-types.ts` | No mock needed — use the real `createTempContext()` from `src/core/temp.ts` directly (see `tests/unit/sass-cache.test.ts`, `tests/unit/ral/safe-remove-dir.test.ts`) |
Several subsystems use context interfaces passed to functions.
For unit tests, create `createMock*()` helpers with no-op stubs.
Key pattern: async callbacks (like `withSpinner`) should just `await op()` so errors propagate normally.
Check existing test files for helpers before writing new ones.

| Context | Interface | Existing helpers |
| ---------------- | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ProjectContext` | `src/project/types.ts` | `tests/unit/project/utils.ts` → `createMockProjectContext()` |
| `InstallContext` | `src/tools/types.ts` | `tests/unit/tools/chrome-headless-shell.test.ts` → `createMockContext()` |
| `Format` | `src/config/types.ts` | `tests/unit/format-utils.ts` → `createMockFormat()` (wraps the real `createFormat()` from `src/format/formats-shared.ts` — no hand-rolled cast) |
| `TempContext` | `src/core/temp-types.ts` | No mock needed — use the real `createTempContext()` from `src/core/temp.ts` directly (see `tests/unit/sass-cache.test.ts`, `tests/unit/ral/safe-remove-dir.test.ts`) |
60 changes: 60 additions & 0 deletions .github/actions/build-dist-tarball/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name: "Build Quarto dist tarball"
description: |
Builds a Quarto distribution tarball from the current checkout:
configure.sh, quarto-bld prepare-dist --set-version, then a tar.gz of
package/pkg-working (top-level directory quarto-<version>) uploaded as a
workflow artifact. Shared by create-release.yml (make-tarball /
make-arm64-tarball) and test-smokes-built.yml.
inputs:
version:
description: "Version to stamp into the distribution (--set-version)"
required: true
arch:
description: "Target architecture: amd64 or arm64"
required: false
default: "amd64"
tarball-name:
description: "File name of the produced .tar.gz"
required: true
artifact-name:
description: "Workflow artifact name to upload the tarball as"
required: true
retention-days:
description: "Artifact retention in days (empty = repo default; upload-artifact ignores an empty value)"
required: false
default: ""
runs:
using: "composite"
steps:
- name: Configure
shell: bash
run: ./configure.sh

- name: Prepare Distribution
shell: bash
run: |
pushd package/src/
if [ "${{ inputs.arch }}" = "arm64" ]; then
./quarto-bld prepare-dist --set-version ${{ inputs.version }} --arch aarch64 --log-level info
else
./quarto-bld prepare-dist --set-version ${{ inputs.version }} --log-level info
fi
popd

- name: Make Tarball
shell: bash
run: |
pushd package/
mv pkg-working quarto-${{ inputs.version }}
tar --owner=root --group=root -czf "${{ inputs.tarball-name }}" quarto-${{ inputs.version }}
mv quarto-${{ inputs.version }} pkg-working
popd

- name: Upload Artifact
uses: actions/upload-artifact@v7
with:
name: ${{ inputs.artifact-name }}
path: ./package/${{ inputs.tarball-name }}
retention-days: ${{ inputs.retention-days }}
# the tarball is already gzipped - re-compressing wastes CPU
compression-level: 0
6 changes: 6 additions & 0 deletions .github/actions/merge-extension-tests/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@ runs:
- name: Merge julia-engine tests
shell: bash
run: |
# The upstream tests do not sanitize the environment passed to quarto.
# Skip them until PumasAI/quarto-julia-engine strips the dev-tree vars.
if [[ -n "$QUARTO_TEST_BIN" ]]; then
echo "::notice title=julia-engine tests skipped in binary mode::subtree tests do not sanitize their quarto spawn env yet (see llm-docs/built-version-testing-architecture.md)"
exit 0
fi
SUBTREE=src/resources/extension-subtrees/julia-engine/tests
cp -r "$SUBTREE/docs/julia-engine" tests/docs/julia-engine
cp -r "$SUBTREE/smoke/julia-engine" tests/smoke/julia-engine
Loading
Loading