name: run-tests
run-name: Run tests / ${{ github.event.head_commit.message }}

on:
  pull_request:
  push:

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.ref || github.run_id }}
  cancel-in-progress: true

jobs:

  test-windows-core:
    runs-on: windows-latest
    steps:
      - name: Disable Windows Defender
        run: Set-MpPreference -DisableRealtimeMonitoring $true
        shell: powershell
      - uses: actions/checkout@v4
      # Build and Test
      - name: Run task 'build'
        shell: cmd
        run: ./build.cmd build
      - name: Run task 'in-tests-core'
        shell: cmd
        run: ./build.cmd in-tests-core -e
      # Upload Artifacts with Unique Name
      - name: Upload test results
        uses: actions/upload-artifact@v3
        if: always()
        with:
          name: test-windows-core-trx-${{ github.run_id }}
          path: "**/*.trx"

  test-windows-full:
    runs-on: windows-latest
    steps:
      - name: Disable Windows Defender
        run: Set-MpPreference -DisableRealtimeMonitoring $true
        shell: powershell
      - uses: actions/checkout@v4
      # Build and Test
      - name: Run task 'build'
        shell: cmd
        run: ./build.cmd build
      - name: Run task 'in-tests-full'
        shell: cmd
        run: ./build.cmd in-tests-full -e
      # Upload Artifacts with Unique Name
      - name: Upload test results
        uses: actions/upload-artifact@v4
        if: always()
        with:
          name: test-windows-full-trx-${{ github.run_id }}
          path: "**/*.trx"

  test-linux:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      # Set up the environment
      - name: Set up Clang
        uses: egor-tensin/setup-clang@v1
        with:
          version: latest
          platform: x64
      - name: Set up zlib-static
        run: sudo apt-get install -y libkrb5-dev
      - name: Set up node
        uses: actions/setup-node@v4
        with:
          node-version: "20"
      - name: Set up v8
        run: npm install jsvu -g && jsvu --os=linux64 --engines=v8 && echo "$HOME/.jsvu/bin" >> $GITHUB_PATH
      - name: Install wasm-tools workload
        run: ./build.cmd install-wasm-tools
      # Build and Test
      - name: Run task 'build'
        run: ./build.cmd build
      - name: Run task 'unit-tests'
        run: ./build.cmd unit-tests -e
      - name: Run task 'in-tests-core'
        run: ./build.cmd in-tests-core -e
      # Upload Artifacts with Unique Name
      - name: Upload test results
        uses: actions/upload-artifact@v4
        if: always()
        with:
          name: test-linux-trx-${{ github.run_id }}
          path: "**/*.trx"

  test-macos:
    runs-on: macos-13
    steps:
      - uses: actions/checkout@v4
      - name: Set up node
        uses: actions/setup-node@v4
        with:
          node-version: "20"
      - name: Set up v8
        run: npm install jsvu -g && jsvu --os=mac64 --engines=v8 && echo "$HOME/.jsvu/bin" >> $GITHUB_PATH
      - name: Install wasm-tools workload
        run: ./build.cmd install-wasm-tools
      # Build and Test
      - name: Run task 'build'
        run: ./build.cmd build
      - name: Run task 'unit-tests'
        run: ./build.cmd unit-tests -e
      - name: Run task 'in-tests-core'
        run: ./build.cmd in-tests-core -e
      # Upload Artifacts with Unique Name
      - name: Upload test results
        uses: actions/upload-artifact@v4
        if: always()
        with:
          name: test-macos-trx-${{ github.run_id }}
          path: "**/*.trx"

  test-pack:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up Clang
        uses: egor-tensin/setup-clang@v1
        with:
          version: latest
          platform: x64
      - name: Set up zlib-static
        run: sudo apt-get install -y libkrb5-dev
      - name: Run task 'pack'
        run: ./build.cmd pack

  spellcheck-docs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        name: Setup node
        with:
          node-version: "18"
      - name: Install cSpell
        run: npm install -g cspell@8.0.0
      - name: Copy cSpell config
        run: cp ./build/cSpell.json ./cSpell.json
      - name: Run cSpell
        run: cspell --config ./cSpell.json "docs/**/*.md" --no-progress
