{
  "skill_name": "swift-testing",
  "evals": [
    {
      "id": 1,
      "prompt": "I'm moving our CartServiceTests from XCTest to Swift Testing. My plan: keep `final class CartServiceTests: XCTestCase` but add @Test to the methods, share one CartService through a static singleton so setUp goes away, put @available(iOS 18, *) on the class, turn every assertion including XCTUnwrap into #expect, and move the checkout UI tests into the same Swift Testing file. Review it.",
      "expected_output": "A migration review that corrects each part of the plan and explains how the two frameworks coexist.",
      "files": [],
      "assertions": [
        "Rejects keeping XCTestCase as the parent of Swift Testing tests and proposes a struct, class or actor suite or free functions.",
        "Recommends a fresh fixture per test through the suite init() instead of a shared singleton.",
        "Moves @available onto the individual @Test functions, not the suite type.",
        "Converts XCTUnwrap to try #require and XCTFail to Issue.record rather than turning everything into #expect.",
        "Keeps the checkout UI tests on XCTest with XCUITest.",
        "States that XCTest and Swift Testing can coexist during the migration."
      ]
    },
    {
      "id": 2,
      "prompt": "We build with Xcode 26.4 and Swift 6.3 for an iOS 26 app. Review these tests: `#expect(exitsWith: .failure) { Vault.unlock(code: badCode) }` where badCode is a local, `func skipsOffline() { Test.cancel(\"offline\") }`, `Issue.record(\"slow parse\")` that should only warn, and `Attachment(chartImage, named: \"chart\").record()`.",
      "expected_output": "Each API corrected to its current spelling, with the toolchain gate and platform limits named for every change.",
      "files": [],
      "assertions": [
        "Replaces exitsWith: with await #expect(processExitsWith: .failure).",
        "States that exit tests need Swift 6.2 and Xcode 26.0 and do not run on iOS, tvOS or watchOS, and suggests testing the non-exiting logic in the app target.",
        "Adds an explicit, typed capture list for badCode, notes it was verified with the Swift 6.3.1 compiler, and requires Sendable plus Codable values.",
        "Makes the cancelling test async throws (or throws) and calls try Test.cancel.",
        "Uses Issue.record with severity: .warning and names the Swift 6.3 and Xcode 26.4 gate.",
        "Uses Attachment.record(chartImage, named:, as: .png) and names the Swift 6.3 and Xcode 26.4 gate."
      ]
    },
    {
      "id": 3,
      "prompt": "Plan the tests for our checkout feature: a price calculator with discounts, a coupon service that posts async events, the login-to-checkout flow, a launch-time benchmark, and screenshots in dark mode and at large text sizes.",
      "expected_output": "A test plan that assigns each area to the right framework or tool.",
      "files": [],
      "assertions": [
        "Uses Swift Testing (@Test, #expect, parameterized arguments) for the price calculator.",
        "Uses confirmation for the async coupon events and rules out sleeps.",
        "Uses XCUITest for the login-to-checkout flow.",
        "Keeps the benchmark on XCTest performance APIs and the dark-mode and Dynamic Type screenshots on snapshot tooling.",
        "Says both frameworks may share a target during migration but recommends clear file or target separation."
      ]
    }
  ]
}
