name: Main Checks

on:
  pull_request:
    paths:
      - ".github/workflows/main-checks.yml"
      - "ci/**"
      - "packages/**/*"
      - "Cargo.toml"
      - "Cargo.lock"
  push:
    branches: [master]

jobs:
  spell_check:
    name: spellcheck
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Check spelling
        run: |
          sudo apt-get install aspell
          ci/spellcheck.sh list

  doc_tests:
    name: Documentation Tests
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: Swatinem/rust-cache@v2
        with:
          shared-key: yew-packages

      # for wasm-bindgen-cli, always use stable rust
      - name: Setup toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: stable

      - name: Install wasm-bindgen-cli
        shell: bash
        run: ./ci/install-wasm-bindgen-cli.sh

      - name: Setup toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: nightly
          targets: wasm32-unknown-unknown

      - uses: browser-actions/setup-geckodriver@latest
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
      - uses: nanasess/setup-chromedriver@v2

      - name: Run doctest
        run: |
          ls packages | xargs -I {} \
            cargo test \
              -p {} \
              --doc \
              --all-features \
              --target wasm32-unknown-unknown

  integration_tests:
    name: Integration Tests on ${{ matrix.toolchain }}
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        toolchain:
          - 1.76.0
          - stable

    steps:
      - uses: actions/checkout@v4

      - uses: Swatinem/rust-cache@v2
        with:
          shared-key: yew-packages

      # for wasm-bindgen-cli, always use stable rust
      - name: Setup toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: stable

      - name: Install wasm-bindgen-cli
        shell: bash
        run: ./ci/install-wasm-bindgen-cli.sh

      - name: Setup toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.toolchain }}
          targets: wasm32-unknown-unknown

      - uses: browser-actions/setup-geckodriver@latest
        with:
          token: ${{ secrets.GITHUB_TOKEN }}

      - uses: nanasess/setup-chromedriver@v2

      - name: Run tests - yew
        run: |
          cd packages/yew
          CHROMEDRIVER=$(which chromedriver) cargo test --features csr,hydration,ssr --target wasm32-unknown-unknown
          GECKODRIVER=$(which geckodriver) cargo test --features csr,hydration,ssr --target wasm32-unknown-unknown

      - name: Run tests - yew-router
        run: |
          cd packages/yew-router
          CHROMEDRIVER=$(which chromedriver) cargo test --target wasm32-unknown-unknown
          GECKODRIVER=$(which geckodriver) cargo test --target wasm32-unknown-unknown

  unit_tests:
    name: Unit Tests on ${{ matrix.toolchain }}
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        toolchain:
          - 1.76.0
          - stable
          - nightly

    steps:
      - uses: actions/checkout@v4

      - name: Setup toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.toolchain }}

      - uses: Swatinem/rust-cache@v2
        with:
          shared-key: yew-packages

      - name: Run native tests
        env:
          # workaround for lack of ternary operator
          # see https://github.com/orgs/community/discussions/25725
          RUSTFLAGS: ${{ matrix.toolchain == 'nightly' && '--cfg nightly_yew' || '' }}
        run: ls packages | grep -v "^yew$" | xargs -I {} cargo test --all-targets -p {}

      - name: Run native tests for yew
        env:
          # workaround for lack of ternary operator
          # see https://github.com/orgs/community/discussions/25725
          RUSTFLAGS: ${{ matrix.toolchain == 'nightly' && '--cfg nightly_yew' || '' }}
        run: cargo test -p yew --all-features

  test-lints:
    name: Test lints on nightly
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Setup toolchain
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: nightly

      - uses: Swatinem/rust-cache@v2
        with:
          shared-key: yew-packages

      - name: Run tests
        env:
          RUSTFLAGS: --cfg nightly_yew --cfg yew_lints
        run: cargo test -p yew-macro test_html_lints

  unit_tests_wasi:
    name: Unit Tests (WASI) on ${{ matrix.toolchain }}
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        toolchain:
          - stable
          - nightly

    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.toolchain }}
          target: wasm32-wasip1

      - name: Install wasmtime
        run: |
          wget https://github.com/bytecodealliance/wasmtime/releases/download/v24.0.0/wasmtime-v24.0.0-x86_64-linux.tar.xz
          tar xf wasmtime-v24.0.0-x86_64-linux.tar.xz
          mv wasmtime-v24.0.0-x86_64-linux/wasmtime ~/wasmtime
          rm -rf wasmtime-v24.0.0-x86_64-linux.tar.xz wasmtime-v24.0.0-x86_64-linux
          chmod +x ~/wasmtime
          mv ~/wasmtime /usr/local/bin
          source ~/.bashrc

      - uses: Swatinem/rust-cache@v2

      - name: Run WASI tests for yew
        run: |
          RUST_LOG=info
          cargo test --features ssr,hydration --target wasm32-wasip1 -p yew

  example-runnable-tests-on-wasi:
    name: Example Runnable Tests on WASI
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        package:
          - wasi_ssr_module
        toolchain:
          - stable
          - nightly
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.toolchain }}
          target: wasm32-wasip1

      - name: Install wasmtime
        run: |
          wget https://github.com/bytecodealliance/wasmtime/releases/download/v24.0.0/wasmtime-v24.0.0-x86_64-linux.tar.xz
          tar xf wasmtime-v24.0.0-x86_64-linux.tar.xz
          mv wasmtime-v24.0.0-x86_64-linux/wasmtime ~/wasmtime
          rm -rf wasmtime-v24.0.0-x86_64-linux.tar.xz wasmtime-v24.0.0-x86_64-linux
          chmod +x ~/wasmtime
          mv ~/wasmtime /usr/local/bin
          source ~/.bashrc

      - uses: Swatinem/rust-cache@v2

      - name: Build and run ${{ matrix.package }}
        run: |
          cargo build --target wasm32-wasip1 -p ${{ matrix.package }}
          wasmtime -W unknown-imports-trap=y target/wasm32-wasip1/debug/${{ matrix.package }}.wasm
