[
  {
    "path": ".github/workflows/doc.yml",
    "content": "name: update-documentation\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n  update_docs:\n    name: Update Documentation\n    runs-on: macos-latest\n    env:\n      MOCKABLE_DOC: true\n    steps:\n    - name: Checkout main branch\n      uses: actions/checkout@v4\n      with:\n        fetch-depth: 0\n\n    - name: Checkout documentation branch\n      run: |\n        git checkout -b documentation\n\n    - name: Update documentation\n      run: |\n        Scripts/doc.sh\n        git config user.name github-actions\n        git config user.email github-actions@github.com\n        git add docs\n        git commit -m 'chore: update documentation'\n        git push origin documentation --force"
  },
  {
    "path": ".github/workflows/pr.yml",
    "content": "name: pull-request-validation\n\non:\n  pull_request:\n    branches:\n      - \"*\"\n\njobs:\n  commit-lint:\n    name: Lint Commit Messages\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n\n      - name: Install Node.js and NPM\n        uses: actions/setup-node@v4\n        with:\n          node-version: \"14\"\n\n      - name: Install commitlint\n        run: npm install -g @commitlint/cli@11.0.0 @commitlint/config-conventional@11.0.0\n\n      - name: Run commitlint\n        run: commitlint -x @commitlint/config-conventional --from=${{ github.event.pull_request.base.sha }} --to=${{ github.event.pull_request.head.sha }}\n\n  swift-lint:\n    name: SwiftLint\n    runs-on: macos-latest\n\n    steps:\n    - name: Checkout code\n      uses: actions/checkout@v4\n\n    - name: Install SwiftLint\n      run: brew install swiftlint\n\n    - name: Run SwiftLint\n      run: swiftlint lint --strict Sources Tests/MockableTests\n  \n  linux-tests:\n    name: Build and Test on Linux\n    uses: swiftlang/github-workflows/.github/workflows/swift_package_test.yml@main\n    with:\n      enable_windows_checks: false\n      linux_env_vars: |\n        MOCKABLE_LINT=false\n        MOCKABLE_TEST=true\n\n  macOS-tests:\n    name: Build and Test on macos-latest\n    runs-on: macos-latest\n    env:\n      MOCKABLE_LINT: false\n      MOCKABLE_TEST: true\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v4\n      - name: Swift Version\n        run: |\n          swift -version\n      - name: Run Tests\n        run: |\n          swift build && swift test"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n/.build\n/Packages\nPackage.resolved\nxcuserdata/\nDerivedData/\n.swiftpm\n.netrc\n.env\n.build"
  },
  {
    "path": ".swiftlint.yml",
    "content": "disabled_rules:\n  - dynamic_inline\n  - private_unit_test\n  - type_body_length\n  - valid_ibinspectable\n  - function_default_parameter_at_end\n  - nesting\n  - switch_case_alignment\n  - void_function_in_ternary\n  - type_name\n\nopt_in_rules:\n  - closure_spacing\n  - convenience_type\n  - discouraged_object_literal\n  - empty_string\n  - fallthrough\n  - fatal_error_message\n  - first_where\n  - multiline_arguments\n  - multiline_parameters\n  - overridden_super_call\n  - override_in_extension\n  - required_enum_case\n  - vertical_parameter_alignment_on_call\n  - yoda_condition\n  - array_init\n  - explicit_init\n  - function_default_parameter_at_end\n  - redundant_nil_coalescing\n  - closure_body_length\n  - collection_alignment\n  - conditional_returns_on_newline\n  - contains_over_filter_count\n  - contains_over_filter_is_empty\n  - contains_over_first_not_nil\n  - contains_over_range_nil_comparison\n  - empty_collection_literal\n  - enum_case_associated_values_count\n  - file_name_no_space\n  - flatmap_over_map_reduce\n  - identical_operands\n  - joined_default_parameter\n  - last_where\n  - literal_expression_end_indentation\n  - no_extension_access_modifier\n  - nslocalizedstring_key\n  - operator_usage_whitespace\n  - private_action\n  - private_outlet\n  - prohibited_super_call\n  - reduce_into\n  - redundant_type_annotation\n  - sorted_first_last\n  - static_operator\n  - toggle_bool\n  - unavailable_function\n  - unneeded_parentheses_in_closure_argument\n  - vertical_whitespace_closing_braces\n  - closure_end_indentation\n  - lower_acl_than_parent\n  - force_unwrapping\n  - weak_delegate\nanalyzer_rules:\n  - unused_declaration\n  - unused_import\n\n\nclosing_brace:\n  severity: error\nclosure_body_length:\n  warning: 30\n  error: 40\nclosure_end_indentation:\n  severity: error\ncolon:\n  severity: error\n  flexible_right_spacing: false\n  apply_to_dictionaries: true\ncomma:\n  severity: error\nconditional_returns_on_newline:\n  severity: error\n  if_only: true\ncontrol_statement:\n  severity: error\ncyclomatic_complexity:\n  warning: 8\n  error: 9\n  ignores_case_statements: true\nempty_parameters:\n  severity: error\nexplicit_init:\n  severity: error\nfile_length:\n  ignore_comment_only_lines: true\n  warning: 400\n  error: 500\nforce_cast:\n  severity: error\nforce_try:\n  severity: error\nforce_unwrapping:\n  severity: error\nfunction_parameter_count:\n  warning: 5\n  error: 6\nimplicit_getter:\n  severity: error\nlarge_tuple:\n  warning: 3\n  error: 5\nleading_whitespace:\n  severity: error\nlegacy_cggeometry_functions:\n  severity: error\nlegacy_constant:\n  severity: error\nlegacy_constructor:\n  severity: error\nlegacy_nsgeometry_functions:\n  severity: error\nline_length:\n  ignores_comments: true\n  warning: 120\n  error: 120\nmark:\n  severity: error\nopening_brace:\n  severity: error\noperator_usage_whitespace:\n  severity: error\noperator_whitespace:\n  severity: error\noverridden_super_call:\n  severity: error\nredundant_nil_coalescing:\n  severity: error\nredundant_optional_initialization:\n  severity: error\nredundant_string_enum_value:\n  severity: error\nredundant_void_return:\n  severity: error\nreturn_arrow_whitespace:\n  severity: error\nsyntactic_sugar:\n  severity: error\ntodo:\n  severity: warning\ntrailing_comma:\n  severity: error\ntrailing_newline:\n  severity: error\ntrailing_semicolon:\n  severity: error\ntrailing_whitespace:\n  severity: warning\nunused_closure_parameter:\n  severity: error\nidentifier_name:\n  excluded:\n    - to\n    - id\n  allowed_symbols:\n    - _\nvertical_parameter_alignment:\n  severity: error\nvertical_whitespace:\n  severity: error\nvoid_return:\n  severity: error\nweak_delegate:\n  severity: error\nlower_acl_than_parent:\n  severity: error\nfirst_where:\n  severity: error\nprivate_action:\n  severity: error\nprivate_outlet:\n  severity: error\nclosure_spacing:\n  severity: error\narray_init:\n  severity: error\nstatement_position:\n  severity: error\nunused_enumerated:\n  severity: error\nvertical_parameter_alignment_on_call:\n  severity: error\nempty_string:\n  severity: error\nunneeded_break_in_switch:\n  severity: error\nfatal_error_message:\n  severity: error\nempty_parentheses_with_trailing_closure:\n  severity: error\ncontains_over_first_not_nil:\n  severity: error\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2023 Kolos Foltanyi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "Package.swift",
    "content": "// swift-tools-version: 5.9\n\nimport PackageDescription\nimport CompilerPluginSupport\n\nlet test = Context.environment[\"MOCKABLE_TEST\"].flatMap(Bool.init) ?? false\nlet lint = Context.environment[\"MOCKABLE_LINT\"].flatMap(Bool.init) ?? false\nlet doc = Context.environment[\"MOCKABLE_DOC\"].flatMap(Bool.init) ?? false\n\nfunc when<T>(_ condition: Bool, _ list: [T]) -> [T] { condition ? list : [] }\n\nlet devDependencies: [Package.Dependency] = when(test, [\n    .package(url: \"https://github.com/pointfreeco/swift-macro-testing\", exact: \"0.6.4\")\n]) + when(lint, [\n    .package(url: \"https://github.com/realm/SwiftLint\", exact: \"0.57.1\"),\n]) + when(doc, [\n    .package(url: \"https://github.com/apple/swift-docc-plugin\", from: \"1.3.0\")\n])\n\nlet devPlugins: [Target.PluginUsage] = when(lint, [\n    .plugin(name: \"SwiftLintBuildToolPlugin\", package: \"SwiftLint\")\n])\n\nlet devTargets: [Target] = when(test, [\n    .testTarget(\n        name: \"MockableTests\",\n        dependencies: [\"Mockable\"],\n        swiftSettings: [\n            .define(\"MOCKING\"),\n            .enableExperimentalFeature(\"StrictConcurrency\"),\n            .enableUpcomingFeature(\"ExistentialAny\")\n        ],\n        plugins: devPlugins\n    ),\n    .testTarget(\n        name: \"MockableMacroTests\",\n        dependencies: [\n            \"MockableMacro\",\n            .product(name: \"SwiftSyntaxMacrosTestSupport\", package: \"swift-syntax\"),\n            .product(name: \"MacroTesting\", package: \"swift-macro-testing\"),\n        ],\n        swiftSettings: [.define(\"MOCKING\")]\n    )\n])\n\nlet package = Package(\n    name: \"Mockable\",\n    platforms: [.macOS(.v12), .iOS(.v13), .tvOS(.v13), .watchOS(.v6), .macCatalyst(.v13)],\n    products: [\n        .library(\n            name: \"Mockable\",\n            targets: [\"Mockable\"]\n        )\n    ],\n    dependencies: devDependencies + [\n        .package(url: \"https://github.com/swiftlang/swift-syntax.git\", \"509.0.0\"..<\"603.0.0\"),\n        .package(url: \"https://github.com/pointfreeco/xctest-dynamic-overlay\", .upToNextMajor(from: \"1.6.0\"))\n    ],\n    targets: devTargets + [\n        .target(\n            name: \"Mockable\",\n            dependencies: [\n                \"MockableMacro\",\n                .product(name: \"IssueReporting\", package: \"xctest-dynamic-overlay\")\n            ],\n            swiftSettings: [\n                .enableExperimentalFeature(\"StrictConcurrency\"),\n                .enableUpcomingFeature(\"ExistentialAny\")\n            ],\n            plugins: devPlugins\n        ),\n        .macro(\n            name: \"MockableMacro\",\n            dependencies: [\n                .product(name: \"SwiftSyntaxMacros\", package: \"swift-syntax\"),\n                .product(name: \"SwiftCompilerPlugin\", package: \"swift-syntax\")\n            ],\n            swiftSettings: [\n                .enableExperimentalFeature(\"StrictConcurrency\"),\n                .enableUpcomingFeature(\"ExistentialAny\")\n            ],\n            plugins: devPlugins\n        )\n    ],\n    swiftLanguageVersions: [.v5, .version(\"6\")]\n)\n\n"
  },
  {
    "path": "README.md",
    "content": "\n<p>\n<img width=\"300\" src=\"https://github.com/Kolos65/Mockable/assets/26504214/4e19e4fc-8453-4320-a061-e672dcc95023\" alt=\"@Mockable\"/>\n</p>\n\n**Mockable** is a [Swift macro](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/macros/) driven testing framework that provides automatic mock implementations for your protocols. It offers an intuitive **declarative syntax** that simplifies the process of mocking services in unit tests. The generated mock implementations can be excluded from release builds using compile conditions. \n\n## Table of Contents\n- [Sponsorship](#Sponsorship)\n- [Documentation](#Documentation)\n- [Installation](#Installation)\n- [Configuration](#Configuration)\n- [Usage](#Usage)\n  - [Example](#Example)\n  - [Syntax](#Syntax)\n  - [Parameters](#Parameters)\n  - [Given](#Given)\n  - [When](#When)\n  - [Verify](#Verify)\n  - [Relaxed Mode](#Relaxed-Mode)\n  - [Non-equatable Types](#Working-with-non-equatable-Types)\n- [Supported Features](#Supported-Features)\n- [Limitations](#Limitations)\n- [Contribution](#Contribution)\n- [License](#License)\n\n## Sponsorship\n\nI'm working on **Mockable** as a fun side project. I believe in the power of open source, and I'm thrilled to share it with you. If **Mockable** saves you time and you’d like to show your appreciation, I would be incredibly grateful for your support.\n\n<a href=\"https://www.buymeacoffee.com/kolos\" target=\"_blank\"><img src=\"https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png\" alt=\"Buy Me A Coffee\" style=\"height: 60px !important;width: 217px !important;\" ></a>\n\n## Documentation\n\nRead **Mockable**'s [documentation](https://kolos65.github.io/Mockable/documentation/mockable) for detailed installation and configuration guides as well as usage examples.\n\n## Installation\n\nThe library can be installed using Swift Package Manager.\n\nAdd the **Mockable** target to all targets that contain protocols you want to mock. **Mockable** does not depend on the `XCTest` framework so it can be added to any target.\n\nWhen using the plugin for the first time, be sure to **trust and enable** it when prompted. For unattended usage (e.g. on the CI), macro validation can be disabled with either of the following:\n* Using an **xcodebuild** flag: `-skipMacroValidation`\n* Setting Xcode defaults: `defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES`\n\nRead the [installation guide](https://kolos65.github.io/Mockable/documentation/mockable/installation/) of the documentation for more details on how to integrate **Mockable** with your project.\n\n## Configuration\n\nSince `@Mockable` is a [peer macro](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/attributes/#attached), \nthe generated code will always be at the same scope as the protocol it is attached to. \n\nTo solve this, the macro expansion is enclosed in a pre-defined compile-time flag called **`MOCKING`** that can be leveraged to exclude generated mock implementations from release builds.\n\n> ⚠️ Since the **`MOCKING`** flag is not defined in your project by default, you won't be able to use mock implementations unless you configure it.\n\n### When using framework modules or a non-modular project:\nDefine the flag in your target's build settings for debug build configuration(s):\n1. Open your **Xcode project**.\n2. Go to your target's **Build Settings**.\n3. Find **Swift Compiler - Custom Flags**.\n4. Add the **MOCKING** flag under the debug configuration(s).\n\n### When using SPM modules or testing a package:\nIn your module's package manifest under the target definition, you can define the **`MOCKING`** compile-time condition if the build configuration is set to **`debug`**:\n```swift\n.target(\n    ...\n    swiftSettings: [\n        .define(\"MOCKING\", .when(configuration: .debug))\n    ]\n)\n```\n\n### When using [XcodeGen](https://github.com/yonaskolb/XcodeGen):\nDefine the flag in your **XcodeGen** specification:\n```yml\nsettings:\n  ...\n  configs:\n    debug:\n      SWIFT_ACTIVE_COMPILATION_CONDITIONS: MOCKING\n```\n\n### When using [Tuist](https://tuist.io/):\n\nIf you use Tuist, you can define the `MOCKING` flag in your target's settings under `configurations`.  \n\n```swift\n.target(\n    ...\n    settings: .settings(\n        configurations: [\n            .debug(\n                name: .debug, \n                settings: [\n                    \"SWIFT_ACTIVE_COMPILATION_CONDITIONS\": \"$(inherited) MOCKING\"\n                ]\n            )\n        ]\n    )\n)\n```\n\nRead the [configuration guide](https://kolos65.github.io/Mockable/documentation/mockable/configuration/) of the documentation for more details on how to setup the **`MOCKING`** flag in your project.\n\n## Usage\n\n### Example\n\nGiven a protocol annotated with the `@Mockable` macro:\n```swift\nimport Mockable\n\n@Mockable\nprotocol ProductService {\n    var url: URL? { get set }\n    func fetch(for id: UUID) async throws -> Product\n    func checkout(with product: Product) throws\n}\n```\nA mock implementation named `MockProductService` will be generated, that can be used in unit tests like:\n```swift\nimport Mockable\n\nlazy var productService = MockProductService()\nlazy var cartService = CartServiceImpl(productService: productService)\n\nfunc testCartService() async throws {\n    let mockURL = URL(string: \"apple.com\")\n    let mockError: ProductError = .notFound\n    let mockProduct = Product(name: \"iPhone 15 Pro\")\n\n    given(productService)\n        .fetch(for: .any).willReturn(mockProduct)\n        .checkout(with: .any).willThrow(mockError)\n\n    try await cartService.checkout(with: mockProduct, using: mockURL)\n\n    verify(productService)\n        .fetch(for: .value(mockProduct.id)).called(.atLeastOnce)\n        .checkout(with: .value(mockProduct)).called(.once)\n        .url(newValue: .value(mockURL)).setCalled(.once)\n}\n```\n\n### Syntax\n\n**Mockable** has a declarative syntax that utilizes builders to construct `given`, `when`, and `verify` clauses. \nWhen constructing any of these clauses, you always follow the same syntax: \n\n`clause type`(`service`).`function builder`.`behavior builder`\n\nIn the following example where we use the previously introduced product service:\n```swift\nlet id = UUID()\nlet error: ProductError = .notFound\n\ngiven(productService).fetch(for: .value(id)).willThrow(error)\n```\nWe specify the following:\n* **`given`**: we want to register **return values**\n* **`(productService)`**: we specify what mockable service we want to register return values for\n* **`.fetch(for: .value(id))`**: we want to mock the `fetch(for:)` method and constrain our behavior on calls with matching `id` parameters\n* **`.willThrow(error)`**: if `fetch(for:)` is called with the specified parameter value, we want an **error** to be thrown\n\n### Parameters\n\nFunction builders have **all parameters** from the original requirement but **encapsulate them** within the [`Parameter<Value>`](https://kolos65.github.io/Mockable/documentation/mockable/parameter) type. \nWhen constructing mockable clauses, you have to **specify parameter conditions** for every parameter of a function. There are three available options:\n\n* **`.any`**: Matches every call to the specified function, disregarding the actual parameter values.\n* **`.value(Value)`**: Matches to calls with an identical value in the specified parameter.\n* **`.matching((Value) -> Bool)`**: Uses the provided closure to filter functions calls.\n\n> Computed properties have no parameters, but mutable properties get a `(newValue:)` parameter in function builders that can be used \nto constraint functionality on property assignment with a match condition. These `newValue` conditions will only effect the `performOnGet`, `performOnSet`, `getCalled` and `setCalled`\nclauses but will have no effect on return clauses.\n\nHere are examples of using different parameter conditions:\n\n```swift\n// throw an error when `fetch(for:)` is called with `id`\ngiven(productService).fetch(for: .value(id)).willThrow(error)\n\n// print \"Ouch!\" if product service is called with a product named \"iPhone 15 Pro\"\nwhen(productService)\n  .checkout(with: .matching { $0.name == \"iPhone 15 Pro\" })\n  .perform { print(\"Ouch!\") }\n\n// assert if the fetch(for:) was called exactly once regardless of what id parameter it was called with\nverify(productService).fetch(for: .any).called(.once)\n```\n\n### Given\n\nReturn values can be specified using a `given(_ service:)` clause. There are three return builders available:\n* [`willReturn(_ value:)`](https://kolos65.github.io/Mockable/documentation/mockable/functionreturnbuilder/willreturn(_:)): Will store the given return value and use it to mock subsequent calls.\n* [`willThrow(_ error:)`](https://kolos65.github.io/Mockable/documentation/mockable/throwingfunctionreturnbuilder/willthrow(_:)): Will store the given error and throw it in subsequent calls. Only available for throwing functions and properties.\n* [`willProduce(_ producer:)`](https://kolos65.github.io/Mockable/documentation/mockable/throwingfunctionreturnbuilder/willproduce(_:)): Will use the provided closure for mocking. The closure has the same signature as the mocked function, so for example a function that takes an integer returns a string and can throw will accept a closure of type `(Int) throws -> String`.\n* [`willHandle(_ result:)`](https://kolos65.github.io/Mockable/documentation/mockable/throwingfunctionreturnbuilder/willhandle(_:)): Registers a result type that automatically emits a value when successful or throws a failure. \n\nThe provided return values are used up in FIFO order and the last one is always kept for any further calls. Here are examples of using return clauses:\n```swift\n// Throw an error for the first call and then return 'product' for every other call\ngiven(productService)\n    .fetch(for: .any).willThrow(error)\n    .fetch(for: .any).willReturn(product)\n\n// Throw an error if the id parameter ends with a 0, return a product otherwise\ngiven(productService)\n    .fetch(for: .any).willProduce { id in\n        if id.uuidString.last == \"0\" {\n            throw error\n        } else {\n            return product\n        }\n    }\n```\n\n### When\n\nSide effects can be added using `when(_ service:)` clauses. There are three kind of side effects:\n* [`perform(_ action)`](https://kolos65.github.io/Mockable/documentation/mockable/functionactionbuilder/perform(_:)): Will register an operation to perform on invocations of the mocked function.\n* [`performOnGet(_ action:)`](https://kolos65.github.io/Mockable/documentation/mockable/propertyactionbuilder/performonget(_:)): Available for mutable properties only, will perform the provided operation on property access.\n* [`performOnSet(_ action:)`](https://kolos65.github.io/Mockable/documentation/mockable/propertyactionbuilder/performonset(_:)): Available for mutable properties only, will perform the provided operation on property assignment.\n\nSome examples of using side effects are:\n```swift\n// log calls to fetch(for:)\nwhen(productService).fetch(for: .any).perform {\n    print(\"fetch(for:) was called\")\n}\n\n// log when url is accessed\nwhen(productService).url().performOnGet {\n    print(\"url accessed\")\n}\n\n// log when url is set to nil\nwhen(productService).url(newValue: .value(nil)).performOnSet {\n    print(\"url set to nil\")\n}\n```\n\n### Verify\nYou can verify invocations of your mock service using the `verify(_ service:)` clause.\n\n> **Mockable** supports both *XCTest* and *Swift Testing* by using Pointfree's [swift-issue-reporting](https://github.com/pointfreeco/swift-issue-reporting) to dynamically report test failures with the appropriate test framework.\n\nThere are three kind of verifications:\n* [`called(_:)`](https://kolos65.github.io/Mockable/documentation/mockable/functionverifybuilder/called(_:fileid:filepath:line:column:)): Asserts invocation count based on the given value.\n* [`getCalled(_:)`](https://kolos65.github.io/Mockable/documentation/mockable/propertyverifybuilder/getcalled(_:fileid:filepath:line:column:)): Available for mutable properties only, asserts property access count.\n* [`setCalled(_:)`](https://kolos65.github.io/Mockable/documentation/mockable/propertyverifybuilder/setcalled(_:fileid:filepath:line:column:)): Available for mutable properties only, asserts property assignment count.\n\nHere are some example assertions:\n```swift\nverify(productService)\n    // assert fetch(for:) was called between 1 and 5 times\n    .fetch(for: .any).called(.from(1, to: 5))\n    // assert checkout(with:) was called between exactly 10 times\n    .checkout(with: .any).called(10)\n    // assert url property was accessed at least 2 times\n    .url().getCalled(.moreOrEqual(to: 2))\n    // assert url property was never set to nil\n    .url(newValue: .value(nil)).setCalled(.never)\n```\n\nIf you are testing asynchronous code and cannot write sync assertions you can use the async counterparts of the above verifications:\n* [`calledEventually(_:before:)`](https://kolos65.github.io/Mockable/documentation/mockable/functionverifybuilder/calledeventually(_:before:fileid:filepath:line:column:)): Wait until timeout or invocation count satisfied.\n* [`getCalledEventually(_:before:)`](https://kolos65.github.io/Mockable/documentation/mockable/propertyverifybuilder/getcalledeventually(_:before:fileid:filepath:line:column:)): Wait until timeout or property access count satisfied.\n* [`setSalledEventually(_:before:)`](https://kolos65.github.io/Mockable/documentation/mockable/propertyverifybuilder/setcalledeventually(_:before:fileid:filepath:line:column:)): Wait until timeout or property assignment count satisfied.\n\nHere are some examples of async verifications:\n```swift\nawait verify(productService)\n    // assert fetch(for:) was called between 1 and 5 times before default timeout (1 second)\n    .fetch(for: .any).calledEventually(.from(1, to: 5))\n    // assert checkout(with:) was called between exactly 10 times before 3 seconds\n    .checkout(with: .any).calledEventually(10, before: .seconds(3))\n    // assert url property was accessed at least 2 times before default timeout (1 second)\n    .url().getCalledEventually(.moreOrEqual(to: 2))\n    // assert url property was set to nil once\n    .url(newValue: .value(nil)).setCalledEventually(.once)\n```\n\n### Relaxed Mode\nBy default, you must specify a return value for all requirements; otherwise, a fatal error will be thrown. The reason for this is to aid in the discovery (and thus the verification) of every called function when writing unit tests. \n\nHowever, it is common to prefer avoiding this strict default behavior in favor of a more relaxed setting, where, \nfor example, void or optional return values do not need explicit `given` registration.\n\nUse [`MockerPolicy`](https://kolos65.github.io/Mockable/documentation/mockable/mockerpolicy) (which is an [option set](https://developer.apple.com/documentation/swift/optionset)) to implicitly mock:\n* only one kind of return value: `.relaxedMocked`\n* construct a custom set of policies: `[.relaxedVoid, .relaxedOptional]`\n* or opt for a fully relaxed mode: `.relaxed`.\n\nYou have two options to override the default strict behavior of the library:\n* at **mock implementation level** you can override the mocker policy for each individual mock implementation in the initializer: \n    ```swift\n    let relaxedMock = MockService(policy: [.relaxedOptional, .relaxedVoid])\n    ```\n* at **project level** you can set a custom default policy to use in every scenario by changing the default property of **MockerPolicy**: \n    ```swift\n    MockerPolicy.default = .relaxedVoid\n    ```\n\nThe `.relaxedMocked` policy in combination with the [`Mocked`](https://kolos65.github.io/Mockable/documentation/mockable/mocked) protocol can be used to set an implicit return value for custom (or even built in) types:\n```swift\nstruct Car {\n    var name: String\n    var seats: Int\n}\n\nextension Car: Mocked {\n    static var mock: Car {\n        Car(name: \"Mock Car\", seats: 4)\n    }\n\n    // Defaults to [mock] but we can \n    // provide a custom array of cars:\n    static var mocks: [Car] {\n        [\n            Car(name: \"Mock Car 1\", seats: 4),\n            Car(name: \"Mock Car 2\", seats: 4)\n        ]\n    }\n}\n\n@Mockable\nprotocol CarService {\n    func getCar() -> Car\n    func getCars() -> [Car]\n}\n\nfunc testCarService() {\n    func test() {\n        let mock = MockCarService(policy: .relaxedMocked)\n        // Implictly mocked without a given registration:\n        let car = mock.getCar()\n        let cars = mock.getCars()\n    }\n}\n```\n\n> ⚠️ Relaxed mode will not work with generic return values as the type system is unable to locate the appropriate generic overload.\n\n### Working with non-equatable Types\n**Mockable** uses a [`Matcher`](https://kolos65.github.io/Mockable/documentation/mockable/matcher) internally to compare parameters. \nBy default the matcher is able to compare any custom type that conforms to `Equatable` (except when used in a generic function).\nIn special cases, when you\n* have non-equatable parameter types\n* need testing specific equality logic for a custom type\n* have generic functions that are used with custom concrete types\n\nyou can register your custom types with the `Matcher.register()` functions.\nHere is how to do it:\n```swift\n// register an equatable type to the matcher because we use it in a generic function\nMatcher.register(SomeEquatableType.self)\n\n// register a non-equatable type to the matcher\nMatcher.register(Product.self, match: { $0.name == $1.name })\n\n// register a meta-type to the matcher\nMatcher.register(HomeViewController.Type.self)\n\n// remove all previously registered custom types\nMatcher.reset()\n```\nIf you see an error during tests like:\n> No comparator found for type \"SomeType\". All non-equatable types must be registered using Matcher.register(_).\n\nRemember to add the noted type to your `Matcher` using the `register()` function.\n\n## Supported Features\n\n- [x] **Zero-boilerplate** mock generation</br>\n- [x] **Exclude** mock implementations **from production** target</br>\n- [x] Protocols with **associated types**</br>\n- [x] Protocols with **constrained associated types**</br>\n- [x] **Init** requirements</br>\n- [x] **Generic function parameters** and **return values**</br>\n- [x] Generic functions with **where clauses**</br>\n- [x] Computed and mutable **property requirements**</br>\n- [x] **@escaping closure** parameters</br>\n- [x] **Implicitly unwrapped** optionals</br>\n- [x] **throwing, rethrowing and async** requirements</br>\n- [x] Custom **non-equatable** types\n\n## Limitations\n\n- [ ] **Static Requirements**: Static members cannot be used on protocols and are not supported.</br>\n- [ ] **Protocol Inheritance**: Due to limitations of the macro system, inherited protocol requirements won't be implemented.</br>\n- [ ] **Return Type Overloads**: Requirements with overloaded return types are not supported in favour of supporting generic return types.\n- [ ] **Rethrows functions**: Rethrowing function requirements are always implemented with non-throwing functions.</br>\n- [ ] **Non-escaping function parameters**: Non-escaping closure parameters cannot be stored and are not supported.</br>\n- [ ] **Subscripts** are not supported (yet).</br>\n- [ ] **Operators** are not supported (yet).</br>\n\n## Contribution\n\nIf you encounter any issues with the project or have suggestions for improvement, please feel free to open an issue. I value your feedback and am committed to making this project as robust and user-friendly as possible.\n\nThe package manifest is set up to only contain test targets and test dependencies if an environment variable named `MOCKABLE_DEV` is set to true. This is done to prevent the overly zealous Swift Package Manager from downloading test dependencies and plugins, such as `swift-macro-testing` or `SwiftLint`, when someone uses **Mockable** as a package dependency.\n\nTo open the package with Xcode in \"development mode\", you need the `MOCKABLE_DEV=true` environment variable to be set. Use `Scripts/open.sh` to open the project (or copy its contents into your terminal) to be able to run tests and lint your code when contributing.\n\n## License\n\n**Mockable** is made available under the MIT License. Please see the [LICENSE](https://raw.githubusercontent.com/Kolos65/Mockable/main/LICENSE) file for more details.\n\n"
  },
  {
    "path": "Scripts/doc.sh",
    "content": "#!/bin/bash\n\nswift package \\\n --allow-writing-to-directory ./docs \\\n generate-documentation \\\n --target Mockable \\\n --output-path ./docs \\\n --transform-for-static-hosting \\\n --hosting-base-path Mockable"
  },
  {
    "path": "Scripts/open.sh",
    "content": "#!/bin/bash\n\nexport MOCKABLE_LINT=true\nexport MOCKABLE_TEST=true\nopen Package.swift\n"
  },
  {
    "path": "Scripts/test.sh",
    "content": "#!/bin/bash\n\nset -eo pipefail\n\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nROOT_DIR=\"$(dirname \"$SCRIPT_DIR\")\"\nsource $ROOT_DIR/Scripts/utils.sh\n\n# When --vm is passed, the build and test commands are executed in a virtualized container.\nif [[ \" $* \" == *\" --vm \"* ]]; then\n    CONTAINER_RUNTIME=$(get_container_runtime)\n    $CONTAINER_RUNTIME run --rm \\\n        --volume \"$ROOT_DIR:/package\" \\\n        --workdir \"/package\" \\\n        -e MOCKABLE_TEST=$MOCKABLE_TEST \\\n        swiftlang/swift:nightly-6.1-focal \\\n        /bin/bash -c \\\n        \"swift build --build-path ./.build/linux\"\nelse\n    swift build --package-path \"$ROOT_DIR\"\n    swift test --package-path \"$ROOT_DIR\"\nfi\n"
  },
  {
    "path": "Scripts/utils.sh",
    "content": "#!/bin/bash\n\n# Function to determine the container runtime\nget_container_runtime() {\n    if command -v podman &> /dev/null; then\n        echo \"podman\"\n    elif command -v docker &> /dev/null; then\n        echo \"docker\"\n    else\n        echo \"Neither podman nor docker is installed. Please install one of them to proceed.\" >&2\n        exit 1\n    fi\n}\n"
  },
  {
    "path": "Sources/Mockable/Builder/Builder.swift",
    "content": "//\n//  Builder.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 21..\n//\n\n/// Used to specify members of a protocol when building\n/// given or when clauses of a mock service.\npublic protocol Builder<Service> {\n\n    /// The mock service associated with the Builder.\n    associatedtype Service: MockableService\n\n    /// Initializes a new instance of the builder with the provided `Mocker`.\n    ///\n    /// - Parameter mocker: The associated service's `Mocker` to provide for subsequent builders.\n    init(mocker: Mocker<Service>)\n}\n"
  },
  {
    "path": "Sources/Mockable/Builder/FunctionBuilders/FunctionActionBuilder.swift",
    "content": "//\n//  FunctionActionBuilder.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 22..\n//\n\n/// A builder for specifying actions to be performed when mocking a function.\n///\n/// This builder is used within the context of a higher-level builder (e.g., an `ActionBuilder`)\n/// to specify a desired action to perform when a particular function of a mock service is called.\npublic struct FunctionActionBuilder<T: MockableService, ParentBuilder: Builder<T>> {\n\n    /// Convenient type for the associated service's Member.\n    public typealias Member = T.Member\n\n    /// The member being mocked.\n    private var member: Member\n\n    /// The associated service's mocker.\n    private var mocker: Mocker<T>\n\n    /// Initializes a new instance of `FunctionActionBuilder`.\n    ///\n    /// - Parameters:\n    ///   - mocker: The `Mocker` instance of the associated mock service.\n    ///   - kind: The member being mocked.\n    public init(_ mocker: Mocker<T>, kind member: Member) {\n        self.member = member\n        self.mocker = mocker\n    }\n\n    /// Registers an action to be performed when the provided member is called.\n    ///\n    /// - Parameter action: The closure representing the action to be performed.\n    /// - Returns: The parent builder, used for chaining additional specifications.\n    @discardableResult\n    public func perform(_ action: @escaping () -> Void) -> ParentBuilder {\n        mocker.addAction(action, for: member)\n        return .init(mocker: mocker)\n    }\n}\n"
  },
  {
    "path": "Sources/Mockable/Builder/FunctionBuilders/FunctionReturnBuilder.swift",
    "content": "//\n//  FunctionReturnBuilder.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 14..\n//\n\n/// A builder for specifying return values or producers when mocking a function.\n///\n/// This builder is typically used within the context of a higher-level builder (e.g., a `ReturnBuilder`)\n/// to specify the desired return value or a return value producer for a particular function of a mock service.\npublic struct FunctionReturnBuilder<T: MockableService, ParentBuilder: Builder<T>, ReturnType, ProduceType> {\n\n    /// Convenient type for the associated service's Member.\n    public typealias Member = T.Member\n\n    /// The member being mocked.\n    private var member: Member\n\n    /// The associated service's mocker.\n    private var mocker: Mocker<T>\n\n    /// Initializes a new instance of `FunctionReturnBuilder`.\n    ///\n    /// - Parameters:\n    ///   - mocker: The `Mocker` instance of the associated mock service.\n    ///   - kind: The member being mocked.\n    public init(_ mocker: Mocker<T>, kind member: Member) {\n        self.member = member\n        self.mocker = mocker\n    }\n\n    /// Registers a return value to provide when the mocked member is called.\n    ///\n    /// - Parameter value: The return value to use for mocking the specified member.\n    /// - Returns: The parent builder, used for chaining additional specifications.\n    @discardableResult\n    public func willReturn(_ value: ReturnType) -> ParentBuilder {\n        mocker.addReturnValue(.return(value), for: member)\n        return .init(mocker: mocker)\n    }\n\n    /// Registers a return value producing closure to use when the mocked member is called.\n    ///\n    /// - Parameter producer: A closure that produces a return value for the mocked member.\n    /// - Returns: The parent builder, used for chaining additional specifications.\n    @discardableResult\n    public func willProduce(_ producer: ProduceType) -> ParentBuilder {\n        mocker.addReturnValue(.produce(producer), for: member)\n        return .init(mocker: mocker)\n    }\n}\n\nextension FunctionReturnBuilder where ReturnType == Void {\n    /// Specifies that the void function will return normally when the mocked member is called.\n    @discardableResult\n    public func willReturn() -> ParentBuilder {\n        mocker.addReturnValue(.return(()), for: member)\n        return .init(mocker: mocker)\n    }\n}\n"
  },
  {
    "path": "Sources/Mockable/Builder/FunctionBuilders/FunctionVerifyBuilder.swift",
    "content": "//\n//  FunctionVerifyBuilder.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 22..\n//\n\n/// A builder for verifying the number of times a mocked member was called.\n///\n/// This builder is typically used within the context of a higher-level builder (e.g., a `VerifyBuilder`)\n/// to verify the expected number of invocations for a particular function of a mock service.\npublic struct FunctionVerifyBuilder<T: MockableService, ParentBuilder: Builder<T>> {\n\n    /// Convenient type for the associated service's Member.\n    public typealias Member = T.Member\n\n    /// The associated service's mocker.\n    private var mocker: Mocker<T>\n\n    /// The member being verified.\n    private var member: Member\n\n    /// Initializes a new instance of `FunctionVerifyBuilder`.\n    ///\n    /// - Parameters:\n    ///   - mocker: The `Mocker` instance of the associated mock service.\n    ///   - kind: The member being verified.\n    public init(_ mocker: Mocker<T>, kind member: Member) {\n        self.member = member\n        self.mocker = mocker\n    }\n\n    /// Asserts the number of invocations of the specified member using `count`.\n    ///\n    /// - Parameter count: Specifies the expected invocation count.\n    /// - Returns: The parent builder, used for chaining additional specifications.\n    @discardableResult\n    public func called(\n        _ count: Count,\n        fileID: StaticString = #fileID,\n        filePath: StaticString = #filePath,\n        line: UInt = #line,\n        column: UInt = #column) -> ParentBuilder {\n        mocker.verify(\n            member: member,\n            count: count,\n            fileID: fileID,\n            filePath: filePath,\n            line: line,\n            column: column\n        )\n        return .init(mocker: mocker)\n    }\n\n    /// Asynchronously waits at most `timeout` interval for a successfuly assertion of\n    /// `count` invocations, then fails.\n    ///\n    /// - Parameters:\n    ///   - count: Specifies the expected invocation count.\n    ///   - timeout: The maximum time it will wait for assertion to be true. Default 1 second.\n    /// - Returns: The parent builder, used for chaining additional specifications.\n    @discardableResult\n    public func calledEventually(_ count: Count,\n                                 before timeout: TimeoutDuration = .seconds(1),\n                                 fileID: StaticString = #fileID,\n                                 filePath: StaticString = #filePath,\n                                 line: UInt = #line,\n                                 column: UInt = #column) async -> ParentBuilder {\n        await mocker.verify(\n            member: member,\n            count: count,\n            timeout: timeout,\n            fileID: fileID,\n            filePath: filePath,\n            line: line,\n            column: column\n        )\n        return .init(mocker: mocker)\n    }\n}\n"
  },
  {
    "path": "Sources/Mockable/Builder/FunctionBuilders/ThrowingFunctionActionBuilder.swift",
    "content": "//\n//  ThrowingFunctionActionBuilder.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 22..\n//\n\n/// A builder for specifying actions to be performed when mocking a throwing function.\n///\n/// This builder is used within the context of a higher-level builder (e.g., an `ActionBuilder`)\n/// to specify a desired action to perform when a particular throwing function of a mock service is called.\npublic typealias ThrowingFunctionActionBuilder<T: MockableService, ParentBuilder: Builder<T>>\n    = FunctionActionBuilder<T, ParentBuilder>\n"
  },
  {
    "path": "Sources/Mockable/Builder/FunctionBuilders/ThrowingFunctionReturnBuilder.swift",
    "content": "//\n//  ThrowingFunctionReturnBuilder.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 22..\n//\n\n/// A builder for specifying return values or producers when mocking a function.\n///\n/// This builder is typically used within the context of a higher-level builder (e.g., a `ReturnBuilder`)\n/// to specify the desired return value or a return value producer for a throwing function of a mock service.\npublic struct ThrowingFunctionReturnBuilder<\n    T: MockableService,\n    ParentBuilder: Builder<T>,\n    ReturnType,\n    ErrorType: Error,\n    ProduceType\n> {\n\n    /// Convenient type for the associated service's Member.\n    public typealias Member = T.Member\n\n    /// The member being mocked.\n    private var member: Member\n\n    /// The associated service's mocker.\n    private var mocker: Mocker<T>\n\n    /// Initializes a new instance of `FunctionReturnBuilder`.\n    ///\n    /// - Parameters:\n    ///   - mocker: The `Mocker` instance of the associated mock service.\n    ///   - kind: The member being mocked.\n    public init(_ mocker: Mocker<T>, kind member: Member) {\n        self.member = member\n        self.mocker = mocker\n    }\n\n    /// Registers a return value to provide when the mocked member is called.\n    ///\n    /// - Parameter value: The return value to use for mocking the specified member.\n    /// - Returns: The parent builder, used for chaining additional specifications.\n    @discardableResult\n    public func willReturn(_ value: ReturnType) -> ParentBuilder {\n        mocker.addReturnValue(.return(value), for: member)\n        return .init(mocker: mocker)\n    }\n\n    /// Registers an error to be thrown when the mocked member is called.\n    ///\n    /// - Parameter error: The error to be thrown for mocking the specified member.\n    /// - Returns: The parent builder, used for chaining additional specifications.\n    @discardableResult\n    public func willThrow(_ error: ErrorType) -> ParentBuilder {\n        mocker.addReturnValue(.throw(error), for: member)\n        return .init(mocker: mocker)\n    }\n\n    /// Registers a return value producing closure to use when the mocked member is called.\n    ///\n    /// - Parameter producer: A closure that produces a return value or throws an error.\n    /// - Returns: The parent builder, used for chaining additional specifications.\n    @discardableResult\n    public func willProduce(_ producer: ProduceType) -> ParentBuilder {\n        mocker.addReturnValue(.produce(producer), for: member)\n        return .init(mocker: mocker)\n    }\n\n    /// Registers a result type that automatically emits a value when successful or throws a failure.\n    ///\n    /// - Parameter result: The result type wrapping a value or error.\n    /// - Returns:  The parent builder, used for chaining additional specifications.\n    @discardableResult\n    public func willHandle(_ result: Result<ReturnType, ErrorType>) -> ParentBuilder {\n        switch result {\n        case let .success(value):\n            mocker.addReturnValue(.return(value), for: member)\n        case let .failure(error):\n            mocker.addReturnValue(.throw(error), for: member)\n        }\n        return .init(mocker: mocker)\n    }\n}\n\nextension ThrowingFunctionReturnBuilder where ReturnType == Void {\n    /// Specifies that the void function will return normally when the mocked member is called.\n    @discardableResult\n    public func willReturn() -> ParentBuilder {\n        mocker.addReturnValue(.return(()), for: member)\n        return .init(mocker: mocker)\n    }\n}\n"
  },
  {
    "path": "Sources/Mockable/Builder/FunctionBuilders/ThrowingFunctionVerifyBuilder.swift",
    "content": "//\n//  ThrowingFunctionVerifyBuilder.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 22..\n//\n\n/// A builder for verifying the number of times a throwing function was called.\n///\n/// This builder is typically used within the context of a higher-level builder (e.g., a `VerifyBuilder`)\n/// to verify the expected number of invocations for a throwing function of a mock service.\npublic typealias ThrowingFunctionVerifyBuilder<T: MockableService, ParentBuilder: Builder<T>>\n    = FunctionVerifyBuilder<T, ParentBuilder>\n"
  },
  {
    "path": "Sources/Mockable/Builder/MockableService.swift",
    "content": "//\n//  MockableService.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 13..\n//\n\n/// A protocol defining the structure for a mocked service.\n///\n/// Conforming types must provide a `Member` type representing their members\n/// as well as builders for specifying return values, actions, and verifications.\npublic protocol MockableService {\n\n    /// A type representing the members of the mocked protocol.\n    associatedtype Member: Matchable, CaseIdentifiable, Sendable\n\n    /// A builder responsible for registering return values.\n    associatedtype ReturnBuilder: Builder<Self>\n    /// A builder responsible for registering side-effects.\n    associatedtype ActionBuilder: Builder<Self>\n    /// A builder responsible for asserting member invocations.\n    associatedtype VerifyBuilder: Builder<Self>\n\n    /// Encapsulates member return values.\n    typealias Return = MemberReturn<Member>\n\n    /// Encapsulates member side-effects.\n    typealias Action = MemberAction<Member>\n\n    /// A builder proxy for specifying return values.\n    var _given: ReturnBuilder { get }\n\n    /// A builder proxy for specifying actions.\n    var _when: ActionBuilder { get }\n\n    /// The builder proxy for verifying invocations.\n    var _verify: VerifyBuilder { get }\n}\n"
  },
  {
    "path": "Sources/Mockable/Builder/PropertyBuilders/PropertyActionBuilder.swift",
    "content": "//\n//  PropertyActionBuilder.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 22..\n//\n\n/// A builder for specifying actions to be performed when mocking the getter and setter of a property.\n///\n/// This builder is typically used within the context of a higher-level builder (e.g., an `ActionBuilder`)\n/// to specify the behavior of the getter and setter of a particular property of a mock.\npublic struct PropertyActionBuilder<T: MockableService, ParentBuilder: Builder<T>> {\n\n    /// Convenient type for the associated service's Member.\n    public typealias Member = T.Member\n\n    /// The member representing the getter of the property.\n    var getMember: Member\n\n    /// The member representing the setter of the property.\n    var setMember: Member\n\n    /// The associated service's mocker.\n    var mocker: Mocker<T>\n\n    /// Initializes a new instance of `PropertyActionBuilder`.\n    ///\n    /// - Parameters:\n    ///   - mocker: The `Mocker` instance of the associated mock service.\n    ///   - getKind: The member representing the getter of the property.\n    ///   - setKind: The member representing the setter of the property.\n    public init(_ mocker: Mocker<T>, kind getMember: Member, setKind setMember: Member) {\n        self.getMember = getMember\n        self.setMember = setMember\n        self.mocker = mocker\n    }\n\n    /// Specifies the action to be performed when the getter of the property is called.\n    ///\n    /// - Parameter action: The closure representing the action to be performed.\n    /// - Returns: The parent builder, typically used for chaining additional specifications.\n    @discardableResult\n    public func performOnGet(_ action: @escaping () -> Void) -> ParentBuilder {\n        mocker.addAction(action, for: getMember)\n        return .init(mocker: mocker)\n    }\n\n    /// Specifies the action to be performed when the setter of the property is called.\n    ///\n    /// - Parameter action: The closure representing the action to be performed.\n    /// - Returns: The parent builder, typically used for chaining additional specifications.\n    @discardableResult\n    public func performOnSet(_ action: @escaping () -> Void) -> ParentBuilder {\n        mocker.addAction(action, for: setMember)\n        return .init(mocker: mocker)\n    }\n}\n"
  },
  {
    "path": "Sources/Mockable/Builder/PropertyBuilders/PropertyReturnBuilder.swift",
    "content": "//\n//  PropertyReturnBuilder.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 22..\n//\n\n/// A builder for specifying return values or producers when mocking the getter of a mutable property.\n///\n/// This builder is typically used within the context of a higher-level builder (e.g., a `ReturnBuilder`)\n/// to specify the desired return value or a return value producer for the getter\n/// of a particular property of a mock.\npublic struct PropertyReturnBuilder<T: MockableService, ParentBuilder: Builder<T>, ReturnType> {\n\n    /// Convenient type for the associated service's Member.\n    public typealias Member = T.Member\n\n    /// The member representing the getter of the property.\n    var getMember: Member\n\n    /// The associated service's mocker.\n    var mocker: Mocker<T>\n\n    /// Initializes a new instance of `PropertyReturnBuilder`.\n    ///\n    /// - Parameters:\n    ///   - mocker: The `Mocker` instance of the associated mock service.\n    ///   - getKind: The member representing the getter of the property.\n    public init(_ mocker: Mocker<T>, kind getMember: Member) {\n        self.getMember = getMember\n        self.mocker = mocker\n    }\n\n    /// Specifies the return value when the getter of the property is called.\n    ///\n    /// - Parameter value: The return value to use for mocking the specified getter.\n    /// - Returns: The parent builder, used for chaining additional specifications.\n    @discardableResult\n    public func willReturn(_ value: ReturnType) -> ParentBuilder {\n        mocker.addReturnValue(.return(value), for: getMember)\n        return .init(mocker: mocker)\n    }\n\n    /// Specifies the return value producing closure to use when the getter of the property is called.\n    ///\n    /// - Parameter producer: A closure that produces a return value for the getter.\n    /// - Returns: The parent builder, used for chaining additional specifications.\n    @discardableResult\n    public func willProduce(_ producer: @escaping () -> ReturnType) -> ParentBuilder {\n        mocker.addReturnValue(.produce(producer), for: getMember)\n        return .init(mocker: mocker)\n    }\n}\n"
  },
  {
    "path": "Sources/Mockable/Builder/PropertyBuilders/PropertyVerifyBuilder.swift",
    "content": "//\n//  PropertyVerifyBuilder.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 22..\n//\n\n/// A builder for verifying the number of times the getter and setter of a property are called.\n///\n/// This builder is typically used within the context of a higher-level builder (e.g., a `VerifyBuilder`)\n/// to verify the expected number of invocations for the getter and setter of a particular property of a mock.\npublic struct PropertyVerifyBuilder<T: MockableService, ParentBuilder: Builder<T>> {\n\n    /// Convenient type for the associated service's Member.\n    public typealias Member = T.Member\n\n    /// The associated service's mocker.\n    var mocker: Mocker<T>\n\n    /// The member representing the getter of the property.\n    var getMember: Member\n\n    /// The member representing the setter of the property.\n    var setMember: Member\n\n    /// Initializes a new instance of `PropertyVerifyBuilder`.\n    ///\n    /// - Parameters:\n    ///   - mocker: The `Mocker` instance of the associated mock service.\n    ///   - getKind: The member representing the getter of the property.\n    ///   - setKind: The member representing the setter of the property.\n    public init(_ mocker: Mocker<T>,\n                kind getMember: Member,\n                setKind setMember: Member) {\n        self.getMember = getMember\n        self.setMember = setMember\n        self.mocker = mocker\n    }\n\n    /// Specifies the expected number of times the getter of the property should be called.\n    ///\n    /// - Parameter count: The `Count` object specifying the expected invocation count.\n    /// - Returns: The parent builder, used for chaining additional specifications.\n    @discardableResult\n    public func getCalled(\n        _ count: Count,\n        fileID: StaticString = #fileID,\n        filePath: StaticString = #filePath,\n        line: UInt = #line,\n        column: UInt = #column\n    ) -> ParentBuilder {\n        mocker.verify(\n            member: getMember,\n            count: count,\n            fileID: fileID,\n            filePath: filePath,\n            line: line,\n            column: column\n        )\n        return .init(mocker: mocker)\n    }\n\n    /// Asynchronously waits at most `timeout` interval for a successfuly assertion of\n    /// `count` invocations of the property's getter, then fails.\n    ///\n    /// - Parameters:\n    ///   - count: Specifies the expected invocation count.\n    ///   - timeout: The maximum time it will wait for assertion to be true. Default 1 second.\n    /// - Returns: The parent builder, used for chaining additional specifications.\n    @discardableResult\n    public func getCalledEventually(_ count: Count,\n                                    before timeout: TimeoutDuration = .seconds(1),\n                                    fileID: StaticString = #fileID,\n                                    filePath: StaticString = #filePath,\n                                    line: UInt = #line,\n                                    column: UInt = #column) async -> ParentBuilder {\n        await mocker.verify(\n            member: getMember,\n            count: count,\n            timeout: timeout,\n            fileID: fileID,\n            filePath: filePath,\n            line: line,\n            column: column\n        )\n        return .init(mocker: mocker)\n    }\n\n    /// Specifies the expected number of times the setter of the property should be called.\n    ///\n    /// - Parameter count: The `Count` object specifying the expected invocation count.\n    /// - Returns: The parent builder, used for chaining additional specifications.\n    @discardableResult\n    public func setCalled(\n        _ count: Count,\n        fileID: StaticString = #fileID,\n        filePath: StaticString = #filePath,\n        line: UInt = #line,\n        column: UInt = #column) -> ParentBuilder {\n        mocker.verify(\n            member: setMember,\n            count: count,\n            fileID: fileID,\n            filePath: filePath,\n            line: line,\n            column: column\n        )\n        return .init(mocker: mocker)\n    }\n\n    /// Asynchronously waits at most `timeout` interval for a successfuly assertion of\n    /// `count` invocations fot the property's setter, then fails.\n    ///\n    /// - Parameters:\n    ///   - count: Specifies the expected invocation count.\n    ///   - timeout: The maximum time it will wait for assertion to be true. Default 1 second.\n    /// - Returns: The parent builder, used for chaining additional specifications.\n    @discardableResult\n    public func setCalledEventually(_ count: Count,\n                                    before timeout: TimeoutDuration = .seconds(1),\n                                    fileID: StaticString = #fileID,\n                                    filePath: StaticString = #filePath,\n                                    line: UInt = #line,\n                                    column: UInt = #column) async -> ParentBuilder {\n        await mocker.verify(\n            member: setMember,\n            count: count,\n            timeout: timeout,\n            fileID: fileID,\n            filePath: filePath,\n            line: line,\n            column: column\n        )\n        return .init(mocker: mocker)\n    }\n}\n"
  },
  {
    "path": "Sources/Mockable/Documentation/Documentation.docc/Configuration.md",
    "content": "# Configuration\n\nLearn how to configure build settings so generated mock implementations are excluded from release builds.\n\n## Overview\n\nSince `@Mockable` is a peer macro the generated code will always be at the same scope as the protocol it is attached to. From **Mockable**'s perspective this is unfortunate as we don't want to include our generated mock implementations in the release bundle.\n\nTo solve this, the macro expansion is enclosed in a pre-defined compile-time flag called **`MOCKING`** that can be leveraged to exclude generated mock implementations from release builds:\n```swift\n#if MOCKING\npublic final class MockService: Service, Mockable {\n    // generated code...\n}\n#endif\n```\n\n> Since the **`MOCKING`** flag is not defined in your project by default, you won't be able to use mock implementations unless you configure it.\n\nThere are many ways to define the flag depending on how your project is set up or what tool you use for build setting generation. Below you can find how to define the `MOCKING` flag in three common scenarios.\n\n## Define the flag using Xcode\nIf your porject relies on Xcode build settings, define the flag in your target's build settings for debug build configuration(s):\n1. Open your **Xcode project**.\n2. Go to your target's **Build Settings**.\n3. Find **Swift Compiler - Custom Flags**.\n4. Add the **MOCKING** flag under the debug build configuration(s).\n5. Repeat these steps for all of your targets where you want to use the `@Mockable` macro.\n\n## Using a Package.swift manifest\nIf you are using SPM modules or working with a package, define the **`MOCKING`** compile-time condition in your package manifest. Using a `.when(configuration:)` build setting condition you can define the flag only if the build configuration is set to `debug`.\n```swift\n.target(\n    ...\n    swiftSettings: [\n        .define(\"MOCKING\", .when(configuration: .debug))\n    ]\n)\n```\n\n## Using XcodeGen\nIf you use XcodeGen to generate you project, you can define the `MOCKING` flag in your yaml file under the `configs` definition.  \n```yml\nsettings:\n  ...\n  configs:\n    debug:\n      SWIFT_ACTIVE_COMPILATION_CONDITIONS: MOCKING\n```\n\n## Using [Tuist](https://tuist.io/):\n\nIf you use Tuist, you can define the `MOCKING` flag in your target's settings under `configurations`.  \n```swift\n.target(\n    ...\n    settings: .settings(\n        configurations: [\n            .debug(\n                name: .debug, \n                settings: [\n                    \"SWIFT_ACTIVE_COMPILATION_CONDITIONS\": \"$(inherited) MOCKING\"\n                ]\n            )\n        ]\n    )\n)\n```\n\n## Summary\n\nBy defining the `MOCKING` condition in the debug build configuration you ensured that generated mock implementations are excluded from release builds and kept available for your unit tests that use the debug configuration to build tested targets. \n"
  },
  {
    "path": "Sources/Mockable/Documentation/Documentation.docc/Installation.md",
    "content": "# Installation\n\nLearn how to install **Mockable** and integrate into your targets.\n\n## Overview\n\n**Mockable** can be installed using Swift Package Manager.\n\nAdd the **Mockable** target to all targets that contain protocols you want to mock. **Mockable** does not depend on the `XCTest` framework so it can be added to any target.\n\n## Add **Mockable** using Xcode\n1. Open your Xcode project.\n2. Navigate to the **File** menu and select **Add Package Dependencies...**\n3. Enter the following URL: **`https://github.com/Kolos65/Mockable`**\n4. Specify the version you want to use and click **Add Package**.\n6. Click **Add Package**\n\n> If you have multiple targets or multiple test targets:\n> Navigate to each target's **General** settings and add Mockable under the **Frameworks and Libraries** settings.\n\n### Using a Package.swift manifest:\nIf you have SPM modules or you want to test an SPM package, add **Mockable** as a package dependency in the manifest file.\n\nIn you target definitions add the **Mockable** product to your main and test targets.\n```swift\nlet package = Package(\n    ...\n    dependencies: [\n        .package(url: \"https://github.com/Kolos65/Mockable\", from: \"0.0.1\"),\n    ],\n    targets: [\n        .target(\n            ...\n            dependencies: [\n                .product(name: \"Mockable\", package: \"Mockable\")\n            ]\n        ),\n        .testTarget(\n            ...\n            dependencies: [\n                .product(name: \"Mockable\", package: \"Mockable\")\n            ]\n        )\n    ]\n)\n```\n\n### Using XcodeGen:\nAdd Mockable to the `packages` definition and the `targets` definition.\n```yaml\npackages:\n  Mockable:\n    url: https://github.com/Kolos65/Mockable\n    from: \"0.0.1\"\n\ntargets:\n  MyApp:\n    ...\n    dependencies:\n      - package: Mockable\n        product: Mockable\n  MyAppUnitTests:\n    ...\n    dependencies:\n      - package: Mockable\n        product: Mockable\n        \n```\n"
  },
  {
    "path": "Sources/Mockable/Documentation/Documentation.docc/Mockable.md",
    "content": "# ``Mockable``\n\nA macro driven testing framework that provides automatic mock implementations for your protocols. It offers an intuitive declarative syntax that simplifies the process of mocking services in unit tests. \n\n## Overview\n\n**Mockable** utilizes the new Swift macro system to generate code that eliminates the need for external dependencies like Sourcery.\nIt has a declarative API that enables you to rapidly specify return values and verify invocations in a readable format.\n\n\nAssociated types, generic functions, where clauses and constrained generic arguments are all supported.\nThe generated mock implementations can be excluded from release builds using a built in compile condition.\n\n## Topics\n\n### Guides\n\n- <doc:Installation>\n- <doc:Configuration>\n- <doc:Usage>\n"
  },
  {
    "path": "Sources/Mockable/Documentation/Documentation.docc/Usage.md",
    "content": "# Usage\n\nLarn how to use **Mockable** to write readable and concise unit tests.\n\n## Overview\n\nGiven a protocol annotated with the `@Mockable` macro:\n```swift\nimport Mockable\n\n@Mockable\nprotocol ProductService {\n    var url: URL? { get set }\n    func fetch(for id: UUID) async throws -> Product\n    func checkout(with product: Product) throws\n}\n```\nA mock implementation named `MockProductService` will be generated, that can be used in unit tests like this:\n```swift\nimport Mockable\n\nlazy var productService = MockProductService()\nlazy var cartService = CartServiceImpl(productService: productService)\n\nfunc testCartService() async throws {\n    let mockURL = URL(string: \"apple.com\")\n    let mockError: ProductError = .notFound\n    let mockProduct = Product(name: \"iPhone 15 Pro\")\n\n    given(productService)\n        .fetch(for: .any).willReturn(mockProduct)\n        .checkout(with: .any).willThrow(mockError)\n\n    try await cartService.checkout(with: mockProduct, using: mockURL)\n\n    verify(productService)\n        .fetch(for: .value(mockProduct.id)).called(.atLeastOnce)\n        .checkout(with: .value(mockProduct)).called(.once)\n        .url(newValue: .value(mockURL)).setCalled(.once)\n}\n```\n\n## Syntax\n\n**Mockable** has a declarative syntax that utilizes builders to construct `given`, `when`, and `verify` clauses. \nWhen constructing any of these clauses, you always follow the same syntax: \n\n`clause type`(`service`).`function builder`.`behavior builder`\n\nIn the following example where we use the previously introduced product service:\n```swift\nlet id = UUID()\nlet error: ProductError = .notFound\n\ngiven(productService).fetch(for: .value(id)).willThrow(error)\n```\nWe specify the following:\n* **`given`**: we want to register **return values**\n* **`(productService)`**: we specify what mockable service we want to register return values for\n* **`.fetch(for: .value(id))`**: we want to mock the `fetch(for:)` method and constrain our behavior on calls with matching `id` parameters\n* **`.willThrow(error)`**: if `fetch(for:)` is called with the specified parameter value, we want an **error** to be thrown\n\n## Parameters\n\nFunction builders have **all parameters** from the original requirement but **encapsulate them** within the [`Parameter<Value>`](https://kolos65.github.io/Mockable/documentation/mockable/parameter) type. \nWhen constructing mockable clauses, you have to **specify parameter conditions** for every parameter of a function. There are three available options:\n\n* **`.any`**: Matches every call to the specified function, disregarding the actual parameter values.\n* **`.value(Value)`**: Matches to calls with an identical value in the specified parameter.\n* **`.matching((Value) -> Bool)`**: Uses the provided closure to filter functions calls.\n\n> Computed properties have no parameters, but mutable properties get a `(newValue:)` parameter in function builders that can be used \nto constraint functionality on property assignment with a match condition. These `newValue` conditions will only effect the `performOnGet`, `performOnSet`, `getCalled` and `setCalled`\nclauses but will have no effect on return clauses.\n\nHere are examples of using different parameter conditions:\n\n```swift\n// throw an error when `fetch(for:)` is called with `id`\ngiven(productService).fetch(for: .value(id)).willThrow(error)\n\n// print \"Ouch!\" if product service is called with a product named \"iPhone 15 Pro\"\nwhen(productService)\n  .checkout(with: .matching { $0.name == \"iPhone 15 Pro\" })\n  .perform { print(\"Ouch!\") }\n\n// assert if the fetch(for:) was called exactly once regardless of what id parameter it was called with\nverify(productService).fetch(for: .any).called(.once)\n```\n\n## Given\n\nReturn values can be specified using a `given(_ service:)` clause. There are three return builders available:\n* [`willReturn(_ value:)`](https://kolos65.github.io/Mockable/documentation/mockable/functionreturnbuilder/willreturn(_:)): Will store the given return value and use it to mock subsequent calls.\n* [`willThrow(_ error:)`](https://kolos65.github.io/Mockable/documentation/mockable/throwingfunctionreturnbuilder/willthrow(_:)): Will store the given error and throw it in subsequent calls. Only available for throwing functions and properties.\n* [`willProduce(_ producer:)`](https://kolos65.github.io/Mockable/documentation/mockable/throwingfunctionreturnbuilder/willproduce(_:)): Will use the provided closure for mocking. The closure has the same signature as the mocked function, so for example a function that takes an integer returns a string and can throw will accept a closure of type `(Int) throws -> String`.\n* [`willHandle(_ result:)`](https://kolos65.github.io/Mockable/documentation/mockable/throwingfunctionreturnbuilder/willhandle(_:)): Registers a result type that automatically emits a value when successful or throws a failure. \n\nThe provided return values are used up in FIFO order and the last one is always kept for any further calls. Here are examples of using return clauses:\n```swift\n// Throw an error for the first call and then return 'product' for every other call\ngiven(productService)\n    .fetch(for: .any).willThrow(error)\n    .fetch(for: .any).willReturn(product)\n\n// Throw an error if the id parameter ends with a 0, return a product otherwise\ngiven(productService)\n    .fetch(for: .any).willProduce { id in\n        if id.uuidString.last == \"0\" {\n            throw error\n        } else {\n            return product\n        }\n    }\n```\n\n## When\n\nSide effects can be added using `when(_ service:)` clauses. There are three kind of side effects:\n* [`perform(_ action)`](https://kolos65.github.io/Mockable/documentation/mockable/functionactionbuilder/perform(_:)): Will register an operation to perform on invocations of the mocked function.\n* [`performOnGet(_ action:)`](https://kolos65.github.io/Mockable/documentation/mockable/propertyactionbuilder/performonget(_:)): Available for mutable properties only, will perform the provided operation on property access.\n* [`performOnSet(_ action:)`](https://kolos65.github.io/Mockable/documentation/mockable/propertyactionbuilder/performonset(_:)): Available for mutable properties only, will perform the provided operation on property assignment.\n\nSome examples of using side effects are:\n```swift\n// log calls to fetch(for:)\nwhen(productService).fetch(for: .any).perform {\n    print(\"fetch(for:) was called\")\n}\n\n// log when url is accessed\nwhen(productService).url().performOnGet {\n    print(\"url accessed\")\n}\n\n// log when url is set to nil\nwhen(productService).url(newValue: .value(nil)).performOnSet {\n    print(\"url set to nil\")\n}\n```\n\n## Verify\nYou can verify invocations of your mock service using the `verify(_ service:)` clause.\n\n> **Mockable** supports both *XCTest* and *Swift Testing* by using Pointfree's [swift-issue-reporting](https://github.com/pointfreeco/swift-issue-reporting) to dynamically report test failures with the appropriate test framework.\n\nThere are three kind of verifications:\n* [`called(_:)`](https://kolos65.github.io/Mockable/documentation/mockable/functionverifybuilder/called(_:file:line:)): Asserts invocation count based on the given value.\n* [`getCalled(_:)`](https://kolos65.github.io/Mockable/documentation/mockable/propertyverifybuilder/getcalled(_:file:line:)): Available for mutable properties only, asserts property access count.\n* [`setCalled(_:)`](https://kolos65.github.io/Mockable/documentation/mockable/propertyverifybuilder/setcalled(_:file:line:)): Available for mutable properties only, asserts property assignment count.\n\nHere are some example assertions:\n```swift\nverify(productService)\n    // assert fetch(for:) was called between 1 and 5 times\n    .fetch(for: .any).called(.from(1, to: 5))\n    // assert checkout(with:) was called between exactly 10 times\n    .checkout(with: .any).called(10)\n    // assert url property was accessed at least 2 times\n    .url().get(.moreOrEqual(to: 2))\n    // assert url property was never set to nil\n    .url(newValue: .value(nil)).setCalled(.never)\n```\n\nIf you are testing asynchronous code and cannot write sync assertions you can use the async counterparts of the above verifications:\n* [`calledEventually(_:before:)`](https://kolos65.github.io/Mockable/documentation/mockable/functionverifybuilder/calledeventually(_:before:file:line:)): Wait until timeout or invocation count satisfied.\n* [`getCalledEventually(_:before:)`](https://kolos65.github.io/Mockable/documentation/mockable/propertyverifybuilder/getcalledeventually(_:before:file:line:)): Wait until timeout or property access count satisfied.\n* [`setSalledEventually(_:before:)`](https://kolos65.github.io/Mockable/documentation/mockable/propertyverifybuilder/setcalledeventually(_:before:file:line:)): Wait until timeout or property assignment count satisfied.\n\nHere are some examples of async verifications:\n```swift\nawait verify(productService)\n    // assert fetch(for:) was called between 1 and 5 times before default timeout (1 second)\n    .fetch(for: .any).calledEventually(.from(1, to: 5))\n    // assert checkout(with:) was called between exactly 10 times before 3 seconds\n    .checkout(with: .any).calledEventually(10, before: .seconds(3))\n    // assert url property was accessed at least 2 times before default timeout (1 second)\n    .url().getCalledEventually(.moreOrEqual(to: 2))\n    // assert url property was set to nil once\n    .url(newValue: .value(nil)).setCalledEventually(.once)\n```\n\n## Relaxed Mode\nBy default, you must specify a return value for all requirements; otherwise, a fatal error will be thrown. The reason for this is to aid in the discovery (and thus the verification) of every called function when writing unit tests. \n\nHowever, it is common to prefer avoiding this strict default behavior in favor of a more relaxed setting, where, \nfor example, void or optional return values do not need explicit `given` registration.\n\nUse the Use [`MockerPolicy`](https://kolos65.github.io/Mockable/documentation/mockable/mockerpolicy) (which is an [option set](https://developer.apple.com/documentation/swift/optionset)) to implicitly mock:\n* only one kind of return value: `.relaxedMocked`\n* construct a custom set of policies: `[.relaxedVoid, .relaxedOptional]`\n* or opt for a fully relaxed mode: `.relaxed`.\n\nYou have two options to override the default strict behavior of the library:\n* At **mock implementation level** you can override the mocker policy for each individual mock implementation in the initializer: \n    ```swift\n    let relaxedMock = MockService(policy: [.relaxedOptional, .relaxedVoid])\n    ```\n* At **project level** you can set a custom default policy to use in every scenario by changing the default property of **MockerPolicy**: \n    ```swift\n    MockerPolicy.default = .relaxedVoid\n    ```\n\nThe `.relaxedMocked` policy in combination with the [`Mocked`](https://kolos65.github.io/Mockable/documentation/mockable/mocked) protocol can be used to set an implicit return value for custom (or even built in) types:\n```swift\nstruct Car {\n    var name: String\n    var seats: Int\n}\n\nextension Car: Mocked {\n    static var mock: Car {\n        Car(name: \"Mock Car\", seats: 4)\n    }\n\n    // Defaults to [mock] but we can \n    // provide a custom array of cars:\n    static var mocks: [Car] {\n        [\n            Car(name: \"Mock Car 1\", seats: 4),\n            Car(name: \"Mock Car 2\", seats: 4)\n        ]\n    }\n}\n\n@Mockable\nprotocol CarService {\n    func getCar() -> Car\n    func getCars() -> [Car]\n}\n\nfunc testCarService() {\n    func test() {\n        let mock = MockCarService(policy: .relaxedMocked)\n        // Implictly mocked without a given registration:\n        let car = mock.getCar()\n        let cars = mock.getCars()\n    }\n}\n```\n\n> ⚠️ Relaxed mode will not work with generic return values as the type system is unable to locate the appropriate generic overload.\n\n## Working with non-equatable Types\n**Mockable** uses a [`Matcher`](https://kolos65.github.io/Mockable/documentation/mockable/matcher) internally to compare parameters. \nBy default the matcher is able to compare any custom type that conforms to `Equatable` (except when used in a generic function).\nIn special cases, when you\n* have non-equatable parameter types\n* need testing specific equality logic for a custom type\n* have generic functions that are used with custom concrete types\n\nyou can register your custom types with the `Matcher.register()` functions.\nHere is how to do it:\n```swift\n// register an equatable type to the matcher because we use it in a generic function\nMatcher.register(SomeEquatableType.self)\n\n// register a non-equatable type to the matcher\nMatcher.register(Product.self, match: { $0.name == $1.name })\n\n// register a meta-type to the matcher\nMatcher.register(HomeViewController.Type.self)\n\n// remove all previously registered custom types\nMatcher.reset()\n```\nIf you see this error during tests:\n```\nNo comparator found for type XYZ. All non-equatable types must be \nregistered using Matcher.register(_).\n```\n\nremember to add the noted type to your `Matcher` using the `register()` function.\n"
  },
  {
    "path": "Sources/Mockable/Helpers/Async+Timeout.swift",
    "content": "//\n//  Async+Timeout.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2024. 04. 04..\n//\n\nimport Foundation\n\npublic struct TimeoutError: Error {}\n\n/// Runs an async task with a timeout.\n///\n/// - Parameters:\n///   - maxDuration: The duration in seconds `work` is allowed to run before timing out.\n///   - work: The async operation to perform.\n/// - Returns: Returns the result of `work` if it completed in time.\n/// - Throws: Throws ``TimedOutError`` if the timeout expires before `work` completes.\n///   If `work` throws an error before the timeout expires, that error is propagated to the caller.\n@discardableResult\nfunc withTimeout<Value: Sendable>(\n    after maxDuration: TimeInterval,\n    _ operation: @Sendable @escaping () async throws -> Value\n) async throws -> Value {\n    try await withThrowingTaskGroup(of: Value.self) { group in\n        group.addTask(operation: operation)\n        group.addTask {\n            try await Task.sleep(nanoseconds: UInt64(maxDuration * 1_000_000_000))\n            throw TimeoutError()\n        }\n        let result = try await group.next()! // swiftlint:disable:this force_unwrapping\n        group.cancelAll()\n        return result\n    }\n}\n"
  },
  {
    "path": "Sources/Mockable/Helpers/AsyncSubject.swift",
    "content": "//\n//  AsyncSubject.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2024. 12. 16..\n//\n\nactor AsyncSubject<Element: Sendable>: AsyncSequence {\n\n    typealias Failure = Never\n\n    // MARK: Types\n\n    struct Subscription: Equatable {\n        let id: UInt64\n        let continuation: AsyncStream<Element>.Continuation\n        let stream: AsyncStream<Element>\n        static func == (lhs: Self, rhs: Self) -> Bool { lhs.id == rhs.id }\n    }\n\n    // MARK: Private properties\n\n    private(set) var value: Element\n    private var ids: UInt64 = 0\n    private var subscriptions = [Subscription]()\n\n    // MARK: Init\n\n    init(_ initialValue: Element) {\n        self.value = initialValue\n    }\n\n    deinit {\n        for subscription in subscriptions {\n            subscription.continuation.finish()\n        }\n    }\n\n    func finish() {\n        for subscription in subscriptions {\n            subscription.continuation.finish()\n        }\n        subscriptions.removeAll()\n    }\n\n    nonisolated func makeAsyncIterator() -> AsyncIterator {\n        AsyncIterator(parent: self)\n    }\n\n    func generateId() -> UInt64 {\n        defer { ids &+= 1 }\n        return ids\n    }\n\n    fileprivate func subscribe() -> (Subscription, Element) {\n        let (stream, continuation) = AsyncStream<Element>.makeStream()\n        let subscription = Subscription(id: generateId(), continuation: continuation, stream: stream)\n        subscriptions.append(subscription)\n        return (subscription, value)\n    }\n\n    fileprivate func remove(_ subscription: Subscription) {\n        subscriptions.removeAll { $0 == subscription }\n        subscription.continuation.finish()\n    }\n\n    func send(_ value: Element) {\n        self.value = value\n        for subscription in subscriptions {\n            subscription.continuation.yield(value)\n        }\n    }\n\n    func update(with block: (inout Element) -> Void) {\n        block(&value)\n        send(value)\n    }\n\n    class AsyncIterator: AsyncIteratorProtocol {\n        private weak var parent: AsyncSubject?\n        private var subscription: Subscription?\n        private var iterator: AsyncStream<Element>.AsyncIterator?\n\n        fileprivate init(parent: AsyncSubject) {\n            self.parent = parent\n        }\n\n        deinit {\n            cancelSubscription()\n        }\n\n        func next() async -> Element? {\n            if iterator != nil {\n                return await iterator?.next()\n            } else if let parent {\n                let (subscription, value) = await parent.subscribe()\n                self.subscription = subscription\n                iterator = subscription.stream.makeAsyncIterator()\n                return value\n            } else {\n                return nil\n            }\n        }\n\n        private func cancelSubscription() {\n            guard let parent, let subscription else { return }\n            Task { await parent.remove(subscription) }\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/Mockable/Helpers/LockedValue.swift",
    "content": "//\n//  LockedValue.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2024. 12. 16..\n//\nimport Foundation\n\n/// A generic wrapper for isolating a mutable value with a lock.\n///\n/// If you trust the sendability of the underlying value, consider using ``UncheckedSendable``,\n/// instead.\n@dynamicMemberLookup\nfinal class LockedValue<Value>: @unchecked Sendable {\n    private var _value: Value\n    private let lock = NSRecursiveLock()\n    private var didSet: ((Value) -> Void)?\n\n    /// Initializes lock-isolated state around a value.\n    ///\n    /// - Parameter value: A value to isolate with a lock.\n    init(_ value: @autoclosure @Sendable () throws -> Value) rethrows {\n        self._value = try value()\n    }\n\n    subscript<Subject>(dynamicMember keyPath: KeyPath<Value, Subject>) -> Subject {\n        self.lock.criticalRegion {\n            self._value[keyPath: keyPath]\n        }\n    }\n\n    /// Perform an operation with isolated access to the underlying value.\n    ///\n    /// Useful for modifying a value in a single transaction.\n    ///\n    /// ```swift\n    /// // Isolate an integer for concurrent read/write access:\n    /// var count = LockedValue(0)\n    ///\n    /// func increment() {\n    ///   // Safely increment it:\n    ///   self.count.withValue { $0 += 1 }\n    /// }\n    /// ```\n    ///\n    /// - Parameter operation: An operation to be performed on the the underlying value with a lock.\n    /// - Returns: The result of the operation.\n    func withValue<T>(\n        _ operation: (inout Value) throws -> T\n    ) rethrows -> T {\n        try self.lock.criticalRegion {\n            var value = self._value\n            defer {\n                self._value = value\n                self.didSet?(self._value)\n            }\n            return try operation(&value)\n        }\n    }\n\n    /// Overwrite the isolated value with a new value.\n    ///\n    /// ```swift\n    /// // Isolate an integer for concurrent read/write access:\n    /// var count = LockedValue(0)\n    ///\n    /// func reset() {\n    ///   // Reset it:\n    ///   self.count.setValue(0)\n    /// }\n    /// ```\n    ///\n    /// > Tip: Use ``withValue(_:)`` instead of ``setValue(_:)`` if the value being set is derived\n    /// > from the current value. That is, do this:\n    /// >\n    /// > ```swift\n    /// > self.count.withValue { $0 += 1 }\n    /// > ```\n    /// >\n    /// > ...and not this:\n    /// >\n    /// > ```swift\n    /// > self.count.setValue(self.count + 1)\n    /// > ```\n    /// >\n    /// > ``withValue(_:)`` isolates the entire transaction and avoids data races between reading and\n    /// > writing the value.\n    ///\n    /// - Parameter newValue: The value to replace the current isolated value with.\n    func setValue(_ newValue: @autoclosure () throws -> Value) rethrows {\n        try self.lock.criticalRegion {\n            self._value = try newValue()\n            self.didSet?(self._value)\n        }\n    }\n}\n\nextension LockedValue where Value: Sendable {\n    var value: Value {\n        self.lock.criticalRegion {\n            self._value\n        }\n    }\n\n    /// Initializes lock-isolated state around a value.\n    ///\n    /// - Parameter value: A value to isolate with a lock.\n    /// - Parameter didSet: A callback to invoke when the value changes.\n    convenience init(\n        _ value: @autoclosure @Sendable () throws -> Value,\n        didSet: (@Sendable (Value) -> Void)? = nil\n    ) rethrows {\n        try self.init(value())\n        self.didSet = didSet\n    }\n}\n\nextension NSRecursiveLock {\n    @inlinable @discardableResult\n    func criticalRegion<R>(work: () throws -> R) rethrows -> R {\n        self.lock()\n        defer { self.unlock() }\n        return try work()\n    }\n}\n"
  },
  {
    "path": "Sources/Mockable/Macro/MockableMacro.swift",
    "content": "//\n//  MockableMacro.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 20..\n//\n\n/// A peer macro that generates a mock implementation for the protocol it is attached to.\n///\n/// The generated implementation is named with a \"Mock\" prefix followed by the protocol name.\n/// By default, the generated code is enclosed in an `#if MOCKING` condition, ensuring it is only accessible\n/// in modules where the `MOCKING` compile-time condition is set.\n///\n/// Example usage:\n///\n/// ```swift\n/// @Mockable\n/// protocol UserService {\n///     func get(id: UUID) -> User\n///     func remove(id: UUID) throws\n/// }\n///\n/// var mockUserService: MockUserService\n///\n/// func test() {\n///     let error: UserError = .invalidId\n///     let mockUser = User(id: UUID())\n///\n///     given(mockUserService)\n///         .get(id: .any).willReturn(mockUser)\n///         .remove(id: .any).willThrow(error)\n///\n///     try await loginService.login()\n///\n///     verify(mockUserService)\n///         .get(id: .value(mockUser.id)).called(count: .once)\n///         .remove(id: .any).called(count: .never)\n/// }\n/// ```\n@attached(peer, names: prefixed(Mock))\npublic macro Mockable() = #externalMacro(module: \"MockableMacro\", type: \"MockableMacro\")\n"
  },
  {
    "path": "Sources/Mockable/Matcher/Matcher.swift",
    "content": "//\n//  Matcher.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 14..\n//\n\nimport Foundation\n\n/// A utility for defining matchers used in mock assertions.\npublic class Matcher {\n\n    // MARK: Public Types\n\n    /// A closure type representing a comparator function for elements of type `T`.\n    ///\n    /// - Parameters:\n    ///   - lhs: The left-hand side element for comparison.\n    ///   - rhs: The right-hand side element for comparison.\n    /// - Returns: `true` if the elements match according to the comparison criteria; otherwise, `false`.\n    public typealias Comparator<T> = (T, T) -> Bool\n\n    /// A closure type representing a comparator function for elements of a sequence of type `T`.\n    ///\n    /// - Parameters:\n    ///   - lhs: The left-hand side element for comparison.\n    ///   - rhs: The right-hand side element for comparison.\n    /// - Returns: `true` if the elements match according to the comparison criteria; otherwise, `false`.\n    public typealias ElementComparator<T: Sequence> = (T.Element, T.Element) -> Bool\n\n    // MARK: Private Types\n\n    private typealias MatcherType = (mirror: Mirror, comparator: Any)\n\n    // MARK: Private Properties\n\n    private let matchers = LockedValue<[MatcherType]>([])\n\n    #if swift(>=6)\n    nonisolated(unsafe) private static var `default` = Matcher()\n    #else\n    private static var `default` = Matcher()\n    #endif\n\n    // MARK: Init\n\n    private init() {\n        registerDefaultTypes()\n        registerCustomTypes()\n    }\n\n    // MARK: - Reset\n\n    /// Reset the default state of the matcher by removing all registered types.\n    public static func reset() {\n        `default` = Matcher()\n    }\n\n    // MARK: - Register\n\n    /// Registers comparator for given type **T**.\n    ///\n    /// Comparator is a closure of `(T,T) -> Bool`.\n    ///\n    /// When several comparators for same type  are registered to common\n    /// **Matcher** instance - it will resolve the most receont one.\n    ///\n    /// - Parameters:\n    ///   - valueType: compared type\n    ///   - match: comparator closure\n    public static func register<T>(_ valueType: T.Type, match: @escaping Comparator<T>) {\n        Self.default.register(valueType, match: match)\n    }\n\n    /// Registers comparator for type, like comparing Int.self to Int.self. These types of comparators always returns true. Register like: `Matcher.default.register(CustomType.Type.self)`\n    ///\n    /// - Parameter valueType: Type.Type.self\n    public static func register<T>(_ valueType: T.Type.Type) {\n        Self.default.register(valueType)\n    }\n\n    /// Register default comparator for Equatable types. Required for generic mocks to work.\n    ///\n    /// - Parameter valueType: Equatable type\n    public static func register<T>(_ valueType: T.Type) where T: Equatable {\n        Self.default.register(valueType)\n    }\n\n    // MARK: - Comparator\n\n    /// Returns comparator closure for given type (if any).\n    ///\n    /// Comparator is a closure of `(T,T) -> Bool`.\n    ///\n    /// When several comparators for same type  are registered to common\n    /// **Matcher** instance - it will resolve the most receont one.\n    ///\n    /// - Parameter valueType: compared type\n    /// - Returns: comparator closure\n    public static func comparator<T>(for valueType: T.Type) -> Comparator<T>? {\n        Self.default.comparator(for: valueType)\n    }\n\n    /// Default Equatable comparator, compares if elements are equal.\n    ///\n    /// - Parameter valueType: Equatable type\n    /// - Returns: comparator closure\n    public static func comparator<T>(for valueType: T.Type) -> Comparator<T>? where T: Equatable {\n        Self.default.comparator(for: valueType)\n    }\n\n    /// Default Equatable Sequence comparator, compares count, and then for every element equal element.\n    ///\n    /// - Parameter valueType: Equatable Sequence type\n    /// - Returns: comparator closure\n    public static func comparator<T>(for valueType: T.Type) -> Comparator<T>? where T: Equatable, T: Sequence {\n        Self.default.comparator(for: valueType)\n    }\n\n    /// Default Sequence comparator, compares count, and then depending on sequence type:\n    /// - for Arrays, elements will be compared element by element (verifying order as well)\n    /// - other Sequences would be treated as unordered, so every element has to have matching element\n    ///\n    /// - Parameter valueType: Sequence type\n    /// - Returns: comparator closure\n    public static func comparator<T>(for valueType: T.Type) -> Comparator<T>? where T: Sequence {\n        Self.default.comparator(for: valueType)\n    }\n}\n\n// MARK: - Register\n\nextension Matcher {\n    private func register<T>(_ valueType: T.Type, match: @escaping Comparator<T>) {\n        let mirror = Mirror(reflecting: valueType)\n        matchers.withValue { $0.append((mirror, match as Any)) }\n    }\n\n    private func register<T>(_ valueType: T.Type.Type) {\n        register(valueType, match: { _, _ in true })\n    }\n\n    private func register<T>(_ valueType: T.Type) where T: Equatable {\n        let mirror = Mirror(reflecting: valueType)\n        let comparator = comparator(for: T.self)\n        matchers.withValue { $0.append((mirror, comparator as Any)) }\n    }\n}\n\n// MARK: - Comparator\n\nextension Matcher {\n    private func comparator<T>(for valueType: T.Type) -> Comparator<T>? {\n        let mirror = Mirror(reflecting: valueType)\n        return comparator(by: mirror) as? (T, T) -> Bool\n    }\n\n    private func comparator<T>(for valueType: T.Type) -> Comparator<T>? where T: Equatable {\n        { $0 == $1 }\n    }\n\n    private func comparator<T>(for valueType: T.Type) -> Comparator<T>? where T: Equatable, T: Sequence {\n        { $0 == $1 }\n    }\n\n    private func comparator<T>(for valueType: T.Type) -> Comparator<T>? where T: Sequence {\n        let mirror = Mirror(reflecting: valueType)\n        if let directComparator = comparator(by: mirror) as? Comparator<T> {\n            return directComparator\n        }\n\n        guard let elementComparator = comparator(for: T.Element.self) else {\n            return nil\n        }\n\n        return sequenceComparator(for: valueType, elementComparator: elementComparator)\n    }\n}\n\n// MARK: - Helpers\n\nextension Matcher {\n    private func comparator(by mirror: Mirror) -> Any? {\n        let snapshot = matchers.withValue { $0 }\n        return snapshot.reversed().first { matcher -> Bool in\n            matcher.mirror.subjectType == mirror.subjectType\n        }?.comparator\n    }\n\n    private func sequenceComparator<T: Sequence>(\n        for valueType: T.Type,\n        elementComparator: @escaping ElementComparator<T>\n    ) -> Comparator<T>? {\n        { (left: T, right: T) -> Bool in\n            let left = Array(left)\n            let right = Array(right)\n\n            guard left.count == right.count else { return false }\n\n            if valueType is [T.Element].Type {\n                return self.orderedCompare(left: left, right: right, comparator: elementComparator)\n            } else {\n                return self.unorderedCompare(left: left, right: right, comparator: elementComparator)\n            }\n        }\n    }\n\n    private func orderedCompare<T>(left: [T], right: [T], comparator: Comparator<T>) -> Bool {\n        left.enumerated().allSatisfy { index, element in\n            comparator(element, right[index])\n        }\n    }\n\n    private func unorderedCompare<T>(left: [T], right: [T], comparator: Comparator<T>) -> Bool {\n        var buffer = right\n        for element in left {\n            let index = buffer.firstIndex { comparator(element, $0) }\n            guard let index else { return false }\n            buffer.remove(at: index)\n        }\n        return buffer.isEmpty\n    }\n}\n\n// MARK: - Defaults\n\nextension Matcher {\n    private func registerCustomTypes() {\n        register(GenericValue.self) { left, right -> Bool in\n            left.comparator(left.value, right.value)\n        }\n    }\n\n    private func registerDefaultTypes() {\n        registerBasicTypes()\n        registerArrays()\n        registerMetaTypes()\n    }\n\n    private func registerBasicTypes() {\n        register(Bool.self)\n        register(String.self)\n        register(Float.self)\n        register(Double.self)\n        register(Character.self)\n        register(Int.self)\n        register(Int8.self)\n        register(Int16.self)\n        register(Int32.self)\n        register(Int64.self)\n        register(UInt.self)\n        register(UInt8.self)\n        register(UInt16.self)\n        register(UInt32.self)\n        register(UInt64.self)\n        register(Data.self)\n        register(UUID.self)\n        register(Bool?.self)\n        register(String?.self)\n        register(Float?.self)\n        register(Double?.self)\n        register(Character?.self)\n        register(Int?.self)\n        register(Int8?.self)\n        register(Int16?.self)\n        register(Int32?.self)\n        register(Int64?.self)\n        register(UInt?.self)\n        register(UInt8?.self)\n        register(UInt16?.self)\n        register(UInt32?.self)\n        register(UInt64?.self)\n        register(Data?.self)\n        register(UUID?.self)\n    }\n\n    private func registerArrays() {\n        register([Bool].self)\n        register([String].self)\n        register([Float].self)\n        register([Double].self)\n        register([Character].self)\n        register([Int].self)\n        register([Int8].self)\n        register([Int16].self)\n        register([Int32].self)\n        register([Int64].self)\n        register([UInt].self)\n        register([UInt8].self)\n        register([UInt16].self)\n        register([UInt32].self)\n        register([UInt64].self)\n        register([Data].self)\n        register([UUID].self)\n        register([Bool?].self)\n        register([String?].self)\n        register([Float?].self)\n        register([Double?].self)\n        register([Character?].self)\n        register([Int?].self)\n        register([Int8?].self)\n        register([Int16?].self)\n        register([Int32?].self)\n        register([Int64?].self)\n        register([UInt?].self)\n        register([UInt8?].self)\n        register([UInt16?].self)\n        register([UInt32?].self)\n        register([UInt64?].self)\n        register([Data?].self)\n        register([UUID?].self)\n    }\n\n    private func registerMetaTypes() {\n        register(Any.Type.self) { _, _ in true }\n        register(Bool.Type.self)\n        register(String.Type.self)\n        register(Float.Type.self)\n        register(Double.Type.self)\n        register(Character.Type.self)\n        register(Int.Type.self)\n        register(Int8.Type.self)\n        register(Int16.Type.self)\n        register(Int32.Type.self)\n        register(Int64.Type.self)\n        register(UInt.Type.self)\n        register(UInt8.Type.self)\n        register(UInt16.Type.self)\n        register(UInt32.Type.self)\n        register(UInt64.Type.self)\n        register(Data.Type.self)\n        register(Any?.Type.self) { _, _ in true }\n        register(Bool?.Type.self)\n        register(String?.Type.self)\n        register(Float?.Type.self)\n        register(Double?.Type.self)\n        register(Character?.Type.self)\n        register(Int?.Type.self)\n        register(Int8?.Type.self)\n        register(Int16?.Type.self)\n        register(Int32?.Type.self)\n        register(Int64?.Type.self)\n        register(UInt?.Type.self)\n        register(UInt8?.Type.self)\n        register(UInt16?.Type.self)\n        register(UInt32?.Type.self)\n        register(UInt64?.Type.self)\n        register(Data?.Type.self)\n    }\n}\n"
  },
  {
    "path": "Sources/Mockable/Mocker/CaseIdentifiable.swift",
    "content": "//\n//  CaseIdentifiable.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 22..\n//\n\n/// A protocol for enumerations that can be identified by a unique identifier.\n///\n/// Enumerations conforming to `CaseIdentifiable` must provide a computed property `id`\n/// that returns a unique identifier, typically derived from the type name.\npublic protocol CaseIdentifiable: Equatable, Hashable {\n    /// A computed property that returns a unique identifier for the case.\n    var id: String { get }\n\n    /// A computed property that returns a human readably name for member enum cases.\n    var name: String { get }\n\n    /// A computed property that returns a human readably description of member parameters.\n    var parameters: String { get }\n}\n\nextension CaseIdentifiable {\n    /// A default implementation of the `id` property, deriving the identifier from the case name.\n    ///\n    /// The default implementation removes any additional information such as parameters\n    /// by splitting the type name at the opening parenthesis.\n    public var id: String {\n        String(String(describing: self).split(separator: \"(\")[0])\n    }\n\n    /// A default implementation of the `name` property, deriving a human readable name for member enum cases.\n    public var name: String {\n        guard let lastToken = id.split(separator: \"_\").last else { return id }\n        return String(lastToken)\n    }\n\n    /// A default implementation of the `parameters` property, deriving a human readable name for member parameters.\n    public var parameters: String {\n        let description = String(describing: self)\n        guard let index = description.firstIndex(of: \"(\")  else { return \"no parameters\" }\n        return String(description[index...])\n    }\n}\n\nextension CaseIdentifiable {\n    /// Compares two `CaseIdentifiable` instances for equality based on their unique identifiers.\n    ///\n    /// - Parameters:\n    ///   - lhs: The left-hand side `CaseIdentifiable`.\n    ///   - rhs: The right-hand side `CaseIdentifiable`.\n    /// - Returns: `true` if the instances have the same identifier; otherwise, `false`.\n    public static func == (lhs: Self, rhs: Self) -> Bool {\n        lhs.id == rhs.id\n    }\n\n    /// Hashes a `CaseIdentifiable` instance using its unique identifier.\n    ///\n    /// - Parameter hasher: The hasher to use for combining the hash value.\n    public func hash(into hasher: inout Hasher) {\n        hasher.combine(id)\n    }\n}\n"
  },
  {
    "path": "Sources/Mockable/Mocker/Matchable.swift",
    "content": "//\n//  Matchable.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 14..\n//\n\n/// A protocol for types that can be used as matchers in mock assertions.\npublic protocol Matchable {\n    /// Determines if the receiver matches another instance of the same type according to custom criteria.\n    ///\n    /// - Parameter other: The instance to compare against.\n    /// - Returns: `true` if the receiver matches the specified instance; otherwise, `false`.\n    func match(_ other: Self) -> Bool\n}\n"
  },
  {
    "path": "Sources/Mockable/Mocker/MemberAction.swift",
    "content": "//\n//  MemberAction.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 14..\n//\n\n/// A class representing an action to be performed on a member.\n///\n/// `MemberAction` associates a member of type `Member` with a closure (`action`)\n/// that can be executed when needed.\npublic class MemberAction<Member> {\n    /// The member associated with the action.\n    public let member: Member\n\n    /// The closure representing the action to be performed.\n    public let action: () -> Void\n\n    /// Initializes a new instance of `MemberAction`.\n    ///\n    /// - Parameters:\n    ///   - member: The member to associate with the action.\n    ///   - action: The closure representing the action to be performed.\n    public init(member: Member, action: @escaping () -> Void) {\n        self.member = member\n        self.action = action\n    }\n}\n"
  },
  {
    "path": "Sources/Mockable/Mocker/MemberReturn.swift",
    "content": "//\n//  MemberReturn.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 14..\n//\n\n/// A class representing the return value associated with a member.\n///\n/// `MemberReturn` associates a member of type `Member` with a `ReturnValue` object,\n/// encapsulating the information about the expected return value or behavior.\npublic class MemberReturn<Member> {\n    /// The member associated with the return value.\n    public let member: Member\n\n    /// The `ReturnValue` object encapsulating information about the expected return value or behavior.\n    public let returnValue: ReturnValue\n\n    /// Initializes a new instance of `MemberReturn`.\n    ///\n    /// - Parameters:\n    ///   - member: The member to associate with the return value.\n    ///   - returnValue: The `ReturnValue` object representing the expected return value or behavior.\n    public init(member: Member, returnValue: ReturnValue) {\n        self.member = member\n        self.returnValue = returnValue\n    }\n}\n"
  },
  {
    "path": "Sources/Mockable/Mocker/Mocked.swift",
    "content": "//\n//  Mocked.swift\n//  Mocked\n//\n//  Created by Kolos Foltanyi on 2024. 04. 03..\n//\n\n/// A protocol that represents auto-mocked types.\n///\n/// `Mocked` in combination with a `relaxedMocked` option of `MockerPolicy `can be used\n/// to set an implicit return value for custom types:\n///\n/// ```swift\n/// struct Car {\n///     var name: String\n///     var seats: Int\n/// }\n///\n/// extension Car: Mocked {\n///     static var mock: Car {\n///         Car(name: \"Mock Car\", seats: 4)\n///     }\n///\n///     // Defaults to [mock] but we can \n///     // provide a custom array of cars:\n///     static var mocks: [Car] {\n///         [\n///             Car(name: \"Mock Car 1\", seats: 4),\n///             Car(name: \"Mock Car 2\", seats: 4)\n///         ]\n///     }\n/// }\n///\n/// @Mockable\n/// protocol CarService {\n///     func getCar() -> Car\n///     func getCars() -> [Car]\n/// }\n///\n/// func testCarService() {\n///     func test() {\n///         let mock = MockCarService(policy: .relaxedMocked)\n///         // Implictly mocked without a given registration:\n///         let car = mock.getCar()\n///         let cars = mock.getCars()\n///     }\n/// }\n/// ```\npublic protocol Mocked {\n    /// A default mock return value to use when `.relaxedMocked` policy is set.\n    static var mock: Self { get }\n\n    /// An array of mock values to use as return values when `.relaxedMocked` policy is set.\n    /// Defaults to `[Self.mock]`.\n    static var mocks: [Self] { get }\n}\n\nextension Mocked {\n    public static var mocks: [Self] { [mock] }\n}\n\nextension Array: Mocked where Element: Mocked {\n    public static var mock: Self {\n        Element.mocks\n    }\n}\n\nextension Optional: Mocked where Wrapped: Mocked {\n    public static var mock: Self { Wrapped.mock }\n}\n"
  },
  {
    "path": "Sources/Mockable/Mocker/Mocker.swift",
    "content": "//\n//  Mocker.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 14..\n//\n\nimport Foundation\nimport IssueReporting\n\n/// A class responsible for mocking and verifying interactions with a mockable service.\n///\n/// The `Mocker` class keeps track of invocations, expected return values, and actions associated with\n/// specific members of a mockable service.\npublic class Mocker<Service: MockableService>: @unchecked Sendable {\n\n    // MARK: Public Properties\n\n    /// The associated type representing a member of the mockable service.\n    public typealias Member = Service.Member\n    /// The associated type representing the return value of a member.\n    public typealias Return = Service.Return\n    /// The associated type representing an action to be performed on a member.\n    public typealias Action = Service.Action\n    /// Custom relaxation policy to use when missing return values.\n    public var policy: MockerPolicy?\n\n    // MARK: Private Properties\n\n    /// Dictionary to store expected return values for each member.\n    private var returns = LockedValue<[Member: [Return]]>([:])\n    /// Dictionary to store actions to be performed on each member.\n    private var actions = LockedValue<[Member: [Action]]>([:])\n    /// Array to store invocations of members.\n    private lazy var invocations = LockedValue<[Member]>([]) { [invocationsSubject] newValue in\n        Task {\n            #if swift(>=6.0) && !swift(>=6.1)\n            invocationsSubject.send(newValue)\n            #else\n            await invocationsSubject.send(newValue)\n            #endif\n        }\n    }\n\n    /// Subject to track invocations.\n    private var invocationsSubject = AsyncSubject<[Member]>([])\n\n    /// Resolved relaxation policy to use when missing return values.\n    private var currentPolicy: MockerPolicy {\n        policy ?? .default\n    }\n\n    // MARK: Init\n\n    /// Initializes a new instance of `Mocker`.\n    public init(policy: MockerPolicy? = nil) {\n        self.policy = policy\n    }\n\n    // MARK: Public Methods\n\n    /// Adds an invocation for a member to the list of invocations.\n    ///\n    /// - Parameter member: The member for which the invocation is added.\n    public func addInvocation(for member: Member) {\n        invocations.withValue { invocations in\n            invocations.append(member)\n        }\n    }\n\n    /// Specifies an expected return value for a member.\n    ///\n    /// - Parameters:\n    ///   - member: The member for which the return value is specified.\n    ///   - returnValue: The expected return value.\n    public func addReturnValue(_ returnValue: ReturnValue, for member: Member) {\n        let given = Return(member: member, returnValue: returnValue)\n        returns.withValue { returns in\n            returns[member] = (returns[member] ?? []) + [given]\n        }\n    }\n\n    /// Specifies an action to be performed on a member.\n    ///\n    /// - Parameters:\n    ///   - member: The member for which the action is specified.\n    ///   - action: The action to be performed.\n    public func addAction(_ action: @escaping () -> Void, for member: Member) {\n        let action = Action(member: member, action: action)\n        actions.withValue { actions in\n            actions[action.member] = (actions[action.member] ?? []) + [action]\n        }\n    }\n\n    /// Verifies the number of times a member has been called.\n    ///\n    /// - Parameters:\n    ///   - member: The member to verify.\n    ///   - count: The expected number of invocations.\n    public func verify(member: Member,\n                       count: Count,\n                       fileID: StaticString = #fileID,\n                       filePath: StaticString = #filePath,\n                       line: UInt = #line,\n                       column: UInt = #column) {\n        let matches = invocations.value.filter(member.match)\n        let message = \"\"\"\n        Expected \\(count) invocation(s) of \\(member.name), but was \\(matches.count).\",\n        \"\"\"\n        guard count.satisfies(matches.count) else {\n            reportIssue(message, fileID: fileID, filePath: filePath, line: line, column: column)\n            return\n        }\n    }\n\n    /// Verifies the number of times a member should be called.\n    ///\n    /// - Parameters:\n    ///   - member: The member to verify.\n    ///   - count: The expected number of invocations.\n    ///   - timeout: The maximum time it will wait for assertion to be true\n    public func verify(member: Member,\n                       count: Count,\n                       timeout: TimeoutDuration,\n                       fileID: StaticString = #fileID,\n                       filePath: StaticString = #filePath,\n                       line: UInt = #line,\n                       column: UInt = #column) async {\n        do {\n            try await withTimeout(after: timeout.duration) { [invocationsSubject] in\n                for await invocations in invocationsSubject {\n                    let matches = invocations.filter(member.match)\n                    if count.satisfies(matches.count) {\n                        break\n                    } else {\n                        continue\n                    }\n                }\n            }\n        } catch {\n            let matches = invocations.value.filter(member.match)\n            let message = \"\"\"\n            Expected \\(count) invocation(s) of \\(member.name) before \\(timeout.duration) s, but was \\(matches.count).\n            \"\"\"\n            guard count.satisfies(matches.count) else {\n                reportIssue(message, fileID: fileID, filePath: filePath, line: line, column: column)\n                return\n            }\n        }\n    }\n\n    /// Resets the state of the mocker.\n    ///\n    /// - Parameter scopes: The set of scopes to reset (given, effect, verify).\n    public func reset(scopes: Set<MockerScope>) {\n        MockerScope.allCases.forEach { scope in\n            guard scopes.contains(scope) else { return }\n            switch scope {\n            case .given:\n                returns.setValue([:])\n            case .when:\n                actions.setValue([:])\n            case .verify:\n                invocations.setValue([])\n            }\n        }\n    }\n\n    /// Performs actions associated with a member.\n    ///\n    /// - Parameter member: The member for which actions should be performed.\n    public func performActions(for member: Member) {\n        actions.withValue { actions in\n            guard let actions = actions[member] else { return }\n            let matches = actions.filter { member.match($0.member) }\n            matches.forEach { $0.action() }\n        }\n    }\n\n    /// Mocks a member, performing associated actions and providing the expected return value.\n    ///\n    /// - Parameters:\n    ///   - member: The member to mock.\n    ///   - producerResolver: A closure resolving the produced value.\n    /// - Returns: The expected return value.\n    @discardableResult\n    public func mock<V>(_ member: Member, producerResolver: (Any) throws -> V) -> V {\n        // swiftlint:disable:next force_try\n        return try! mock(member, producerResolver, .none)\n    }\n\n    /// Mocks a throwing member, performing associated actions and providing the expected return value.\n    ///\n    /// - Parameters:\n    ///   - member: The member to mock.\n    ///   - producerResolver: A closure resolving the produced value.\n    /// - Returns: The expected return value.\n    @discardableResult\n    public func mockThrowing<V>(_ member: Member, producerResolver: (Any) throws -> V) throws -> V {\n        return try mock(member, producerResolver, .none)\n    }\n\n    #if swift(>=6)\n    /// Mocks a throwing member, performing associated actions and providing the expected return value.\n    ///\n    /// - Parameters:\n    ///   - member: The member to mock.\n    ///   - producerResolver: A closure resolving the produced value.\n    /// - Returns: The expected return value.\n    @discardableResult\n    public func mockThrowing<V, E>(_ member: Member,\n                                   error: E.Type,\n                                   producerResolver: (Any) throws -> V) throws(E) -> V {\n        do {\n            return try mock(member, producerResolver, .none)\n        } catch {\n            throw error as! E // swiftlint:disable:this force_cast\n        }\n    }\n    #endif\n}\n\n// MARK: - Helpers\n\nextension Mocker {\n    private func mock<V>(\n        _ member: Member,\n        _ producerResolver: (Any) throws -> V,\n        _ fallback: MockerFallback<V>\n    ) throws -> V {\n        addInvocation(for: member)\n        performActions(for: member)\n\n        // swiftlint:disable:next closure_body_length\n        return try returns.withValue { returns in\n            let matchCount = returns[member]?\n                .filter { member.match($0.member) }\n                .count ?? 0\n\n            guard var candidates = returns[member], matchCount != 0 else {\n                if case .value(let value) = fallback {\n                    return value\n                } else {\n                    let message = notMockedMessage(member, value: V.self)\n                    reportIssue(message)\n                    fatalError(message)\n                }\n            }\n\n            for index in candidates.indices {\n                let match = candidates[index]\n                guard member.match(match.member) else { continue }\n\n                let removeMatch: (inout [Member: [Return]]) -> Void = { returns in\n                    guard matchCount > 1 else { return }\n                    candidates.remove(at: index)\n                    returns[member] = candidates\n                }\n                switch match.returnValue {\n                case .return(let value):\n                    guard let value = value as? V else { continue }\n                    removeMatch(&returns)\n                    return value\n                case .throw(let error):\n                    removeMatch(&returns)\n                    throw error\n                case .produce(let producer):\n                    do {\n                        let value = try producerResolver(producer)\n                        removeMatch(&returns)\n                        return value\n                    } catch ProducerCastError.typeMismatch {\n                        continue\n                    } catch {\n                        removeMatch(&returns)\n                        throw error\n                    }\n                }\n            }\n            let message = genericNotMockedMessage(member, value: V.self)\n            reportIssue(message)\n            fatalError(message)\n        }\n    }\n}\n\n// MARK: - Error Messages\n\nextension Mocker {\n    private func notMockedMessage<V>(_ member: Member, value: V.Type) -> String {\n        \"\"\"\n        No return value found for member \"\\(member.name)\" of \"\\(Service.self)\" \\\n        with parameter conditions: \\(member.parameters) \\\n        At least one return value of type \"\\(V.self)\" must be provided \\\n        matching the given parameters. Use a \"given\" clause to provide return values.\n        \"\"\"\n    }\n\n    private func genericNotMockedMessage<V>(_ member: Member, value: V.Type) -> String {\n        \"\"\"\n        No generic return value of type \\(V.self) found for member \"\\(member.name)\" of \"\\(Service.self)\" \\\n        with parameter conditions: \\(member.parameters) \\\n        At least one return value of type \"\\(V.self)\" must be provided \\\n        matching the given parameters. Use a \"given\" clause to provide return values.\n        \"\"\"\n    }\n}\n\n// MARK: - Void\n\nextension Mocker {\n    /// Mocks a member, performing associated actions and providing the expected return value.\n    ///\n    /// - Parameters:\n    ///   - member: The member to mock.\n    ///   - producerResolver: A closure resolving the produced value.\n    /// - Returns: The expected return value.\n    public func mock(_ member: Member, producerResolver: (Any) throws -> Void) {\n        let relaxed = currentPolicy.contains(.relaxedNonThrowingVoid)\n        // swiftlint:disable:next force_try\n        return try! mock(member, producerResolver, relaxed ? .value(()) : .none)\n    }\n\n    /// Mocks a throwing member, performing associated actions and providing the expected return value.\n    ///\n    /// - Parameters:\n    ///   - member: The member to mock.\n    ///   - producerResolver: A closure resolving the produced value.\n    /// - Returns: The expected return value.\n    public func mockThrowing(_ member: Member, producerResolver: (Any) throws -> Void) throws {\n        let relaxed = currentPolicy.contains(.relaxedThrowingVoid)\n        return try mock(member, producerResolver, relaxed ? .value(()) : .none)\n    }\n\n    #if swift(>=6)\n    /// Mocks a throwing member, performing associated actions and providing the expected return value.\n    ///\n    /// - Parameters:\n    ///   - member: The member to mock.\n    ///   - producerResolver: A closure resolving the produced value.\n    /// - Returns: The expected return value.\n    public func mockThrowing<E>(_ member: Member,\n                                error: E.Type,\n                                producerResolver: (Any) throws -> Void) throws(E) {\n        do {\n            let relaxed = currentPolicy.contains(.relaxedThrowingVoid)\n            return try mock(member, producerResolver, relaxed ? .value(()) : .none)\n        } catch {\n            throw error as! E // swiftlint:disable:this force_cast\n        }\n    }\n    #endif\n}\n\n// MARK: - Optional\n\nextension Mocker {\n    /// Mocks a member, performing associated actions and providing the expected return value.\n    ///\n    /// - Parameters:\n    ///   - member: The member to mock.\n    ///   - producerResolver: A closure resolving the produced value.\n    /// - Returns: The expected return value.\n    @discardableResult\n    public func mock<V>(\n        _ member: Member,\n        producerResolver: (Any) throws -> V\n    ) -> V where V: ExpressibleByNilLiteral {\n        let relaxed = currentPolicy.contains(.relaxedOptional)\n        // swiftlint:disable:next force_try\n        return try! mock(member, producerResolver, relaxed ? .value(nil) : .none)\n    }\n\n    /// Mocks a throwing member, performing associated actions and providing the expected return value.\n    ///\n    /// - Parameters:\n    ///   - member: The member to mock.\n    ///   - producerResolver: A closure resolving the produced value.\n    /// - Returns: The expected return value.\n    @discardableResult\n    public func mockThrowing<V>(\n        _ member: Member,\n        producerResolver: (Any) throws -> V\n    ) throws -> V where V: ExpressibleByNilLiteral {\n        let relaxed = currentPolicy.contains(.relaxedOptional)\n        return try mock(member, producerResolver, relaxed ? .value(nil) : .none)\n    }\n\n    #if swift(>=6)\n    /// Mocks a throwing member, performing associated actions and providing the expected return value.\n    ///\n    /// - Parameters:\n    ///   - member: The member to mock.\n    ///   - producerResolver: A closure resolving the produced value.\n    /// - Returns: The expected return value.\n    @discardableResult\n    public func mockThrowing<V, E>(\n        _ member: Member,\n        error: E.Type,\n        producerResolver: (Any) throws -> V\n    ) throws(E) -> V where V: ExpressibleByNilLiteral {\n        do {\n            let relaxed = currentPolicy.contains(.relaxedThrowingVoid)\n            return try mock(member, producerResolver, relaxed ? .value(nil) : .none)\n        } catch {\n            throw error as! E // swiftlint:disable:this force_cast\n        }\n    }\n    #endif\n}\n\n// MARK: - Mockable\n\nextension Mocker {\n    /// Mocks a member, performing associated actions and providing the expected return value.\n    ///\n    /// - Parameters:\n    ///   - member: The member to mock.\n    ///   - producerResolver: A closure resolving the produced value.\n    /// - Returns: The expected return value.\n    @discardableResult\n    public func mock<V>(\n        _ member: Member,\n        producerResolver: (Any) throws -> V\n    ) -> V where V: Mocked {\n        let relaxed = currentPolicy.contains(.relaxedMocked)\n        // swiftlint:disable:next force_try\n        return try! mock(member, producerResolver, relaxed ? .value(.mock) : .none)\n    }\n\n    /// Mocks a throwing member, performing associated actions and providing the expected return value.\n    ///\n    /// - Parameters:\n    ///   - member: The member to mock.\n    ///   - producerResolver: A closure resolving the produced value.\n    /// - Returns: The expected return value.\n    @discardableResult\n    public func mockThrowing<V>(\n        _ member: Member,\n        producerResolver: (Any) throws -> V\n    ) throws -> V where V: Mocked {\n        let relaxed = currentPolicy.contains(.relaxedMocked)\n        return try mock(member, producerResolver, relaxed ? .value(.mock) : .none)\n    }\n\n    #if swift(>=6)\n    /// Mocks a throwing member, performing associated actions and providing the expected return value.\n    ///\n    /// - Parameters:\n    ///   - member: The member to mock.\n    ///   - producerResolver: A closure resolving the produced value.\n    /// - Returns: The expected return value.\n    @discardableResult\n    public func mockThrowing<V, E>(\n        _ member: Member,\n        error: E,\n        producerResolver: (Any) throws -> V\n    ) throws(E) -> V where V: Mocked {\n        do {\n            let relaxed = currentPolicy.contains(.relaxedMocked)\n            return try mock(member, producerResolver, relaxed ? .value(.mock) : .none)\n        } catch {\n            throw error as! E // swiftlint:disable:this force_cast\n        }\n    }\n    #endif\n}\n\n// MARK: - Mockable + Optional\n\nextension Mocker {\n    /// Mocks a member, performing associated actions and providing the expected return value.\n    ///\n    /// - Parameters:\n    ///   - member: The member to mock.\n    ///   - producerResolver: A closure resolving the produced value.\n    /// - Returns: The expected return value.\n    @discardableResult\n    public func mock<V>(\n        _ member: Member,\n        producerResolver: (Any) throws -> V\n    ) -> V where V: Mocked, V: ExpressibleByNilLiteral {\n        // swiftlint:disable force_try\n        if currentPolicy.contains(.relaxedMocked) {\n            return try! mock(member, producerResolver, .value(.mock))\n        } else if currentPolicy.contains(.relaxedOptional) {\n            return try! mock(member, producerResolver, .value(nil))\n        } else {\n            return try! mock(member, producerResolver, .none)\n        }\n        // swiftlint:enable force_try\n    }\n\n    /// Mocks a throwing member, performing associated actions and providing the expected return value.\n    ///\n    /// - Parameters:\n    ///   - member: The member to mock.\n    ///   - producerResolver: A closure resolving the produced value.\n    /// - Returns: The expected return value.\n    @discardableResult\n    public func mockThrowing<V>(\n        _ member: Member,\n        producerResolver: (Any) throws -> V\n    ) throws -> V where V: Mocked, V: ExpressibleByNilLiteral {\n        if currentPolicy.contains(.relaxedMocked) {\n            return try mock(member, producerResolver, .value(.mock))\n        } else if currentPolicy.contains(.relaxedOptional) {\n            return try mock(member, producerResolver, .value(nil))\n        } else {\n            return try mock(member, producerResolver, .none)\n        }\n    }\n\n    #if swift(>=6)\n    /// Mocks a throwing member, performing associated actions and providing the expected return value.\n    ///\n    /// - Parameters:\n    ///   - member: The member to mock.\n    ///   - producerResolver: A closure resolving the produced value.\n    /// - Returns: The expected return value.\n    @discardableResult\n    public func mockThrowing<V, E>(\n        _ member: Member,\n        error: E.Type,\n        producerResolver: (Any) throws -> V\n    ) throws(E) -> V where V: Mocked, V: ExpressibleByNilLiteral {\n        do {\n            if currentPolicy.contains(.relaxedMocked) {\n                return try mock(member, producerResolver, .value(.mock))\n            } else if currentPolicy.contains(.relaxedOptional) {\n                return try mock(member, producerResolver, .value(nil))\n            } else {\n                return try mock(member, producerResolver, .none)\n            }\n        } catch {\n            throw error as! E // swiftlint:disable:this force_cast\n        }\n    }\n    #endif\n}\n"
  },
  {
    "path": "Sources/Mockable/Mocker/MockerFallback.swift",
    "content": "//\n//  MockerFallback.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2024. 03. 17..\n//\n\n/// Describes an optional default value to use when no stored\n/// return value found during mocking.\nenum MockerFallback<V> {\n    /// Specifies a default value to be used when no stored return value is found.\n    case value(V)\n\n    /// Specifies that no default value should be used when no stored return value is found.\n    /// This results in a fatal error. This is the default behavior.\n    case none\n}\n"
  },
  {
    "path": "Sources/Mockable/Mocker/MockerPolicy.swift",
    "content": "//\n//  MockerPolicy.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2024. 04. 01..\n//\n\n/// A policy that controls how the library handles when no return value is found during mocking.\n///\n/// MockerPolicy can be used to customize mocking behavior and disable the requirement of\n/// return value registration in case of certain types.\npublic struct MockerPolicy: OptionSet, Sendable {\n    /// Default policy to use when none was explicitly specified for a mock.\n    ///\n    /// Change this property to set the default policy to use for all mocks. Defaults to `strict`.\n    #if swift(>=6)\n    nonisolated(unsafe) public static var `default`: Self = .strict\n    #else\n    public static var `default`: Self = .strict\n    #endif\n\n    /// All return values must be registered, a fatal error will occur otherwise.\n    public static let strict: Self = []\n\n    /// Every literal expressible requirement will return a default value.\n    public static let relaxed: Self = [\n        .relaxedOptional,\n        .relaxedThrowingVoid,\n        .relaxedNonThrowingVoid,\n        .relaxedMocked\n    ]\n\n    /// Every void function will run normally without a registration\n    public static let relaxedVoid: Self = [\n        .relaxedNonThrowingVoid,\n        .relaxedThrowingVoid\n    ]\n\n    /// Throwing Void functions will run without return value registration.\n    public static let relaxedThrowingVoid = Self(rawValue: 1 << 0)\n\n    /// Non-throwing Void functions will run without return value registration.\n    public static let relaxedNonThrowingVoid = Self(rawValue: 1 << 1)\n\n    /// Optional return values will default to nil.\n    public static let relaxedOptional = Self(rawValue: 1 << 2)\n\n    /// Types conforming to the `Mocked` protocol will default to their mock value.\n    public static let relaxedMocked = Self(rawValue: 1 << 3)\n\n    /// Option set raw value.\n    public let rawValue: Int\n\n    /// Creates a new option set from the given raw value.\n    public init(rawValue: Int) {\n        self.rawValue = rawValue\n    }\n}\n"
  },
  {
    "path": "Sources/Mockable/Mocker/MockerScope.swift",
    "content": "//\n//  MockerScope.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 21..\n//\n\n/// An enumeration representing different scopes of the Mocker state.\n///\n/// Scopes can be used to only reset specific states of a mock service.\npublic enum MockerScope: CaseIterable {\n    /// The scope for storing expected return values.\n    case given\n    /// The scope for storing actions to be performed on members.\n    case when\n    /// The scope for storing invocations to be verified.\n    case verify\n}\n\nextension Set where Element == MockerScope {\n    /// A convenience property representing a set containing all available scopes.\n    public static var all: Self { Set(MockerScope.allCases) }\n}\n"
  },
  {
    "path": "Sources/Mockable/Models/Count.swift",
    "content": "//\n//  Count.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 13..\n//\n\n/// An enumeration representing different counting conditions for verifying invocations.\n///\n/// Use `Count` in `verify` clauses to write assertions:\n/// ```swift\n/// // Assert `fetch(for)` was called between 1 and 5 times:\n/// verify(productService)\n///     .fetch(for: .any)\n///     .called(.from(1, to: 5))\n/// ```\npublic enum Count: ExpressibleByIntegerLiteral, Sendable {\n    /// The associated type for the integer literal.\n    public typealias IntegerLiteralType = Int\n\n    /// Initializes a new instance of `Count` using an integer literal.\n    ///\n    /// - Parameter value: The integer literal value.\n    public init(integerLiteral value: IntegerLiteralType) {\n        self = .exactly(value)\n    }\n\n    /// The member was called at least once.\n    case atLeastOnce\n    /// The member was called exactly once.\n    case once\n    /// The member was called a specific number of times.\n    case exactly(Int)\n    /// The member was called within a specific range of times.\n    case from(Int, to: Int)\n    /// The member was called less than a specific number of times.\n    case less(than: Int)\n    /// The member was called less than or equal to a specific number of times.\n    case lessOrEqual(to: Int)\n    /// The member was called more than a specific number of times.\n    case more(than: Int)\n    /// The member was called more than or equal to a specific number of times.\n    case moreOrEqual(to: Int)\n    /// The member was never called.\n    case never\n\n    /// Checks if the given count satisfies the specified condition.\n    ///\n    /// - Parameter count: The actual count to be compared.\n    /// - Returns: `true` if the condition is satisfied; otherwise, `false`.\n    func satisfies(_ count: Int) -> Bool {\n        switch self {\n        case .atLeastOnce: return count >= 1\n        case .once: return count == 1\n        case .exactly(let times): return count == times\n        case .from(let from, let to): return count >= from && count <= to\n        case .less(let than): return count < than\n        case .lessOrEqual(let to): return count <= to\n        case .more(let than): return count > than\n        case .moreOrEqual(let to): return count >= to\n        case .never: return count == 0\n        }\n    }\n}\n\nextension Count: CustomStringConvertible {\n    public var description: String {\n        switch self {\n        case .atLeastOnce:\n            return \"at least 1\"\n        case .once:\n            return \"exactly one\"\n        case .exactly(let value):\n            return \"exactly \\(value)\"\n        case .from(let lowerBound, let upperBound):\n            return \"from \\(lowerBound) to \\(upperBound)\"\n        case .less(let value):\n            return \"less than \\(value)\"\n        case .lessOrEqual(let value):\n            return \"less than or equal to \\(value)\"\n        case .more(let value):\n            return \"more than \\(value)\"\n        case .moreOrEqual(let value):\n            return \"more than or equal to \\(value)\"\n        case .never:\n            return \"none\"\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/Mockable/Models/GenericValue.swift",
    "content": "//\n//  GenericAttribute.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 17..\n//\n\n/// A type erased wrapper for generic parameters.\n///\n/// `GenericValue` encapsulates an arbitrary generic value along with a custom comparator closure.\n/// The comparator is used to determine equality between two instances of `GenericValue`.\npublic struct GenericValue {\n    /// The encapsulated value of type `Any`.\n    public let value: Any\n\n    /// The comparator closure used to determine equality between two instances of `GenericValue`.\n    public let comparator: (Any, Any) -> Bool\n\n    /// Initializes a new instance of `GenericValue`.\n    ///\n    /// - Parameters:\n    ///   - value: The value to be encapsulated.\n    ///   - comparator: The closure used to determine equality between two instances of `GenericValue`.\n    public init(value: Any, comparator: @escaping (Any, Any) -> Bool) {\n        self.value = value\n        self.comparator = comparator\n    }\n}\n"
  },
  {
    "path": "Sources/Mockable/Models/Parameter+Match.swift",
    "content": "//\n//  Parameter+Match.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 25..\n//\n\nimport IssueReporting\n\nextension Parameter {\n    private func match(_ parameter: Parameter<Value>, using comparator: Matcher.Comparator<Value>?) -> Bool {\n        switch (self, parameter) {\n        case (.any, _): return true\n        case (_, .any): return true\n        case (.value(let value), .matching(let matcher)): return matcher(value)\n        case (.matching(let matcher), .value(let value)): return matcher(value)\n        case (.value(let value1), .value(let value2)):\n            guard let comparator else {\n                reportIssue(noComparatorMessage)\n                fatalError(noComparatorMessage)\n            }\n            return comparator(value1, value2)\n        default: return false\n        }\n    }\n}\n\n// MARK: - Default\n\nextension Parameter {\n    /// Matches the current parameter with another parameter.\n    ///\n    /// - Parameter parameter: The parameter to match against.\n    /// - Returns: `true` if the parameters match; otherwise, `false`.\n    public func match(_ parameter: Parameter<Value>) -> Bool {\n        match(parameter, using: Matcher.comparator(for: Value.self))\n    }\n}\n\n// MARK: - Equatable\n\nextension Parameter where Value: Equatable {\n    /// Matches the current parameter with another parameter.\n    ///\n    /// - Parameter parameter: The parameter to match against.\n    /// - Returns: `true` if the parameters match; otherwise, `false`.\n    public func match(_ parameter: Parameter<Value>) -> Bool {\n        match(parameter, using: Matcher.comparator(for: Value.self))\n    }\n}\n\n// MARK: - Sequence\n\nextension Parameter where Value: Sequence {\n    /// Matches the current parameter with another parameter.\n    ///\n    /// - Parameter parameter: The parameter to match against.\n    /// - Returns: `true` if the parameters match; otherwise, `false`.\n    public func match(_ parameter: Parameter<Value>) -> Bool {\n        match(parameter, using: Matcher.comparator(for: Value.self))\n    }\n}\n\n// MARK: - Equatable Sequence\n\nextension Parameter where Value: Equatable, Value: Sequence {\n    /// Matches the current parameter with another parameter.\n    ///\n    /// - Parameter parameter: The parameter to match against.\n    /// - Returns: `true` if the parameters match; otherwise, `false`.\n    public func match(_ parameter: Parameter<Value>) -> Bool {\n        match(parameter, using: Matcher.comparator(for: Value.self))\n    }\n}\n"
  },
  {
    "path": "Sources/Mockable/Models/Parameter.swift",
    "content": "//\n//  Parameter.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 13..\n//\n\nimport IssueReporting\n\n/// An enumeration representing different types of parameters used in mocking.\npublic enum Parameter<Value>: @unchecked Sendable {\n    /// Matches any value.\n    case any\n    /// Matches a specific value.\n    case value(Value)\n    /// Matches a value using a custom matching closure.\n    case matching((Value) -> Bool)\n}\n\nextension Parameter {\n    /// Creates a type erased parameter from a value of type `T`.\n    ///\n    /// - Parameter value: The value to be encapsulated in a generic parameter.\n    /// - Returns: A a type erased parameter containing the provided value.\n    public static func generic<T>(_ value: T) -> Parameter<GenericValue> {\n        Parameter<T>.value(value).eraseToGenericValue()\n    }\n\n    /// Type erases a parameter of type `Parameter<T>` to a `Parameter<GenericValue>`\n    ///\n    /// - Returns: A type erased parameter with the same matching behavior.\n    public func eraseToGenericValue() -> Parameter<GenericValue> {\n        switch self {\n        case .any:\n            return .any\n        case .value(let value):\n            let value = GenericValue(value: value) { left, right in\n                guard let left = left as? Value,\n                      let right = right as? Value else { return false }\n\n                guard let comparator = Matcher.comparator(for: Value.self) else {\n                    reportIssue(noComparatorMessage)\n                    fatalError(noComparatorMessage)\n                }\n                return comparator(left, right)\n            }\n            return .value(value)\n        case .matching(let matcher):\n            return .matching { value in\n                guard let value = value.value as? Value else { return false }\n                return matcher(value)\n            }\n        }\n    }\n}\n\nextension Parameter {\n    var noComparatorMessage: String {\n        \"\"\"\n        No comparator found for type \"\\(Value.self)\". \\\n        All non-equatable types must be registered using Matcher.register(_).\n        \"\"\"\n    }\n}\n"
  },
  {
    "path": "Sources/Mockable/Models/ReturnValue.swift",
    "content": "//\n//  ReturnValue.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2023. 11. 13..\n//\n\n/// An enumeration representing different types of return values for mocked functions.\n///\n/// - `return(Any)`: A concrete value to be returned.\n/// - `throw(Error)`: An error to be thrown.\n/// - `produce(Any)`: A value producer to be invoked.\npublic enum ReturnValue {\n    /// A case representing a concrete value to be returned.\n    case `return`(Any)\n\n    /// A case representing an error to be thrown.\n    case `throw`(any Error)\n\n    /// A case representing a value producer to be invoked.\n    case produce(Any)\n}\n\n/// An error thrown when type erased producers cannot be casted to their original closure type.\npublic enum ProducerCastError: Error {\n    case typeMismatch\n}\n\n/// Casts the given producer to the specified type.\n///\n/// This function is used to cast the producer to a specific type when using the `.produce` case\n/// in the `ReturnValue` enum.\n///\n/// - Parameter producer: The producer to be cast.\n/// - Returns: The casted producer of type `P`.\npublic func cast<P>(_ producer: Any) throws -> P {\n    guard let producer = producer as? P else {\n        throw ProducerCastError.typeMismatch\n    }\n    return producer\n}\n"
  },
  {
    "path": "Sources/Mockable/Models/TimeoutDuration.swift",
    "content": "//\n//  TimeoutDuration.swift\n//  Mockable\n//\n//\n//  Created by Nayanda Haberty on 3/4/24.\n//\n\nimport Foundation\n\n/// An enumeration representing a duration of time.\npublic enum TimeoutDuration {\n\n    /// A TimeoutDuration representing a given number of seconds.\n    case seconds(Double)\n\n    /// A TimeoutDuration representing a given number of miliseconds.\n    case miliseconds(UInt)\n\n    /// Converts the duration to TimeInterval.\n    public var duration: TimeInterval {\n        switch self {\n        case .seconds(let value): value\n        case .miliseconds(let value): TimeInterval(value) / 1000\n        }\n    }\n}\n\n// MARK: - ExpressibleByFloatLiteral\n\nextension TimeoutDuration: ExpressibleByFloatLiteral {\n    public init(floatLiteral value: Double) {\n        self = .seconds(value)\n    }\n}\n\n// MARK: - ExpressibleByIntegerLiteral\n\nextension TimeoutDuration: ExpressibleByIntegerLiteral {\n    public init(integerLiteral value: Int) {\n        self = .seconds(Double(value))\n    }\n}\n"
  },
  {
    "path": "Sources/Mockable/Utils/Utils.swift",
    "content": "//\n//  Utils.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2024. 03. 17..\n//\n\n/// Creates a proxy for building return values for members of the given service.\n///\n/// Example usage of `given(_ service:)`:\n/// ```swift\n/// // Throw an error for the first call and then return 'product' for every other call\n/// given(productService)\n///     .fetch(for: .any).willThrow(error)\n///     .fetch(for: .any).willReturn(product)\n///\n/// // Throw an error if the id parameter ends with a 0, return a product otherwise\n/// given(productService)\n///     .fetch(for: .any).willProduce { id in\n///         if id.uuidString.last == \"0\" {\n///             throw error\n///         } else {\n///             return product\n///         }\n///     }\n/// ```\n///\n/// - Parameter service: The mockable service for which return values are specified.\n/// - Returns: The service's return value builder.\npublic func given<T: MockableService>(_ service: T) -> T.ReturnBuilder { service._given }\n\n/// Creates a proxy for building actions for members of the given service.\n///\n/// Example usage of `when(_ service:)`:\n/// ```swift\n/// // log calls to fetch(for:)\n/// when(productService).fetch(for: .any).perform {\n///     print(\"fetch(for:) was called\")\n/// }\n///\n/// // log when url is accessed\n/// when(productService).url().performOnGet {\n///     print(\"url accessed\")\n/// }\n///\n/// // log when url is set to nil\n/// when(productService).url(newValue: .value(nil)).performOnSet {\n///     print(\"url set to nil\")\n/// }\n/// ```\n///\n/// - Parameter service: The mockable service for which actions are specified.\n/// - Returns: The service's action builder.\npublic func when<T: MockableService>(_ service: T) -> T.ActionBuilder { service._when }\n\n/// Creates a proxy for verifying invocations of members of the given service.\n///\n/// Example usage of `verify(_ service:)`:\n/// ```swift\n/// verify(productService)\n///     // assert fetch(for:) was called between 1 and 5 times\n///     .fetch(for: .any).called(.from(1, to: 5))\n///     // assert checkout(with:) was called between exactly 10 times\n///     .checkout(with: .any).called(10)\n///     // assert url property was accessed at least 2 times\n///     .url().getCalled(.moreOrEqual(to: 2))\n///     // assert url property was never set to nil\n///     .url(newValue: .value(nil)).setCalled(.never)\n/// ```\n/// - Parameter service: The mockable service for which invocations are verified.\n/// - Returns: The service's verification builder.\npublic func verify<T: MockableService>(_ service: T) -> T.VerifyBuilder { service._verify }\n"
  },
  {
    "path": "Sources/MockableMacro/Extensions/AttributeListSyntax+Extensions.swift",
    "content": "//\n//  File.swift\n//  Mockable\n//\n//  Created by Kolos Foltányi on 2025. 11. 16..\n//\n\nimport SwiftSyntax\n\nextension AttributeListSyntax {\n    func filter(allowedNames: [String]) -> AttributeListSyntax {\n        filter { element in\n            switch element {\n            case .attribute(let attributeSyntax):\n                return attribute(attributeSyntax, matches: allowedNames)\n            case .ifConfigDecl(let ifConfigDeclSyntax):\n                return ifConfigDeclSyntax.clauses\n                    .compactMap { $0.elements }\n                    .allSatisfy { item in\n                        guard case .attributes(let list) = item else { return false }\n                        return list.allSatisfy {\n                            guard case .attribute(let attr) = $0 else { return false }\n                            return attribute(attr, matches: allowedNames)\n                        }\n                    }\n            }\n        }\n    }\n\n    private func attribute(_ attribute: AttributeSyntax, matches allowedNames: [String]) -> Bool {\n        allowedNames.contains(attribute.attributeName.trimmedDescription)\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Extensions/AttributeSyntax+Extensions.swift",
    "content": "//\n//  AttributeSyntax+Extensions.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 25..\n//\n\nimport SwiftSyntax\n\nextension AttributeSyntax {\n    static var escaping: Self {\n        AttributeSyntax(\n            atSign: .atSignToken(),\n            attributeName: IdentifierTypeSyntax(\n                name: .keyword(.escaping)\n            )\n        )\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Extensions/DeclModifierListSyntax+Extensions.swift",
    "content": "//\n//  DeclModifierListSyntax+Extensions.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 27/09/2024.\n//\n\nimport SwiftSyntax\n\nextension DeclModifierListSyntax {\n    func filtered(keywords: Set<Keyword>) -> DeclModifierListSyntax {\n        filter { modifier in\n            guard case .keyword(let keyword) = modifier.name.tokenKind else { return false }\n            return keywords.contains(keyword)\n        }\n    }\n\n    func appending(_ other: DeclModifierListSyntax) -> DeclModifierListSyntax {\n        self + Array(other)\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Extensions/FunctionDeclSyntax+Extensions.swift",
    "content": "//\n//  FunctionDeclSyntax+Extensions.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 23..\n//\n\nimport SwiftSyntax\n\nextension FunctionDeclSyntax {\n    var isVoid: Bool {\n        signature.returnClause == nil\n    }\n\n    var isThrowing: Bool {\n        #if canImport(SwiftSyntax600)\n        signature.effectSpecifiers?.throwsClause?.throwsSpecifier.tokenKind == .keyword(.throws)\n        #else\n        signature.effectSpecifiers?.throwsSpecifier?.tokenKind == .keyword(.throws)\n        #endif\n    }\n\n    var closureType: FunctionTypeSyntax {\n        let params = signature.parameterClause.parameters\n            .map { $0.resolvedType(for: .parameter) }\n\n        #if canImport(SwiftSyntax600)\n        let effectSpecifiers = TypeEffectSpecifiersSyntax(\n            throwsClause: isThrowing ? .init(throwsSpecifier: .keyword(.throws)) : nil\n        )\n        #else\n        let effectSpecifiers = TypeEffectSpecifiersSyntax(\n            throwsSpecifier: isThrowing ? .keyword(.throws) : nil\n        )\n        #endif\n        return FunctionTypeSyntax(\n            parameters: TupleTypeElementListSyntax {\n                for param in params {\n                    TupleTypeElementSyntax(type: param)\n                }\n            },\n            effectSpecifiers: effectSpecifiers,\n            returnClause: signature.returnClause ?? .init(type: IdentifierTypeSyntax(name: NS.Void))\n        )\n    }\n\n    func containsGenericType(in functionParameter: FunctionParameterSyntax) -> Bool {\n        let genericParameters = genericParameterClause?.parameters ?? []\n        guard !genericParameters.isEmpty else { return false }\n        let generics = genericParameters.map(\\.name.trimmedDescription)\n        return nil != TokenFinder.find(in: functionParameter.type) {\n            guard case .identifier(let name) = $0.tokenKind else { return false }\n            return generics.contains(name)\n        }\n    }\n}\n\n#if canImport(SwiftSyntax600)\nextension FunctionDeclSyntax {\n    var errorType: TypeSyntax? {\n        signature.effectSpecifiers?.throwsClause?.type\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/MockableMacro/Extensions/FunctionParameterSyntax+Extensions.swift",
    "content": "//\n//  FunctionParameterSyntax+Extensions.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2023. 11. 20..\n//\n\nimport SwiftSyntax\nimport SwiftSyntaxMacros\n\nenum FunctionParameterTypeResolveRole {\n    /// Resolves a type that can be used for property type bindings, removes attributes.\n    case binding\n    /// Resolves a type that can be used as a function or closure parameter, keeps attributes.\n    case parameter\n}\n\nextension FunctionParameterSyntax {\n    func resolvedType(for role: FunctionParameterTypeResolveRole = .binding) -> TypeSyntax {\n        guard ellipsis == nil else {\n            return TypeSyntax(ArrayTypeSyntax(element: type))\n        }\n\n        guard role != .parameter else { return type }\n\n        if let attributeType = type.as(AttributedTypeSyntax.self) {\n            return TypeSyntax(attributeType.baseType)\n        } else {\n            return TypeSyntax(type)\n        }\n    }\n\n    var isInout: Bool {\n        #if canImport(SwiftSyntax600)\n        type.as(AttributedTypeSyntax.self)?.specifiers.contains { specifier in\n            guard case .simpleTypeSpecifier(let simpleSpecifier) = specifier else { return false }\n            return simpleSpecifier.specifier.tokenKind == .keyword(.inout)\n        } ?? false\n        #else\n        type.as(AttributedTypeSyntax.self)?.specifier?.tokenKind == .keyword(.inout)\n        #endif\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Extensions/GenericArgumentSyntax+Extensions.swift",
    "content": "//\n//  GenericArgumentSyntax+Extensions.swift\n//  Mockable\n//\n//  Created by Scott Hoyt on 10/06/2025.\n//\n\nimport SwiftSyntax\n\n#if canImport(SwiftSyntax601)\n// The purpose of this initializer is to silence deprecation warnings by the using the new API when\n// built against SwiftSyntax >= 601.0.0\nextension GenericArgumentSyntax {\n    init(argument: any TypeSyntaxProtocol) {\n        self.init(argument: Argument(argument))\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/MockableMacro/Extensions/ProtocolDeclSyntax+Extensions.swift",
    "content": "//\n//  ProtocolDeclSyntax+Extensions.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 23..\n//\n\nimport SwiftSyntax\n\nextension ProtocolDeclSyntax {\n    var mockName: String {\n        NS.Mock.trimmedDescription + name.trimmedDescription\n    }\n\n    var mockType: IdentifierTypeSyntax {\n        IdentifierTypeSyntax(name: .identifier(mockName))\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Extensions/String+Extensions.swift",
    "content": "//\n//  String+Extensions.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2023. 11. 19..\n//\n\nextension String {\n    var capitalizedFirstLetter: String {\n        let firstLetter = prefix(1).capitalized\n        let remainingLetters = dropFirst()\n        return firstLetter + remainingLetters\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Extensions/TokenSyntax+Extensions.swift",
    "content": "//\n//  TokenSyntax+Extensions.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltányi on 2025. 05. 06..\n//\n\nimport SwiftSyntax\n\nextension TokenSyntax {\n    public var declNameOrVarCallName: Self {\n        let text = trimmed.description\n        if text.hasPrefix(\"`\") && text.hasSuffix(\"`\") {\n            return self\n        }\n        if Keyword.all.contains(text) {\n            return \"`\\(raw: text)`\"\n        } else {\n            return self\n        }\n    }\n}\n\nextension Keyword {\n    fileprivate static let all: [String] = [\n        \"__consuming\",\n        \"__owned\",\n        \"__setter_access\",\n        \"__shared\",\n        \"_alignment\",\n        \"_backDeploy\",\n        \"_borrow\",\n        \"_borrowing\",\n        \"_BridgeObject\",\n        \"_cdecl\",\n        \"_Class\",\n        \"_compilerInitialized\",\n        \"_const\",\n        \"_consuming\",\n        \"_documentation\",\n        \"_dynamicReplacement\",\n        \"_effects\",\n        \"_expose\",\n        \"_forward\",\n        \"_implements\",\n        \"_linear\",\n        \"_local\",\n        \"_modify\",\n        \"_move\",\n        \"_mutating\",\n        \"_NativeClass\",\n        \"_NativeRefCountedObject\",\n        \"_noMetadata\",\n        \"_nonSendable\",\n        \"_objcImplementation\",\n        \"_objcRuntimeName\",\n        \"_opaqueReturnTypeOf\",\n        \"_optimize\",\n        \"_originallyDefinedIn\",\n        \"_PackageDescription\",\n        \"_private\",\n        \"_projectedValueProperty\",\n        \"_read\",\n        \"_RefCountedObject\",\n        \"_semantics\",\n        \"_specialize\",\n        \"_spi\",\n        \"_spi_available\",\n        \"_swift_native_objc_runtime_base\",\n        \"_Trivial\",\n        \"_TrivialAtMost\",\n        \"_TrivialStride\",\n        \"_typeEraser\",\n        \"_unavailableFromAsync\",\n        \"_underlyingVersion\",\n        \"_UnknownLayout\",\n        \"_version\",\n        \"accesses\",\n        \"actor\",\n        \"addressWithNativeOwner\",\n        \"addressWithOwner\",\n        \"any\",\n        \"Any\",\n        \"as\",\n        \"assignment\",\n        \"associatedtype\",\n        \"associativity\",\n        \"async\",\n        \"attached\",\n        \"autoclosure\",\n        \"availability\",\n        \"available\",\n        \"await\",\n        \"backDeployed\",\n        \"before\",\n        \"block\",\n        \"borrowing\",\n        \"break\",\n        \"canImport\",\n        \"case\",\n        \"catch\",\n        \"class\",\n        \"compiler\",\n        \"consume\",\n        \"copy\",\n        \"consuming\",\n        \"continue\",\n        \"convenience\",\n        \"convention\",\n        \"cType\",\n        \"default\",\n        \"defer\",\n        \"deinit\",\n        \"dependsOn\",\n        \"deprecated\",\n        \"derivative\",\n        \"didSet\",\n        \"differentiable\",\n        \"distributed\",\n        \"do\",\n        \"dynamic\",\n        \"each\",\n        \"else\",\n        \"enum\",\n        \"escaping\",\n        \"exclusivity\",\n        \"exported\",\n        \"extension\",\n        \"fallthrough\",\n        \"false\",\n        \"file\",\n        \"fileprivate\",\n        \"final\",\n        \"for\",\n        \"discard\",\n        \"forward\",\n        \"func\",\n        \"freestanding\",\n        \"get\",\n        \"guard\",\n        \"higherThan\",\n        \"if\",\n        \"import\",\n        \"in\",\n        \"indirect\",\n        \"infix\",\n        \"init\",\n        \"initializes\",\n        \"inline\",\n        \"inout\",\n        \"internal\",\n        \"introduced\",\n        \"is\",\n        \"isolated\",\n        \"kind\",\n        \"lazy\",\n        \"left\",\n        \"let\",\n        \"line\",\n        \"linear\",\n        \"lowerThan\",\n        \"macro\",\n        \"message\",\n        \"metadata\",\n        \"module\",\n        \"mutableAddressWithNativeOwner\",\n        \"mutableAddressWithOwner\",\n        \"mutating\",\n        \"nil\",\n        \"noasync\",\n        \"noDerivative\",\n        \"noescape\",\n        \"none\",\n        \"nonisolated\",\n        \"nonmutating\",\n        \"objc\",\n        \"obsoleted\",\n        \"of\",\n        \"open\",\n        \"operator\",\n        \"optional\",\n        \"override\",\n        \"package\",\n        \"postfix\",\n        \"precedencegroup\",\n        \"preconcurrency\",\n        \"prefix\",\n        \"private\",\n        \"Protocol\",\n        \"protocol\",\n        \"public\",\n        \"reasync\",\n        \"renamed\",\n        \"repeat\",\n        \"required\",\n        \"_resultDependsOn\",\n        \"_resultDependsOnSelf\",\n        \"rethrows\",\n        \"retroactive\",\n        \"return\",\n        \"reverse\",\n        \"right\",\n        \"safe\",\n        \"scoped\",\n        \"self\",\n        \"sending\",\n        \"Self\",\n        \"Sendable\",\n        \"set\",\n        \"some\",\n        \"sourceFile\",\n        \"spi\",\n        \"spiModule\",\n        \"static\",\n        \"struct\",\n        \"subscript\",\n        \"super\",\n        \"swift\",\n        \"switch\",\n        \"target\",\n        \"then\",\n        \"throw\",\n        \"throws\",\n        \"transpose\",\n        \"true\",\n        \"try\",\n        \"Type\",\n        \"typealias\",\n        \"unavailable\",\n        \"unchecked\",\n        \"unowned\",\n        \"unsafe\",\n        \"unsafeAddress\",\n        \"unsafeMutableAddress\",\n        \"var\",\n        \"visibility\",\n        \"weak\",\n        \"where\",\n        \"while\",\n        \"willSet\",\n        \"witness_method\",\n        \"wrt\",\n        \"yield\"\n    ]\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Extensions/VariableDeclSyntax+Extensions.swift",
    "content": "//\n//  VariableDeclSyntax+Extensions.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 10..\n//\n\nimport SwiftSyntax\n\nextension VariableDeclSyntax {\n    var name: TokenSyntax {\n        get throws {\n            .identifier(try binding.pattern.trimmedDescription)\n        }\n    }\n\n    var isComputed: Bool { setAccessor == nil }\n\n    var isThrowing: Bool {\n        get throws {\n            #if canImport(SwiftSyntax600)\n            try getAccessor.effectSpecifiers?.throwsClause?.throwsSpecifier != nil\n            #else\n            try getAccessor.effectSpecifiers?.throwsSpecifier != nil\n            #endif\n        }\n    }\n\n    var resolvedType: TypeSyntax {\n        get throws {\n            let type = try type\n            if let type = type.as(ImplicitlyUnwrappedOptionalTypeSyntax.self) {\n                return type.wrappedType\n            }\n            return type\n        }\n    }\n\n    var type: TypeSyntax {\n        get throws {\n            guard let typeAnnotation = try binding.typeAnnotation else {\n                throw MockableMacroError.invalidVariableRequirement\n            }\n            return typeAnnotation.type.trimmed\n        }\n    }\n\n    var getAccessor: AccessorDeclSyntax {\n        get throws {\n            let getAccessor = try accessors.first { $0.accessorSpecifier.tokenKind == .keyword(.get) }\n            guard let getAccessor else { throw MockableMacroError.invalidVariableRequirement }\n            return getAccessor\n        }\n    }\n\n    var setAccessor: AccessorDeclSyntax? {\n        try? accessors.first { $0.accessorSpecifier.tokenKind == .keyword(.set) }\n    }\n\n    var closureType: FunctionTypeSyntax {\n        get throws {\n            #if canImport(SwiftSyntax600)\n            let effectSpecifiers = TypeEffectSpecifiersSyntax(\n                throwsClause: try isThrowing ? .init(throwsSpecifier: .keyword(.throws)) : nil\n            )\n            #else\n            let effectSpecifiers = TypeEffectSpecifiersSyntax(\n                throwsSpecifier: try isThrowing ? .keyword(.throws) : nil\n            )\n            #endif\n            return FunctionTypeSyntax(\n                parameters: TupleTypeElementListSyntax(),\n                effectSpecifiers: effectSpecifiers,\n                returnClause: .init(type: try resolvedType)\n            )\n        }\n    }\n\n    var binding: PatternBindingSyntax {\n        get throws {\n            guard let binding = bindings.first else {\n                throw MockableMacroError.invalidVariableRequirement\n            }\n            return binding\n        }\n    }\n}\n\n// MARK: - Helpers\n\nextension VariableDeclSyntax {\n    private var accessors: AccessorDeclListSyntax {\n        get throws {\n            guard let accessorBlock = try binding.accessorBlock,\n                  case .accessors(let accessorList) = accessorBlock.accessors else {\n                throw MockableMacroError.invalidVariableRequirement\n            }\n            return accessorList\n        }\n    }\n}\n\n#if canImport(SwiftSyntax600)\nextension VariableDeclSyntax {\n    var errorType: TypeSyntax? {\n        get throws { try getAccessor.effectSpecifiers?.throwsClause?.type }\n    }\n}\n#endif\n"
  },
  {
    "path": "Sources/MockableMacro/Factory/Buildable/Buildable.swift",
    "content": "//\n//  Buildable.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 23..\n//\n\nimport SwiftSyntax\n\n/// An enum representing the different builder structs to generate.\nenum BuilderKind: CaseIterable {\n    case `return`\n    case action\n    case verify\n\n    /// The builder struct declaration's name.\n    var name: TokenSyntax {\n        switch self {\n        case .return: NS.ReturnBuilder\n        case .action: NS.ActionBuilder\n        case .verify: NS.VerifyBuilder\n        }\n    }\n\n    /// The builder struct declaration's type.\n    var type: IdentifierTypeSyntax {\n        IdentifierTypeSyntax(name: name)\n    }\n}\n\n/// A protocol to associate builder functions with individual requirements.\n///\n/// Used to generate members of builder struct declarations in builder factory.\nprotocol Buildable {\n    /// Returns the specified builder implementation.\n    ///\n    /// - Parameter kind: The kind of builder function to generate.\n    /// - Parameter modifiers: Declaration modifiers to add to the builder.\n    /// - Parameter mockType: The enclosing mock service's type.\n    /// - Returns: A function or variable declaration that mirrors a protocol requirement\n    /// with its syntax. The parameters of the generated declaration are wrapped in the `Parameter`\n    /// wrapper, and it returns the corresponding builder object.\n    func builder(\n        of kind: BuilderKind,\n        with modifiers: DeclModifierListSyntax,\n        using mockType: IdentifierTypeSyntax\n    ) throws -> DeclSyntax\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Factory/Buildable/Function+Buildable.swift",
    "content": "//\n//  Function+Buildable.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 23..\n//\n\nimport SwiftSyntax\n\n// MARK: - FunctionRequirement + Buildable\n\nextension FunctionRequirement: Buildable {\n    func builder(\n        of kind: BuilderKind,\n        with modifiers: DeclModifierListSyntax,\n        using mockType: IdentifierTypeSyntax\n    ) throws -> DeclSyntax {\n        let decl = FunctionDeclSyntax(\n            attributes: syntax.attributes\n                .filter(allowedNames: [NS.available.text])\n                .trimmed.with(\\.trailingTrivia, .newline),\n            modifiers: DeclModifierListSyntax {\n                modifiers\n                DeclModifierSyntax(name: .keyword(.nonisolated))\n            },\n            name: syntax.name.trimmed,\n            genericParameterClause: genericParameterClause(for: kind),\n            signature: signature(for: kind, using: mockType),\n            genericWhereClause: genericWhereClause(for: kind),\n            body: try body(for: kind)\n        )\n        return DeclSyntax(decl)\n    }\n}\n\n// MARK: - Helpers\n\nextension FunctionRequirement {\n    private func genericParameterClause(for kind: BuilderKind) -> GenericParameterClauseSyntax? {\n        switch kind {\n        case .return: syntax.genericParameterClause\n        case .action: filteredGenericParameterClause\n        case .verify: filteredGenericParameterClause\n        }\n    }\n\n    private func genericWhereClause(for kind: BuilderKind) -> GenericWhereClauseSyntax? {\n        switch kind {\n        case .return: syntax.genericWhereClause\n        case .action: filteredGenericWhereClause\n        case .verify: filteredGenericWhereClause\n        }\n    }\n\n    private func signature(\n        for kind: BuilderKind,\n        using mockType: IdentifierTypeSyntax\n    ) -> FunctionSignatureSyntax {\n        FunctionSignatureSyntax(\n            parameterClause: parameterClause,\n            returnClause: returnClause(for: kind, using: mockType)\n        )\n    }\n\n    private var parameterClause: FunctionParameterClauseSyntax {\n        let parameters = FunctionParameterListSyntax {\n            for parameter in syntax.signature.parameterClause.parameters {\n                FunctionParameterSyntax(\n                    firstName: parameter.firstName,\n                    secondName: parameter.secondName,\n                    type: IdentifierTypeSyntax(name: NS.Parameter(parameter.resolvedType().description))\n                )\n            }\n        }\n        return FunctionParameterClauseSyntax(parameters: parameters)\n    }\n\n    private func returnClause(\n        for kind: BuilderKind,\n        using mockType: IdentifierTypeSyntax\n    ) -> ReturnClauseSyntax {\n        let name = syntax.isThrowing ? NS.ThrowingFunction(kind) : NS.Function(kind)\n        let arguments = GenericArgumentListSyntax {\n            GenericArgumentSyntax(argument: mockType)\n            GenericArgumentSyntax(argument: kind.type)\n            if let returnType = functionReturnType(for: kind) {\n                returnType\n            }\n            if let errorType = errorType(for: kind) {\n                errorType\n            }\n            if let produceType = functionProduceType(for: kind) {\n                produceType\n            }\n        }\n        return ReturnClauseSyntax(\n            type: MemberTypeSyntax(\n                baseType: IdentifierTypeSyntax(name: NS.Mockable),\n                name: name,\n                genericArgumentClause: .init(arguments: arguments)\n            )\n        )\n    }\n\n    private func errorType(for kind: BuilderKind) -> GenericArgumentSyntax? {\n        guard syntax.isThrowing && kind == .return else { return nil }\n        #if canImport(SwiftSyntax600)\n        guard let errorType = syntax.errorType else {\n            return GenericArgumentSyntax(argument: defaultErrorType)\n        }\n        return GenericArgumentSyntax(argument: errorType.trimmed)\n        #else\n        return GenericArgumentSyntax(argument: defaultErrorType)\n        #endif\n    }\n\n    private var defaultErrorType: some TypeSyntaxProtocol {\n        SomeOrAnyTypeSyntax(\n            someOrAnySpecifier: .keyword(.any),\n            constraint: MemberTypeSyntax(\n                baseType: IdentifierTypeSyntax(name: NS.Swift),\n                name: NS.Error\n            )\n        )\n    }\n\n    private func functionReturnType(for kind: BuilderKind) -> GenericArgumentSyntax? {\n        guard kind == .return else { return nil }\n        guard let returnClause = syntax.signature.returnClause else {\n            let voidType = IdentifierTypeSyntax(name: NS.Void)\n            return GenericArgumentSyntax(argument: voidType)\n        }\n        return GenericArgumentSyntax(argument: returnClause.type)\n    }\n\n    private func functionProduceType(for kind: BuilderKind) -> GenericArgumentSyntax? {\n        guard kind == .return else { return nil }\n        return GenericArgumentSyntax(argument: syntax.closureType)\n    }\n\n    private func body(for kind: BuilderKind) throws -> CodeBlockSyntax {\n        let arguments = try LabeledExprListSyntax {\n            LabeledExprSyntax(\n                expression: DeclReferenceExprSyntax(baseName: NS.mocker)\n            )\n            LabeledExprSyntax(\n                label: NS.kind,\n                colon: .colonToken(),\n                expression: try caseSpecifier(wrapParams: false)\n            )\n        }\n        let statements = CodeBlockItemListSyntax {\n            FunctionCallExprSyntax(\n                calledExpression: MemberAccessExprSyntax(name: NS.initializer),\n                leftParen: .leftParenToken(),\n                arguments: arguments,\n                rightParen: .rightParenToken()\n            )\n        }\n        return .init(statements: statements)\n    }\n\n    /// Returns the function's generic parameter clause with return only generics filtered out.\n    /// If a generic parameter is only used in the return clause of a function, it will not\n    /// be part of the returned generic parameter clause.\n    private var filteredGenericParameterClause: GenericParameterClauseSyntax? {\n        guard let generics = syntax.genericParameterClause else { return nil }\n        var parameters = generics.parameters.filter { generic in\n            hasParameter(containing: generic.name.trimmedDescription)\n        }\n        if let lastIndex = parameters.indices.last {\n            parameters[lastIndex] = parameters[lastIndex].with(\\.trailingComma, nil)\n        }\n        return parameters.isEmpty ? nil : .init(parameters: parameters)\n    }\n\n    /// Returns the function's generic where clause with return only generics filtered out.\n    /// If a generic parameter is only used in the return clause of a function, it will not\n    /// be part of the returned generic where clause.\n    private var filteredGenericWhereClause: GenericWhereClauseSyntax? {\n        guard let generics = syntax.genericWhereClause else { return nil }\n        var requirements = generics.requirements.filter { requirement in\n            switch requirement.requirement {\n            case .conformanceRequirement(let conformance):\n                return hasParameter(containing: conformance.leftType.trimmedDescription)\n            case .sameTypeRequirement(let sameType):\n                return hasParameter(containing: sameType.leftType.trimmedDescription)\n            default:\n                return false\n            }\n        }\n        if let lastIndex = requirements.indices.last {\n            var last = requirements[lastIndex]\n            last.trailingComma = nil\n            requirements[lastIndex] = last\n        }\n        let whereClause = GenericWhereClauseSyntax(requirements: requirements)\n            .with(\\.trailingTrivia, .space)\n        return requirements.isEmpty ? nil : whereClause\n    }\n\n    private func hasParameter(containing identifier: String) -> Bool {\n        nil != TokenFinder.find(in: syntax.signature.parameterClause) {\n            $0.tokenKind == .identifier(identifier)\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Factory/Buildable/Variable+Buildable.swift",
    "content": "//\n//  Variable+Buildable.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 23..\n//\n\nimport SwiftSyntax\n\n// MARK: - VariableRequirement + Buildable\n\nextension VariableRequirement: Buildable {\n    func builder(\n        of kind: BuilderKind,\n        with modifiers: DeclModifierListSyntax,\n        using mockType: IdentifierTypeSyntax\n    ) throws -> DeclSyntax {\n        if syntax.isComputed || kind == .return {\n            return try variableDeclaration(of: kind, with: modifiers, using: mockType)\n        } else {\n            return try functionDeclaration(of: kind, with: modifiers, using: mockType)\n        }\n    }\n}\n\n// MARK: - Helpers\n\nextension VariableRequirement {\n    func variableDeclaration(\n        of kind: BuilderKind,\n        with modifiers: DeclModifierListSyntax,\n        using mockType: IdentifierTypeSyntax\n    ) throws -> DeclSyntax {\n        let variableDecl = VariableDeclSyntax(\n            attributes: syntax.attributes\n                .filter(allowedNames: [NS.available.text])\n                .trimmed.with(\\.trailingTrivia, .newline),\n            modifiers: DeclModifierListSyntax {\n                modifiers\n                DeclModifierSyntax(name: .keyword(.nonisolated))\n            },\n            bindingSpecifier: .keyword(.var),\n            bindings: try PatternBindingListSyntax {\n                PatternBindingSyntax(\n                    pattern: try syntax.binding.pattern,\n                    typeAnnotation: TypeAnnotationSyntax(\n                        type: try returnType(for: kind, using: mockType)\n                    ),\n                    accessorBlock: AccessorBlockSyntax(\n                        accessors: .getter(try body(for: kind))\n                    )\n                )\n            }\n        )\n        return DeclSyntax(variableDecl)\n    }\n\n    private func functionDeclaration(\n        of kind: BuilderKind,\n        with modifiers: DeclModifierListSyntax,\n        using mockType: IdentifierTypeSyntax\n    ) throws -> DeclSyntax {\n        let functionDecl = FunctionDeclSyntax(\n            attributes: syntax.attributes.trimmed.with(\\.trailingTrivia, .newline),\n            modifiers: modifiers,\n            name: try syntax.name,\n            signature: try signature(for: kind, using: mockType),\n            body: .init(statements: try body(for: kind))\n        )\n        return DeclSyntax(functionDecl)\n    }\n\n    private func signature(\n        for kind: BuilderKind,\n        using mockType: IdentifierTypeSyntax\n    ) throws -> FunctionSignatureSyntax {\n        let parameters = try FunctionParameterListSyntax {\n            FunctionParameterSyntax(\n                firstName: NS.newValue,\n                type: IdentifierTypeSyntax(\n                    name: NS.Parameter(try syntax.resolvedType.trimmedDescription)\n                ),\n                defaultValue: InitializerClauseSyntax(\n                    value: MemberAccessExprSyntax(name: NS.any)\n                )\n            )\n        }\n        return FunctionSignatureSyntax(\n            parameterClause: FunctionParameterClauseSyntax(parameters: parameters),\n            returnClause: ReturnClauseSyntax(\n                type: try returnType(for: kind, using: mockType)\n            )\n        )\n    }\n\n    private func returnType(\n        for kind: BuilderKind,\n        using mockType: IdentifierTypeSyntax\n    ) throws -> MemberTypeSyntax {\n        let name = if syntax.isComputed {\n            try syntax.isThrowing ? NS.ThrowingFunction(kind) : NS.Function(kind)\n        } else {\n            try syntax.isThrowing ? NS.ThrowingProperty(kind) : NS.Property(kind)\n        }\n\n        let arguments = try GenericArgumentListSyntax {\n            GenericArgumentSyntax(argument: mockType)\n            GenericArgumentSyntax(argument: kind.type)\n            if let returnType = try variableReturnType(for: kind) {\n                returnType\n            }\n            if let errorType = try errorType(for: kind) {\n                errorType\n            }\n            if let produceType = try variableProduceType(for: kind) {\n                produceType\n            }\n        }\n\n        return MemberTypeSyntax(\n            baseType: IdentifierTypeSyntax(name: NS.Mockable),\n            name: name,\n            genericArgumentClause: .init(arguments: arguments)\n        )\n    }\n\n    private func errorType(for kind: BuilderKind) throws -> GenericArgumentSyntax? {\n        guard try syntax.isThrowing && syntax.isComputed && kind == .return else { return nil }\n        #if canImport(SwiftSyntax600)\n        guard let errorType = try syntax.errorType else {\n            return GenericArgumentSyntax(argument: defaultErrorType)\n        }\n        return GenericArgumentSyntax(argument: errorType.trimmed)\n        #else\n        return GenericArgumentSyntax(argument: defaultErrorType)\n        #endif\n    }\n\n    private var defaultErrorType: some TypeSyntaxProtocol {\n        SomeOrAnyTypeSyntax(\n            someOrAnySpecifier: .keyword(.any),\n            constraint: IdentifierTypeSyntax(name: NS.Error)\n        )\n    }\n\n    private func variableReturnType(for kind: BuilderKind) throws -> GenericArgumentSyntax? {\n        guard kind == .return else { return nil }\n        return GenericArgumentSyntax(argument: try syntax.resolvedType)\n    }\n\n    private func variableProduceType(for kind: BuilderKind) throws -> GenericArgumentSyntax? {\n        guard kind == .return, syntax.isComputed else { return nil }\n        return GenericArgumentSyntax(argument: try syntax.closureType)\n    }\n\n    private func body(for kind: BuilderKind) throws -> CodeBlockItemListSyntax {\n        let arguments = try LabeledExprListSyntax {\n            LabeledExprSyntax(\n                expression: DeclReferenceExprSyntax(baseName: NS.mocker)\n            )\n            LabeledExprSyntax(\n                label: NS.kind,\n                colon: .colonToken(),\n                expression: try caseSpecifier(wrapParams: false)\n            )\n            if kind != .return, let setterSpecifier = try setterCaseSpecifier(wrapParams: false) {\n                LabeledExprSyntax(\n                    label: NS.setKind,\n                    colon: .colonToken(),\n                    expression: setterSpecifier\n                )\n            }\n        }\n        return CodeBlockItemListSyntax {\n            FunctionCallExprSyntax(\n                calledExpression: MemberAccessExprSyntax(name: NS._init),\n                leftParen: .leftParenToken(),\n                arguments: arguments,\n                rightParen: .rightParenToken()\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Factory/BuilderFactory.swift",
    "content": "//\n//  BuilderFactory.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 23..\n//\n\nimport SwiftSyntax\n\n/// Factory to generate builder struct declarations.\n///\n/// Creates a member block item list that includes  `ReturnBuilder`,\n/// `ActionBuilder` and `VerifyBuilder` struct declarations.\nenum BuilderFactory: Factory {\n    static func build(from requirements: Requirements) throws -> MemberBlockItemListSyntax {\n        try MemberBlockItemListSyntax {\n            for builder in BuilderKind.allCases {\n                try builderDeclaration(for: builder, requirements)\n            }\n        }\n    }\n}\n\n// MARK: - Helpers\n\nextension BuilderFactory {\n    private static func builderDeclaration(\n        for kind: BuilderKind,\n        _ requirements: Requirements\n    ) throws -> some DeclSyntaxProtocol {\n        StructDeclSyntax(\n            modifiers: requirements.modifiers,\n            name: kind.name,\n            inheritanceClause: InheritanceClauseSyntax(\n                inheritedTypes: [\n                    InheritedTypeSyntax(\n                        type: MemberTypeSyntax(\n                            baseType: IdentifierTypeSyntax(name: NS.Mockable),\n                            name: NS.Builder\n                        )\n                    )\n                ]\n            ),\n            memberBlock: MemberBlockSyntax(members: try members(kind, requirements))\n        )\n    }\n\n    private static func members(_ kind: BuilderKind, _ requirements: Requirements) throws -> MemberBlockItemListSyntax {\n        try MemberBlockItemListSyntax {\n            mockerDeclaration(requirements)\n            initializerDeclaration(kind, requirements)\n            for variable in requirements.variables {\n                MemberBlockItemSyntax(\n                    decl: try variable.builder(\n                        of: kind,\n                        with: requirements.modifiers,\n                        using: requirements.syntax.mockType\n                    )\n                )\n            }\n            for function in requirements.functions {\n                MemberBlockItemSyntax(\n                    decl: try function.builder(\n                        of: kind,\n                        with: requirements.modifiers,\n                        using: requirements.syntax.mockType\n                    )\n                )\n            }\n        }\n    }\n\n    private static func mockerDeclaration(_ requirements: Requirements) -> VariableDeclSyntax {\n        VariableDeclSyntax(\n            modifiers: [DeclModifierSyntax(name: .keyword(.private))],\n            bindingSpecifier: .keyword(.let),\n            bindingsBuilder: {\n                PatternBindingSyntax(\n                    pattern: IdentifierPatternSyntax(identifier: NS.mocker),\n                    typeAnnotation: TypeAnnotationSyntax(type: IdentifierTypeSyntax(name: NS.Mocker))\n                )\n            }\n        )\n    }\n\n    private static func initializerDeclaration(\n        _ kind: BuilderKind,\n        _ requirements: Requirements\n    ) -> InitializerDeclSyntax {\n        InitializerDeclSyntax(\n            modifiers: DeclModifierListSyntax {\n                requirements.modifiers\n                DeclModifierSyntax(name: .keyword(.nonisolated))\n            },\n            signature: initializerSignature(kind, requirements)\n        ) {\n            InfixOperatorExprSyntax(\n                leftOperand: MemberAccessExprSyntax(\n                    base: DeclReferenceExprSyntax(baseName: .keyword(.self)),\n                    name: NS.mocker\n                ),\n                operator: AssignmentExprSyntax(),\n                rightOperand: DeclReferenceExprSyntax(baseName: NS.mocker)\n            )\n        }\n    }\n\n    private static func initializerSignature(\n        _ kind: BuilderKind,\n        _ requirements: Requirements\n    ) -> FunctionSignatureSyntax {\n        FunctionSignatureSyntax(\n            parameterClause: FunctionParameterClauseSyntax {\n                FunctionParameterSyntax(\n                    firstName: NS.mocker,\n                    type: IdentifierTypeSyntax(name: NS.Mocker)\n                )\n            }\n        )\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Factory/Caseable/Caseable.swift",
    "content": "//\n//  Caseable.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2023. 12. 07..\n//\n\nimport SwiftSyntax\n\n/// Describes requirements that are representable by a `Member` enum case.\n///\n/// Requirements conforming to `Caseable` provide their case declarations and a\n/// utility that helps creating member access expressions for a given case.\nprotocol Caseable {\n    /// Returns the member enum represenatation of a syntax.\n    ///\n    /// For example a member like:\n    /// ```\n    /// func foo(param: String) -> Int\n    /// ```\n    /// would return the following case declaration:\n    /// ```\n    /// case foo(param: Parameter<String>)\n    /// ```\n    var caseDeclarations: [EnumCaseDeclSyntax] { get throws }\n\n    /// Returns the initializer block that creates the enum case representation.\n    ///\n    /// For example a member like:\n    /// ```\n    /// func foo(param: String) -> Int\n    /// ```\n    /// would return the following initializer declaration if wrapParams is true:\n    /// ```\n    /// .m1_foo(param: .value(param))\n    /// ```\n    /// and:\n    /// ```\n    /// .m1_foo(param: param)\n    /// ```\n    /// if wrapParams is false.\n    func caseSpecifier(wrapParams: Bool) throws -> ExprSyntax\n\n    /// Returns the initializer block that creates the enum case representation.\n    ///\n    /// For example a member like:\n    /// ```\n    /// var prop: Int { get set }\n    /// ```\n    /// would return the following initializer declaration if wrapParams is true:\n    /// ```\n    /// .m1_set_name(newValue: .value(newValue))\n    /// ```\n    /// and:\n    /// ```\n    /// .m1_set_name(newValue: newValue)\n    /// ```\n    /// if wrapParams is false.\n    func setterCaseSpecifier(wrapParams: Bool) throws -> ExprSyntax?\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Factory/Caseable/Function+Caseable.swift",
    "content": "//\n//  Function+Caseable.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2023. 12. 07..\n//\n\nimport SwiftSyntax\nimport Foundation\n\n// MARK: - FunctionRequirement + Caseable\n\nextension FunctionRequirement: Caseable {\n    var caseDeclarations: [EnumCaseDeclSyntax] {\n        get throws {\n            let enumCase = EnumCaseElementSyntax(\n                name: caseExpression.declName.baseName,\n                parameterClause: enumParameterClause\n            )\n            let elements: EnumCaseElementListSyntax = .init(arrayLiteral: enumCase)\n            return [EnumCaseDeclSyntax(elements: elements)]\n        }\n    }\n\n    func caseSpecifier(wrapParams: Bool) throws -> ExprSyntax {\n        guard let parameters = parameters(wrap: wrapParams) else {\n            return ExprSyntax(caseExpression)\n        }\n        let functionCallExpr = FunctionCallExprSyntax(\n            calledExpression: caseExpression,\n            leftParen: .leftParenToken(),\n            arguments: parameters,\n            rightParen: .rightParenToken()\n        )\n        return ExprSyntax(functionCallExpr)\n    }\n\n    func setterCaseSpecifier(wrapParams: Bool) -> ExprSyntax? { nil }\n}\n\n// MARK: - Helpers\n\nextension FunctionRequirement {\n    private var caseExpression: MemberAccessExprSyntax {\n        let indexPrefix = String(index + 1)\n        let specialEnclosingCharacters: CharacterSet = [\"`\"]\n        let caseName = syntax.name.trimmedDescription.trimmingCharacters(in: specialEnclosingCharacters)\n        return MemberAccessExprSyntax(\n            name: .identifier(\"m\\(indexPrefix)_\\(caseName)\")\n        )\n    }\n\n    private func parameters(wrap: Bool) -> LabeledExprListSyntax? {\n        guard let parameterClause = enumParameterClause else { return nil }\n        let functionParameters = syntax.signature.parameterClause.parameters\n        let zippedParameters = zip(parameterClause.parameters, functionParameters)\n        let enumeratedParameters = zippedParameters.enumerated()\n        let lastIndex = enumeratedParameters.map(\\.offset).last\n        return LabeledExprListSyntax {\n            for (index, element) in enumeratedParameters {\n                let (enumParameter, functionParameter) = element\n                let hasComma = index != lastIndex && lastIndex != 0\n                let hasColon = enumParameter.firstName != nil\n                LabeledExprSyntax(\n                    label: enumParameter.firstName,\n                    colon: hasColon ? .colonToken() : nil,\n                    expression: parameterExpression(\n                        for: functionParameter,\n                        wrapParams: wrap\n                    ),\n                    trailingComma: hasComma ? .commaToken() : nil\n                )\n            }\n        }\n    }\n\n    private var enumParameterClause: EnumCaseParameterClauseSyntax? {\n        guard !syntax.signature.parameterClause.parameters.isEmpty else { return nil }\n        let enumParameters: EnumCaseParameterListSyntax = .init {\n            for parameter in syntax.signature.parameterClause.parameters {\n                let firstName = parameter.firstName.tokenKind == .wildcard\n                    ? nil : parameter.firstName.trimmed\n                EnumCaseParameterSyntax(\n                    firstName: firstName,\n                    colon: firstName == nil ? nil : .colonToken(),\n                    type: wrappedType(for: parameter)\n                )\n            }\n        }\n        return .init(parameters: enumParameters)\n    }\n\n    private func wrappedType(for parameter: FunctionParameterSyntax) -> IdentifierTypeSyntax {\n        let type = parameter.resolvedType().description\n        let isGeneric = syntax.containsGenericType(in: parameter)\n        let identifier = isGeneric ? NS.GenericValue : type\n        return IdentifierTypeSyntax(name: NS.Parameter(identifier))\n    }\n\n    private func parameterExpression(for functionParameter: FunctionParameterSyntax, wrapParams: Bool) -> ExprSyntax {\n        if wrapParams {\n            wrappedParameterExpression(for: functionParameter)\n        } else {\n            parameterExpression(for: functionParameter)\n        }\n    }\n\n    private func wrappedParameterExpression(for functionParameter: FunctionParameterSyntax) -> ExprSyntax {\n        let isGeneric = syntax.containsGenericType(in: functionParameter)\n        let functionParamName = (functionParameter.secondName ?? functionParameter.firstName).declNameOrVarCallName\n        let functionCallExpr = FunctionCallExprSyntax(\n            calledExpression: MemberAccessExprSyntax(name: isGeneric ? NS.generic : NS.value),\n            leftParen: .leftParenToken(),\n            arguments: LabeledExprListSyntax {\n                LabeledExprSyntax(expression: DeclReferenceExprSyntax(baseName: functionParamName))\n            },\n            rightParen: .rightParenToken()\n        )\n        return ExprSyntax(functionCallExpr)\n    }\n\n    private func parameterExpression(for functionParameter: FunctionParameterSyntax) -> ExprSyntax {\n        let isGeneric = syntax.containsGenericType(in: functionParameter)\n        let functionParamName = (functionParameter.secondName ?? functionParameter.firstName).declNameOrVarCallName\n        if isGeneric {\n            return ExprSyntax(\n                FunctionCallExprSyntax(\n                    calledExpression: MemberAccessExprSyntax(\n                        base: DeclReferenceExprSyntax(baseName: functionParamName),\n                        name: NS.eraseToGenericValue\n                    ),\n                    leftParen: .leftParenToken(),\n                    arguments: [],\n                    rightParen: .rightParenToken()\n                )\n            )\n        } else {\n            return ExprSyntax(\n                DeclReferenceExprSyntax(baseName: functionParamName)\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Factory/Caseable/Variable+Caseable.swift",
    "content": "//\n//  Variable+Caseable.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 10..\n//\n\nimport SwiftSyntax\n\n// MARK: - VariableRequirement + Caseable\n\nextension VariableRequirement: Caseable {\n    var caseDeclarations: [EnumCaseDeclSyntax] {\n        get throws {\n            [try getterEnumCaseDeclaration, try setterEnumCaseDeclaration].compactMap { $0 }\n        }\n    }\n\n    func caseSpecifier(wrapParams: Bool) throws -> ExprSyntax {\n        ExprSyntax(MemberAccessExprSyntax(name: try getterEnumName))\n    }\n\n    func setterCaseSpecifier(wrapParams: Bool) throws -> ExprSyntax? {\n        guard let setterName = try setterEnumName else { return nil }\n        let functionCallExpr = FunctionCallExprSyntax(\n            calledExpression: MemberAccessExprSyntax(name: setterName),\n            leftParen: .leftParenToken(),\n            arguments: LabeledExprListSyntax {\n                LabeledExprSyntax(\n                    label: NS.newValue,\n                    colon: .colonToken(),\n                    expression: wrapParams ? wrappedSetterParameters : setterParameters\n                )\n            },\n            rightParen: .rightParenToken()\n        )\n        return ExprSyntax(functionCallExpr)\n    }\n}\n\n// MARK: - Helpers\n\nextension VariableRequirement {\n    private func enumName(prefix: String = \"\") throws -> TokenSyntax {\n        .identifier(\"m\\(String(index + 1))_\\(prefix)\\(try syntax.name)\")\n    }\n\n    private var getterEnumName: TokenSyntax {\n        get throws {\n            syntax.isComputed ? try enumName() : try enumName(prefix: NS.get_)\n        }\n    }\n\n    private var setterEnumName: TokenSyntax? {\n        get throws {\n            syntax.isComputed ? nil : try enumName(prefix: NS.set_)\n        }\n    }\n\n    private var setterParameters: ExprSyntax {\n        ExprSyntax(DeclReferenceExprSyntax(baseName: NS.newValue))\n    }\n\n    private var wrappedSetterParameters: ExprSyntax {\n        let functionCallExpr = FunctionCallExprSyntax(\n            calledExpression: MemberAccessExprSyntax(name: NS.value),\n            leftParen: .leftParenToken(),\n            arguments: LabeledExprListSyntax {\n                LabeledExprSyntax(expression: DeclReferenceExprSyntax(baseName: NS.newValue))\n            },\n            rightParen: .rightParenToken()\n        )\n        return ExprSyntax(functionCallExpr)\n    }\n\n    private var getterEnumCaseDeclaration: EnumCaseDeclSyntax {\n        get throws {\n            let getterCase = EnumCaseElementSyntax(name: try getterEnumName)\n            let elements: EnumCaseElementListSyntax = .init(arrayLiteral: getterCase)\n            return EnumCaseDeclSyntax(elements: elements)\n        }\n    }\n\n    private var setterEnumCaseDeclaration: EnumCaseDeclSyntax? {\n        get throws {\n            guard let setterName = try setterEnumName else { return nil }\n            let setterCase = EnumCaseElementSyntax(\n                name: setterName,\n                parameterClause: try setterEnumParameterClause\n            )\n            let elements: EnumCaseElementListSyntax = .init(arrayLiteral: setterCase)\n            return EnumCaseDeclSyntax(elements: elements)\n        }\n    }\n\n    private var wrappedType: IdentifierTypeSyntax {\n        get throws {\n            let baseType = try syntax.resolvedType.trimmedDescription\n            return IdentifierTypeSyntax(name: NS.Parameter(baseType))\n        }\n    }\n\n    private var setterEnumParameterClause: EnumCaseParameterClauseSyntax? {\n        get throws {\n            guard !syntax.isComputed else { return nil }\n            let parameter = EnumCaseParameterSyntax(\n                firstName: NS.newValue,\n                colon: .colonToken(),\n                type: try wrappedType\n            )\n            return EnumCaseParameterClauseSyntax(\n                parameters: EnumCaseParameterListSyntax([parameter])\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Factory/ConformanceFactory.swift",
    "content": "//\n//  ConformanceFactory.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 23..\n//\n\nimport SwiftSyntax\n\n/// Factory to generate mock conformances of requirements.\n///\n/// Returns a member block item list that includes a mock implementation for every requirement.\nenum ConformanceFactory: Factory {\n    static func build(from requirements: Requirements) throws -> MemberBlockItemListSyntax {\n        try MemberBlockItemListSyntax {\n            try inits(requirements)\n            try functions(requirements)\n            try variables(requirements)\n        }\n    }\n}\n\n// MARK: - Helpers\n\nextension ConformanceFactory {\n    private static func variables(_ requirements: Requirements) throws -> MemberBlockItemListSyntax {\n        try MemberBlockItemListSyntax {\n            for variable in requirements.variables {\n                MemberBlockItemSyntax(\n                    decl: try variable.implement(with: requirements.modifiers)\n                )\n            }\n        }\n    }\n\n    private static func functions(_ requirements: Requirements) throws -> MemberBlockItemListSyntax {\n        try MemberBlockItemListSyntax {\n            for function in requirements.functions {\n                MemberBlockItemSyntax(\n                    decl: try function.implement(with: requirements.modifiers)\n                )\n            }\n        }\n    }\n\n    private static func inits(_ requirements: Requirements) throws -> MemberBlockItemListSyntax {\n        try MemberBlockItemListSyntax {\n            for initializer in requirements.initializers {\n                MemberBlockItemSyntax(\n                    decl: try initializer.implement(with: requirements.modifiers)\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Factory/EnumFactory.swift",
    "content": "//\n//  EnumFactory.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 12..\n//\n\nimport SwiftSyntax\n\n/// Factory to generate the `Member` enum.\n///\n/// Generates an enum that represents the given requirements as an enum case.\n/// The enum declaration also contains the implementation of the `match(_:)` function.\nenum EnumFactory: Factory {\n    static func build(from requirements: Requirements) throws -> IfConfigDeclSyntax {\n        SwiftVersionHelper.condition(\n            minimumVersion: .swift_6_1,\n            gte: .decls(\n                try MemberBlockItemListSyntax {\n                    try enumDeclaration(requirements, nonisolated: true)\n                }\n            ), else: .decls(\n                try MemberBlockItemListSyntax {\n                    try enumDeclaration(requirements, nonisolated: false)\n                }\n            )\n        )\n    }\n}\n\n// MARK: - Helpers\n\nextension EnumFactory {\n    private static func enumDeclaration(\n        _ requirements: Requirements,\n        nonisolated: Bool\n    ) throws -> EnumDeclSyntax {\n        EnumDeclSyntax(\n            modifiers: DeclModifierListSyntax {\n                requirements.modifiers\n                if nonisolated {\n                    DeclModifierSyntax(name: .keyword(.nonisolated))\n                }\n            },\n            name: NS.Member,\n            inheritanceClause: inheritanceClause,\n            memberBlock: MemberBlockSyntax(members: try members(requirements))\n        )\n    }\n\n    private static var inheritanceClause: InheritanceClauseSyntax {\n        InheritanceClauseSyntax {\n            InheritedTypeSyntax(\n                type: MemberTypeSyntax(\n                    baseType: IdentifierTypeSyntax(name: NS.Mockable),\n                    name: NS.Matchable\n                )\n            )\n            InheritedTypeSyntax(\n                type: MemberTypeSyntax(\n                    baseType: IdentifierTypeSyntax(name: NS.Mockable),\n                    name: NS.CaseIdentifiable\n                )\n            )\n            InheritedTypeSyntax(\n                type: MemberTypeSyntax(\n                    baseType: IdentifierTypeSyntax(name: NS.Swift),\n                    name: NS.Sendable\n                )\n            )\n        }\n    }\n\n    private static func members(_ requirements: Requirements) throws -> MemberBlockItemListSyntax {\n        try MemberBlockItemListSyntax {\n            for enumCase in try enumCaseDeclarations(requirements) {\n                enumCase\n            }\n            try matcherFunction(requirements)\n        }\n    }\n\n    private static func enumCaseDeclarations(_ requirements: Requirements) throws -> [EnumCaseDeclSyntax] {\n        var cases = [EnumCaseDeclSyntax]()\n        for variable in requirements.variables {\n            cases += try variable.caseDeclarations\n        }\n        for function in requirements.functions {\n            cases += try function.caseDeclarations\n        }\n        return cases\n    }\n\n    private static func matcherFunction(_ requirements: Requirements) throws -> MemberBlockItemSyntax {\n        let param = FunctionParameterSyntax(\n            firstName: .wildcardToken(),\n            secondName: NS.other,\n            type: IdentifierTypeSyntax(name: NS.Member)\n        )\n        let returnType = IdentifierTypeSyntax(name: NS.Bool)\n        let signature = FunctionSignatureSyntax(\n            parameterClause: .init(parameters: [param]),\n            returnClause: .init(type: returnType)\n        )\n        let statement = try CodeBlockItemListSyntax {\n            try matcherSwitch(requirements)\n        }\n        let decl = FunctionDeclSyntax(\n            modifiers: DeclModifierListSyntax {\n                requirements.modifiers\n                DeclModifierSyntax(name: .keyword(.nonisolated))\n            },\n            name: NS.match,\n            signature: signature,\n            body: .init(statements: statement)\n        )\n        return .init(decl: decl)\n    }\n\n    private static func matcherSwitch(_ requirements: Requirements) throws -> ExprSyntax {\n        let subject = TupleExprSyntax {\n            LabeledExprListSyntax {\n                LabeledExprSyntax(\n                    expression: DeclReferenceExprSyntax(baseName: .keyword(.self))\n                )\n                LabeledExprSyntax(\n                    expression: DeclReferenceExprSyntax(baseName: NS.other)\n                )\n            }\n        }\n\n        let cases = try enumCaseDeclarations(requirements)\n        let switchSyntax = try SwitchExprSyntax(subject: subject) {\n            try SwitchCaseListSyntax {\n                for caseDeclaration in cases {\n                    try matcherCase(for: caseDeclaration)\n                }\n                if cases.count > 1 {\n                    defaultCase\n                }\n            }\n        }\n        return ExprSyntax(switchSyntax)\n    }\n\n    private static var defaultCase: SwitchCaseSyntax {\n        let label = SwitchDefaultLabelSyntax()\n        let returnStmt = ReturnStmtSyntax(\n            expression: BooleanLiteralExprSyntax(false)\n        )\n\n        return SwitchCaseSyntax(\n            label: .default(label),\n            statements: CodeBlockItemListSyntax { returnStmt }\n        )\n    }\n\n    private static func matcherCase(for enumDeclaration: EnumCaseDeclSyntax) throws -> SwitchCaseSyntax {\n        guard let enumCase = enumDeclaration.elements.first else {\n            throw MockableMacroError.invalidDerivedEnumCase\n        }\n        let switchCaseLabel = try SwitchCaseLabelSyntax {\n            SwitchCaseItemSyntax(\n                pattern: ExpressionPatternSyntax(\n                    expression: try matcherCaseExpr(for: enumCase)\n                )\n            )\n        }\n        let statements = CodeBlockItemListSyntax {\n            matcherCaseBody(for: enumCase)\n        }\n        return SwitchCaseSyntax(\n            label: .case(switchCaseLabel),\n            statements: statements\n        )\n    }\n\n    private static func matcherCaseExpr(for enumCase: EnumCaseElementSyntax) throws -> TupleExprSyntax {\n        let parameters = enumCase.parameterClause?.parameters ?? []\n        let leftCase = matcherCaseSide(enumCase.name, parameters, prefix: NS.left)\n        let rightCase = matcherCaseSide(enumCase.name, parameters, prefix: NS.right)\n\n        return TupleExprSyntax {\n            LabeledExprListSyntax {\n                LabeledExprSyntax(expression: leftCase)\n                LabeledExprSyntax(expression: rightCase)\n            }\n        }\n    }\n\n    private static func matcherCaseSide(\n        _ name: TokenSyntax,\n        _ parameters: EnumCaseParameterListSyntax,\n        prefix: TokenSyntax\n    ) -> ExprSyntax {\n        let memberAccess = MemberAccessExprSyntax(\n            declName: DeclReferenceExprSyntax(baseName: name)\n        )\n\n        guard !parameters.isEmpty else {\n            return ExprSyntax(memberAccess)\n        }\n\n        let functionCallExpr = FunctionCallExprSyntax(\n            calledExpression: memberAccess,\n            leftParen: .leftParenToken(),\n            arguments: LabeledExprListSyntax {\n                for (index, parameter) in parameters.enumerated() {\n                    LabeledExprSyntax(\n                        label: parameter.firstName,\n                        colon: parameter.firstName != nil ? .colonToken() : nil,\n                        expression: parameterExpression(for: parameter, at: index, prefix: prefix)\n                    )\n                }\n            },\n            rightParen: .rightParenToken()\n        )\n        return ExprSyntax(functionCallExpr)\n    }\n\n    private static func parameterExpression(\n        for param: EnumCaseParameterSyntax,\n        at index: Int,\n        prefix: TokenSyntax\n    ) -> PatternExprSyntax {\n        return PatternExprSyntax(\n            pattern: ValueBindingPatternSyntax(\n                bindingSpecifier: .keyword(.let),\n                pattern: IdentifierPatternSyntax(\n                    identifier: parameterName(param, index: index, prefix: prefix)\n                )\n            )\n        )\n    }\n\n    private static func parameterName(\n        _ param: EnumCaseParameterSyntax,\n        index: Int,\n        prefix: TokenSyntax\n    ) -> TokenSyntax {\n        let patternId = param.firstName ?? NS.Param(suffix: String(index + 1))\n        let name = prefix.description + patternId.trimmed.description.capitalizedFirstLetter\n        return .identifier(name)\n    }\n\n    private static func matcherCaseBody(for enumCase: EnumCaseElementSyntax) -> StmtSyntax {\n        let parameters = enumCase.parameterClause?.parameters ?? []\n\n        guard !parameters.isEmpty else {\n            let returnStmt = ReturnStmtSyntax(expression: BooleanLiteralExprSyntax(true))\n            return StmtSyntax(returnStmt)\n        }\n\n        let leftNames = parameters.enumerated().map { index, element in\n            parameterName(element, index: index, prefix: NS.left)\n        }\n        let rightNames = parameters.enumerated().map { index, element in\n            parameterName(element, index: index, prefix: NS.right)\n        }\n\n        var expression: ExprSyntax!\n        for (leftName, rightName) in zip(leftNames, rightNames) {\n            guard expression != nil else {\n                expression = matchCall(leftName, rightName)\n                continue\n            }\n            let infixExpression = InfixOperatorExprSyntax(\n                leftOperand: expression,\n                operator: BinaryOperatorExprSyntax(operator: .binaryOperator(NS._andSign)),\n                rightOperand: matchCall(leftName, rightName)\n            )\n            expression = ExprSyntax(infixExpression)\n        }\n\n        let returnStmt = ReturnStmtSyntax(expression: expression)\n        return StmtSyntax(returnStmt)\n    }\n\n    private static func matchCall(_ leftName: TokenSyntax, _ rightName: TokenSyntax) -> ExprSyntax {\n        let functionCallExpr = FunctionCallExprSyntax(\n            calledExpression: MemberAccessExprSyntax(\n                base: DeclReferenceExprSyntax(baseName: leftName),\n                declName: DeclReferenceExprSyntax(baseName: NS.match)\n            ),\n            leftParen: .leftParenToken(),\n            arguments: LabeledExprListSyntax {\n                LabeledExprSyntax(\n                    expression: DeclReferenceExprSyntax(baseName: rightName)\n                )\n            },\n            rightParen: .rightParenToken()\n        )\n        return ExprSyntax(functionCallExpr)\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Factory/Factory.swift",
    "content": "//\n//  Factory.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 28..\n//\n\nimport SwiftSyntax\n\n/// Defines a generic factory protocol for generating syntax of the mock implementation.\n///\n/// This protocol serves as a blueprint for factory types that transform the protocol requirements\n/// into a mock implementation.\nprotocol Factory {\n    /// The type of syntax produced by the factory.\n    associatedtype Result: SyntaxProtocol\n\n    /// Generates a syntax using the given requirements.\n    ///\n    /// - Parameter requirements: Groupped protocol requirements to generate syntax for.\n    /// - Throws: Throws an error if the construction fails, which could be due to invalid\n    ///   requirements or other issues that prevent the successful generation of the result.\n    /// - Returns: An instance of the associated `Result` type, representing the generated\n    ///   syntax structure.\n    static func build(from requirements: Requirements) throws -> Result\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Factory/MemberFactory.swift",
    "content": "//\n//  MemberFactory.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 23..\n//\n\nimport SwiftSyntax\n\n/// Factory to generate custom members.\n///\n/// Generates custom members (ex.: default init, reset function, etc...)\n/// for the mock implementation.\nenum MemberFactory: Factory {\n    static func build(from requirements: Requirements) throws -> MemberBlockItemListSyntax {\n        MemberBlockItemListSyntax {\n            mockerAlias(requirements)\n            mocker(requirements)\n            clause(requirements, name: NS._given, type: NS.ReturnBuilder, message: Messages.givenMessage)\n            clause(requirements, name: NS._when, type: NS.ActionBuilder, message: Messages.whenMessage)\n            clause(requirements, name: NS._verify, type: NS.VerifyBuilder, message: Messages.verifyMessage)\n            reset(requirements)\n            defaultInit(requirements)\n        }\n    }\n}\n\n// MARK: - Helpers\n\nextension MemberFactory {\n    private static func defaultInit(_ requirements: Requirements) -> InitializerDeclSyntax {\n        InitializerDeclSyntax(\n            modifiers: requirements.isActor ? requirements.modifiers : memberModifiers(requirements),\n            signature: .init(parameterClause: defaultInitParameters),\n            body: .init { CodeBlockItemSyntax(item: .expr(mockerAssignmentWithPolicy)) }\n        )\n    }\n\n    private static func mockerAlias(_ requirements: Requirements) -> TypeAliasDeclSyntax {\n        TypeAliasDeclSyntax(\n            modifiers: requirements.modifiers,\n            name: NS.Mocker,\n            initializer: TypeInitializerClauseSyntax(\n                value: MemberTypeSyntax(\n                    baseType: IdentifierTypeSyntax(name: NS.Mockable),\n                    name: NS.Mocker,\n                    genericArgumentClause: GenericArgumentClauseSyntax(\n                        arguments: GenericArgumentListSyntax {\n                            GenericArgumentSyntax(argument: requirements.syntax.mockType)\n                        }\n                    )\n                )\n            )\n        )\n    }\n\n    private static func mocker(_ requirements: Requirements) -> VariableDeclSyntax {\n        VariableDeclSyntax(\n            modifiers: [DeclModifierSyntax(name: .keyword(.private))],\n            bindingSpecifier: .keyword(.let)\n        ) {\n            PatternBindingSyntax(\n                pattern: IdentifierPatternSyntax(identifier: NS.mocker),\n                initializer: InitializerClauseSyntax(\n                    value: FunctionCallExprSyntax(\n                        calledExpression: DeclReferenceExprSyntax(baseName: NS.Mocker),\n                        leftParen: .leftParenToken(),\n                        arguments: [],\n                        rightParen: .rightParenToken()\n                    )\n                )\n            )\n        }\n    }\n\n    private static func clause(\n        _ requirements: Requirements,\n        name: TokenSyntax,\n        type: TokenSyntax,\n        message: String\n    ) -> VariableDeclSyntax {\n        VariableDeclSyntax(\n            attributes: unavailableAttribute(message: message),\n            modifiers: memberModifiers(requirements),\n            bindingSpecifier: .keyword(.var),\n            bindings: PatternBindingListSyntax {\n                PatternBindingSyntax(\n                    pattern: IdentifierPatternSyntax(identifier: name),\n                    typeAnnotation: TypeAnnotationSyntax(type: IdentifierTypeSyntax(name: type)),\n                    accessorBlock: AccessorBlockSyntax(\n                        accessors: .getter(builderInit)\n                    )\n                )\n            }\n        )\n    }\n\n    private static var builderInit: CodeBlockItemListSyntax {\n        CodeBlockItemListSyntax {\n            FunctionCallExprSyntax(\n                calledExpression: MemberAccessExprSyntax(name: NS._init),\n                leftParen: .leftParenToken(),\n                arguments: [\n                    LabeledExprSyntax(\n                        label: NS.mocker,\n                        colon: .colonToken(),\n                        expression: DeclReferenceExprSyntax(baseName: NS.mocker)\n                    )\n                ],\n                rightParen: .rightParenToken()\n            )\n        }\n    }\n\n    private static func reset(_ requirements: Requirements) -> FunctionDeclSyntax {\n        FunctionDeclSyntax(\n            modifiers: memberModifiers(requirements),\n            name: NS.reset,\n            signature: .init(\n                parameterClause: FunctionParameterClauseSyntax(\n                    parameters: [scopesParameter]\n                )\n            ),\n            body: resetCall\n        )\n    }\n\n    private static func memberModifiers(_ requirements: Requirements) -> DeclModifierListSyntax {\n        DeclModifierListSyntax {\n            requirements.modifiers\n            DeclModifierSyntax(name: .keyword(.nonisolated))\n        }\n    }\n\n    private static var scopesParameter: FunctionParameterSyntax {\n        FunctionParameterSyntax(\n            firstName: .wildcardToken(),\n            secondName: NS.scopes,\n            type: IdentifierTypeSyntax(\n                name: NS.Set,\n                genericArgumentClause: GenericArgumentClauseSyntax(\n                    arguments: GenericArgumentListSyntax {\n                        GenericArgumentSyntax(\n                            argument: MemberTypeSyntax(\n                                baseType: IdentifierTypeSyntax(name: NS.Mockable),\n                                name: NS.MockerScope\n                            )\n                        )\n                    }\n                )\n            ),\n            defaultValue: InitializerClauseSyntax(\n                value: MemberAccessExprSyntax(name: NS.all)\n            )\n        )\n    }\n\n    private static var resetCall: CodeBlockSyntax {\n        CodeBlockSyntax(\n            statements: CodeBlockItemListSyntax {\n                FunctionCallExprSyntax(\n                    calledExpression: MemberAccessExprSyntax(\n                        base: DeclReferenceExprSyntax(baseName: NS.mocker),\n                        name: NS.reset\n                    ),\n                    leftParen: .leftParenToken(),\n                    arguments: [\n                        LabeledExprSyntax(\n                            label: NS.scopes,\n                            colon: .colonToken(),\n                            expression: DeclReferenceExprSyntax(baseName: NS.scopes)\n                        )\n                    ],\n                    rightParen: .rightParenToken()\n                )\n            }\n        )\n    }\n\n    private static func unavailableAttribute(message: String) -> AttributeListSyntax {\n        let arguments = AvailabilityArgumentListSyntax {\n            AvailabilityArgumentSyntax(argument: .token(NS._star))\n            AvailabilityArgumentSyntax(argument: .token(NS.deprecated))\n            AvailabilityArgumentSyntax(argument: .availabilityLabeledArgument(\n                AvailabilityLabeledArgumentSyntax(\n                    label: NS.message,\n                    value: .string(SimpleStringLiteralExprSyntax(\n                        openingQuote: .stringQuoteToken(),\n                        segments: SimpleStringLiteralSegmentListSyntax {\n                            StringSegmentSyntax(content: .identifier(message))\n                        },\n                        closingQuote: .stringQuoteToken()\n                    ))\n                )\n            ))\n        }\n        let attribute = AttributeSyntax(\n            attributeName: IdentifierTypeSyntax(name: NS.available),\n            leftParen: .leftParenToken(),\n            arguments: .availability(arguments),\n            rightParen: .rightParenToken(),\n            trailingTrivia: .newline\n        )\n        return AttributeListSyntax { attribute }\n    }\n\n    private static var defaultInitParameters: FunctionParameterClauseSyntax {\n        FunctionParameterClauseSyntax(\n            parameters: FunctionParameterListSyntax {\n                FunctionParameterSyntax(\n                    firstName: NS.policy,\n                    type: OptionalTypeSyntax(\n                        wrappedType: MemberTypeSyntax(\n                            baseType: IdentifierTypeSyntax(name: NS.Mockable),\n                            name: NS.MockerPolicy\n                        )\n                    ),\n                    defaultValue: InitializerClauseSyntax(\n                        value: NilLiteralExprSyntax()\n                    )\n                )\n            }\n        )\n    }\n\n    private static var mockerAssignmentWithPolicy: ExprSyntax {\n        let expression = IfExprSyntax(\n            conditions: ConditionElementListSyntax {\n                OptionalBindingConditionSyntax(\n                    bindingSpecifier: .keyword(.let),\n                    pattern: IdentifierPatternSyntax(\n                        identifier: NS.policy\n                    )\n                )\n            },\n            body: CodeBlockSyntax(\n                statements: CodeBlockItemListSyntax {\n                    InfixOperatorExprSyntax(\n                        leftOperand: MemberAccessExprSyntax(\n                            base: DeclReferenceExprSyntax(baseName: NS.mocker),\n                            declName: DeclReferenceExprSyntax(baseName: NS.policy)\n                        ),\n                        operator: AssignmentExprSyntax(),\n                        rightOperand: DeclReferenceExprSyntax(baseName: NS.policy)\n                    )\n                }\n            )\n        )\n        return ExprSyntax(expression)\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Factory/MockFactory.swift",
    "content": "//\n//  MockFactory.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 28..\n//\n\n#if canImport(SwiftSyntax600) || swift(<6)\nimport SwiftSyntax\n#else\n@preconcurrency import SwiftSyntax\n#endif\n\n/// Factory to generate the mock service declaration.\n///\n/// Generates a class declaration that defines the mock implementation of the protocol.\nenum MockFactory: Factory {\n    static func build(from requirements: Requirements) throws -> DeclSyntax {\n        let classDecl = ClassDeclSyntax(\n            leadingTrivia: leadingTrivia(requirements),\n            attributes: try attributes(requirements),\n            modifiers: modifiers(requirements),\n            classKeyword: classKeyword(requirements),\n            name: .identifier(requirements.syntax.mockName),\n            genericParameterClause: genericParameterClause(requirements),\n            inheritanceClause: inheritanceClause(requirements),\n            genericWhereClause: genericWhereClause(requirements),\n            memberBlock: try MemberBlockSyntax {\n                try MemberFactory.build(from: requirements)\n                try ConformanceFactory.build(from: requirements)\n                try EnumFactory.build(from: requirements)\n                try BuilderFactory.build(from: requirements)\n            }\n        )\n        return DeclSyntax(classDecl)\n    }\n}\n\n// MARK: - Helpers\n\nextension MockFactory {\n    private static func leadingTrivia(_ requirements: Requirements) -> Trivia {\n        requirements.syntax.leadingTrivia\n    }\n\n    private static let inheritedTypeMappings: [String: TokenSyntax] = [\n        NS.NSObjectProtocol: NS.NSObject\n    ]\n\n    private static func attributes(_ requirements: Requirements) throws -> AttributeListSyntax {\n        guard requirements.containsGenericExistentials else { return [] }\n        return try AttributeListSyntax {\n            // Runtime support for parametrized protocol types is only available from:\n            try Availability.from(iOS: \"16.0\", macOS: \"13.0\", tvOS: \"16.0\", watchOS: \"9.0\")\n        }\n        .with(\\.trailingTrivia, .newline)\n    }\n\n    private static func modifiers(_ requirements: Requirements) -> DeclModifierListSyntax {\n        var modifiers = requirements.syntax.modifiers.trimmed\n        if !requirements.isActor {\n            modifiers.append(DeclModifierSyntax(name: .keyword(.final)))\n        }\n        return modifiers\n    }\n\n    private static func classKeyword(_ requirements: Requirements) -> TokenSyntax {\n        requirements.isActor ? .keyword(.actor) : .keyword(.class)\n    }\n\n    private static func inheritanceClause(_ requirements: Requirements) -> InheritanceClauseSyntax {\n        InheritanceClauseSyntax {\n            inheritedTypeMappings(requirements)\n            InheritedTypeSyntax(type: IdentifierTypeSyntax(\n                name: requirements.syntax.name.trimmed\n            ))\n            InheritedTypeSyntax(\n                type: MemberTypeSyntax(\n                    baseType: IdentifierTypeSyntax(name: NS.Mockable),\n                    name: NS.MockableService\n                )\n            )\n        }\n    }\n\n    private static func inheritedTypeMappings(_ requirements: Requirements) -> InheritedTypeListSyntax {\n        guard let inheritanceClause = requirements.syntax.inheritanceClause else { return [] }\n        return InheritedTypeListSyntax {\n            for inheritedType in inheritanceClause.inheritedTypes {\n                if let type = inheritedType.type.as(IdentifierTypeSyntax.self),\n                   let mapping = inheritedTypeMappings[type.name.trimmedDescription] {\n                    InheritedTypeSyntax(type: IdentifierTypeSyntax(name: mapping))\n                }\n            }\n        }\n    }\n\n    private static func getAssociatedTypes(_ requirements: Requirements) -> [AssociatedTypeDeclSyntax] {\n        requirements.syntax.memberBlock.members.compactMap {\n            $0.decl.as(AssociatedTypeDeclSyntax.self)\n        }\n    }\n\n    private static func genericParameterClause(_ requirements: Requirements) -> GenericParameterClauseSyntax? {\n        let associatedTypes = getAssociatedTypes(requirements)\n        guard !associatedTypes.isEmpty else { return nil }\n        return .init {\n            GenericParameterListSyntax {\n                for name in associatedTypes.map(\\.name.trimmed) {\n                    GenericParameterSyntax(name: name)\n                }\n            }\n        }\n    }\n\n    private static func genericWhereClause(_ requirements: Requirements) -> GenericWhereClauseSyntax? {\n        let associatedTypes = getAssociatedTypes(requirements)\n        guard !associatedTypes.isEmpty else { return nil }\n\n        let inheritances = associatedTypes.filter { $0.inheritanceClause != nil }\n        let whereClauses = associatedTypes.filter { $0.genericWhereClause != nil }\n\n        guard !inheritances.isEmpty || !whereClauses.isEmpty else { return nil }\n\n        let requirementList = GenericRequirementListSyntax {\n            if let genericWhereClause = requirements.syntax.genericWhereClause {\n                genericWhereClause.requirements\n            }\n\n            for type in whereClauses {\n                if let genericWhereClause = type.genericWhereClause {\n                    genericWhereClause.requirements\n                }\n            }\n\n            for type in inheritances {\n                if let inheritanceClause = type.inheritanceClause {\n                    for inheritedType in inheritanceClause.inheritedTypes {\n                        let requirement = ConformanceRequirementSyntax(\n                            leftType: IdentifierTypeSyntax(name: type.name),\n                            rightType: inheritedType.type\n                        )\n                        GenericRequirementSyntax(\n                            requirement: .conformanceRequirement(requirement)\n                        )\n                    }\n                }\n            }\n        }\n\n        return .init(requirements: requirementList)\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Factory/Mockable/Function+Mockable.swift",
    "content": "//\n//  Function+Mockable.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 23..\n//\n\nimport SwiftSyntax\n\n// MARK: - FunctionRequirement + Mockable\n\nextension FunctionRequirement: Mockable {\n    func implement(with modifiers: DeclModifierListSyntax) throws -> DeclSyntax {\n        let decl = FunctionDeclSyntax(\n            attributes: syntax.attributes.trimmed.with(\\.trailingTrivia, .newline),\n            modifiers: declarationModifiers(extending: modifiers),\n            funcKeyword: syntax.funcKeyword.trimmed,\n            name: syntax.name.trimmed,\n            genericParameterClause: syntax.genericParameterClause?.trimmed,\n            signature: syntax.signature.trimmed,\n            genericWhereClause: syntax.genericWhereClause?.trimmed,\n            body: .init(statements: try body)\n        )\n        for parameter in decl.signature.parameterClause.parameters {\n            guard parameter.type.as(FunctionTypeSyntax.self) == nil else {\n                throw MockableMacroError.nonEscapingFunctionParameter\n            }\n        }\n        return DeclSyntax(decl)\n    }\n}\n\n// MARK: - Helpers\n\nextension FunctionRequirement {\n    private func declarationModifiers(extending modifiers: DeclModifierListSyntax) -> DeclModifierListSyntax {\n        let filtered = syntax.modifiers.filtered(keywords: [.nonisolated])\n        return modifiers.trimmed.appending(filtered.trimmed)\n    }\n\n    private var body: CodeBlockItemListSyntax {\n        get throws {\n            try CodeBlockItemListSyntax {\n                try memberDeclaration\n                if syntax.isVoid {\n                    mockerCall\n                } else {\n                    returnStatement\n                }\n            }\n        }\n    }\n\n    private var memberDeclaration: DeclSyntax {\n        get throws {\n            let variableDecl = try VariableDeclSyntax(bindingSpecifier: .keyword(.let)) {\n                try PatternBindingListSyntax {\n                    PatternBindingSyntax(\n                        pattern: IdentifierPatternSyntax(identifier: NS.member),\n                        typeAnnotation: TypeAnnotationSyntax(\n                            type: IdentifierTypeSyntax(name: NS.Member)\n                        ),\n                        initializer: InitializerClauseSyntax(\n                            value: try caseSpecifier(wrapParams: true)\n                        )\n                    )\n                }\n            }\n            return DeclSyntax(variableDecl)\n        }\n    }\n\n    private var returnStatement: StmtSyntax {\n        StmtSyntax(ReturnStmtSyntax(expression: mockerCall))\n    }\n\n    private var mockerCall: ExprSyntax {\n        let call = FunctionCallExprSyntax(\n            calledExpression: MemberAccessExprSyntax(\n                base: DeclReferenceExprSyntax(baseName: NS.mocker),\n                declName: DeclReferenceExprSyntax(\n                    baseName: syntax.isThrowing ? NS.mockThrowing : NS.mock\n                )\n            ),\n            leftParen: .leftParenToken(),\n            arguments: LabeledExprListSyntax {\n                LabeledExprSyntax(\n                    expression: DeclReferenceExprSyntax(baseName: NS.member)\n                )\n                if let errorTypeExpression {\n                    errorTypeExpression\n                }\n            },\n            rightParen: .rightParenToken(),\n            trailingClosure: mockerClosure\n        )\n        return if syntax.isThrowing {\n            ExprSyntax(TryExprSyntax(expression: call))\n        } else {\n            ExprSyntax(call)\n        }\n    }\n\n    private var errorTypeExpression: LabeledExprSyntax? {\n        #if canImport(SwiftSyntax600)\n        guard let type = syntax.errorType else { return nil }\n        return LabeledExprSyntax(\n            label: NS.error,\n            colon: .colonToken(),\n            expression: MemberAccessExprSyntax(\n                base: DeclReferenceExprSyntax(baseName: .identifier(type.trimmedDescription)),\n                declName: DeclReferenceExprSyntax(baseName: .keyword(.`self`))\n            )\n        )\n        #else\n        return nil\n        #endif\n    }\n\n    private var mockerClosure: ClosureExprSyntax {\n        ClosureExprSyntax(\n            signature: mockerClosureSignature,\n            statements: CodeBlockItemListSyntax {\n                producerDeclaration\n                producerCall\n            }\n        )\n    }\n\n    private var mockerClosureSignature: ClosureSignatureSyntax {\n        let paramList = ClosureShorthandParameterListSyntax {\n            ClosureShorthandParameterSyntax(name: NS.producer)\n        }\n        return ClosureSignatureSyntax(parameterClause: .simpleInput(paramList))\n    }\n\n    private var producerDeclaration: VariableDeclSyntax {\n        VariableDeclSyntax(\n            bindingSpecifier: .keyword(.let),\n            bindings: PatternBindingListSyntax {\n                PatternBindingSyntax(\n                    pattern: IdentifierPatternSyntax(identifier: NS.producer),\n                    initializer: InitializerClauseSyntax(value: producerCast)\n                )\n            }\n        )\n    }\n\n    private var producerCast: TryExprSyntax {\n        TryExprSyntax(\n            expression: AsExprSyntax(\n                expression: FunctionCallExprSyntax(\n                    calledExpression: DeclReferenceExprSyntax(baseName: NS.cast),\n                    leftParen: .leftParenToken(),\n                    arguments: LabeledExprListSyntax {\n                        LabeledExprSyntax(\n                            expression: DeclReferenceExprSyntax(baseName: NS.producer)\n                        )\n                    },\n                    rightParen: .rightParenToken()\n                ),\n                type: syntax.closureType\n            )\n        )\n    }\n\n    private var producerCall: ReturnStmtSyntax {\n        let producerCallExpr = FunctionCallExprSyntax(\n            calledExpression: DeclReferenceExprSyntax(baseName: NS.producer),\n            leftParen: .leftParenToken(),\n            arguments: LabeledExprListSyntax {\n                for parameter in syntax.signature.parameterClause.parameters {\n                    let parameterReference = DeclReferenceExprSyntax(\n                        baseName: (parameter.secondName?.trimmed ?? parameter.firstName.trimmed).declNameOrVarCallName\n                    )\n                    if parameter.isInout {\n                        LabeledExprSyntax(expression: InOutExprSyntax(expression: parameterReference))\n                    } else {\n                        LabeledExprSyntax(expression: parameterReference)\n                    }\n                }\n            },\n            rightParen: .rightParenToken()\n        )\n        let producerCall = ExprSyntax(producerCallExpr)\n        let tryProducerCall = ExprSyntax(TryExprSyntax(expression: producerCall))\n\n        return ReturnStmtSyntax(expression: syntax.isThrowing ? tryProducerCall : producerCall)\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Factory/Mockable/Initializer+Mockable.swift",
    "content": "//\n//  Initializer+Mockable.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 23..\n//\n\nimport SwiftSyntax\n\n// MARK: - InitializerRequirement + Mockable\n\nextension InitializerRequirement: Mockable {\n    func implement(with modifiers: DeclModifierListSyntax) throws -> DeclSyntax {\n        let initDecl = InitializerDeclSyntax(\n            attributes: syntax.attributes.trimmed.with(\\.trailingTrivia, .newline),\n            modifiers: declarationModifiers(extending: modifiers),\n            initKeyword: syntax.initKeyword.trimmed,\n            optionalMark: syntax.optionalMark?.trimmed,\n            genericParameterClause: syntax.genericParameterClause?.trimmed,\n            signature: syntax.signature.trimmed,\n            genericWhereClause: syntax.genericWhereClause?.trimmed,\n            body: .init(statements: [])\n        )\n        return DeclSyntax(initDecl)\n    }\n}\n\n// MARK: - Helpers\n\nextension InitializerRequirement {\n    private func declarationModifiers(extending modifiers: DeclModifierListSyntax) -> DeclModifierListSyntax {\n        let filtered = syntax.modifiers.filtered(keywords: [.nonisolated])\n        return modifiers.trimmed.appending(filtered.trimmed)\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Factory/Mockable/Mockable.swift",
    "content": "//\n//  Mockable.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 23..\n//\n\nimport SwiftSyntax\n\n/// Defines a protocol for creating mock implementations.\n///\n/// Requirements conforming to `Mockable` can generate mock versions of themselves.\nprotocol Mockable {\n    /// Creates a mock declaration.\n    ///\n    /// - Parameter modifiers: Modifiers to apply to the mock declaration.\n    /// - Throws: If the mock cannot be generated.\n    /// - Returns: The mock declaration of the requirements.\n    func implement(with modifiers: DeclModifierListSyntax) throws -> DeclSyntax\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Factory/Mockable/Variable+Mockable.swift",
    "content": "//\n//  Variable+Mockable.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 23..\n//\n\nimport SwiftSyntax\n\n// MARK: - VariableRequirement + Mockable\n\nextension VariableRequirement: Mockable {\n    func implement(with modifiers: DeclModifierListSyntax) throws -> DeclSyntax {\n        let variableDecl = VariableDeclSyntax(\n            attributes: syntax.attributes.trimmed.with(\\.trailingTrivia, .newline),\n            modifiers: declarationModifiers(extending: modifiers),\n            bindingSpecifier: .keyword(.var),\n            bindings: try PatternBindingListSyntax {\n                try syntax.binding.with(\\.accessorBlock, accessorBlock)\n            }\n        )\n        return DeclSyntax(variableDecl)\n    }\n}\n\n// MARK: - Helpers\n\nextension VariableRequirement {\n    private func declarationModifiers(extending modifiers: DeclModifierListSyntax) -> DeclModifierListSyntax {\n        let filtered = syntax.modifiers.filtered(keywords: [.nonisolated])\n        return modifiers.trimmed.appending(filtered.trimmed)\n    }\n\n    private var accessorBlock: AccessorBlockSyntax {\n        get throws {\n            AccessorBlockSyntax(accessors: .accessors(try accessorDeclList))\n        }\n    }\n\n    private var accessorDeclList: AccessorDeclListSyntax {\n        get throws {\n            try AccessorDeclListSyntax {\n                try getterDecl\n                if let setterDecl = try setterDecl {\n                    setterDecl\n                }\n            }\n        }\n    }\n\n    private var getterDecl: AccessorDeclSyntax {\n        get throws {\n            let caseSpecifier = try caseSpecifier(wrapParams: true)\n            let mockerCall = try mockerCall\n            let body = CodeBlockSyntax(\n                statements: CodeBlockItemListSyntax {\n                    memberDeclaration(caseSpecifier)\n                    ReturnStmtSyntax(expression: mockerCall)\n                }\n            )\n            return try syntax.getAccessor.with(\\.body, body)\n        }\n    }\n\n    private var setterDecl: AccessorDeclSyntax? {\n        get throws {\n            guard let caseSpecifier = try setterCaseSpecifier(wrapParams: true),\n                  let setAccessor = syntax.setAccessor else { return nil }\n            let body = CodeBlockSyntax(\n                statements: CodeBlockItemListSyntax {\n                    memberDeclaration(caseSpecifier)\n                    mockerCall(memberName: NS.addInvocation)\n                    mockerCall(memberName: NS.performActions)\n                }\n            )\n            return setAccessor.with(\\.body, body)\n        }\n    }\n\n    private var mockerCall: ExprSyntax {\n        get throws {\n            let call = FunctionCallExprSyntax(\n                calledExpression: MemberAccessExprSyntax(\n                    base: DeclReferenceExprSyntax(baseName: NS.mocker),\n                    declName: DeclReferenceExprSyntax(\n                        baseName: try syntax.isThrowing ? NS.mockThrowing : NS.mock\n                    )\n                ),\n                leftParen: .leftParenToken(),\n                arguments: try LabeledExprListSyntax {\n                    LabeledExprSyntax(\n                        expression: DeclReferenceExprSyntax(baseName: NS.member)\n                    )\n                    if let errorTypeExpression = try errorTypeExpression {\n                        errorTypeExpression\n                    }\n                },\n                rightParen: .rightParenToken(),\n                trailingClosure: try mockerClosure\n            )\n            return if try syntax.isThrowing {\n                ExprSyntax(TryExprSyntax(expression: call))\n            } else {\n                ExprSyntax(call)\n            }\n        }\n    }\n\n    private var errorTypeExpression: LabeledExprSyntax? {\n        get throws {\n            #if canImport(SwiftSyntax600)\n            guard let type = try syntax.errorType else { return nil }\n            return LabeledExprSyntax(\n                label: NS.error,\n                colon: .colonToken(),\n                expression: MemberAccessExprSyntax(\n                    base: DeclReferenceExprSyntax(baseName: .identifier(type.trimmedDescription)),\n                    declName: DeclReferenceExprSyntax(baseName: .keyword(.`self`))\n                )\n            )\n            #else\n            return nil\n            #endif\n        }\n    }\n\n    private func memberDeclaration(_ caseSpecifier: ExprSyntax) -> VariableDeclSyntax {\n        VariableDeclSyntax(bindingSpecifier: .keyword(.let)) {\n            PatternBindingListSyntax {\n                PatternBindingSyntax(\n                    pattern: IdentifierPatternSyntax(identifier: NS.member),\n                    typeAnnotation: TypeAnnotationSyntax(\n                        type: IdentifierTypeSyntax(name: NS.Member)\n                    ),\n                    initializer: InitializerClauseSyntax(value: caseSpecifier)\n                )\n            }\n        }\n    }\n\n    private var mockerClosure: ClosureExprSyntax {\n        get throws {\n            ClosureExprSyntax(\n                signature: mockerClosureSignature,\n                statements: try CodeBlockItemListSyntax {\n                    try producerDeclaration\n                    try producerCall\n                }\n            )\n        }\n    }\n\n    private var mockerClosureSignature: ClosureSignatureSyntax {\n        let paramList = ClosureShorthandParameterListSyntax {\n            ClosureShorthandParameterSyntax(name: NS.producer)\n        }\n        return ClosureSignatureSyntax(parameterClause: .simpleInput(paramList))\n    }\n\n    private var producerDeclaration: VariableDeclSyntax {\n        get throws {\n            VariableDeclSyntax(\n                bindingSpecifier: .keyword(.let),\n                bindings: try PatternBindingListSyntax {\n                    PatternBindingSyntax(\n                        pattern: IdentifierPatternSyntax(identifier: NS.producer),\n                        initializer: InitializerClauseSyntax(value: try producerCast)\n                    )\n                }\n            )\n        }\n    }\n\n    private var producerCast: TryExprSyntax {\n        get throws {\n            TryExprSyntax(\n                expression: AsExprSyntax(\n                    expression: FunctionCallExprSyntax(\n                        calledExpression: DeclReferenceExprSyntax(baseName: NS.cast),\n                        leftParen: .leftParenToken(),\n                        arguments: LabeledExprListSyntax {\n                            LabeledExprSyntax(\n                                expression: DeclReferenceExprSyntax(baseName: NS.producer)\n                            )\n                        },\n                        rightParen: .rightParenToken()\n                    ),\n                    type: try syntax.closureType\n                )\n            )\n        }\n    }\n\n    private var producerCall: ReturnStmtSyntax {\n        get throws {\n            let producerCallExpr = FunctionCallExprSyntax(\n                calledExpression: DeclReferenceExprSyntax(baseName: NS.producer),\n                leftParen: .leftParenToken(),\n                arguments: [],\n                rightParen: .rightParenToken()\n            )\n\n            let producerCall = ExprSyntax(producerCallExpr)\n            let tryProducerCall = ExprSyntax(TryExprSyntax(expression: producerCall))\n\n            return ReturnStmtSyntax(expression: try syntax.isThrowing ? tryProducerCall : producerCall)\n        }\n    }\n\n    private func mockerCall(memberName: TokenSyntax) -> FunctionCallExprSyntax {\n        FunctionCallExprSyntax(\n            calledExpression: MemberAccessExprSyntax(\n                base: DeclReferenceExprSyntax(baseName: NS.mocker),\n                name: memberName\n            ),\n            leftParen: .leftParenToken(),\n            arguments: LabeledExprListSyntax {\n                LabeledExprSyntax(\n                    label: NS._for,\n                    colon: .colonToken(),\n                    expression: DeclReferenceExprSyntax(baseName: NS.member)\n                )\n            },\n            rightParen: .rightParenToken()\n        )\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/MockableMacro.swift",
    "content": "//\n//  MockableMacro.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2023. 11. 14..\n//\n\nimport SwiftSyntax\nimport SwiftSyntaxMacros\nimport SwiftDiagnostics\n\npublic enum MockableMacro: PeerMacro {\n    public static func expansion(\n        of node: AttributeSyntax,\n        providingPeersOf declaration: some DeclSyntaxProtocol,\n        in context: some MacroExpansionContext\n    ) throws -> [DeclSyntax] {\n        guard let protocolDecl = declaration.as(ProtocolDeclSyntax.self) else {\n            throw MockableMacroError.notAProtocol\n        }\n\n        #if swift(>=6) && !canImport(SwiftSyntax600)\n        context.diagnose(Diagnostic(node: node, message: MockableMacroWarning.versionMismatch))\n        #endif\n\n        let requirements = try Requirements(protocolDecl)\n        let declaration = try MockFactory.build(from: requirements)\n        let codeblock = CodeBlockItemListSyntax {\n            CodeBlockItemSyntax(item: .decl(declaration))\n        }\n\n        let ifClause = IfConfigClauseListSyntax {\n            IfConfigClauseSyntax(\n                poundKeyword: .poundIfToken(),\n                condition: DeclReferenceExprSyntax(baseName: NS.MOCKING),\n                elements: .statements(codeblock)\n            )\n        }\n\n        return [DeclSyntax(IfConfigDeclSyntax(clauses: ifClause))]\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/MockableMacroError.swift",
    "content": "//\n//  MockableMacroError.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2023. 11. 24..\n//\n\npublic enum MockableMacroError: Error, CustomStringConvertible {\n    case notAProtocol\n    case invalidVariableRequirement\n    case invalidDerivedEnumCase\n    case nonEscapingFunctionParameter\n    case subscriptsNotSupported\n    case operatorsNotSupported\n    case staticMembersNotSupported\n\n    public var description: String {\n        switch self {\n        case .notAProtocol:\n            return \"@Mockable can only be applied to protocols.\"\n        case .invalidVariableRequirement:\n            return \"Invalid variable requirement. Missing type annotation or accessor block.\"\n        case .invalidDerivedEnumCase:\n            return \"Unexpected error during generating an enum representation of this protocol.\"\n        case .nonEscapingFunctionParameter:\n            return \"\"\"\n            Non-escaping function parameters are not supported by @Mockable. \\\n            Add @escaping to all function parameters to resolve this issue.\n            \"\"\"\n        case .subscriptsNotSupported:\n            return \"Subscript requirements are not supported by @Mockable.\"\n        case .operatorsNotSupported:\n            return \"Operator requirements are not supported by @Mockable.\"\n        case .staticMembersNotSupported:\n            return \"Static member requirements are not supported by @Mockable.\"\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/MockableMacroWarning.swift",
    "content": "//\n//  MockableMacroWarning.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 2024. 12. 01..\n//\n\nimport SwiftSyntax\nimport SwiftDiagnostics\n\npublic enum MockableMacroWarning {\n    case versionMismatch\n}\n\n// MARK: - DiagnosticMessage\n\nextension MockableMacroWarning: DiagnosticMessage {\n    public var message: String {\n        switch self {\n        case .versionMismatch: \"\"\"\n        Your SwiftSyntax version is pinned to \\(swiftSyntaxVersion).x.x by some of your dependencies. \\\n        Using a lower SwiftSyntax version than your Swift version may lead to issues when using Mockable.\n        \"\"\"\n        }\n    }\n    public var diagnosticID: MessageID {\n        switch self {\n        case .versionMismatch: MessageID(domain: \"Mockable\", id: \"MockableMacroWarning.versionMismatch\")\n        }\n    }\n    public var severity: DiagnosticSeverity { .warning }\n}\n\n// MARK: - Helpers\n\nextension MockableMacroWarning {\n    private var swiftSyntaxVersion: String {\n        #if canImport(SwiftSyntax600)\n        \">600\"\n        #elseif canImport(SwiftSyntax510)\n        \"510\"\n        #elseif canImport(SwiftSyntax509)\n        \"509\"\n        #else\n        \"<unknown>\"\n        #endif\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Plugin.swift",
    "content": "//\n//  MockableMacroPlugin.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2023. 11. 14..\n//\n\nimport SwiftCompilerPlugin\nimport SwiftSyntaxMacros\n\n@main\nstruct Plugin: CompilerPlugin {\n    let providingMacros: [any Macro.Type] = [\n        MockableMacro.self\n    ]\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Requirements/FunctionRequirement.swift",
    "content": "//\n//  FunctionRequirement.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2023. 12. 07..\n//\n\nimport SwiftSyntax\n\nstruct FunctionRequirement {\n    let index: Int\n    let syntax: FunctionDeclSyntax\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Requirements/InitializerRequirement.swift",
    "content": "//\n//  InitializerRequirement.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 14..\n//\n\nimport SwiftSyntax\n\nstruct InitializerRequirement {\n    let index: Int\n    let syntax: InitializerDeclSyntax\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Requirements/Requirements.swift",
    "content": "//\n//  Requirements.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 12..\n//\n\nimport SwiftSyntax\n\nstruct Requirements {\n\n    // MARK: Properties\n\n    let syntax: ProtocolDeclSyntax\n    let modifiers: DeclModifierListSyntax\n    let isActor: Bool\n    let containsGenericExistentials: Bool\n    var functions = [FunctionRequirement]()\n    var variables = [VariableRequirement]()\n    var initializers = [InitializerRequirement]()\n\n    // MARK: Init\n\n    init(_ syntax: ProtocolDeclSyntax) throws {\n        self.syntax = syntax\n        let members = syntax.memberBlock.members\n\n        guard members.compactMap({ $0.decl.as(SubscriptDeclSyntax.self) }).isEmpty else {\n            throw MockableMacroError.subscriptsNotSupported\n        }\n\n        self.modifiers = Self.initModifiers(syntax)\n        self.isActor = Self.initIsActor(syntax)\n        self.initializers = Self.initInitializers(members)\n        self.variables = try Self.initVariables(members)\n        self.functions = try Self.initFunctions(members, startIndex: variables.count)\n        self.containsGenericExistentials = try Self.initContainsGenericExistentials(variables, functions)\n    }\n}\n\n// MARK: - Helpers\n\nextension Requirements {\n    private static func isStatic(_ modifier: DeclModifierSyntax) -> Bool {\n        modifier.name.tokenKind == .keyword(.static)\n    }\n\n    private static func initModifiers(_ syntax: ProtocolDeclSyntax) -> DeclModifierListSyntax {\n        syntax.modifiers.trimmed.filter { modifier in\n            guard case .keyword(let keyword) = modifier.name.tokenKind else {\n                return true\n            }\n            return keyword != .private && keyword != .nonisolated\n        }\n    }\n\n    private static func initIsActor(_ syntax: ProtocolDeclSyntax) -> Bool {\n        guard let inheritanceClause = syntax.inheritanceClause,\n              !inheritanceClause.inheritedTypes.isEmpty else {\n            return false\n        }\n\n        for inheritedType in inheritanceClause.inheritedTypes {\n            if let type = inheritedType.type.as(IdentifierTypeSyntax.self),\n               type.name.trimmed.tokenKind == NS.Actor.tokenKind {\n                return true\n            }\n        }\n\n        return false\n    }\n\n    private static func initVariables(_ members: MemberBlockItemListSyntax) throws -> [VariableRequirement] {\n        try members\n            .compactMap { $0.decl.as(VariableDeclSyntax.self) }\n            .filter {\n                guard !$0.modifiers.contains(where: isStatic) else {\n                    throw MockableMacroError.staticMembersNotSupported\n                }\n                return true\n            }\n            .enumerated()\n            .map(VariableRequirement.init)\n    }\n\n    private static func initFunctions(_ members: MemberBlockItemListSyntax,\n                                      startIndex: Int) throws -> [FunctionRequirement] {\n        try members\n            .compactMap { $0.decl.as(FunctionDeclSyntax.self) }\n            .filter {\n                guard !$0.modifiers.contains(where: isStatic) else {\n                    throw MockableMacroError.staticMembersNotSupported\n                }\n                guard case .identifier = $0.name.tokenKind else {\n                    throw MockableMacroError.operatorsNotSupported\n                }\n                return true\n            }\n            .enumerated()\n            .map { index, element in\n                FunctionRequirement(index: startIndex + index, syntax: element)\n            }\n    }\n\n    private static func initInitializers(_ members: MemberBlockItemListSyntax) -> [InitializerRequirement] {\n        members\n            .compactMap { $0.decl.as(InitializerDeclSyntax.self) }\n            .enumerated()\n            .map { InitializerRequirement(index: $0, syntax: $1) }\n    }\n\n    private static func initContainsGenericExistentials(\n        _ variables: [VariableRequirement],\n        _ functions: [FunctionRequirement]\n    ) throws -> Bool {\n        let variables = try variables.filter {\n            let type = try $0.syntax.type\n            return hasParametrizedProtocolRequirement(type)\n        }\n\n        let functions = functions.filter {\n            guard let returnClause = $0.syntax.signature.returnClause else { return false }\n            let type = returnClause.type\n            return hasParametrizedProtocolRequirement(type)\n        }\n\n        return !variables.isEmpty || !functions.isEmpty\n    }\n\n    private static func hasParametrizedProtocolRequirement(_ type: TypeSyntax) -> Bool {\n        if let type = type.as(SomeOrAnyTypeSyntax.self),\n           type.someOrAnySpecifier.tokenKind == .keyword(.any),\n           let type = type.constraint.as(IdentifierTypeSyntax.self),\n           let argumentClause = type.genericArgumentClause,\n           !argumentClause.arguments.isEmpty {\n            return true\n        } else if let type = type.as(IdentifierTypeSyntax.self),\n                  let argumentClause = type.genericArgumentClause {\n            return argumentClause.arguments.contains {\n                #if canImport(SwiftSyntax601)\n                switch $0.argument {\n                case .type(let type):\n                    return hasParametrizedProtocolRequirement(type)\n                default:\n                    return false\n                }\n                #else\n                return hasParametrizedProtocolRequirement($0.argument)\n                #endif\n            }\n        } else {\n            return false\n        }\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Requirements/VariableRequirement.swift",
    "content": "//\n//  VariableRequirement.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 10..\n//\n\nimport SwiftSyntax\n\nstruct VariableRequirement {\n    let index: Int\n    let syntax: VariableDeclSyntax\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Utils/Availability.swift",
    "content": "//\n//  Availability.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 30/07/2024.\n//\n\nimport SwiftSyntax\n\nenum AvailabilityVersionParseError: Error {\n    case invalidVersionString\n}\n\nenum Availability {\n    static func from(iOS: String, macOS: String, tvOS: String, watchOS: String) throws -> AttributeSyntax {\n        let arguments = try AvailabilityArgumentListSyntax {\n            try availability(platform: NS.iOS, version: iOS)\n            try availability(platform: NS.macOS, version: macOS)\n            try availability(platform: NS.tvOS, version: tvOS)\n            try availability(platform: NS.watchOS, version: watchOS)\n            AvailabilityArgumentSyntax(argument: .token(.binaryOperator(\"*\")))\n        }\n\n        return AttributeSyntax(\n            attributeName: IdentifierTypeSyntax(name: NS.available),\n            leftParen: .leftParenToken(),\n            arguments: .availability(arguments),\n            rightParen: .rightParenToken()\n        )\n    }\n\n    private static func availability(platform: TokenSyntax, version: String) throws -> AvailabilityArgumentSyntax {\n        let version = version.split(separator: \".\").map(String.init)\n\n        guard let major = version.first else {\n            throw AvailabilityVersionParseError.invalidVersionString\n        }\n        let components = version.dropFirst().compactMap {\n            return VersionComponentSyntax(number: .integerLiteral($0))\n        }\n\n        let versionSyntax = PlatformVersionSyntax(\n            platform: platform,\n            version: .init(\n                major: .integerLiteral(major),\n                components: .init(components)\n            )\n        )\n\n        return AvailabilityArgumentSyntax(argument: .availabilityVersionRestriction(versionSyntax))\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Utils/Messages.swift",
    "content": "//\n//  Messages.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 04. 01..\n//\n\nenum Messages {\n    static let givenMessage = \"Use given(_ service:) instead.\"\n    static let whenMessage = \"Use when(_ service:) instead.\"\n    static let verifyMessage = \"Use verify(_ service:) instead.\"\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Utils/Namespace.swift",
    "content": "//\n//  Namespace.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2024. 03. 28..\n//\n\n#if canImport(SwiftSyntax600) || swift(<6)\nimport SwiftSyntax\n#else\n@preconcurrency import SwiftSyntax\n#endif\n\n// swiftlint:disable identifier_name\nenum NS {\n    static let MOCKING: TokenSyntax = \"MOCKING\"\n\n    static let generic: TokenSyntax = \"generic\"\n    static let value: TokenSyntax = \"value\"\n    static let eraseToGenericValue: TokenSyntax = \"eraseToGenericValue\"\n    static let newValue: TokenSyntax = \"newValue\"\n    static let other: TokenSyntax = \"other\"\n    static let match: TokenSyntax = \"match\"\n    static let left: TokenSyntax = \"left\"\n    static let right: TokenSyntax = \"right\"\n    static let with: TokenSyntax = \"with\"\n    static let reset: TokenSyntax = \"reset\"\n    static let scopes: TokenSyntax = \"scopes\"\n    static let all: TokenSyntax = \"all\"\n    static let available: TokenSyntax = \"available\"\n    static let deprecated: TokenSyntax = \"deprecated\"\n    static let message: TokenSyntax = \"message\"\n    static let kind: TokenSyntax = \"kind\"\n    static let setKind: TokenSyntax = \"setKind\"\n    static let any: TokenSyntax = \"any\"\n    static let initializer: TokenSyntax = \"init\"\n    static let member: TokenSyntax = \"member\"\n    static let mock: TokenSyntax = \"mock\"\n    static let mockThrowing: TokenSyntax = \"mockThrowing\"\n    static let producer: TokenSyntax = \"producer\"\n    static let cast: TokenSyntax = \"cast\"\n    static let addInvocation: TokenSyntax = \"addInvocation\"\n    static let performActions: TokenSyntax = \"performActions\"\n    static let policy: TokenSyntax = \"policy\"\n    static let error: TokenSyntax = \"error\"\n    static let swift: TokenSyntax = \"swift\"\n    static let iOS: TokenSyntax = \"iOS\"\n    static let macOS: TokenSyntax = \"macOS\"\n    static let tvOS: TokenSyntax = \"tvOS\"\n    static let watchOS: TokenSyntax = \"watchOS\"\n\n    static let _given: TokenSyntax = \"_given\"\n    static let _when: TokenSyntax = \"_when\"\n    static let _verify: TokenSyntax = \"_verify\"\n    static let _andSign: String = \"&&\"\n    static let _init: TokenSyntax = \"init\"\n    static let _star: TokenSyntax = \"*\"\n    static let _for: TokenSyntax = \"for\"\n    static let _gte: String = \">=\"\n    static let get_: String = \"get_\"\n    static let set_: String = \"set_\"\n\n    static let mocker: TokenSyntax = \"mocker\"\n\n    static let Mockable: TokenSyntax = \"Mockable\"\n    static let Mock: TokenSyntax = \"Mock\"\n    static let MockableService: TokenSyntax = \"MockableService\"\n    static let Bool: TokenSyntax = \"Bool\"\n    static let GenericValue: String = \"GenericValue\"\n    static let Mocker: TokenSyntax = \"Mocker\"\n    static let Builder: TokenSyntax = \"Builder\"\n    static let Member: TokenSyntax = \"Member\"\n    static let Matchable: TokenSyntax = \"Matchable\"\n    static let CaseIdentifiable: TokenSyntax = \"CaseIdentifiable\"\n    static let ReturnBuilder: TokenSyntax = \"ReturnBuilder\"\n    static let ActionBuilder: TokenSyntax = \"ActionBuilder\"\n    static let VerifyBuilder: TokenSyntax = \"VerifyBuilder\"\n    static let MockerScope: TokenSyntax = \"MockerScope\"\n    static let MockerPolicy: TokenSyntax = \"MockerPolicy\"\n    static let Set: TokenSyntax = \"Set\"\n    static let Void: TokenSyntax = \"Void\"\n    static let Actor: TokenSyntax = \"Actor\"\n    static let Error: TokenSyntax = \"Error\"\n    static let NSObjectProtocol: String = \"NSObjectProtocol\"\n    static let NSObject: TokenSyntax = \"NSObject\"\n    static let Swift: TokenSyntax = \"Swift\"\n    static let Sendable: TokenSyntax = \"Sendable\"\n\n    static func Parameter(_ type: String) -> TokenSyntax { \"Parameter<\\(raw: type)>\" }\n    static func Param(suffix: String) -> TokenSyntax { \"Param\\(raw: suffix)\" }\n    static func Function(_ kind: BuilderKind) -> TokenSyntax { \"Function\\(raw: kind.name)\" }\n    static func ThrowingFunction(_ kind: BuilderKind) -> TokenSyntax { \"ThrowingFunction\\(raw: kind.name)\" }\n    static func Property(_ kind: BuilderKind) -> TokenSyntax { \"Property\\(raw: kind.name)\" }\n    static func ThrowingProperty(_ kind: BuilderKind) -> TokenSyntax { \"ThrowingProperty\\(raw: kind.name)\" }\n}\n// swiftlint:enable identifier_name\n"
  },
  {
    "path": "Sources/MockableMacro/Utils/SwiftVersionHelper.swift",
    "content": "//\n//  File.swift\n//  Mockable\n//\n//  Created by Kolos Foltányi on 2025. 11. 13..\n//\n\nimport SwiftSyntax\n\nenum SwiftVersionRequirement: TokenSyntax {\n    case swift_6_1 = \"6.1\"\n}\n\nenum SwiftVersionHelper {\n    static func condition(\n        minimumVersion: SwiftVersionRequirement,\n        gte latest: IfConfigClauseSyntax.Elements,\n        else fallback: IfConfigClauseSyntax.Elements\n    ) -> IfConfigDeclSyntax {\n        IfConfigDeclSyntax(\n            clauses: IfConfigClauseListSyntax {\n                IfConfigClauseSyntax(\n                    poundKeyword: .poundIfToken(),\n                    condition: FunctionCallExprSyntax(\n                        calledExpression: DeclReferenceExprSyntax(baseName: NS.swift),\n                        leftParen: .leftParenToken(),\n                        arguments: LabeledExprListSyntax {\n                            LabeledExprSyntax(\n                                expression: PrefixOperatorExprSyntax(\n                                    operator: .prefixOperator(NS._gte),\n                                    expression: FloatLiteralExprSyntax(literal: minimumVersion.rawValue)\n                                )\n                            )\n                        },\n                        rightParen: .rightParenToken(),\n                        additionalTrailingClosures: MultipleTrailingClosureElementListSyntax()\n                    ),\n                    elements: latest\n                )\n                IfConfigClauseSyntax(\n                    poundKeyword: .poundElseToken(),\n                    elements: fallback\n                )\n            },\n            poundEndif: .poundEndifToken()\n        )\n    }\n}\n"
  },
  {
    "path": "Sources/MockableMacro/Utils/TokenFinder.swift",
    "content": "//\n//  TokenFinder.swift\n//  MockableMacro\n//\n//  Created by Kolos Foltanyi on 2023. 11. 20..\n//\n\nimport SwiftSyntax\n\nclass TokenVisitor: SyntaxVisitor {\n    var match: (TokenSyntax) -> Bool\n    init(match: @escaping (TokenSyntax) -> Bool) {\n        self.match = match\n        super.init(viewMode: .sourceAccurate)\n    }\n    override func visit(_ token: TokenSyntax) -> SyntaxVisitorContinueKind {\n        match(token) ? .skipChildren : .visitChildren\n    }\n}\n\nenum TokenFinder {\n    static func find(\n        in syntax: some SyntaxProtocol,\n        matching matcher: @escaping (TokenSyntax) -> Bool\n    ) -> TokenSyntax? {\n        var result: TokenSyntax?\n        let visitor = TokenVisitor {\n            let match = matcher($0)\n            if match, result == nil {\n                result = $0\n            }\n            return result != nil\n        }\n        visitor.walk(syntax)\n        return result\n    }\n}\n"
  },
  {
    "path": "Tests/MockableMacroTests/AccessModifierTests.swift",
    "content": "//\n//  AccessModifierTests.swift\n//\n//\n//  Created by Nayanda Haberty on 29/5/24.\n//\n\nimport MacroTesting\nimport XCTest\n\nfinal class AccessModifierTests: MockableMacroTestCase {\n    func test_public_modifier() {\n        assertMacro {\n            \"\"\"\n            @Mockable\n            public protocol Test {\n                init(id: String)\n                var foo: Int { get }\n                func bar(number: Int) -> Int\n            }\n            \"\"\"\n        } expansion: {\n            \"\"\"\n            public protocol Test {\n                init(id: String)\n                var foo: Int { get }\n                func bar(number: Int) -> Int\n            }\n\n            #if MOCKING\n            public final class MockTest: Test, Mockable.MockableService {\n                public typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                public nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                public nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                public nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                public nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                public nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                public init(id: String) {\n                }\n                public func bar(number: Int) -> Int {\n                    let member: Member = .m2_bar(number: .value(number))\n                    return mocker.mock(member) { producer in\n                        let producer = try cast(producer) as (Int) -> Int\n                        return producer(number)\n                    }\n                }\n                public var foo: Int {\n                    get {\n                        let member: Member = .m1_foo\n                        return mocker.mock(member) { producer in\n                            let producer = try cast(producer) as () -> Int\n                            return producer()\n                        }\n                    }\n                }\n                #if swift(>=6.1)\n                public nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    case m2_bar(number: Parameter<Int>)\n                    public nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        case (.m2_bar(number: let leftNumber), .m2_bar(number: let rightNumber)):\n                            return leftNumber.match(rightNumber)\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #else\n                public enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    case m2_bar(number: Parameter<Int>)\n                    public nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        case (.m2_bar(number: let leftNumber), .m2_bar(number: let rightNumber)):\n                            return leftNumber.match(rightNumber)\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #endif\n                public struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    public nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    public nonisolated var foo: Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Int, () -> Int> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                    public nonisolated func bar(number: Parameter<Int>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Int, (Int) -> Int> {\n                        .init(mocker, kind: .m2_bar(number: number))\n                    }\n                }\n                public struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    public nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    public nonisolated var foo: Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                    public nonisolated func bar(number: Parameter<Int>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m2_bar(number: number))\n                    }\n                }\n                public struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    public nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    public nonisolated var foo: Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                    public nonisolated func bar(number: Parameter<Int>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m2_bar(number: number))\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_private_access_modifier() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          private protocol Test {\n              var foo: Int { get }\n              func bar(number: Int) -> Int\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            private protocol Test {\n                var foo: Int { get }\n                func bar(number: Int) -> Int\n            }\n\n            #if MOCKING\n            private final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func bar(number: Int) -> Int {\n                    let member: Member = .m2_bar(number: .value(number))\n                    return mocker.mock(member) { producer in\n                        let producer = try cast(producer) as (Int) -> Int\n                        return producer(number)\n                    }\n                }\n                var foo: Int {\n                    get {\n                        let member: Member = .m1_foo\n                        return mocker.mock(member) { producer in\n                            let producer = try cast(producer) as () -> Int\n                            return producer()\n                        }\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    case m2_bar(number: Parameter<Int>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        case (.m2_bar(number: let leftNumber), .m2_bar(number: let rightNumber)):\n                            return leftNumber.match(rightNumber)\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    case m2_bar(number: Parameter<Int>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        case (.m2_bar(number: let leftNumber), .m2_bar(number: let rightNumber)):\n                            return leftNumber.match(rightNumber)\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var foo: Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Int, () -> Int> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                    nonisolated func bar(number: Parameter<Int>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Int, (Int) -> Int> {\n                        .init(mocker, kind: .m2_bar(number: number))\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var foo: Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                    nonisolated func bar(number: Parameter<Int>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m2_bar(number: number))\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var foo: Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                    nonisolated func bar(number: Parameter<Int>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m2_bar(number: number))\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_mutating_modifier_filtered() {\n        assertMacro {\n            \"\"\"\n            @Mockable\n            public protocol Test {\n                mutating nonisolated func foo()\n            }\n            \"\"\"\n        } expansion: {\n            \"\"\"\n            public protocol Test {\n                mutating nonisolated func foo()\n            }\n\n            #if MOCKING\n            public final class MockTest: Test, Mockable.MockableService {\n                public typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                public nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                public nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                public nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                public nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                public nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                public nonisolated func foo() {\n                    let member: Member = .m1_foo\n                    mocker.mock(member) { producer in\n                        let producer = try cast(producer) as () -> Void\n                        return producer()\n                    }\n                }\n                #if swift(>=6.1)\n                public nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    public nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        }\n                    }\n                }\n                #else\n                public enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    public nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        }\n                    }\n                }\n                #endif\n                public struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    public nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    public nonisolated func foo() -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Void, () -> Void> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n                public struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    public nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    public nonisolated func foo() -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n                public struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    public nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    public nonisolated func foo() -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n}\n"
  },
  {
    "path": "Tests/MockableMacroTests/ActorConformanceTests.swift",
    "content": "//\n//  ActorConformanceTests.swift\n//  \n//\n//  Created by Kolos Foltanyi on 06/07/2024.\n//\n\nimport MacroTesting\nimport XCTest\n\nfinal class ActorConformanceTests: MockableMacroTestCase {\n    func test_global_actor_conformance() {\n        assertMacro {\n          \"\"\"\n          @MainActor\n          @Mockable\n          protocol Test {\n              var foo: Int { get }\n              nonisolated var quz: Int { get }\n              func bar(number: Int) -> Int\n              nonisolated func baz(number: Int) -> Int\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            @MainActor\n            protocol Test {\n                var foo: Int { get }\n                nonisolated var quz: Int { get }\n                func bar(number: Int) -> Int\n                nonisolated func baz(number: Int) -> Int\n            }\n\n            #if MOCKING\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func bar(number: Int) -> Int {\n                    let member: Member = .m3_bar(number: .value(number))\n                    return mocker.mock(member) { producer in\n                        let producer = try cast(producer) as (Int) -> Int\n                        return producer(number)\n                    }\n                }\n                nonisolated func baz(number: Int) -> Int {\n                    let member: Member = .m4_baz(number: .value(number))\n                    return mocker.mock(member) { producer in\n                        let producer = try cast(producer) as (Int) -> Int\n                        return producer(number)\n                    }\n                }\n                var foo: Int {\n                    get {\n                        let member: Member = .m1_foo\n                        return mocker.mock(member) { producer in\n                            let producer = try cast(producer) as () -> Int\n                            return producer()\n                        }\n                    }\n                }\n                nonisolated var quz: Int {\n                    get {\n                        let member: Member = .m2_quz\n                        return mocker.mock(member) { producer in\n                            let producer = try cast(producer) as () -> Int\n                            return producer()\n                        }\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    case m2_quz\n                    case m3_bar(number: Parameter<Int>)\n                    case m4_baz(number: Parameter<Int>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        case (.m2_quz, .m2_quz):\n                            return true\n                        case (.m3_bar(number: let leftNumber), .m3_bar(number: let rightNumber)):\n                            return leftNumber.match(rightNumber)\n                        case (.m4_baz(number: let leftNumber), .m4_baz(number: let rightNumber)):\n                            return leftNumber.match(rightNumber)\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    case m2_quz\n                    case m3_bar(number: Parameter<Int>)\n                    case m4_baz(number: Parameter<Int>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        case (.m2_quz, .m2_quz):\n                            return true\n                        case (.m3_bar(number: let leftNumber), .m3_bar(number: let rightNumber)):\n                            return leftNumber.match(rightNumber)\n                        case (.m4_baz(number: let leftNumber), .m4_baz(number: let rightNumber)):\n                            return leftNumber.match(rightNumber)\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var foo: Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Int, () -> Int> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                    nonisolated var quz: Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Int, () -> Int> {\n                        .init(mocker, kind: .m2_quz)\n                    }\n                    nonisolated func bar(number: Parameter<Int>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Int, (Int) -> Int> {\n                        .init(mocker, kind: .m3_bar(number: number))\n                    }\n                    nonisolated func baz(number: Parameter<Int>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Int, (Int) -> Int> {\n                        .init(mocker, kind: .m4_baz(number: number))\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var foo: Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                    nonisolated var quz: Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m2_quz)\n                    }\n                    nonisolated func bar(number: Parameter<Int>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m3_bar(number: number))\n                    }\n                    nonisolated func baz(number: Parameter<Int>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m4_baz(number: number))\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var foo: Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                    nonisolated var quz: Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m2_quz)\n                    }\n                    nonisolated func bar(number: Parameter<Int>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m3_bar(number: number))\n                    }\n                    nonisolated func baz(number: Parameter<Int>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m4_baz(number: number))\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n    func test_actor_requirement() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol Test: Actor {\n              var foo: Int { get }\n              nonisolated var quz: Int { get }\n              func bar(number: Int) -> Int\n              nonisolated func baz(number: Int) -> Int\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test: Actor {\n                var foo: Int { get }\n                nonisolated var quz: Int { get }\n                func bar(number: Int) -> Int\n                nonisolated func baz(number: Int) -> Int\n            }\n\n            #if MOCKING\n            actor MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func bar(number: Int) -> Int {\n                    let member: Member = .m3_bar(number: .value(number))\n                    return mocker.mock(member) { producer in\n                        let producer = try cast(producer) as (Int) -> Int\n                        return producer(number)\n                    }\n                }\n                nonisolated func baz(number: Int) -> Int {\n                    let member: Member = .m4_baz(number: .value(number))\n                    return mocker.mock(member) { producer in\n                        let producer = try cast(producer) as (Int) -> Int\n                        return producer(number)\n                    }\n                }\n                var foo: Int {\n                    get {\n                        let member: Member = .m1_foo\n                        return mocker.mock(member) { producer in\n                            let producer = try cast(producer) as () -> Int\n                            return producer()\n                        }\n                    }\n                }\n                nonisolated var quz: Int {\n                    get {\n                        let member: Member = .m2_quz\n                        return mocker.mock(member) { producer in\n                            let producer = try cast(producer) as () -> Int\n                            return producer()\n                        }\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    case m2_quz\n                    case m3_bar(number: Parameter<Int>)\n                    case m4_baz(number: Parameter<Int>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        case (.m2_quz, .m2_quz):\n                            return true\n                        case (.m3_bar(number: let leftNumber), .m3_bar(number: let rightNumber)):\n                            return leftNumber.match(rightNumber)\n                        case (.m4_baz(number: let leftNumber), .m4_baz(number: let rightNumber)):\n                            return leftNumber.match(rightNumber)\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    case m2_quz\n                    case m3_bar(number: Parameter<Int>)\n                    case m4_baz(number: Parameter<Int>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        case (.m2_quz, .m2_quz):\n                            return true\n                        case (.m3_bar(number: let leftNumber), .m3_bar(number: let rightNumber)):\n                            return leftNumber.match(rightNumber)\n                        case (.m4_baz(number: let leftNumber), .m4_baz(number: let rightNumber)):\n                            return leftNumber.match(rightNumber)\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var foo: Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Int, () -> Int> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                    nonisolated var quz: Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Int, () -> Int> {\n                        .init(mocker, kind: .m2_quz)\n                    }\n                    nonisolated func bar(number: Parameter<Int>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Int, (Int) -> Int> {\n                        .init(mocker, kind: .m3_bar(number: number))\n                    }\n                    nonisolated func baz(number: Parameter<Int>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Int, (Int) -> Int> {\n                        .init(mocker, kind: .m4_baz(number: number))\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var foo: Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                    nonisolated var quz: Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m2_quz)\n                    }\n                    nonisolated func bar(number: Parameter<Int>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m3_bar(number: number))\n                    }\n                    nonisolated func baz(number: Parameter<Int>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m4_baz(number: number))\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var foo: Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                    nonisolated var quz: Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m2_quz)\n                    }\n                    nonisolated func bar(number: Parameter<Int>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m3_bar(number: number))\n                    }\n                    nonisolated func baz(number: Parameter<Int>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m4_baz(number: number))\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_nonisolated_protocol() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          nonisolated protocol Test {\n              func foo()\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            nonisolated protocol Test {\n                func foo()\n            }\n\n            #if MOCKING\n            nonisolated final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func foo() {\n                    let member: Member = .m1_foo\n                    mocker.mock(member) { producer in\n                        let producer = try cast(producer) as () -> Void\n                        return producer()\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo() -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Void, () -> Void> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo() -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo() -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_mainactor_requirement() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol Test {\n              @MainActor func foo()\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                @MainActor func foo()\n            }\n\n            #if MOCKING\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                @MainActor\n                func foo() {\n                    let member: Member = .m1_foo\n                    mocker.mock(member) { producer in\n                        let producer = try cast(producer) as () -> Void\n                        return producer()\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo() -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Void, () -> Void> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo() -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo() -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n}\n"
  },
  {
    "path": "Tests/MockableMacroTests/AssociatedTypeTests.swift",
    "content": "//\n//  AssociatedTypeTests.swift\n//\n//\n//  Created by Kolos Foltanyi on 2023. 11. 21..\n//\n\nimport MacroTesting\nimport XCTest\n\nfinal class AssociatedTypeTests: MockableMacroTestCase {\n    func test_associated_type() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol Test {\n              associatedtype Item\n              func foo(item: Item) -> Item\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                associatedtype Item\n                func foo(item: Item) -> Item\n            }\n\n            #if MOCKING\n            final class MockTest<Item>: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func foo(item: Item) -> Item {\n                    let member: Member = .m1_foo(item: .value(item))\n                    return mocker.mock(member) { producer in\n                        let producer = try cast(producer) as (Item) -> Item\n                        return producer(item)\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo(item: Parameter<Item>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo(item: let leftItem), .m1_foo(item: let rightItem)):\n                            return leftItem.match(rightItem)\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo(item: Parameter<Item>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo(item: let leftItem), .m1_foo(item: let rightItem)):\n                            return leftItem.match(rightItem)\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo(item: Parameter<Item>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Item, (Item) -> Item> {\n                        .init(mocker, kind: .m1_foo(item: item))\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo(item: Parameter<Item>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_foo(item: item))\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo(item: Parameter<Item>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_foo(item: item))\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_associated_type_with_inheritance() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol Test {\n              associatedtype Item: Equatable, Hashable\n              func foo(item: Item) -> Item\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                associatedtype Item: Equatable, Hashable\n                func foo(item: Item) -> Item\n            }\n\n            #if MOCKING\n            final class MockTest<Item>: Test, Mockable.MockableService where Item: Equatable, Item: Hashable {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func foo(item: Item) -> Item {\n                    let member: Member = .m1_foo(item: .value(item))\n                    return mocker.mock(member) { producer in\n                        let producer = try cast(producer) as (Item) -> Item\n                        return producer(item)\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo(item: Parameter<Item>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo(item: let leftItem), .m1_foo(item: let rightItem)):\n                            return leftItem.match(rightItem)\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo(item: Parameter<Item>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo(item: let leftItem), .m1_foo(item: let rightItem)):\n                            return leftItem.match(rightItem)\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo(item: Parameter<Item>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Item, (Item) -> Item> {\n                        .init(mocker, kind: .m1_foo(item: item))\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo(item: Parameter<Item>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_foo(item: item))\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo(item: Parameter<Item>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_foo(item: item))\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_associated_type_with_where_clause() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol Test {\n              associatedtype Item where Item: Equatable, Item: Hashable\n              func foo(item: Item) -> Item\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                associatedtype Item where Item: Equatable, Item: Hashable\n                func foo(item: Item) -> Item\n            }\n\n            #if MOCKING\n            final class MockTest<Item>: Test, Mockable.MockableService where Item: Equatable, Item: Hashable {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func foo(item: Item) -> Item {\n                    let member: Member = .m1_foo(item: .value(item))\n                    return mocker.mock(member) { producer in\n                        let producer = try cast(producer) as (Item) -> Item\n                        return producer(item)\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo(item: Parameter<Item>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo(item: let leftItem), .m1_foo(item: let rightItem)):\n                            return leftItem.match(rightItem)\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo(item: Parameter<Item>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo(item: let leftItem), .m1_foo(item: let rightItem)):\n                            return leftItem.match(rightItem)\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo(item: Parameter<Item>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Item, (Item) -> Item> {\n                        .init(mocker, kind: .m1_foo(item: item))\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo(item: Parameter<Item>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_foo(item: item))\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo(item: Parameter<Item>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_foo(item: item))\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n}\n"
  },
  {
    "path": "Tests/MockableMacroTests/AttributesTests.swift",
    "content": "//\n//  AttributesTest.swift\n//\n//\n//  Created by Kolos Foltanyi on 2024. 03. 17..\n//\n\nimport MacroTesting\nimport XCTest\n\nfinal class AttributesTests: MockableMacroTestCase {\n    func test_attributed_requirements() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol AttributeTest {\n              @available(iOS 15, *)\n              init(name: String)\n\n              @available(iOS 15, *)\n              var prop: Int { get }\n\n              @available(iOS 15, *)\n              func test()\n\n              @available(iOS 15, *) init(name2: String)\n\n              @available(iOS 15, *) var prop2: Int { get }\n\n              @available(iOS 15, *) func test2()\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol AttributeTest {\n                @available(iOS 15, *)\n                init(name: String)\n\n                @available(iOS 15, *)\n                var prop: Int { get }\n\n                @available(iOS 15, *)\n                func test()\n\n                @available(iOS 15, *) init(name2: String)\n\n                @available(iOS 15, *) var prop2: Int { get }\n\n                @available(iOS 15, *) func test2()\n            }\n\n            #if MOCKING\n            final class MockAttributeTest: AttributeTest, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockAttributeTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                @available(iOS 15, *)\n                init(name: String) {\n                }\n                @available(iOS 15, *)\n                init(name2: String) {\n                }\n                @available(iOS 15, *)\n                func test() {\n                    let member: Member = .m3_test\n                    mocker.mock(member) { producer in\n                        let producer = try cast(producer) as () -> Void\n                        return producer()\n                    }\n                }\n                @available(iOS 15, *)\n                func test2() {\n                    let member: Member = .m4_test2\n                    mocker.mock(member) { producer in\n                        let producer = try cast(producer) as () -> Void\n                        return producer()\n                    }\n                }\n                @available(iOS 15, *)\n                var prop: Int {\n                    get {\n                        let member: Member = .m1_prop\n                        return mocker.mock(member) { producer in\n                            let producer = try cast(producer) as () -> Int\n                            return producer()\n                        }\n                    }\n                }\n                @available(iOS 15, *)\n                var prop2: Int {\n                    get {\n                        let member: Member = .m2_prop2\n                        return mocker.mock(member) { producer in\n                            let producer = try cast(producer) as () -> Int\n                            return producer()\n                        }\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_prop\n                    case m2_prop2\n                    case m3_test\n                    case m4_test2\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_prop, .m1_prop):\n                            return true\n                        case (.m2_prop2, .m2_prop2):\n                            return true\n                        case (.m3_test, .m3_test):\n                            return true\n                        case (.m4_test2, .m4_test2):\n                            return true\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_prop\n                    case m2_prop2\n                    case m3_test\n                    case m4_test2\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_prop, .m1_prop):\n                            return true\n                        case (.m2_prop2, .m2_prop2):\n                            return true\n                        case (.m3_test, .m3_test):\n                            return true\n                        case (.m4_test2, .m4_test2):\n                            return true\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    @available(iOS 15, *)\n                    nonisolated var prop: Mockable.FunctionReturnBuilder<MockAttributeTest, ReturnBuilder, Int, () -> Int> {\n                        .init(mocker, kind: .m1_prop)\n                    }\n                    @available(iOS 15, *)\n                    nonisolated var prop2: Mockable.FunctionReturnBuilder<MockAttributeTest, ReturnBuilder, Int, () -> Int> {\n                        .init(mocker, kind: .m2_prop2)\n                    }\n                    @available(iOS 15, *)\n                    nonisolated func test() -> Mockable.FunctionReturnBuilder<MockAttributeTest, ReturnBuilder, Void, () -> Void> {\n                        .init(mocker, kind: .m3_test)\n                    }\n                    @available(iOS 15, *)\n                    nonisolated func test2() -> Mockable.FunctionReturnBuilder<MockAttributeTest, ReturnBuilder, Void, () -> Void> {\n                        .init(mocker, kind: .m4_test2)\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    @available(iOS 15, *)\n                    nonisolated var prop: Mockable.FunctionActionBuilder<MockAttributeTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_prop)\n                    }\n                    @available(iOS 15, *)\n                    nonisolated var prop2: Mockable.FunctionActionBuilder<MockAttributeTest, ActionBuilder> {\n                        .init(mocker, kind: .m2_prop2)\n                    }\n                    @available(iOS 15, *)\n                    nonisolated func test() -> Mockable.FunctionActionBuilder<MockAttributeTest, ActionBuilder> {\n                        .init(mocker, kind: .m3_test)\n                    }\n                    @available(iOS 15, *)\n                    nonisolated func test2() -> Mockable.FunctionActionBuilder<MockAttributeTest, ActionBuilder> {\n                        .init(mocker, kind: .m4_test2)\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    @available(iOS 15, *)\n                    nonisolated var prop: Mockable.FunctionVerifyBuilder<MockAttributeTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_prop)\n                    }\n                    @available(iOS 15, *)\n                    nonisolated var prop2: Mockable.FunctionVerifyBuilder<MockAttributeTest, VerifyBuilder> {\n                        .init(mocker, kind: .m2_prop2)\n                    }\n                    @available(iOS 15, *)\n                    nonisolated func test() -> Mockable.FunctionVerifyBuilder<MockAttributeTest, VerifyBuilder> {\n                        .init(mocker, kind: .m3_test)\n                    }\n                    @available(iOS 15, *)\n                    nonisolated func test2() -> Mockable.FunctionVerifyBuilder<MockAttributeTest, VerifyBuilder> {\n                        .init(mocker, kind: .m4_test2)\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n}\n"
  },
  {
    "path": "Tests/MockableMacroTests/DocCommentsTests.swift",
    "content": "//\n//  DocCommentsTests.swift\n//  \n//\n//  Created by Sagar Dagdu on 20/12/24.\n//\n\nimport XCTest\nimport MacroTesting\n\nfinal class DocCommentsTests: MockableMacroTestCase {\n    func test_documentation_comments() {\n        assertMacro {\n           \"\"\"\n           /// Protocol documentation\n           /// Multiple lines\n           @Mockable\n           protocol Test {\n               var foo: Int { get }\n           }\n           \"\"\"\n        } expansion: {\n            \"\"\"\n            /// Protocol documentation\n            /// Multiple lines\n            protocol Test {\n                var foo: Int { get }\n            }\n\n            #if MOCKING\n            /// Protocol documentation\n            /// Multiple lines\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                var foo: Int {\n                    get {\n                        let member: Member = .m1_foo\n                        return mocker.mock(member) { producer in\n                            let producer = try cast(producer) as () -> Int\n                            return producer()\n                        }\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var foo: Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Int, () -> Int> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var foo: Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var foo: Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n}\n"
  },
  {
    "path": "Tests/MockableMacroTests/ExoticParameterTests.swift",
    "content": "//\n//  ExoticParameterTests.swift\n//  \n//\n//  Created by Kolos Foltanyi on 2023. 11. 21..\n//\n\nimport MacroTesting\nimport XCTest\n\nfinal class ExoticParameterTests: MockableMacroTestCase {\n    func test_inout_parameter() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol Test {\n              func modifyValue(_ value: inout Int)\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                func modifyValue(_ value: inout Int)\n            }\n\n            #if MOCKING\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func modifyValue(_ value: inout Int) {\n                    let member: Member = .m1_modifyValue(.value(value))\n                    mocker.mock(member) { producer in\n                        let producer = try cast(producer) as (inout Int) -> Void\n                        return producer(&value)\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_modifyValue(Parameter<Int>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_modifyValue(let leftParam1), .m1_modifyValue(let rightParam1)):\n                            return leftParam1.match(rightParam1)\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_modifyValue(Parameter<Int>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_modifyValue(let leftParam1), .m1_modifyValue(let rightParam1)):\n                            return leftParam1.match(rightParam1)\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func modifyValue(_ value: Parameter<Int>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Void, (inout Int) -> Void> {\n                        .init(mocker, kind: .m1_modifyValue(value))\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func modifyValue(_ value: Parameter<Int>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_modifyValue(value))\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func modifyValue(_ value: Parameter<Int>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_modifyValue(value))\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_variadic_parameter() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol Test {\n              func printValues(_ values: Int...)\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                func printValues(_ values: Int...)\n            }\n\n            #if MOCKING\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func printValues(_ values: Int...) {\n                    let member: Member = .m1_printValues(.value(values))\n                    mocker.mock(member) { producer in\n                        let producer = try cast(producer) as ([Int]) -> Void\n                        return producer(values)\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_printValues(Parameter<[Int]>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_printValues(let leftParam1), .m1_printValues(let rightParam1)):\n                            return leftParam1.match(rightParam1)\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_printValues(Parameter<[Int]>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_printValues(let leftParam1), .m1_printValues(let rightParam1)):\n                            return leftParam1.match(rightParam1)\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func printValues(_ values: Parameter<[Int]>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Void, ([Int]) -> Void> {\n                        .init(mocker, kind: .m1_printValues(values))\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func printValues(_ values: Parameter<[Int]>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_printValues(values))\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func printValues(_ values: Parameter<[Int]>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_printValues(values))\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_closure_parameter() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol Test {\n              func execute(operation: @escaping () throws -> Void)\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                func execute(operation: @escaping () throws -> Void)\n            }\n\n            #if MOCKING\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func execute(operation: @escaping () throws -> Void) {\n                    let member: Member = .m1_execute(operation: .value(operation))\n                    mocker.mock(member) { producer in\n                        let producer = try cast(producer) as (@escaping () throws -> Void) -> Void\n                        return producer(operation)\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_execute(operation: Parameter<() throws -> Void>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_execute(operation: let leftOperation), .m1_execute(operation: let rightOperation)):\n                            return leftOperation.match(rightOperation)\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_execute(operation: Parameter<() throws -> Void>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_execute(operation: let leftOperation), .m1_execute(operation: let rightOperation)):\n                            return leftOperation.match(rightOperation)\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func execute(operation: Parameter<() throws -> Void>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Void, (@escaping () throws -> Void) -> Void> {\n                        .init(mocker, kind: .m1_execute(operation: operation))\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func execute(operation: Parameter<() throws -> Void>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_execute(operation: operation))\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func execute(operation: Parameter<() throws -> Void>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_execute(operation: operation))\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_reserved_keyword_parameter() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol Test {\n              func foo(for: String)\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                func foo(for: String)\n            }\n\n            #if MOCKING\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func foo(for: String) {\n                    let member: Member = .m1_foo(for: .value(`for`))\n                    mocker.mock(member) { producer in\n                        let producer = try cast(producer) as (String) -> Void\n                        return producer(`for`)\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo(for: Parameter<String>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo(for: let leftFor), .m1_foo(for: let rightFor)):\n                            return leftFor.match(rightFor)\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo(for: Parameter<String>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo(for: let leftFor), .m1_foo(for: let rightFor)):\n                            return leftFor.match(rightFor)\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo(for: Parameter<String>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Void, (String) -> Void> {\n                        .init(mocker, kind: .m1_foo(for: `for`))\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo(for: Parameter<String>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_foo(for: `for`))\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo(for: Parameter<String>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_foo(for: `for`))\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n}\n"
  },
  {
    "path": "Tests/MockableMacroTests/FunctionEffectTests.swift",
    "content": "//\n//  FunctionEffectTests.swift\n//\n//\n//  Created by Kolos Foltanyi on 2023. 11. 21..\n//\n\nimport MacroTesting\nimport XCTest\n\nfinal class FunctionEffectTests: MockableMacroTestCase {\n    func test_throwing_function() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol Test {\n              func returnsAndThrows() throws -> String\n              func canThrowError() throws\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                func returnsAndThrows() throws -> String\n                func canThrowError() throws\n            }\n\n            #if MOCKING\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func returnsAndThrows() throws -> String {\n                    let member: Member = .m1_returnsAndThrows\n                    return try mocker.mockThrowing(member) { producer in\n                        let producer = try cast(producer) as () throws -> String\n                        return try producer()\n                    }\n                }\n                func canThrowError() throws {\n                    let member: Member = .m2_canThrowError\n                    try mocker.mockThrowing(member) { producer in\n                        let producer = try cast(producer) as () throws -> Void\n                        return try producer()\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_returnsAndThrows\n                    case m2_canThrowError\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_returnsAndThrows, .m1_returnsAndThrows):\n                            return true\n                        case (.m2_canThrowError, .m2_canThrowError):\n                            return true\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_returnsAndThrows\n                    case m2_canThrowError\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_returnsAndThrows, .m1_returnsAndThrows):\n                            return true\n                        case (.m2_canThrowError, .m2_canThrowError):\n                            return true\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func returnsAndThrows() -> Mockable.ThrowingFunctionReturnBuilder<MockTest, ReturnBuilder, String, any Swift.Error, () throws -> String> {\n                        .init(mocker, kind: .m1_returnsAndThrows)\n                    }\n                    nonisolated func canThrowError() -> Mockable.ThrowingFunctionReturnBuilder<MockTest, ReturnBuilder, Void, any Swift.Error, () throws -> Void> {\n                        .init(mocker, kind: .m2_canThrowError)\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func returnsAndThrows() -> Mockable.ThrowingFunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_returnsAndThrows)\n                    }\n                    nonisolated func canThrowError() -> Mockable.ThrowingFunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m2_canThrowError)\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func returnsAndThrows() -> Mockable.ThrowingFunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_returnsAndThrows)\n                    }\n                    nonisolated func canThrowError() -> Mockable.ThrowingFunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m2_canThrowError)\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_rethrowing_function() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol Test {\n              func execute(operation: @escaping () throws -> Void) rethrows\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                func execute(operation: @escaping () throws -> Void) rethrows\n            }\n\n            #if MOCKING\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func execute(operation: @escaping () throws -> Void) rethrows {\n                    let member: Member = .m1_execute(operation: .value(operation))\n                    mocker.mock(member) { producer in\n                        let producer = try cast(producer) as (@escaping () throws -> Void) -> Void\n                        return producer(operation)\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_execute(operation: Parameter<() throws -> Void>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_execute(operation: let leftOperation), .m1_execute(operation: let rightOperation)):\n                            return leftOperation.match(rightOperation)\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_execute(operation: Parameter<() throws -> Void>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_execute(operation: let leftOperation), .m1_execute(operation: let rightOperation)):\n                            return leftOperation.match(rightOperation)\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func execute(operation: Parameter<() throws -> Void>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Void, (@escaping () throws -> Void) -> Void> {\n                        .init(mocker, kind: .m1_execute(operation: operation))\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func execute(operation: Parameter<() throws -> Void>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_execute(operation: operation))\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func execute(operation: Parameter<() throws -> Void>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_execute(operation: operation))\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_async_function() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol Test {\n              func asyncFunction() async\n              func asyncThrowingFunction() async throws\n              func asyncParamFunction(param: @escaping () async throws -> Void) async throws\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                func asyncFunction() async\n                func asyncThrowingFunction() async throws\n                func asyncParamFunction(param: @escaping () async throws -> Void) async throws\n            }\n\n            #if MOCKING\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func asyncFunction() async {\n                    let member: Member = .m1_asyncFunction\n                    mocker.mock(member) { producer in\n                        let producer = try cast(producer) as () -> Void\n                        return producer()\n                    }\n                }\n                func asyncThrowingFunction() async throws {\n                    let member: Member = .m2_asyncThrowingFunction\n                    try mocker.mockThrowing(member) { producer in\n                        let producer = try cast(producer) as () throws -> Void\n                        return try producer()\n                    }\n                }\n                func asyncParamFunction(param: @escaping () async throws -> Void) async throws {\n                    let member: Member = .m3_asyncParamFunction(param: .value(param))\n                    try mocker.mockThrowing(member) { producer in\n                        let producer = try cast(producer) as (@escaping () async throws -> Void) throws -> Void\n                        return try producer(param)\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_asyncFunction\n                    case m2_asyncThrowingFunction\n                    case m3_asyncParamFunction(param: Parameter<() async throws -> Void>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_asyncFunction, .m1_asyncFunction):\n                            return true\n                        case (.m2_asyncThrowingFunction, .m2_asyncThrowingFunction):\n                            return true\n                        case (.m3_asyncParamFunction(param: let leftParam), .m3_asyncParamFunction(param: let rightParam)):\n                            return leftParam.match(rightParam)\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_asyncFunction\n                    case m2_asyncThrowingFunction\n                    case m3_asyncParamFunction(param: Parameter<() async throws -> Void>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_asyncFunction, .m1_asyncFunction):\n                            return true\n                        case (.m2_asyncThrowingFunction, .m2_asyncThrowingFunction):\n                            return true\n                        case (.m3_asyncParamFunction(param: let leftParam), .m3_asyncParamFunction(param: let rightParam)):\n                            return leftParam.match(rightParam)\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func asyncFunction() -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Void, () -> Void> {\n                        .init(mocker, kind: .m1_asyncFunction)\n                    }\n                    nonisolated func asyncThrowingFunction() -> Mockable.ThrowingFunctionReturnBuilder<MockTest, ReturnBuilder, Void, any Swift.Error, () throws -> Void> {\n                        .init(mocker, kind: .m2_asyncThrowingFunction)\n                    }\n                    nonisolated func asyncParamFunction(param: Parameter<() async throws -> Void>) -> Mockable.ThrowingFunctionReturnBuilder<MockTest, ReturnBuilder, Void, any Swift.Error, (@escaping () async throws -> Void) throws -> Void> {\n                        .init(mocker, kind: .m3_asyncParamFunction(param: param))\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func asyncFunction() -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_asyncFunction)\n                    }\n                    nonisolated func asyncThrowingFunction() -> Mockable.ThrowingFunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m2_asyncThrowingFunction)\n                    }\n                    nonisolated func asyncParamFunction(param: Parameter<() async throws -> Void>) -> Mockable.ThrowingFunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m3_asyncParamFunction(param: param))\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func asyncFunction() -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_asyncFunction)\n                    }\n                    nonisolated func asyncThrowingFunction() -> Mockable.ThrowingFunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m2_asyncThrowingFunction)\n                    }\n                    nonisolated func asyncParamFunction(param: Parameter<() async throws -> Void>) -> Mockable.ThrowingFunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m3_asyncParamFunction(param: param))\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n}\n"
  },
  {
    "path": "Tests/MockableMacroTests/GenericFunctionTests.swift",
    "content": "//\n//  GenericFunctionTests.swift\n//\n//\n//  Created by Kolos Foltanyi on 2023. 11. 21..\n//\n\nimport MacroTesting\nimport XCTest\n\nfinal class GenericFunctionTests: MockableMacroTestCase {\n    func test_deeply_nested_generic_parameter() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol Test {\n              func foo<T>(item: (Array<[(Set<T>, String)]>, Int))\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                func foo<T>(item: (Array<[(Set<T>, String)]>, Int))\n            }\n\n            #if MOCKING\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func foo<T>(item: (Array<[(Set<T>, String)]>, Int)) {\n                    let member: Member = .m1_foo(item: .generic(item))\n                    mocker.mock(member) { producer in\n                        let producer = try cast(producer) as ((Array<[(Set<T>, String)]>, Int)) -> Void\n                        return producer(item)\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo(item: Parameter<GenericValue>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo(item: let leftItem), .m1_foo(item: let rightItem)):\n                            return leftItem.match(rightItem)\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo(item: Parameter<GenericValue>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo(item: let leftItem), .m1_foo(item: let rightItem)):\n                            return leftItem.match(rightItem)\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo<T>(item: Parameter<(Array<[(Set<T>, String)]>, Int)>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Void, ((Array<[(Set<T>, String)]>, Int)) -> Void> {\n                        .init(mocker, kind: .m1_foo(item: item.eraseToGenericValue()))\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo<T>(item: Parameter<(Array<[(Set<T>, String)]>, Int)>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_foo(item: item.eraseToGenericValue()))\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo<T>(item: Parameter<(Array<[(Set<T>, String)]>, Int)>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_foo(item: item.eraseToGenericValue()))\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_generic_param_and_return() {\n        assertMacro {\n            \"\"\"\n            @Mockable\n            protocol Test {\n                func genericFunc<T, V>(item: T) -> V\n            }\n            \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                func genericFunc<T, V>(item: T) -> V\n            }\n\n            #if MOCKING\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func genericFunc<T, V>(item: T) -> V {\n                    let member: Member = .m1_genericFunc(item: .generic(item))\n                    return mocker.mock(member) { producer in\n                        let producer = try cast(producer) as (T) -> V\n                        return producer(item)\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_genericFunc(item: Parameter<GenericValue>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_genericFunc(item: let leftItem), .m1_genericFunc(item: let rightItem)):\n                            return leftItem.match(rightItem)\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_genericFunc(item: Parameter<GenericValue>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_genericFunc(item: let leftItem), .m1_genericFunc(item: let rightItem)):\n                            return leftItem.match(rightItem)\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func genericFunc<T, V>(item: Parameter<T>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, V, (T) -> V> {\n                        .init(mocker, kind: .m1_genericFunc(item: item.eraseToGenericValue()))\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func genericFunc<T>(item: Parameter<T>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_genericFunc(item: item.eraseToGenericValue()))\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func genericFunc<T>(item: Parameter<T>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_genericFunc(item: item.eraseToGenericValue()))\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_constrained_generic_params() {\n        assertMacro {\n            \"\"\"\n            @Mockable\n            protocol Test {\n                func method1<T: Hashable, E, C, I>(\n                    p1: T, p2: E, p3: C, p4: I\n                ) where E: Equatable, E: Hashable, C: Codable\n            }\n            \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                func method1<T: Hashable, E, C, I>(\n                    p1: T, p2: E, p3: C, p4: I\n                ) where E: Equatable, E: Hashable, C: Codable\n            }\n\n            #if MOCKING\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func method1<T: Hashable, E, C, I>(\n                        p1: T, p2: E, p3: C, p4: I\n                    ) where E: Equatable, E: Hashable, C: Codable {\n                    let member: Member = .m1_method1(p1: .generic(\n                            p1), p2: .generic(p2), p3: .generic(p3), p4: .generic(p4))\n                    mocker.mock(member) { producer in\n                        let producer = try cast(producer) as (T, E, C, I) -> Void\n                        return producer(p1, p2, p3, p4)\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_method1(p1: Parameter<GenericValue>, p2: Parameter<GenericValue>, p3: Parameter<GenericValue>, p4: Parameter<GenericValue>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_method1(p1: let leftP1, p2: let leftP2, p3: let leftP3, p4: let leftP4), .m1_method1(p1: let rightP1, p2: let rightP2, p3: let rightP3, p4: let rightP4)):\n                            return leftP1.match(rightP1) && leftP2.match(rightP2) && leftP3.match(rightP3) && leftP4.match(rightP4)\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_method1(p1: Parameter<GenericValue>, p2: Parameter<GenericValue>, p3: Parameter<GenericValue>, p4: Parameter<GenericValue>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_method1(p1: let leftP1, p2: let leftP2, p3: let leftP3, p4: let leftP4), .m1_method1(p1: let rightP1, p2: let rightP2, p3: let rightP3, p4: let rightP4)):\n                            return leftP1.match(rightP1) && leftP2.match(rightP2) && leftP3.match(rightP3) && leftP4.match(rightP4)\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func method1<T: Hashable, E, C, I>(\n                            p1: Parameter<T>, p2: Parameter<E>, p3: Parameter<C>, p4: Parameter<I>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Void, (T, E, C, I) -> Void> where E: Equatable, E: Hashable, C: Codable {\n                        .init(mocker, kind: .m1_method1(p1:\n                                p1.eraseToGenericValue(), p2: p2.eraseToGenericValue(), p3: p3.eraseToGenericValue(), p4: p4.eraseToGenericValue()))\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func method1<T: Hashable, E, C, I>(\n                            p1: Parameter<T>, p2: Parameter<E>, p3: Parameter<C>, p4: Parameter<I>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> where E: Equatable, E: Hashable, C: Codable {\n                        .init(mocker, kind: .m1_method1(p1:\n                                p1.eraseToGenericValue(), p2: p2.eraseToGenericValue(), p3: p3.eraseToGenericValue(), p4: p4.eraseToGenericValue()))\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func method1<T: Hashable, E, C, I>(\n                            p1: Parameter<T>, p2: Parameter<E>, p3: Parameter<C>, p4: Parameter<I>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> where E: Equatable, E: Hashable, C: Codable {\n                        .init(mocker, kind: .m1_method1(p1:\n                                p1.eraseToGenericValue(), p2: p2.eraseToGenericValue(), p3: p3.eraseToGenericValue(), p4: p4.eraseToGenericValue()))\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_parametrized_protocol_requirements_in_variables() {\n        assertMacro {\n        \"\"\"\n        @Mockable\n        protocol Test {\n            var prop: any SomeProtocol<String> { get }\n        }\n        \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                var prop: any SomeProtocol<String> { get }\n            }\n\n            #if MOCKING\n            @available(iOS 16.0, macOS 13.0, tvOS 16.0, watchOS 9.0, *)\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                var prop: any SomeProtocol<String> {\n                    get {\n                        let member: Member = .m1_prop\n                        return mocker.mock(member) { producer in\n                            let producer = try cast(producer) as () -> any SomeProtocol<String>\n                            return producer()\n                        }\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_prop\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_prop, .m1_prop):\n                            return true\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_prop\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_prop, .m1_prop):\n                            return true\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var prop: Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, any SomeProtocol<String>, () -> any SomeProtocol<String>> {\n                        .init(mocker, kind: .m1_prop)\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var prop: Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_prop)\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var prop: Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_prop)\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_nested_parametrized_protocol_requirements_in_variables() {\n        assertMacro {\n        \"\"\"\n        @Mockable\n        protocol Test {\n            var prop: Parent<String, Child<any SomeProtocol<Double>>> { get }\n        }\n        \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                var prop: Parent<String, Child<any SomeProtocol<Double>>> { get }\n            }\n\n            #if MOCKING\n            @available(iOS 16.0, macOS 13.0, tvOS 16.0, watchOS 9.0, *)\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                var prop: Parent<String, Child<any SomeProtocol<Double>>> {\n                    get {\n                        let member: Member = .m1_prop\n                        return mocker.mock(member) { producer in\n                            let producer = try cast(producer) as () -> Parent<String, Child<any SomeProtocol<Double>>>\n                            return producer()\n                        }\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_prop\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_prop, .m1_prop):\n                            return true\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_prop\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_prop, .m1_prop):\n                            return true\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var prop: Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Parent<String, Child<any SomeProtocol<Double>>>, () -> Parent<String, Child<any SomeProtocol<Double>>>> {\n                        .init(mocker, kind: .m1_prop)\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var prop: Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_prop)\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var prop: Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_prop)\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_parametrized_protocol_requirements_in_functions() {\n        assertMacro {\n        \"\"\"\n        @Mockable\n        protocol Test {\n            func foo() -> any SomeProtocol<Double>\n        }\n        \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                func foo() -> any SomeProtocol<Double>\n            }\n\n            #if MOCKING\n            @available(iOS 16.0, macOS 13.0, tvOS 16.0, watchOS 9.0, *)\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func foo() -> any SomeProtocol<Double> {\n                    let member: Member = .m1_foo\n                    return mocker.mock(member) { producer in\n                        let producer = try cast(producer) as () -> any SomeProtocol<Double>\n                        return producer()\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo() -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, any SomeProtocol<Double>, () -> any SomeProtocol<Double>> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo() -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo() -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_nested_parametrized_protocol_requirements_in_functions() {\n        assertMacro {\n        \"\"\"\n        @Mockable\n        protocol Test {\n            func foo() -> Parent<String, Child<any SomeProtocol<Double>>>\n        }\n        \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                func foo() -> Parent<String, Child<any SomeProtocol<Double>>>\n            }\n\n            #if MOCKING\n            @available(iOS 16.0, macOS 13.0, tvOS 16.0, watchOS 9.0, *)\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func foo() -> Parent<String, Child<any SomeProtocol<Double>>> {\n                    let member: Member = .m1_foo\n                    return mocker.mock(member) { producer in\n                        let producer = try cast(producer) as () -> Parent<String, Child<any SomeProtocol<Double>>>\n                        return producer()\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo() -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Parent<String, Child<any SomeProtocol<Double>>>, () -> Parent<String, Child<any SomeProtocol<Double>>>> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo() -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo() -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n}\n"
  },
  {
    "path": "Tests/MockableMacroTests/InheritedTypeMappingTests.swift",
    "content": "//\n//  InheritedTypeMappingTests.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 27/09/2024.\n//\n\nimport MacroTesting\nimport XCTest\n\nfinal class InheritedTypeMappingTests: MockableMacroTestCase {\n    func test_nsobject_conformance() {\n        assertMacro {\n            \"\"\"\n            @Mockable\n            protocol TestObject: NSObjectProtocol {\n                func foo()\n            }\n            \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol TestObject: NSObjectProtocol {\n                func foo()\n            }\n\n            #if MOCKING\n            final class MockTestObject: NSObject, TestObject, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTestObject>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func foo() {\n                    let member: Member = .m1_foo\n                    mocker.mock(member) { producer in\n                        let producer = try cast(producer) as () -> Void\n                        return producer()\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_foo\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_foo, .m1_foo):\n                            return true\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo() -> Mockable.FunctionReturnBuilder<MockTestObject, ReturnBuilder, Void, () -> Void> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo() -> Mockable.FunctionActionBuilder<MockTestObject, ActionBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func foo() -> Mockable.FunctionVerifyBuilder<MockTestObject, VerifyBuilder> {\n                        .init(mocker, kind: .m1_foo)\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n}\n"
  },
  {
    "path": "Tests/MockableMacroTests/InitRequirementTests.swift",
    "content": "//\n//  InitRequirementTests.swift\n//\n//\n//  Created by Kolos Foltanyi on 2023. 11. 23..\n//\n\nimport MacroTesting\nimport XCTest\n\nfinal class InitRequirementTests: MockableMacroTestCase {\n    func test_init_requirement() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol Test {\n              init()\n              init(name: String)\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                init()\n                init(name: String)\n            }\n\n            #if MOCKING\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                init() {\n                }\n                init(name: String) {\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_multiple_init_requirement() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol Test {\n              init?() async throws\n              init(name: String)\n              init(name value: String, _ index: Int)\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                init?() async throws\n                init(name: String)\n                init(name value: String, _ index: Int)\n            }\n\n            #if MOCKING\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                init?() async throws {\n                }\n                init(name: String) {\n                }\n                init(name value: String, _ index: Int) {\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n}\n"
  },
  {
    "path": "Tests/MockableMacroTests/NameCollisionTests.swift",
    "content": "//\n//  NameCollisionTests.swift\n//\n//\n//  Created by Kolos Foltanyi on 2023. 11. 21..\n//\n\nimport MacroTesting\nimport XCTest\n\nfinal class NameCollisionTests: MockableMacroTestCase {\n    func test_same_name_different_type_params() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol Test {\n              func fetchData(for name: Int) -> String\n              func fetchData(for name: String) -> String\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                func fetchData(for name: Int) -> String\n                func fetchData(for name: String) -> String\n            }\n\n            #if MOCKING\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func fetchData(for name: Int) -> String {\n                    let member: Member = .m1_fetchData(for: .value(name))\n                    return mocker.mock(member) { producer in\n                        let producer = try cast(producer) as (Int) -> String\n                        return producer(name)\n                    }\n                }\n                func fetchData(for name: String) -> String {\n                    let member: Member = .m2_fetchData(for: .value(name))\n                    return mocker.mock(member) { producer in\n                        let producer = try cast(producer) as (String) -> String\n                        return producer(name)\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_fetchData(for: Parameter<Int>)\n                    case m2_fetchData(for: Parameter<String>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_fetchData(for: let leftFor), .m1_fetchData(for: let rightFor)):\n                            return leftFor.match(rightFor)\n                        case (.m2_fetchData(for: let leftFor), .m2_fetchData(for: let rightFor)):\n                            return leftFor.match(rightFor)\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_fetchData(for: Parameter<Int>)\n                    case m2_fetchData(for: Parameter<String>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_fetchData(for: let leftFor), .m1_fetchData(for: let rightFor)):\n                            return leftFor.match(rightFor)\n                        case (.m2_fetchData(for: let leftFor), .m2_fetchData(for: let rightFor)):\n                            return leftFor.match(rightFor)\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func fetchData(for name: Parameter<Int>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, String, (Int) -> String> {\n                        .init(mocker, kind: .m1_fetchData(for: name))\n                    }\n                    nonisolated func fetchData(for name: Parameter<String>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, String, (String) -> String> {\n                        .init(mocker, kind: .m2_fetchData(for: name))\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func fetchData(for name: Parameter<Int>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_fetchData(for: name))\n                    }\n                    nonisolated func fetchData(for name: Parameter<String>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m2_fetchData(for: name))\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func fetchData(for name: Parameter<Int>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_fetchData(for: name))\n                    }\n                    nonisolated func fetchData(for name: Parameter<String>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m2_fetchData(for: name))\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_same_name_different_name_params() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol Test {\n              func fetchData(forA name: String) -> String\n              func fetchData(forB name: String) -> String\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                func fetchData(forA name: String) -> String\n                func fetchData(forB name: String) -> String\n            }\n\n            #if MOCKING\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func fetchData(forA name: String) -> String {\n                    let member: Member = .m1_fetchData(forA: .value(name))\n                    return mocker.mock(member) { producer in\n                        let producer = try cast(producer) as (String) -> String\n                        return producer(name)\n                    }\n                }\n                func fetchData(forB name: String) -> String {\n                    let member: Member = .m2_fetchData(forB: .value(name))\n                    return mocker.mock(member) { producer in\n                        let producer = try cast(producer) as (String) -> String\n                        return producer(name)\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_fetchData(forA: Parameter<String>)\n                    case m2_fetchData(forB: Parameter<String>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_fetchData(forA: let leftForA), .m1_fetchData(forA: let rightForA)):\n                            return leftForA.match(rightForA)\n                        case (.m2_fetchData(forB: let leftForB), .m2_fetchData(forB: let rightForB)):\n                            return leftForB.match(rightForB)\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_fetchData(forA: Parameter<String>)\n                    case m2_fetchData(forB: Parameter<String>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_fetchData(forA: let leftForA), .m1_fetchData(forA: let rightForA)):\n                            return leftForA.match(rightForA)\n                        case (.m2_fetchData(forB: let leftForB), .m2_fetchData(forB: let rightForB)):\n                            return leftForB.match(rightForB)\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func fetchData(forA name: Parameter<String>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, String, (String) -> String> {\n                        .init(mocker, kind: .m1_fetchData(forA: name))\n                    }\n                    nonisolated func fetchData(forB name: Parameter<String>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, String, (String) -> String> {\n                        .init(mocker, kind: .m2_fetchData(forB: name))\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func fetchData(forA name: Parameter<String>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_fetchData(forA: name))\n                    }\n                    nonisolated func fetchData(forB name: Parameter<String>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m2_fetchData(forB: name))\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func fetchData(forA name: Parameter<String>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_fetchData(forA: name))\n                    }\n                    nonisolated func fetchData(forB name: Parameter<String>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m2_fetchData(forB: name))\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_reserved_keyword() {\n        assertMacro {\n            \"\"\"\n            @Mockable\n            protocol Test {\n                func `repeat`(param: Bool) -> String\n            }\n            \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                func `repeat`(param: Bool) -> String\n            }\n\n            #if MOCKING\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func `repeat`(param: Bool) -> String {\n                    let member: Member = .m1_repeat(param: .value(param))\n                    return mocker.mock(member) { producer in\n                        let producer = try cast(producer) as (Bool) -> String\n                        return producer(param)\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_repeat(param: Parameter<Bool>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_repeat(param: let leftParam), .m1_repeat(param: let rightParam)):\n                            return leftParam.match(rightParam)\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_repeat(param: Parameter<Bool>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_repeat(param: let leftParam), .m1_repeat(param: let rightParam)):\n                            return leftParam.match(rightParam)\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func `repeat`(param: Parameter<Bool>) -> Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, String, (Bool) -> String> {\n                        .init(mocker, kind: .m1_repeat(param: param))\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func `repeat`(param: Parameter<Bool>) -> Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_repeat(param: param))\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated func `repeat`(param: Parameter<Bool>) -> Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_repeat(param: param))\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n}\n\n\n"
  },
  {
    "path": "Tests/MockableMacroTests/PropertyRequirementTests.swift",
    "content": "//\n//  PropertyRequirementTests.swift\n//\n//\n//  Created by Kolos Foltanyi on 2023. 11. 21..\n//\n\nimport MacroTesting\nimport XCTest\n\nfinal class PropertyRequirementTests: MockableMacroTestCase {\n    func test_computed_property() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol Test {\n              var computedInt: Int { get }\n              var computedString: String! { get }\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                var computedInt: Int { get }\n                var computedString: String! { get }\n            }\n\n            #if MOCKING\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                var computedInt: Int {\n                    get {\n                        let member: Member = .m1_computedInt\n                        return mocker.mock(member) { producer in\n                            let producer = try cast(producer) as () -> Int\n                            return producer()\n                        }\n                    }\n                }\n                var computedString: String! {\n                    get {\n                        let member: Member = .m2_computedString\n                        return mocker.mock(member) { producer in\n                            let producer = try cast(producer) as () -> String\n                            return producer()\n                        }\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_computedInt\n                    case m2_computedString\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_computedInt, .m1_computedInt):\n                            return true\n                        case (.m2_computedString, .m2_computedString):\n                            return true\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_computedInt\n                    case m2_computedString\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_computedInt, .m1_computedInt):\n                            return true\n                        case (.m2_computedString, .m2_computedString):\n                            return true\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var computedInt: Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, Int, () -> Int> {\n                        .init(mocker, kind: .m1_computedInt)\n                    }\n                    nonisolated var computedString: Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, String, () -> String> {\n                        .init(mocker, kind: .m2_computedString)\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var computedInt: Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_computedInt)\n                    }\n                    nonisolated var computedString: Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m2_computedString)\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var computedInt: Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_computedInt)\n                    }\n                    nonisolated var computedString: Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m2_computedString)\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_mutable_property() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol Test {\n              var mutableInt: Int { get set }\n              var mutableString: String { get set }\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                var mutableInt: Int { get set }\n                var mutableString: String { get set }\n            }\n\n            #if MOCKING\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                var mutableInt: Int {\n                    get {\n                        let member: Member = .m1_get_mutableInt\n                        return mocker.mock(member) { producer in\n                            let producer = try cast(producer) as () -> Int\n                            return producer()\n                        }\n                    }\n                    set {\n                        let member: Member = .m1_set_mutableInt(newValue: .value(newValue))\n                        mocker.addInvocation(for: member)\n                        mocker.performActions(for: member)\n                    }\n                }\n                var mutableString: String {\n                    get {\n                        let member: Member = .m2_get_mutableString\n                        return mocker.mock(member) { producer in\n                            let producer = try cast(producer) as () -> String\n                            return producer()\n                        }\n                    }\n                    set {\n                        let member: Member = .m2_set_mutableString(newValue: .value(newValue))\n                        mocker.addInvocation(for: member)\n                        mocker.performActions(for: member)\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_get_mutableInt\n                    case m1_set_mutableInt(newValue: Parameter<Int>)\n                    case m2_get_mutableString\n                    case m2_set_mutableString(newValue: Parameter<String>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_get_mutableInt, .m1_get_mutableInt):\n                            return true\n                        case (.m1_set_mutableInt(newValue: let leftNewValue), .m1_set_mutableInt(newValue: let rightNewValue)):\n                            return leftNewValue.match(rightNewValue)\n                        case (.m2_get_mutableString, .m2_get_mutableString):\n                            return true\n                        case (.m2_set_mutableString(newValue: let leftNewValue), .m2_set_mutableString(newValue: let rightNewValue)):\n                            return leftNewValue.match(rightNewValue)\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_get_mutableInt\n                    case m1_set_mutableInt(newValue: Parameter<Int>)\n                    case m2_get_mutableString\n                    case m2_set_mutableString(newValue: Parameter<String>)\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_get_mutableInt, .m1_get_mutableInt):\n                            return true\n                        case (.m1_set_mutableInt(newValue: let leftNewValue), .m1_set_mutableInt(newValue: let rightNewValue)):\n                            return leftNewValue.match(rightNewValue)\n                        case (.m2_get_mutableString, .m2_get_mutableString):\n                            return true\n                        case (.m2_set_mutableString(newValue: let leftNewValue), .m2_set_mutableString(newValue: let rightNewValue)):\n                            return leftNewValue.match(rightNewValue)\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var mutableInt: Mockable.PropertyReturnBuilder<MockTest, ReturnBuilder, Int> {\n                        .init(mocker, kind: .m1_get_mutableInt)\n                    }\n                    nonisolated var mutableString: Mockable.PropertyReturnBuilder<MockTest, ReturnBuilder, String> {\n                        .init(mocker, kind: .m2_get_mutableString)\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    func mutableInt(newValue: Parameter<Int> = .any) -> Mockable.PropertyActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_get_mutableInt, setKind: .m1_set_mutableInt(newValue: newValue))\n                    }\n                    func mutableString(newValue: Parameter<String> = .any) -> Mockable.PropertyActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m2_get_mutableString, setKind: .m2_set_mutableString(newValue: newValue))\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    func mutableInt(newValue: Parameter<Int> = .any) -> Mockable.PropertyVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_get_mutableInt, setKind: .m1_set_mutableInt(newValue: newValue))\n                    }\n                    func mutableString(newValue: Parameter<String> = .any) -> Mockable.PropertyVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m2_get_mutableString, setKind: .m2_set_mutableString(newValue: newValue))\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n\n    func test_async_throwing_property() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol Test {\n              var throwingProperty: Int { get throws }\n              var asyncProperty: String { get async }\n              var asyncThrowingProperty: String { get async throws }\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol Test {\n                var throwingProperty: Int { get throws }\n                var asyncProperty: String { get async }\n                var asyncThrowingProperty: String { get async throws }\n            }\n\n            #if MOCKING\n            final class MockTest: Test, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTest>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                var throwingProperty: Int {\n                    get throws {\n                        let member: Member = .m1_throwingProperty\n                        return try mocker.mockThrowing(member) { producer in\n                            let producer = try cast(producer) as () throws -> Int\n                            return try producer()\n                        }\n                    }\n                }\n                var asyncProperty: String {\n                    get async {\n                        let member: Member = .m2_asyncProperty\n                        return mocker.mock(member) { producer in\n                            let producer = try cast(producer) as () -> String\n                            return producer()\n                        }\n                    }\n                }\n                var asyncThrowingProperty: String {\n                    get async throws {\n                        let member: Member = .m3_asyncThrowingProperty\n                        return try mocker.mockThrowing(member) { producer in\n                            let producer = try cast(producer) as () throws -> String\n                            return try producer()\n                        }\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_throwingProperty\n                    case m2_asyncProperty\n                    case m3_asyncThrowingProperty\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_throwingProperty, .m1_throwingProperty):\n                            return true\n                        case (.m2_asyncProperty, .m2_asyncProperty):\n                            return true\n                        case (.m3_asyncThrowingProperty, .m3_asyncThrowingProperty):\n                            return true\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_throwingProperty\n                    case m2_asyncProperty\n                    case m3_asyncThrowingProperty\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_throwingProperty, .m1_throwingProperty):\n                            return true\n                        case (.m2_asyncProperty, .m2_asyncProperty):\n                            return true\n                        case (.m3_asyncThrowingProperty, .m3_asyncThrowingProperty):\n                            return true\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var throwingProperty: Mockable.ThrowingFunctionReturnBuilder<MockTest, ReturnBuilder, Int, any Error, () throws -> Int> {\n                        .init(mocker, kind: .m1_throwingProperty)\n                    }\n                    nonisolated var asyncProperty: Mockable.FunctionReturnBuilder<MockTest, ReturnBuilder, String, () -> String> {\n                        .init(mocker, kind: .m2_asyncProperty)\n                    }\n                    nonisolated var asyncThrowingProperty: Mockable.ThrowingFunctionReturnBuilder<MockTest, ReturnBuilder, String, any Error, () throws -> String> {\n                        .init(mocker, kind: .m3_asyncThrowingProperty)\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var throwingProperty: Mockable.ThrowingFunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m1_throwingProperty)\n                    }\n                    nonisolated var asyncProperty: Mockable.FunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m2_asyncProperty)\n                    }\n                    nonisolated var asyncThrowingProperty: Mockable.ThrowingFunctionActionBuilder<MockTest, ActionBuilder> {\n                        .init(mocker, kind: .m3_asyncThrowingProperty)\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var throwingProperty: Mockable.ThrowingFunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m1_throwingProperty)\n                    }\n                    nonisolated var asyncProperty: Mockable.FunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m2_asyncProperty)\n                    }\n                    nonisolated var asyncThrowingProperty: Mockable.ThrowingFunctionVerifyBuilder<MockTest, VerifyBuilder> {\n                        .init(mocker, kind: .m3_asyncThrowingProperty)\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n}\n"
  },
  {
    "path": "Tests/MockableMacroTests/TypedThrowsTests_Swift6.swift",
    "content": "//\n//  TypedThrowsTests.swift\n//  \n//\n//  Created by Kolos Foltanyi on 08/07/2024.\n//\n\nimport MacroTesting\nimport XCTest\nimport SwiftSyntax\n\n#if canImport(SwiftSyntax600)\nfinal class TypedThrowsTests_Swift6: MockableMacroTestCase {\n    func test_typed_throws_requirement() {\n        assertMacro {\n          \"\"\"\n          @Mockable\n          protocol TypedErrorProtocol {\n              func foo() throws(ExampleError)\n              var baz: String { get throws(ExampleError) }\n          }\n          \"\"\"\n        } expansion: {\n            \"\"\"\n            protocol TypedErrorProtocol {\n                func foo() throws(ExampleError)\n                var baz: String { get throws(ExampleError) }\n            }\n\n            #if MOCKING\n            final class MockTypedErrorProtocol: TypedErrorProtocol, Mockable.MockableService {\n                typealias Mocker = Mockable.Mocker<MockTypedErrorProtocol>\n                private let mocker = Mocker()\n                @available(*, deprecated, message: \"Use given(_ service:) instead. \")\n                nonisolated var _given: ReturnBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use when(_ service:) instead. \")\n                nonisolated var _when: ActionBuilder {\n                    .init(mocker: mocker)\n                }\n                @available(*, deprecated, message: \"Use verify(_ service:) instead. \")\n                nonisolated var _verify: VerifyBuilder {\n                    .init(mocker: mocker)\n                }\n                nonisolated func reset(_ scopes: Set<Mockable.MockerScope> = .all) {\n                    mocker.reset(scopes: scopes)\n                }\n                nonisolated init(policy: Mockable.MockerPolicy? = nil) {\n                    if let policy {\n                        mocker.policy = policy\n                    }\n                }\n                func foo() throws(ExampleError) {\n                    let member: Member = .m2_foo\n                    try mocker.mockThrowing(member, error: ExampleError.self) { producer in\n                        let producer = try cast(producer) as () throws -> Void\n                        return try producer()\n                    }\n                }\n                var baz: String {\n                    get throws(ExampleError) {\n                        let member: Member = .m1_baz\n                        return try mocker.mockThrowing(member, error: ExampleError.self) { producer in\n                            let producer = try cast(producer) as () throws -> String\n                            return try producer()\n                        }\n                    }\n                }\n                #if swift(>=6.1)\n                nonisolated enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_baz\n                    case m2_foo\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_baz, .m1_baz):\n                            return true\n                        case (.m2_foo, .m2_foo):\n                            return true\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #else\n                enum Member: Mockable.Matchable, Mockable.CaseIdentifiable, Swift.Sendable {\n                    case m1_baz\n                    case m2_foo\n                    nonisolated func match(_ other: Member) -> Bool {\n                        switch (self, other) {\n                        case (.m1_baz, .m1_baz):\n                            return true\n                        case (.m2_foo, .m2_foo):\n                            return true\n                        default:\n                            return false\n                        }\n                    }\n                }\n                #endif\n                struct ReturnBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var baz: Mockable.ThrowingFunctionReturnBuilder<MockTypedErrorProtocol, ReturnBuilder, String, ExampleError, () throws -> String> {\n                        .init(mocker, kind: .m1_baz)\n                    }\n                    nonisolated func foo() -> Mockable.ThrowingFunctionReturnBuilder<MockTypedErrorProtocol, ReturnBuilder, Void, ExampleError, () throws -> Void> {\n                        .init(mocker, kind: .m2_foo)\n                    }\n                }\n                struct ActionBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var baz: Mockable.ThrowingFunctionActionBuilder<MockTypedErrorProtocol, ActionBuilder> {\n                        .init(mocker, kind: .m1_baz)\n                    }\n                    nonisolated func foo() -> Mockable.ThrowingFunctionActionBuilder<MockTypedErrorProtocol, ActionBuilder> {\n                        .init(mocker, kind: .m2_foo)\n                    }\n                }\n                struct VerifyBuilder: Mockable.Builder {\n                    private let mocker: Mocker\n                    nonisolated init(mocker: Mocker) {\n                        self.mocker = mocker\n                    }\n                    nonisolated var baz: Mockable.ThrowingFunctionVerifyBuilder<MockTypedErrorProtocol, VerifyBuilder> {\n                        .init(mocker, kind: .m1_baz)\n                    }\n                    nonisolated func foo() -> Mockable.ThrowingFunctionVerifyBuilder<MockTypedErrorProtocol, VerifyBuilder> {\n                        .init(mocker, kind: .m2_foo)\n                    }\n                }\n            }\n            #endif\n            \"\"\"\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Tests/MockableMacroTests/Utils/MockableMacroTestCase.swift",
    "content": "//\n//  MockableMacroTestCase.swift\n//\n//\n//  Created by Kolos Foltanyi on 2023. 11. 21..\n//\n\nimport Foundation\nimport SwiftSyntaxMacros\nimport SwiftSyntaxMacrosTestSupport\nimport MacroTesting\nimport XCTest\n\n#if canImport(MockableMacro)\nimport MockableMacro\n#endif\n\nclass MockableMacroTestCase: XCTestCase {\n    override func invokeTest() {\n        #if canImport(MockableMacro)\n        withMacroTesting(record: false, macros: [\"Mockable\": MockableMacro.self]) {\n            super.invokeTest()\n        }\n        #else\n        fatalError(\"Macro tests can only be run on the host platform!\")\n        #endif\n    }\n}\n"
  },
  {
    "path": "Tests/MockableTests/ActionTests.swift",
    "content": "//\n//  ActionTests.swift\n//\n//\n//  Created by Kolos Foltanyi on 2023. 11. 22..\n//\n\nimport XCTest\nimport Mockable\n\nfinal class ActionTests: XCTestCase {\n\n    // MARK: Properties\n\n    private let mock = MockTestService<String>()\n\n    // MARK: Overrides\n\n    override func tearDown() {\n        mock.reset()\n        Matcher.reset()\n    }\n\n    // MARK: Tests\n\n    func test_givenActionRegistered_whenMockCalled_actionIsCalled() throws {\n        var called = false\n\n        given(mock).getUser(for: .any).willReturn(.test1)\n\n        when(mock).getUser(for: .any).perform {\n            called = true\n        }\n\n        _ = try mock.getUser(for: UUID())\n\n        XCTAssertTrue(called)\n    }\n\n    func test_givenActionRegisteredForMutableProperty_whenMockCalled_relatedActionsAreCalled() {\n        var getCalled = false\n        var setCalled = false\n\n        given(mock).name.willReturn(\"\")\n\n        when(mock)\n            .name().performOnGet { getCalled = true }\n            .name().performOnSet { setCalled = true }\n\n        _ = mock.name\n        mock.name = \"\"\n\n        XCTAssertTrue(getCalled)\n        XCTAssertTrue(setCalled)\n    }\n\n    func test_givenParameterConditionedActions_whenMockCalled_onlyCallsActionWithMatchingParameter() throws {\n        var firstCalled = false\n        var secondCalled = false\n\n        let id1 = UUID()\n        let id2 = UUID()\n\n        given(mock).getUser(for: .any).willReturn(.test1)\n\n        when(mock)\n            .getUser(for: .value(id1)).perform { firstCalled = true }\n            .getUser(for: .value(id2)).perform { secondCalled = true }\n\n        _ = try mock.getUser(for: id2)\n\n        XCTAssertFalse(firstCalled)\n        XCTAssertTrue(secondCalled)\n    }\n\n    func test_givenMultipleActions_whenMockCalled_allActionsAreCalled() throws {\n        var firstCalled = false\n        var secondCalled = false\n        var thirdCalled = false\n\n        given(mock).getUser(for: .any).willReturn(.test1)\n\n        when(mock)\n            .getUser(for: .any).perform { firstCalled = true }\n            .getUser(for: .any).perform { secondCalled = true }\n            .getUser(for: .any).perform { thirdCalled = true }\n\n        _ = try mock.getUser(for: UUID())\n\n        XCTAssertTrue(firstCalled)\n        XCTAssertTrue(secondCalled)\n        XCTAssertTrue(thirdCalled)\n    }\n\n    func test_givenGenericActionsRegistered_whenMockCalled_actionWithMatchingTypeCalled() {\n        var firstCalled = false\n        var secondCalled = false\n        var thirdCalled = false\n\n        let id = UUID()\n\n        given(mock)\n            .delete(for: .value(\"id\")).willReturn(1)\n            .delete(for: .value(id)).willReturn(2)\n\n        when(mock)\n            .delete(for: .value(\"id\")).perform { firstCalled = true }\n            .delete(for: .value(id)).perform { secondCalled = true }\n            .delete(for: .value(\"id\")).perform { thirdCalled = true }\n\n        _ = mock.delete(for: id)\n\n        XCTAssertFalse(firstCalled)\n        XCTAssertTrue(secondCalled)\n        XCTAssertFalse(thirdCalled)\n    }\n\n    func test_givenGenericParamAndReturnFunc_whenActionUsed_onlyParamIsInfered() {\n        var called = false\n\n        given(mock)\n            .retrieveItem(item: Parameter<Int>.any)\n            .willReturn(0)\n\n        when(mock)\n            .retrieveItem(item: Parameter<Int>.any)\n            .perform { called = true }\n\n        let _: Int = mock.retrieveItem(item: 0)\n\n        XCTAssertTrue(called)\n    }\n}\n"
  },
  {
    "path": "Tests/MockableTests/BuildTests.swift",
    "content": "//\n//  TestProtocol.swift\n//\n//\n//  Created by Kolos Foltanyi on 2023. 11. 21..\n//\n\nimport Mockable\n\n@Mockable\nprotocol TestAssociatedTypes where Item2: Identifiable {\n    associatedtype Item1\n    associatedtype Item2: Equatable, Hashable\n    associatedtype Item3 where Item3: Equatable, Item3: Hashable\n    func foo(item1: Item1) -> Item1\n    func foo(item2: Item2) -> Item2\n    func foo(item3: Item3) -> Item3\n}\n\n@Mockable\nprotocol TestExoticParameters {\n    func modifyValue(_ value: inout Int)\n    func printValues(_ values: Int...)\n    func execute(operation: @escaping () throws -> Void)\n}\n\n@Mockable\nprotocol TestFunctionEffects {\n    func canThrowError() throws\n    func returnsAndThrows() throws -> String\n    func call(operation: @escaping () throws -> Void) rethrows\n    func asyncFunction() async\n    func asyncThrowingFunction() async throws\n    func asyncParamFunction(param: @escaping () async throws -> Void) async\n    nonisolated func nonisolatedFunction() async\n}\n\n@Mockable\nprotocol TestGenericFunctions {\n    func foo<T>(item: (Array<[(Set<T>, String)]>, Int))\n    func genericFunc<T, V>(item: T) -> V\n    func getInts() -> any Collection<Int>\n    func method<T: Hashable, E, C, I>(\n        prop1: T, prop2: E, prop3: C, prop4: I\n    ) where E: Equatable, E: Hashable, C: Codable\n}\n\n@Mockable\nprotocol TestNameCollisions {\n    func fetchData(for name: Int) -> String\n    func fetchData(for name: String) -> String\n    func fetchData(forA name: String) -> String\n    func fetchData(forB name: String) -> String\n    func `repeat`(param: Bool) -> Int\n}\n\n@Mockable\nprotocol TestPropertyRequirements {\n    var computedInt: Int { get }\n    var computedString: String { get }\n    var mutableInt: Int { get set }\n    var mutableUnwrappedString: String! { get set }\n    var throwingProperty: Int { get throws }\n    var asyncProperty: String { get async }\n    var asyncThrowingProperty: String { get async throws }\n    nonisolated var nonisolatedProperty: String { get set }\n}\n\n@Mockable\nprotocol TestInitRequirements {\n    init?() async throws\n    init(index: Int)\n    init(name value: String, index: Int)\n}\n\n@Mockable\nprotocol TestAttributes {\n    @available(iOS 16, *)\n    init(attributed: String)\n    @available(iOS 16, *)\n    var attributedProp: Int { get }\n    @available(iOS 16, *)\n    func attributedTest()\n}\n\n#if canImport(Foundation)\nimport Foundation\n\n@Mockable\nprotocol TestNSObject: NSObjectProtocol {\n    func foo(param: Int) -> String\n}\n#endif\n\n@Mockable\nprotocol TestActorConformance: Actor {\n    func foo(param: Int) -> String\n}\n\n@Mockable\n@MainActor\nprotocol TestGlobalActor {\n    func foo(param: Int) -> String\n}\n\n@Mockable\nprotocol TestSendable: Sendable {\n    func foo(param: Int) -> String\n}\n\n@Mockable\npublic protocol TestReservedKeyword {\n    func example(for: String) async throws -> String\n}\n\n#if swift(>=6.1)\n@Mockable\nnonisolated protocol NonisolatedProtocol {\n    func foo()\n}\n#endif\n\n@Mockable\nprotocol AttributedRequirementProtocol {\n    #if swift(>=0)\n    @available(*, deprecated)\n    #endif\n    func foo()\n}\n"
  },
  {
    "path": "Tests/MockableTests/ErrorShadowingCompileTests.swift",
    "content": "import XCTest\nimport Mockable\n\nprivate typealias Error = Int\n\n@Mockable\nprivate protocol ShadowedErrorTypealiasService {\n    func throwingMethod() throws\n}\n\nfinal class ErrorShadowingCompileTests: XCTestCase {\n    func test_shadowed_error_typealias_allows_macro_expansion() {\n        _ = MockShadowedErrorTypealiasService()\n    }\n}\n"
  },
  {
    "path": "Tests/MockableTests/GivenTests.swift",
    "content": "//\n//  GivenTests.swift\n//\n//\n//  Created by Kolos Foltanyi on 2023. 11. 22..\n//\n\nimport XCTest\nimport Mockable\n\nfinal class GivenTests: XCTestCase {\n\n    // MARK: Properties\n\n    private var mock = MockTestService<String>()\n\n    // MARK: Overrides\n\n    override func tearDown() {\n        mock.reset()\n        Matcher.reset()\n    }\n\n    // MARK: Tests\n\n    func test_givenReturnValueRegistered_whenMockCalled_valueReturned() throws {\n        given(mock)\n            .getUser(for: .any).willReturn(.test1)\n            .getUser(for: .any).willProduce { _ in .test2 }\n\n        let user1 = try mock.getUser(for: UUID())\n        let user2 = try mock.getUser(for: UUID())\n\n        XCTAssertEqual(user1, .test1)\n        XCTAssertEqual(user2, .test2)\n    }\n\n    func test_givenReturnValueRegisteredForMutableProperty_whenMockCalled_valueReturned() {\n        let test1 = \"name\"\n        let test2 = \"name\"\n\n        given(mock)\n            .name.willReturn(test1)\n            .name.willProduce { test2 }\n\n        let name1 = mock.name\n        let name2 = mock.name\n\n        XCTAssertEqual(name1, test1)\n        XCTAssertEqual(name2, test2)\n    }\n\n    func test_givenGenericReturnValueRegistered_whenMockCalled_valueReturned() {\n        let red = \"red\"\n\n        given(mock).getFavoriteColor().willReturn(red)\n\n        let color = mock.getFavoriteColor()\n\n        XCTAssertEqual(color, red)\n    }\n\n    func test_givenParameterConditionedReturn_whenMockCalled_onlyReturnsForMatchingParameters() throws {\n        let id1 = UUID()\n        let id2 = UUID()\n\n        given(mock)\n            .getUser(for: .value(id1)).willReturn(User.test1)\n            .getUser(for: .value(id2)).willReturn(User.test2)\n            .getUsers(for: .value([id1])).willReturn([User.test1])\n            .getUsers(for: .value([id2])).willReturn([User.test2])\n\n        let testUser1 = try mock.getUser(for: id1)\n        let testUser2 = try mock.getUser(for: id2)\n        let testUsers1 = mock.getUsers(for: id1)\n        let testUsers2 = mock.getUsers(for: id2)\n\n        XCTAssertEqual(testUser1, User.test1)\n        XCTAssertEqual(testUser2, User.test2)\n        XCTAssertEqual(testUsers1, [User.test1])\n        XCTAssertEqual(testUsers2, [User.test2])\n    }\n\n    func test_givenReturnWithParamComparator_whenMockCalled_valueReturnedToMatchingParameters() {\n        let validIds = [UUID(), UUID()]\n        let invalidIds = [UUID(), UUID()]\n\n        let user: User = .test1\n        let error: UserError = .notFound\n\n        given(mock)\n            .getUser(for: .matching { validIds.contains($0) }).willReturn(user)\n            .getUser(for: .matching { invalidIds.contains($0) }).willThrow(error)\n\n        for id in invalidIds {\n            XCTAssertThrowsError(try mock.getUser(for: id))\n        }\n        for id in validIds {\n            XCTAssertEqual(try mock.getUser(for: id), .test1)\n        }\n    }\n\n    func test_givenMultipleReturn_whenMockCalled_valuesAreReturnedInOrder() throws {\n        given(mock)\n            .getUser(for: .any).willReturn(.test1)\n            .getUser(for: .any).willReturn(.test2)\n            .getUser(for: .any).willReturn(.test3)\n\n        let testUser1 = try mock.getUser(for: UUID())\n        let testUser2 = try mock.getUser(for: UUID())\n        let testUser3 = try mock.getUser(for: UUID())\n        let last = try mock.getUser(for: UUID())\n\n        XCTAssertEqual(testUser1, .test1)\n        XCTAssertEqual(testUser2, .test2)\n        XCTAssertEqual(testUser3, .test3)\n        XCTAssertEqual(last, .test3)\n    }\n\n    func test_givenGenericReturnsRegistered_whenMockCalled_valueWithMatchingTypeReturned() {\n        let stringValue = \"value1\"\n        let intValue = 1234\n        let doubleValue: Double = 2.5\n\n        given(mock)\n            .getUserAndValue(for: .any, value: .any).willReturn((.test1, stringValue))\n            .getUserAndValue(for: .any, value: .any).willReturn((.test2, intValue))\n            .getUserAndValue(for: .any, value: .any).willReturn((.test3, doubleValue))\n\n        let (test1, value1): (User, String) = mock.getUserAndValue(for: UUID(), value: \"\")\n        let (test2, value2): (User, Int) = mock.getUserAndValue(for: UUID(), value: 0)\n        let (test3, value3): (User, Double) = mock.getUserAndValue(for: UUID(), value: 0.5)\n\n        XCTAssertEqual(test1, .test1)\n        XCTAssertEqual(value1, stringValue)\n        XCTAssertEqual(test2, .test2)\n        XCTAssertEqual(value2, intValue)\n        XCTAssertEqual(test3, .test3)\n        XCTAssertEqual(value3, doubleValue)\n    }\n\n    func test_givenVoidProducerRegistered_whenMockCalled_producerUsedToProduceResult() {\n        given(mock).print().willProduce { throw UserError.notFound }\n\n        XCTAssertThrowsError(try mock.print())\n    }\n\n    func test_givenGenericProducers_whenMockCalled_matchingProducerIsUsedToReturnValue() {\n        let stringValue = \"value1\"\n        let intValue = 1234\n\n        given(mock)\n            .retrieve().willProduce { stringValue }\n            .retrieve().willProduce { intValue }\n\n        let test: Int = mock.retrieve()\n\n        XCTAssertEqual(test, intValue)\n    }\n\n    func test_givenError_whenMockCalled_errorIsThrown() async {\n        given(mock).setUser(user: .any).willThrow(UserError.notFound)\n\n        do {\n            _ = try await mock.setUser(user: .test1)\n        } catch let error as UserError {\n            XCTAssertEqual(error, UserError.notFound)\n        } catch {\n            XCTFail(\"Unexpected error: \\(error.localizedDescription)\")\n        }\n    }\n\n    func test_givenThrowingProducer_whenMockCalled_errorIsThrown() async {\n        given(mock)\n            .setUser(user: .any).willProduce { _ in throw UserError.notFound }\n\n        do {\n            _ = try await mock.setUser(user: .test1)\n        } catch let error as UserError {\n            XCTAssertEqual(error, UserError.notFound)\n        } catch {\n            XCTFail(\"Unexpected error: \\(error.localizedDescription)\")\n        }\n    }\n\n    func test_givenMultipleGivenClauses_whenMockCalled_givensAreUsedInOrder() {\n        given(mock)\n            .getUser(for: .any).willReturn(.test1)\n            .getUser(for: .any).willThrow(UserError.notFound)\n            .getUser(for: .any).willProduce { _ in .test2 }\n            .getUser(for: .any).willProduce { _ in throw UserError.notFound }\n\n        XCTAssertEqual(try mock.getUser(for: UUID()), .test1)\n        XCTAssertThrowsError(try mock.getUser(for: UUID()))\n        XCTAssertEqual(try mock.getUser(for: UUID()), .test2)\n        XCTAssertThrowsError(try mock.getUser(for: UUID()))\n    }\n\n    func test_givenEquatableParameterWithCondition_whenMockCalled_canMatchWithDefaultMatcher() {\n        let user1: User = .test1\n        let user2: User = .test2\n        let user3: User = .test3\n\n        given(mock)\n            .modify(user: .value(user1)).willReturn(1)\n            .modify(user: .matching { (user: User) in user == user2 }).willReturn(2)\n            .modify(user: Parameter<User>.any).willReturn(3)\n\n        XCTAssertEqual(mock.modify(user: user1), 1)\n        XCTAssertEqual(mock.modify(user: user2), 2)\n        XCTAssertEqual(mock.modify(user: user3), 3)\n    }\n\n    func test_givenGenericParameterWithCondition_whenMockCalled_canMatchWithRegistered() {\n        let user1: User = .test1\n        let user2: User = .test2\n        let user3: User = .test3\n\n        Matcher.register(User.self)\n\n        given(mock)\n            .delete(for: .value(user1)).willReturn(1)\n            .delete(for: .matching { (user: User) in user == user2 }).willReturn(2)\n            .delete(for: Parameter<User>.any).willReturn(3)\n\n        XCTAssertEqual(mock.delete(for: user1), 1)\n        XCTAssertEqual(mock.delete(for: user2), 2)\n        XCTAssertEqual(mock.delete(for: user3), 3)\n    }\n\n    func test_givenNonEquatableParameterWithCondition_whenCalled_canMatchWithRegisteredMatcher() {\n        Matcher.register(Product.self, match: { $0.name == $1.name })\n\n        given(mock)\n            .update(products: .value([.test])).willReturn(1)\n            .update(products: .matching { $0.allSatisfy { $0.name == Product.test.name } }).willReturn(2)\n            .update(products: .any).willReturn(3)\n\n        XCTAssertEqual(mock.update(products: [.test]), 1)\n        XCTAssertEqual(mock.update(products: [.test]), 2)\n        XCTAssertEqual(mock.update(products: [.test]), 3)\n    }\n\n    func test_givenGenericParamAndReturnFunc_whenValueGiven_genericsAreInferred() {\n        given(mock)\n            .retrieveItem(item: Parameter<Int>.any)\n            .willReturn(1234)\n\n        let result: Int = mock.retrieveItem(item: 0)\n\n        XCTAssertEqual(result, 1234)\n    }\n\n    func test_givenEscapingClosureParam_whenWillProduceCalled_closureCanBeSaved() throws {\n        var storedCompletion: ((Product) -> Void)?\n\n        given(mock)\n            .download(completion: .any)\n            .willProduce { completion in\n                storedCompletion = completion\n            }\n\n        mock.download { _ in }\n\n        XCTAssertNotNil(storedCompletion)\n    }\n\n    func test_givenInoutParam_whenWillProduceUsed_mutationWorks() {\n        given(mock)\n            .change(user: .any)\n            .willProduce { param in\n                param.age = 100\n            }\n        var user: User = .init(name: \"test\", age: 0)\n        mock.change(user: &user)\n\n        XCTAssertEqual(user.age, 100)\n    }\n\n    func test_givenResult_willEmitSuccess() throws {\n        let expected = User.test1\n        let result: Result<User, any Error> = .success(expected)\n\n        given(mock)\n            .getUser(for: .any)\n            .willHandle(result)\n\n        let actual = try mock.getUser(for: .init())\n\n        XCTAssertEqual(actual, expected)\n    }\n\n    func test_givenResult_willThrow() throws {\n        let expected = UserError.notFound\n        let result: Result<User, any Error> = .failure(expected)\n\n        given(mock)\n            .getUser(for: .any)\n            .willHandle(result)\n\n        XCTAssertThrowsError(try mock.getUser(for: .init()))\n    }\n\n    @MainActor\n    func test_givenConcurrentGivens_whenCalled_synchronizedCorrectly() async throws {\n        // Register return values concurrently\n        await withTaskGroup(of: Void.self) { @MainActor group in\n            for _ in (0..<50) {\n                group.addTask { @MainActor in given(self.mock).getUser(for: .any).willReturn(.test1) }\n                group.addTask { @MainActor in given(self.mock).getUser(for: .any).willReturn(.test2) }\n            }\n            await group.waitForAll()\n        }\n\n        // Concurrent calls\n        await withTaskGroup(of: Void.self) { @MainActor group in\n            let id = UUID()\n            for _ in (0..<50) {\n                group.addTask { @MainActor in _ = try? self.mock.getUser(for: id) }\n                group.addTask { @MainActor in _ = try? self.mock.getUser(for: id) }\n            }\n            await group.waitForAll()\n        }\n\n        // Concurrent verifications\n        await withTaskGroup(of: Void.self) { @MainActor group in\n            let verify = verify(self.mock)\n            for index in (0..<100) {\n                group.addTask { await verify.getUser(for: .any).calledEventually(.moreOrEqual(to: index)) }\n                group.addTask { verify.getUser(for: .any).called(100) }\n            }\n            await group.waitForAll()\n        }\n    }\n}\n"
  },
  {
    "path": "Tests/MockableTests/GivenTests_Swift6.swift",
    "content": "//\n//  GivenTests_Swift6.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 28/09/2024.\n//\n\nimport XCTest\nimport Mockable\n\n#if swift(>=6)\nfinal class GivenTests_Swift6: XCTestCase {\n\n    // MARK: Properties\n\n    private var mock = MockTestService_Swift6()\n\n    // MARK: Overrides\n\n    override func tearDown() {\n        mock.reset()\n        Matcher.reset()\n    }\n\n    // MARK: Tests\n\n    func test_givenTypedThrows_whenErrorSet_correctTypeThrown() {\n        given(mock)\n            .fetch().willThrow(.notFound)\n            .fetched.willThrow(.notFound)\n\n        do {\n            try mock.fetch()\n        } catch {\n            XCTAssertEqual(error, UserError.notFound)\n        }\n        do {\n            _ = try mock.fetched\n        } catch {\n            XCTAssertEqual(error, UserError.notFound)\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Tests/MockableTests/Helpers/Task+Sleep.swift",
    "content": "//\n//  Task+Sleep.swift\n//\n//\n//  Created by Kolos Foltanyi on 2024. 04. 07..\n//\n\nimport Foundation\n\nextension Task where Success == Never, Failure == Never {\n    static func sleep(seconds: TimeInterval) async throws {\n        try await sleep(nanoseconds: UInt64(seconds * 1_000_000_000))\n    }\n}\n"
  },
  {
    "path": "Tests/MockableTests/PolicyTests.swift",
    "content": "//\n//  PolicyTests.swift\n//  \n//\n//  Created by Kolos Foltanyi on 2024. 04. 02..\n//\n\nimport XCTest\nimport Mockable\n\npublic struct Car: Equatable {\n    var name: String\n    var seats: Int\n}\n\nextension Car: Mocked {\n    public static var mock: Car {\n        Car(name: \"Mock\", seats: 4)\n    }\n}\n\n@Mockable\nprivate protocol PolicyService {\n    func throwingVoidFunc() throws\n    var throwingVoidProp: Void { get throws }\n    func nonThrowingVoidFunc()\n    var nonThrowingVoidProp: Void { get }\n    func optionalFunc() -> String?\n    var optionalProp: String? { get }\n    func carFunc() -> Car\n    func optionalCarFunc() -> Car?\n    var carProp: Car { get }\n    func carsFunc() -> [Car]\n    var carsProp: [Car] { get }\n}\n\nfinal class PolicyTests: XCTestCase {\n\n    // MARK: Overrides\n\n    override func tearDown() {\n        Matcher.reset()\n        MockerPolicy.default = .strict\n    }\n\n    // MARK: Tests\n\n    func test_whenDefaultPolicyChanged_allCallsAreRelaxed() throws {\n        let mock = MockPolicyService()\n        MockerPolicy.default = .relaxed\n        try testRelaxed(on: mock)\n    }\n\n    func test_whenCustomRelaxedPolicySet_allCallsAreRelaxed() throws {\n        let mock = MockPolicyService(policy: .relaxed)\n        try testRelaxed(on: mock)\n    }\n\n    func test_whenCustomVoidPolicySet_mockReturnsDefault() throws {\n        let mock = MockPolicyService(policy: .relaxedVoid)\n        try mock.throwingVoidFunc()\n        try mock.throwingVoidProp\n        mock.nonThrowingVoidFunc()\n        mock.nonThrowingVoidProp\n    }\n\n    func test_whenOnlyOptionalPolicySet_mockReturnsNilNotMockableValue() throws {\n        let mock = MockPolicyService(policy: .relaxedOptional)\n        XCTAssertNil(mock.optionalCarFunc())\n    }\n\n    func test_whenCustomMockedPolicySet_mockReturnsDefault() throws {\n        let mock = MockPolicyService(policy: .relaxedMocked)\n        XCTAssertEqual(Car.mock, mock.carFunc())\n        XCTAssertEqual(Car.mock, mock.optionalCarFunc())\n        XCTAssertEqual(Car.mock, mock.carProp)\n        XCTAssertEqual(Car.mocks, mock.carsFunc())\n        XCTAssertEqual(Car.mocks, mock.carsProp)\n    }\n\n    private func testRelaxed(on service: MockPolicyService) throws {\n        try service.throwingVoidFunc()\n        try service.throwingVoidProp\n        service.nonThrowingVoidFunc()\n        service.nonThrowingVoidProp\n        XCTAssertEqual(nil, service.optionalFunc())\n        XCTAssertEqual(nil, service.optionalProp)\n        XCTAssertEqual(Car.mock, service.carFunc())\n        XCTAssertEqual(Car.mock, service.optionalCarFunc())\n        XCTAssertEqual(Car.mock, service.carProp)\n        XCTAssertEqual(Car.mocks, service.carsFunc())\n        XCTAssertEqual(Car.mocks, service.carsProp)\n    }\n}\n"
  },
  {
    "path": "Tests/MockableTests/Protocols/Models/Product.swift",
    "content": "//\n//  Product.swift\n//  \n//\n//  Created by Kolos Foltanyi on 2023. 11. 26..\n//\n\nimport Foundation\n\nstruct Product {\n    var id = UUID()\n    var name: String\n\n    static let test = Product(name: \"product1\")\n}\n"
  },
  {
    "path": "Tests/MockableTests/Protocols/Models/User.swift",
    "content": "//\n//  User.swift\n//\n//\n//  Created by Kolos Foltanyi on 2023. 11. 26..\n//\n\nimport Foundation\n\nstruct User: Equatable, Hashable {\n    let id = UUID()\n    let name: String\n    var age: Int\n\n    static let test1: User = .init(name: \"test1\", age: 1)\n    static let test2: User = .init(name: \"test2\", age: 2)\n    static let test3: User = .init(name: \"test3\", age: 3)\n    static let list: [User] = [\n        .init(name: \"test1\", age: 1),\n        .init(name: \"test2\", age: 2),\n        .init(name: \"test3\", age: 3),\n        .init(name: \"test4\", age: 4)\n    ]\n}\n"
  },
  {
    "path": "Tests/MockableTests/Protocols/Models/UserError.swift",
    "content": "//\n//  UserError.swift\n//  \n//\n//  Created by Kolos Foltanyi on 2023. 11. 26..\n//\n\nenum UserError: Error {\n    case notFound\n}\n"
  },
  {
    "path": "Tests/MockableTests/Protocols/TestService.swift",
    "content": "//\n//  TestService.swift\n//\n//\n//  Created by Kolos Foltanyi on 2023. 11. 24..\n//\n\nimport Mockable\nimport Foundation\n\n@Mockable\nprotocol TestService {\n\n    // MARK: Associated Type\n\n    associatedtype Color\n    func getFavoriteColor() -> Color\n\n    // MARK: Properties\n\n    var name: String { get set }\n    var computed: String { get }\n\n    // MARK: Functions\n\n    func getUser(for id: UUID) throws -> User\n    func getUsers(for ids: UUID...) -> [User]\n    func setUser(user: User) async throws -> Bool\n    func modify(user: User) -> Int\n    func update(products: [Product]) -> Int\n    func download(completion: @escaping (Product) -> Void)\n    func print() throws\n    func change(user: inout User)\n\n    // MARK: Generics\n\n    func getUserAndValue<Value>(for id: UUID, value: Value) -> (User, Value)\n    func delete<T>(for value: T) -> Int\n    func retrieve<V>() -> V\n    func retrieveItem<T, V>(item: T) -> V\n}\n"
  },
  {
    "path": "Tests/MockableTests/Protocols/TestService_Swift6.swift",
    "content": "//\n//  TestService6.swift\n//  Mockable\n//\n//  Created by Kolos Foltanyi on 28/09/2024.\n//\n\nimport Mockable\n\n#if swift(>=6)\n@Mockable\nprotocol TestService_Swift6 {\n    // MARK: Typed Throws\n\n    func fetch() throws(UserError)\n    var fetched: User { get throws(UserError) }\n}\n#endif\n"
  },
  {
    "path": "Tests/MockableTests/VerifyTests.swift",
    "content": "//\n//  VerifyTests.swift\n//\n//\n//  Created by Kolos Foltanyi on 2023. 11. 22..\n//\n\nimport XCTest\nimport Foundation\n@testable import Mockable\n\nfinal class VerifyTests: XCTestCase {\n\n    // MARK: Properties\n\n    private let mock = MockTestService<String>()\n\n    // MARK: Overrides\n\n    override func tearDown() {\n        mock.reset()\n        Matcher.reset()\n    }\n\n    // MARK: Tests\n\n    func test_givenMockFunctionIsCalled_whenCountVerified_assertsMatchingCounts() throws {\n        given(mock).getUser(for: .any).willReturn(.test1)\n\n        _ = try mock.getUser(for: UUID())\n\n        verify(mock)\n            .getUser(for: .any).called(.once)\n            .getUser(for: .any).called(.atLeastOnce)\n            .getUser(for: .any).called(.less(than: 2))\n            .getUser(for: .any).called(.more(than: 0))\n            .getUser(for: .any).called(.moreOrEqual(to: 1))\n            .getUser(for: .any).called(.lessOrEqual(to: 1))\n            .getUser(for: .any).called(.from(0, to: 2))\n            .getUser(for: .any).called(.exactly(1))\n    }\n\n    @MainActor\n    func test_givenMockFunctionIsCalledAsyncrhonously_whenCountVerified_assertsMatchingCounts() async {\n        given(mock).getUser(for: .any).willReturn(.test1)\n\n        Task {\n            try await Task.sleep(seconds: 0.5)\n            _ = try mock.getUser(for: UUID())\n        }\n\n        verify(mock).getUser(for: .any).called(.never)\n\n        await verify(mock)\n            .getUser(for: .any).calledEventually(.once)\n            .getUser(for: .any).calledEventually(.atLeastOnce)\n            .getUser(for: .any).calledEventually(.less(than: 2))\n            .getUser(for: .any).calledEventually(.more(than: 0))\n            .getUser(for: .any).calledEventually(.moreOrEqual(to: 1))\n            .getUser(for: .any).calledEventually(.lessOrEqual(to: 1))\n            .getUser(for: .any).calledEventually(.from(0, to: 2))\n            .getUser(for: .any).calledEventually(.exactly(1))\n    }\n\n    func test_givenMockPropertyAccessed_whenCountVerified_assertsGetterAndSetter() throws {\n        let testName = \"Name\"\n\n        given(mock).name.willReturn(testName)\n\n        _ = mock.name\n        _ = mock.name\n        mock.name = testName\n\n        verify(mock)\n            .name().getCalled(2)\n            .name().setCalled(.once)\n    }\n\n    @MainActor\n    func test_givenMockPropertyAccessedAsynchronously_whenCountVerified_assertsGetterAndSetter() async {\n        let testName = \"Name\"\n\n        given(mock).name.willReturn(testName)\n\n        Task {\n            try await Task.sleep(seconds: 0.5)\n            _ = mock.name\n            _ = mock.name\n            mock.name = testName\n        }\n\n        verify(mock)\n            .name().getCalled(.never)\n            .name().setCalled(.never)\n\n        await verify(mock)\n            .name().getCalledEventually(.exactly(2))\n            .name().setCalledEventually(.once)\n    }\n\n    func test_givenGenericParamAndReturnFunc_whenVerifyUsed_OnlyParamIsInferred() {\n        given(mock)\n            .retrieveItem(item: Parameter<Int>.any)\n            .willReturn(0)\n\n        let _: Int = mock.retrieveItem(item: 0)\n\n        verify(mock)\n            .retrieveItem(item: Parameter<Int>.any)\n            .called(.atLeastOnce)\n    }\n\n    @MainActor\n    func test_givenAsyncVerification_whenSatisfied_verifiesEarlyBeforeTimeout() async throws {\n        given(mock).getUser(for: .any).willReturn(.test1)\n\n        Task {\n            try await Task.sleep(seconds: 1)\n            _ = try self.mock.getUser(for: UUID())\n        }\n\n        let verify = verify(mock)\n\n        try await withTimeout(after: 3) {\n            await verify.getUser(for: .any)\n                .calledEventually(.atLeastOnce, before: .seconds(5))\n        }\n    }\n}\n"
  }
]