name: ci

on:
  pull_request:
    paths:
      - '**'
      - '!.gitignore'
      - '!LICENSE'
      - '!TODO'
      - '!doc/**'
      - '!examples/**'
      - '.github/workflows/ci.yml'
  push:
    branches:
      - master

jobs:
  linux:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        buildType: [Debug, Release]
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: true
      - name: build
        run: |
          make BUILD_TYPE=${{matrix.buildType}}
      - name: stats
        run: |
          make stats
      - name: test
        run: |
          make test
      - name: test 262
        if: ${{ matrix.buildType == 'Release' }}
        run: |
          time make test262
  linux-32bits:
    runs-on: ubuntu-latest
    defaults:
      run:
        shell: alpine.sh {0}
    steps:
      - uses: actions/checkout@v3
      - uses: jirutka/setup-alpine@v1
        with:
          arch: x86
          packages: "build-base make cmake"
      - name: build
        run: |
          make
      - name: stats
        run: |
          make stats
      - name: test
        run: |
          make test
  linux-examples:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: build
        run: |
          make BUILD_EXAMPLES=ON
      - name: test
        run: |
          ldd build/hello
          ldd build/hello_module
          ldd build/test_fib
          ./build/hello
          ./build/hello_module
          ./build/test_fib
          cp build/fib.so examples/
          cp build/point.so examples/
          cp build/bjson.so tests/
          ./build/qjs examples/test_fib.js
          ./build/qjs examples/test_point.js
          ./build/qjs tests/test_bjson.js
  linux-shared:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: build
        run: |
          make BUILD_SHARED_LIBS=ON
          ldd build/qjs
      - name: stats
        run: |
          make stats
  linux-asan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: true
      - name: build
        run: |
          make CONFIG_ASAN=ON
      - name: test
        env:
          ASAN_OPTIONS: halt_on_error=1
        run: |
          make test
      - name: test 262
        env:
          ASAN_OPTIONS: halt_on_error=1
        run: |
          time make test262
  linux-msan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: true
      - name: build
        env:
          CC: clang
        run: |
          make CONFIG_MSAN=ON
      - name: test
        env:
          MSAN_OPTIONS: halt_on_error=1
        run: |
          make test
  linux-ubsan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: true
      - name: build
        run: |
          make CONFIG_UBSAN=ON
      - name: test
        env:
          UBSAN_OPTIONS: halt_on_error=1
        run: |
          make test
      - name: test 262
        env:
          UBSAN_OPTIONS: halt_on_error=1
        run: |
          time make test262

  macos:
    runs-on: macos-latest
    strategy:
      fail-fast: false
      matrix:
        buildType: [Debug, Release]
    steps:
      - uses: actions/checkout@v3
      - name: build
        run: |
          make BUILD_TYPE=${{matrix.buildType}}
      - name: stats
        run: |
          make stats
      - name: test
        run: |
          make test
  macos-examples:
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v3
      - name: build
        run: |
          make BUILD_EXAMPLES=ON
      - name: test
        run: |
          otool -L build/hello
          otool -L build/hello_module
          otool -L build/test_fib
          ./build/hello
          ./build/hello_module
          ./build/test_fib
          cp build/fib.so examples/
          cp build/point.so examples/
          cp build/bjson.so tests/
          ./build/qjs examples/test_fib.js
          ./build/qjs examples/test_point.js
          ./build/qjs tests/test_bjson.js
  macos-shared:
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v3
      - name: build
        run: |
          make BUILD_SHARED_LIBS=ON
          otool -L build/qjs
      - name: stats
        run: |
          make stats
  macos-asan:
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v3
      - name: build
        run: |
          make CONFIG_ASAN=ON
      - name: test
        env:
          ASAN_OPTIONS: halt_on_error=1
        run: |
          make test
  macos-ubsan:
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v3
      - name: build
        run: |
          make CONFIG_UBSAN=ON
      - name: test
        env:
          UBSAN_OPTIONS: halt_on_error=1
        run: |
          make test

  windows-mingw:
    runs-on: windows-latest
    strategy:
      fail-fast: false
      matrix:
        buildType: [Debug, Release]
        sys:
          - mingw32
          - mingw64
          - ucrt64
    defaults:
      run:
        shell: msys2 {0}
    steps:
    - uses: actions/checkout@v3
    - name: Setup MSYS2
      uses: msys2/setup-msys2@v2
      with:
        msystem: ${{matrix.sys}}
        install: >-
          git
          make
        pacboy: >-
          cmake:p
          ninja:p
          toolchain:p
    - name: build
      run: |
        make BUILD_TYPE=${{matrix.buildType}}
    - name: stats
      run: |
        make stats
        ldd build/qjs
    - name: test
      run: |
        make test
  windows-mingw-shared:
    runs-on: windows-latest
    defaults:
      run:
        shell: msys2 {0}
    steps:
      - uses: actions/checkout@v3
      - name: Setup MSYS2
        uses: msys2/setup-msys2@v2
        with:
          install: >-
            git
            make
          pacboy: >-
            cmake:p
            ninja:p
            toolchain:p
      - name: build
        run: |
          make BUILD_SHARED_LIBS=ON
          ldd build/qjs
      - name: stats
        run: |
          make stats