name: Run Tests
on: [push, pull_request]
jobs:
  build:
    strategy:
      fail-fast: false
      matrix:
        version: [7.0.0-jdk16, 7.2-jdk17]
    runs-on: ubuntu-20.04
    container:
      image: gradle:${{ matrix.version }}
      options: --user root
    steps:
      - uses: actions/checkout@v2
      - uses: gradle/wrapper-validation-action@v1
      - run: gradle build check -x test --stacktrace

  # This job is used to feed the test matrix of next job to allow the tests to run in parallel
  prepare_test_matrix:
    # Lets wait to ensure it builds before going running tests
    needs: build

    runs-on: ubuntu-20.04
    container:
      image: gradle:7.0.1-jdk16
      options: --user root

    steps:
      - uses: actions/checkout@v2
      - run: gradle writeActionsTestMatrix --stacktrace
      -
        id: set-matrix
        run: echo "::set-output name=matrix::$(cat build/test_matrix.json)"

    outputs:
      matrix: ${{ steps.set-matrix.outputs.matrix }}

  run_tests:
    needs: prepare_test_matrix

    strategy:
      fail-fast: false
      matrix:
        version: [7.0.0-jdk16, 7.2-jdk17]
        test: ${{ fromJson(needs.prepare_test_matrix.outputs.matrix) }}

    runs-on: ubuntu-20.04
    container:
      image: gradle:${{ matrix.version }}
      options: --user root

    steps:
      - uses: actions/checkout@v2
      - run: gradle test --tests ${{ matrix.test }} --stacktrace
        env:
          TEST_WARNING_MODE: fail

      - uses: actions/upload-artifact@v2
        if: ${{ failure() }}
        with:
          name: ${{ matrix.test }} (${{ matrix.java }}) Results
          path: build/reports/

  run_tests_windows:
    needs: prepare_test_matrix

    strategy:
      fail-fast: false
      matrix:
        java: [16]
        test: ${{ fromJson(needs.prepare_test_matrix.outputs.matrix) }}

    runs-on: windows-2019

    steps:
      - uses: actions/checkout@v2
      - name: setup jdk ${{ matrix.java }}
        uses: actions/setup-java@v1
        with:
          java-version: ${{ matrix.java }}
      - run: ./gradlew test --tests ${{ matrix.test }} --stacktrace
        env:
          TEST_WARNING_MODE: fail

      - uses: actions/upload-artifact@v2
        if: ${{ failure() }}
        with:
          name: ${{ matrix.test }} (${{ matrix.java }}) Results
          path: build/reports/

  # Special case this test to run across all os's
  reproducible_build_test:
    needs: build

    strategy:
      fail-fast: false
      matrix:
        java: [ 16 ]
        os: [ windows-2019, ubuntu-20.04, macos-10.15 ]

    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-java@v1
        with:
          java-version: ${{ matrix.java }}

      - run: ./gradlew test --tests *ReproducibleBuildTest --stacktrace

      - uses: actions/upload-artifact@v2
        if: ${{ failure() }}
        with:
          name: Reproducible Build ${{ matrix.os }} (${{ matrix.java }}) Results
          path: build/reports/

  bootstrap_tests:
    needs: build

    strategy:
      fail-fast: false
      matrix:
        java: [ 8, 11, 15, 16 ]
        gradle: [ 4.9, 5.2, 6.0.1, 6.9, 7.0.2 ]
        exclude:
          - java: 16
            gradle: 6.9
          - java: 16
            gradle: 6.0.1
          - java: 16
            gradle: 5.2
          - java: 16
            gradle: 4.9
          - java: 15
            gradle: 6.0.1
          - java: 15
            gradle: 5.2
          - java: 15
            gradle: 4.9
    runs-on: ubuntu-20.04
    container:
      image: gradle:7.0.2-jdk16
      options: --user root

    steps:
      # Build loom and publish to maven local
      - uses: actions/checkout@v2
      - run: gradle build publishToMavenLocal -x test -x check

      - run: gradle wrapper --gradle-version=${{ matrix.gradle }}
        working-directory: bootstrap/test-project
      - run: gradle --stop

      - uses: actions/setup-java@v2
        with:
          java-version: ${{ matrix.java }}
          distribution: 'adopt'

      - run: ./gradlew --version
        working-directory: bootstrap/test-project
      - run: ./gradlew build || true
        working-directory: bootstrap/test-project

      # TODO check the output of the previous step here