# This workflow will build a Swift project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-swift

name: Compound

on:
  workflow_dispatch:

  push:
    branches: [ develop ]
    paths:
      - 'compound-ios/**'
  
  pull_request:
    types: [opened, synchronize, reopened]
    paths:
      - 'compound-ios/**'

permissions: {}

jobs:
  tests:

    runs-on: macos-26
    timeout-minutes: 15

    concurrency:
      # When running on develop, use the sha to allow all runs of this workflow to run concurrently.
      # Otherwise only allow a single run of this workflow on each branch, automatically cancelling older runs.
      group: ${{ github.ref == 'refs/heads/develop' && format('compound-develop-{0}', github.sha) || format('compound-{0}', github.ref) }}
      cancel-in-progress: true

    steps:
    - uses: nschloe/action-cached-lfs-checkout@1c185ad576953eab13e35ffe1bffef437d97e9d2 # v1.2.4
      with:
        persist-credentials: false

    - name: Configure Xcode 26
      run: sudo xcode-select -s /Applications/Xcode_26.1.1.app
        
    - name: Install sourcery
      run: brew install sourcery
        
    - name: Generate preview tests
      working-directory: compound-ios
      run: sourcery --config Tools/Sourcery/PreviewTestsConfig.yml

    - name: Create simulator
      run: xcrun simctl create "Snapshots" "iPhone SE (3rd generation)" "com.apple.CoreSimulator.SimRuntime.iOS-26-1"

    - name: Run tests
      working-directory: compound-ios
      run: set -o pipefail && xcodebuild test -scheme 'Compound' -sdk iphonesimulator -destination 'platform=iOS Simulator,name=Snapshots,OS=26.1' -skipPackagePluginValidation -resultBundlePath Logs/CompoundTests.xcresult | xcbeautify --renderer github-actions

    - name: Zip artifacts
      if: failure() # We only care about artefacts if the tests fail
      working-directory: compound-ios
      run: zip -r Logs/CompoundTests.xcresult.zip Logs/CompoundTests.xcresult/

    - name: Archive artifacts
      uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
      if: failure() # We only care about artefacts if the tests fail
      with:
        name: test-results
        path: compound-ios/Logs/CompoundTests.xcresult.zip
        retention-days: 1
        if-no-files-found: ignore

    - name: Upload coverage to Codecov
      uses: codecov/codecov-action@75cd11691c0faa626561e295848008c8a7dddffe # v5.5.4
      with:
        fail_ci_if_error: false
        token: ${{ secrets.CODECOV_TOKEN }}
        xcode: true
        xcode_archive_path: compound-ios/Logs/CompoundTests.xcresult
        flags: compound
 
