Skip to content

Add Core/QA grouped-tests CI structure#40

Merged
ChrisRackauckas merged 2 commits into
SciML:mainfrom
ChrisRackauckas-Claude:grouped-tests-ci
Jun 8, 2026
Merged

Add Core/QA grouped-tests CI structure#40
ChrisRackauckas merged 2 commits into
SciML:mainfrom
ChrisRackauckas-Claude:grouped-tests-ci

Conversation

@ChrisRackauckas-Claude

Copy link
Copy Markdown
Contributor

Summary

Converts ConcreteStructs.jl to the canonical SciML Core/QA grouped-tests structure. This repo had no QA group; this adds one from scratch and moves the existing CI test matrix into a test/test_groups.toml-driven thin caller.

What changed

  1. GROUP dispatch in test/runtests.jl. The existing test suite is moved verbatim into test/core.jl (byte-identical to the old runtests.jl) and runs under GROUP=Core and the default GROUP=All. runtests.jl is now a small dispatcher.
  2. New QA group. test/qa/Project.toml ([deps] Aqua + JET, [sources] ConcreteStructs = {path = "../.."}) and test/qa/qa.jl running Aqua.test_all(ConcreteStructs) + JET.test_package(ConcreteStructs; target_defined_modules = true), dispatched under GROUP=QA. The dispatcher activates/instantiates test/qa and Pkg.develops the repo path so the QA group tests the PR branch on Julia 1.10 too ([sources] is ignored pre-1.11).
  3. Root test/test_groups.toml encoding the matrix: [Core] on ["lts", "1", "pre"], [QA] on ["lts", "1"].
  4. .github/workflows/ci.yml — the hand-maintained version matrix test job is replaced by a thin caller of SciML/.github/.github/workflows/grouped-tests.yml@v1. Standard concurrency block + paths-ignore: ['docs/**'] added; existing main branch + tag triggers preserved.
    • The docs job is kept (there is no standalone Documentation workflow in this repo).
    • The redundant runic / spellcheck / downgrade jobs inside ci.yml were dropped because standalone FormatCheck.yml, SpellCheck.yml, and Downgrade.yml already provide those checks — no coverage is lost, the duplicate runs are removed. No other workflow files were touched.

Local QA run (julia 1.11) — reported honestly

Core group: PASS — 39 tests (Unit 23, End-to-end 11, Issue #3 1, Commutation 4), all green via the new dispatcher.

QA group: surfaces 3 genuine pre-existing findings (not silenced, not worked around). These are package issues, not artifacts of this PR — reporting for triage rather than fixing here:

Aqua.test_all — 9 passed, 2 failed:

  • Compare Project.toml and test/Project.toml (project_extras): the root Project.toml declares julia = "1.1", so Aqua requires root/test project consistency; test/Project.toml carries LinearAlgebra + Suppressor test deps absent from the root [extras].
  • Compat bounds → extras: root Project.toml lists Test in [extras] but declares no [compat] entry for Test.

These stem from the repo carrying both a [extras]/[targets] block in the root Project.toml and a separate test/Project.toml.

JET.test_package — 1 possible error:

`ConcreteStructs.nerror` is not defined: ConcreteStructs.nerror
  _find_struct_def(expr; tl_expr) @ src/ConcreteStructs.jl:254

src/ConcreteStructs.jl:254 returns nerror("Invalid usage of @concrete.")nerror is undefined and is almost certainly a typo for error(...). It only fires on the invalid-input error path, so the existing tests never hit it. This is a real (latent) source bug; left for @ChrisRackauckas to decide on the fix.

Ignore until reviewed by @ChrisRackauckas.

🤖 Generated with Claude Code

ChrisRackauckas and others added 2 commits June 8, 2026 07:09
Convert the test suite to the canonical SciML grouped-tests layout:

- runtests.jl becomes a GROUP dispatcher. The existing tests are moved
  verbatim into test/core.jl and run under GROUP=Core (and the default
  GROUP=All).
- New QA group: test/qa/Project.toml ([deps] Aqua + JET, [sources]
  ConcreteStructs path="../..") and test/qa/qa.jl running
  Aqua.test_all + JET.test_package(target_defined_modules=true),
  dispatched under GROUP=QA.
- Root test/test_groups.toml encodes the matrix: Core on [lts, 1, pre],
  QA on [lts, 1].
- .github/workflows/ci.yml: the matrix test job is replaced by a thin
  caller of SciML/.github grouped-tests.yml@v1. The docs job is kept
  (no standalone Documentation workflow exists). The redundant
  runic/spellcheck/downgrade jobs are dropped because standalone
  FormatCheck.yml, SpellCheck.yml, and Downgrade.yml already provide them.

Core group verified locally (julia 1.11): 39 tests pass. The QA group
surfaces pre-existing package findings (Aqua project/compat metadata and
a JET-detected `nerror` typo in src); these are reported for triage, not
silenced.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Aqua.test_all surfaced two legitimate metadata findings on the root
Project.toml:

- deps_compat (extras): `Test` was listed in [extras] without a [compat]
  entry. Add `Test = "1"`.
- project_extras: the root declared `julia = "1.1"`, which makes Aqua enforce
  root/test project consistency for packages supporting Julia <= 1.1, so it
  flagged `LinearAlgebra` + `Suppressor` (test-only deps in test/Project.toml)
  as missing from the root [extras]. Bump the root [compat] julia floor to
  "1.10" (the LTS / SciML org minimum), which both conforms to convention and
  lifts the <= 1.1 consistency check. The test-only deps are intentionally NOT
  added to the root [extras].

Verified locally on Julia 1.11 (test/qa env): Aqua.test_all(ConcreteStructs)
now reports 11/11 passing (was 9/2). JET still fails on this branch due to the
latent `nerror` typo; that is fixed separately in the fix-nerror-typo PR.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@ChrisRackauckas ChrisRackauckas marked this pull request as ready for review June 8, 2026 11:51
@ChrisRackauckas ChrisRackauckas merged commit 0170373 into SciML:main Jun 8, 2026
6 of 7 checks passed
ChrisRackauckas added a commit that referenced this pull request Jun 16, 2026
The QA group's JET linting (added in #40) reports four "local variable
may be undefined" errors that fail CI on main:

- `_parse_head(head::Expr)`: the `if/elseif` over `head.head` had no
  fallthrough, so `struct_name`, `type_params`, and `super` were
  undefined for any other head. Add an `else` that errors, matching the
  existing invalid-usage handling elsewhere in the file. This makes the
  function total and removes three of the JET findings.
- `_parse_line(line::Expr)`: `val` was bound only inside `if assignment`
  but its binding is visible at the later `if assignment` read site, so
  JET cannot prove it defined. Initialize `val = nothing` alongside the
  existing `annotation = nothing`; behavior is unchanged since `val` is
  only read when `assignment` is true.

Verified locally on Julia 1.12 (CI's `julia 1`): the QA group now passes
(Aqua 11/11, JET 1/1, zero findings). Core group still passes 40/40 on
Julia 1.10, including the invalid-usage assertion.

Co-authored-by: ChrisRackauckas-Claude <accounts@chrisrackauckas.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants