---
name: ubuntu

permissions:
  contents: read

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - '*'
  workflow_dispatch: {}

jobs:
  integration_test:
    name: >
      OTP ${{matrix.combo.otp-version}},
      Elixir ${{matrix.combo.elixir-version}},
      Gleam ${{matrix.combo.gleam-version}},
      rebar3 ${{matrix.combo.rebar3-version}}
    runs-on: ${{matrix.combo.os}}
    strategy:
      fail-fast: false
      matrix:
        combo:
          - otp-version: '<26'
            elixir-version: '<1.17'
            os: 'ubuntu-22.04'
          - otp-version: 'master'
            elixir-version: '> 0'
            os: 'ubuntu-24.04'
          - otp-version: 'master'
            elixir-version: 'main'
            os: 'ubuntu-24.04'
          - otp-version: '27'
            elixir-version: 'v1.17.0'
            rebar3-version: '3.23'
            os: 'ubuntu-latest'
          - otp-version: '26.0'
            elixir-version: 'v1.14-otp-25'
            os: 'ubuntu-latest'
            version-type: 'strict'
          - otp-version: '26.0'
            elixir-version: '1.14.5'
            os: 'ubuntu-latest'
            version-type: 'strict'
          - otp-version: '25.2'
            elixir-version: '1.14.2'
            os: 'ubuntu-latest'
          - otp-version: '25.2'
            elixir-version: '1.14.3'
            os: 'ubuntu-latest'
            version-type: 'strict'
          - otp-version: '25'
            os: 'ubuntu-24.04'
          - otp-version: '26'
            elixir-version: '1.16'
            rebar3-version: '3.25'
            os: 'ubuntu-22.04'
          - otp-version: '25.0'
            elixir-version: 'v1.13.4-otp-25'
            rebar3-version: '3.18.0'
            os: 'ubuntu-latest'
            version-type: 'strict'
          - otp-version: '25.0'
            elixir-version: 'v1.13.4'
            rebar3-version: '3.18.0'
            os: 'ubuntu-latest'
            version-type: 'strict'
          - otp-version: 'latest'
            rebar3-version: 'latest'
            os: 'ubuntu-latest'
          - gleam-version: '1.9.0'
            otp-version: '27'
            os: 'ubuntu-latest'
            disable_problem_matchers: true
          - gleam-version: '1.9.0'
            otp-version: false
            os: 'ubuntu-latest'
            disable_problem_matchers: true
          - elixir-version: 'v1.13'
            otp-version: '24'
            escript_packages: 'hex protobuf'
            escript_script: 'protoc-gen-elixir --version'
            os: 'ubuntu-latest'
    steps:
      - uses: actions/checkout@v6.0.2
      - name: Use erlef/setup-beam
        id: setup-beam
        uses: ./
        with:
          otp-version: ${{matrix.combo.otp-version}}
          elixir-version: ${{matrix.combo.elixir-version}}
          gleam-version: ${{matrix.combo.gleam-version}}
          rebar3-version: ${{matrix.combo.rebar3-version}}
          version-type: ${{matrix.combo.version-type}}
      - name: Erlang/OTP version (action)
        run: echo "Erlang/OTP ${{steps.setup-beam.outputs.otp-version}}"
        if: ${{matrix.combo.otp-version}}
      - name: Elixir version (action)
        run: echo "Elixir ${{steps.setup-beam.outputs.elixir-version}}"
        if: ${{matrix.combo.elixir-version}}
      - name: Gleam version (action)
        run: echo "Gleam ${{steps.setup-beam.outputs.gleam-version}}"
        if: ${{matrix.combo.gleam-version}}
      - name: rebar3 version (action)
        run: echo "rebar3 ${{steps.setup-beam.outputs.rebar3-version}}"
        if: ${{matrix.combo.rebar3-version}}
      - name: mix version and help (CLI)
        run: |
          mix -v
          mix help local.rebar
          mix help local.hex
        if: ${{matrix.combo.elixir-version}}
      - name: Run Elixir/Mix project tests
        run: |
          cd test/projects/elixir_mix
          mix deps.get
          mix test
        if: ${{matrix.combo.elixir-version}}
      - name: Run Erlang/rebar3 project tests
        run: |
          cd test/projects/erlang_rebar3
          rebar3 ct
        if: ${{matrix.combo.rebar3-version}}
      - name: Format Gleam project (without installing Erlang/OTP)
        run: |
          cd test/projects/gleamgleam
          gleam format
        if: ${{ matrix.combo.gleam-version && !matrix.combo.otp-version }}
      - name: Run Gleam project tests (without `rebar3`)
        run: |
          cd test/projects/gleamgleam
          gleam test
        if: ${{ matrix.combo.gleam-version && matrix.combo.otp-version && !matrix.combo.rebar3-version }}
      - name: Run escript
        run: |
          mix escript.install --force ${{matrix.combo.escript_packages}}
          ${{matrix.combo.escript_script}}
        if: ${{matrix.combo.escript_packages && matrix.combo.escript_script}}

  environment_variables:
    name: Environment variables
    runs-on: ${{matrix.combo.os}}
    strategy:
      fail-fast: false
      matrix:
        combo:
          - otp-version: 27
            elixir-version: 1.19
            gleam-version: 1.10
            rebar3-version: 3.24
            os: ubuntu-latest
    steps:
      - uses: actions/checkout@v6.0.2
      - name: Use erlef/setup-beam
        id: setup-beam
        uses: ./
        with:
          otp-version: ${{matrix.combo.otp-version}}
          elixir-version: ${{matrix.combo.elixir-version}}
          gleam-version: ${{matrix.combo.gleam-version}}
          rebar3-version: ${{matrix.combo.rebar3-version}}
      - run: env
      - name: Check environment variables
        run: |
          "${INSTALL_DIR_FOR_ELIXIR}"/bin/elixir -v
          "${INSTALL_DIR_FOR_GLEAM}"/bin/gleam --version
          "${INSTALL_DIR_FOR_OTP}"/bin/erl -version
          "${INSTALL_DIR_FOR_REBAR3}"/bin/rebar3 version
