name: Run QL for QL Tests

on:
  push:
    branches: [main]
    paths:
      - "ql/**"
      - codeql-workspace.yml
      - .github/workflows/ql-for-ql-tests.yml
  pull_request:
    branches: [main]
    paths:
      - "ql/**"
      - codeql-workspace.yml
      - .github/workflows/ql-for-ql-tests.yml

env:
  CARGO_TERM_COLOR: always

permissions:
  contents: read

jobs:
  qltest:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
      - name: Find codeql
        id: find-codeql
        uses: github/codeql-action/init@main
        with:
          languages: javascript # does not matter
          tools: nightly
      - uses: ./.github/actions/os-version
        id: os_version
      - uses: actions/cache@v3
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            ql/target
          key: ${{ runner.os }}-${{ steps.os_version.outputs.version }}-qltest-cargo-${{ hashFiles('ql/rust-toolchain.toml', 'ql/**/Cargo.lock') }}
      - name: Check formatting
        run: cd ql; cargo fmt -- --check
      - name: Build extractor
        run: |
          cd ql;
          codeqlpath=$(dirname ${{ steps.find-codeql.outputs.codeql-path }});
          env "PATH=$PATH:$codeqlpath" ./scripts/create-extractor-pack.sh
      - name: Cache compilation cache
        id: query-cache
        uses: ./.github/actions/cache-query-compilation
        with:
          key: ql-for-ql-tests
      - name: Run QL tests
        run: |
          "${CODEQL}" test run --check-databases --check-unused-labels --check-repeated-labels --check-redefined-labels --check-use-before-definition --search-path "${{ github.workspace }}" --consistency-queries ql/ql/consistency-queries --compilation-cache "${{ steps.query-cache.outputs.cache-dir }}" ql/ql/test
        env:
          CODEQL: ${{ steps.find-codeql.outputs.codeql-path }}

  other-os:
    strategy:
      matrix:
        os: [macos-latest, windows-latest]
    needs: [qltest]
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v5
      - name: Install GNU tar
        if: runner.os == 'macOS'
        run: |
          brew install gnu-tar
          echo "/usr/local/opt/gnu-tar/libexec/gnubin" >> $GITHUB_PATH
      - name: Find codeql
        id: find-codeql
        uses: github/codeql-action/init@main
        with:
          languages: javascript # does not matter
          tools: nightly
      - uses: ./.github/actions/os-version
        id: os_version
      - uses: actions/cache@v3
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            ql/target
          key: ${{ runner.os }}-${{ steps.os_version.outputs.version }}-qltest-cargo-${{ hashFiles('ql/rust-toolchain.toml', 'ql/**/Cargo.lock') }}
      - name: Build extractor
        if: runner.os != 'Windows'
        run: |
          cd ql;
          codeqlpath=$(dirname ${{ steps.find-codeql.outputs.codeql-path }});
          env "PATH=$PATH:$codeqlpath" ./scripts/create-extractor-pack.sh
      - name: Build extractor (Windows)
        if: runner.os == 'Windows'
        shell: pwsh
        run: |
          cd ql;
          $Env:PATH += ";$(dirname ${{ steps.find-codeql.outputs.codeql-path }})"
          pwsh ./scripts/create-extractor-pack.ps1
      - name: Run a single QL tests - Unix
        if: runner.os != 'Windows'
        run: |
          "${CODEQL}" test run --check-databases --search-path "${{ github.workspace }}" ql/ql/test/queries/style/DeadCode/DeadCode.qlref
        env:
          CODEQL: ${{ steps.find-codeql.outputs.codeql-path }}
      - name: Run a single QL tests - Windows
        if: runner.os == 'Windows'
        shell: pwsh
        run: |
          $Env:PATH += ";$(dirname ${{ steps.find-codeql.outputs.codeql-path }})"
          codeql test run --check-databases --search-path "${{ github.workspace }}" ql/ql/test/queries/style/DeadCode/DeadCode.qlref
