name: Test
on:
  push:
    branches:
    - main
  pull_request:
jobs:
  check:
    name: "Check"
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: "Check that distribution files are unmodified"
      if: github.event_name == 'pull_request'
      run: |
        if git --no-pager diff --name-only $(git rev-parse origin/${{ github.base_ref }})...${{ github.sha }} | grep -q "^dist/"; then
          printf "\nThe pull request modifies distribution files, but it shouldn't.\n" &&
          printf "Please see https://github.com/AssemblyScript/assemblyscript/blob/main/CONTRIBUTING.md\n" &&
          exit 1;
        else
          printf "\nOK: Distributions files have not been modified.\n";
        fi
  compiler:
    name: "Compiler (${{ matrix.os }}, node ${{ matrix.node_version }})"
    runs-on: ${{ matrix.os }}-latest
    needs: check
    strategy:
      matrix:
        os: ["ubuntu", "macos", "windows"]
        node_version: ["current", "lts/*"]
    steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
        node-version: ${{ matrix.node_version }}
    - name: Install dependencies
      run: npm ci --no-audit
    - name: Build
      run: npm run build
    - name: Check
      run: npm run check
    - name: Test
      run: npm test
  bootstrap:
    name: "Bootstrap (${{ matrix.target }})"
    runs-on: ubuntu-latest
    needs: check
    strategy:
      matrix:
        target: ["debug", "release"]
    steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
        node-version: current
    - name: Install dependencies
      run: npm ci --no-audit
    - name: Build
      run: npm run build
    - name: "Bootstrap ${{ matrix.target }}"
      run: npm run bootstrap:${{ matrix.target }}
    - name: "Test ${{ matrix.target }}"
      run: npm run test:compiler -- --wasm build/assemblyscript.${{ matrix.target }}-bootstrap.js
    - name: "Compile ${{ matrix.target }} -> ${{ matrix.target == 'debug' && 'release' || 'debug' }}"
      run: node bin/asc --config src/asconfig.json --target ${{ matrix.target == 'debug' && 'release' || 'debug' }}-bootstrap --wasm ./build/assemblyscript.${{ matrix.target }}-bootstrap.js
    - name: "Test ${{ matrix.target == 'debug' && 'release' || 'debug' }}"
      run: npm run test:compiler -- --wasm build/assemblyscript.${{ matrix.target == 'debug' && 'release' || 'debug' }}-bootstrap.js
  features:
    name: "Features"
    runs-on: ubuntu-latest
    needs: check
    steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
        node-version: 21-v8-canary
    - name: Install dependencies
      run: npm ci --no-audit
    - name: Build
      run: npm run build
    - name: Test experimental features
      env:
        ASC_FEATURES: threads,reference-types,gc,exception-handling
      run: |
        npm run test:compiler features/threads features/reference-types features/gc features/exception-handling bindings/esm bindings/raw
  runtimes:
    name: "Runtimes"
    runs-on: ubuntu-latest
    needs: check
    steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
        node-version: current
    - name: Install dependencies
      run: npm ci --no-audit
    - name: Build
      run: npm run build
    - name: Test default allocator
      run: |
        cd tests/allocators/default
        npm run build
        cd ..
        npm test default
    - name: Test stub allocator
      run: |
        cd tests/allocators/stub
        npm run build
        cd ..
        npm test stub
  loader:
    name: "Loader"
    runs-on: ubuntu-latest
    needs: check
    steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
        node-version: current
    - name: Install dependencies
      run: npm ci --no-audit
    - name: Build
      run: npm run build
    - name: Test the loader
      run: |
        cd lib/loader
        npm run asbuild
        npm run test
  coverage:
    name: "Coverage"
    runs-on: ubuntu-latest
    needs: check
    steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
        node-version: current
    - name: Install dependencies
      run: npm ci --no-audit
    - name: Build
      run: npm run build
    - name: Collect coverage
      run: npx c8 -r none -- npm test
    - name: Output coverage summary
      run: npx c8 report -r text-summary
