Skip to content

Tests, cleanup and release dry-run fix from the audit for 3.0.0-beta.2 - #69

Merged
nmcc24 merged 16 commits into
masterfrom
beta2-cleanup
Nov 13, 2026
Merged

nmcc24 merged 16 commits into
masterfrom
beta2-cleanup

Conversation

@nmcc24

@nmcc24 nmcc24 commented Nov 13, 2026 •

Copy link
Copy Markdown
Owner

The test, cleanup and CI work from the pre-release audit (Tier 5), plus a release dry-run fix: the third of four PRs for 3.0.0-beta.2, after #67 and #68.

Changelog

  • ddb88f3 Fail the snapshot tests when no fixture is found (they expect at least 30), so a moved fixture directory can't pass silently.
  • 64da21b Use the standard library's string APIs (split, ranges(of:), a shared lines helper) in the generator tests.
  • c0fffb5 scripts/swift6-matrix.sh: remove a fixture's old mock first and count a generator failure as a failed fixture.
  • a166e1a Make three runtime tests check what they set up: typed throws expects the throw, the inout test checks the received value and verifies the call, and the captor Sendable test captures from Task.detached.
  • 351ae55 Test the protocolsOnly and enableInheritance options.
  • ad7a9c9 Remove Source/Cuckoo.h, the Info.plists, their Package.swift excludes, and the .gitignore entries for Pods, fastlane and the generator app.
  • 4ed6275 Remove dead generator code: WrappableType, Deinitializer, the unused ComplexType cases and attributes, and the DEBUG test string.
  • e0e16c4 Keep a mock's unstubbed-call fallback (none, superclass, default implementation) in one enum, which also lets enableSuperclassSpy() be called again.
  • a2ce475 Run FailTest's scenarios from one list, as parameterized tests (still 13 intentional known issues).
  • a521e0c Share the source-list code between CuckooPlugin and the test-only single-file plugin.
  • 3e356ff Release workflow: a dry run of a version that's already tagged notes it and goes on, since a dry run never tags; a real release still refuses. Dry runs now work between releases.
  • 367ecf3 Give the test workflow read-only repository access (permissions: contents: read).
  • 553d567 Spell TOMLDecoder's URL in Package.resolved as Package.swift does; swift package resolve leaves the file unchanged.
  • 10450db Show defaultIsolation in the generator's --verbose output.
  • 4c3a1d6 Update the roadmap's status line and Phase 6.
  • 2cc09ab Add these changes to the changelog under Unreleased.

Testing

  • macOS swift test, the CuckooTests scheme on the iOS simulator, and arm64 tvOS and watchOS build-for-testing: pass, no warnings.
  • Linux Docker, Swift 6.2 and 6.3 (native) and 6.4 (swiftbuild): swift test with upcoming features off and on, and the Swift 6 fixture matrix (off, all on, Xcode 26 defaults): pass, no warnings. 13 intentional Swift Testing known issues.

nmcc24 and others added 16 commits November 13, 2026 07:08
The fixture list is read at run time, and an unreadable directory gave an empty list, so the parameterized test ran no case and passed. A separate test now expects at least the 30 fixtures there are.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The tests split lines with components(separatedBy:), named files through NSString and trimmed with CharacterSet, against the rule to use the modern Swift APIs. They now use split, a shared lines helper, ranges(of:) and the generator's own trimmed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
swift6-matrix.sh ignored the generator's exit status and then compiled whatever mock the previous run had left, so a generator error could pass as ok. It now deletes the old mock first and reports a failed generation as FAIL with its first error.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
typedThrowsThenTypedError stubbed a throw and never called the member, testInout printed the argument, and the captor's Sendable test checked that a value is its own type. They now expect the thrown error, the argument the then closure received and the call, and a capture made from a detached task.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Both were tested only as parsed values. The new tests check that protocolsOnly leaves classes out and that turning inheritance off stops a derived protocol's mock repeating its parent's members. glob = false is covered by the unmatched-sources test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cuckoo.h and the two Info.plists were left from the Xcode framework targets, which SwiftPM excluded or ignored, and .gitignore still listed Pods, .fastlane and Generator/*.app from CocoaPods, fastlane and the old generator app.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
WrappableType and Deinitializer were never used, ComplexType's array and dictionary cases were never built (the parser keeps those types as plain names), the @objc attributes were never parsed, and the crawler kept a DEBUG-only test string with commented-out code to parse it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two exclusive flags held whether the superclass spy or the default implementation answers calls with no stub, with a TODO to merge them. One Fallback value now does, so they can't both be set. Enabling the superclass spy again is now allowed, as enabling the default implementation again already is.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The eight failure scenarios were written out twice, once for the failure handler and once for the Swift Testing issue. They're now one list of parameterized arguments, which both tests run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CuckooSingleFileTestPlugin had its own copy of ListedSource and the --source/--sources-list code. The code moves to Generator/Plugin/SourcesArguments.swift, which the test plugin links with a symlink, since a plugin can't depend on a library target.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The version check refused an existing tag even in a dry run, so between releases, when master's version files still hold the last released version, a dry run couldn't run at all. A dry run never tags, so it now notes the tag and goes on; a real release still refuses it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
test.yml set no top-level permissions, so its jobs got the repository's default token scope. They only read the repository; the CI passed job keeps its own actions: read.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Package.resolved had the URL with .git, unlike the manifest. swift package resolve keeps the new spelling and the originHash, which comes from the manifest, is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The verbose description of a module's options listed every option but defaultIsolation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The header still said draft, from 2026-10-22. It now gives the phases' state, and Phase 6 records the alpha.1 and beta.1 releases and the beta.2 plan.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@nmcc24
nmcc24 merged commit 3027a26 into master Nov 13, 2026
16 checks passed
@nmcc24
nmcc24 deleted the beta2-cleanup branch November 13, 2026 08:13
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.

1 participant