#!/bin/bash
#
# This script is used by Travis CI to configure, build and test wxWidgets

set -e

. ./build/tools/httpbin.sh

wxPROC_COUNT=`getconf _NPROCESSORS_ONLN`
((wxPROC_COUNT++))
wxBUILD_ARGS="-j$wxPROC_COUNT"

# Setting this variable suppresses "Error retrieving accessibility bus address"
# messages from WebKit tests that we're not interested in.
export NO_AT_BRIDGE=1

case $wxTOOLSET in
    cmake)
        if [ -z $wxCMAKE_TESTS ]; then wxCMAKE_TESTS=CONSOLE_ONLY; fi
        if [ -z $wxCMAKE_SAMPLES ]; then wxCMAKE_SAMPLES=SOME; fi
        if [ "$wxCMAKE_GENERATOR" == "Xcode" ]; then
            wxBUILD_ARGS="-jobs $wxPROC_COUNT -quiet"
        fi
        cmake --version

        echo 'travis_fold:start:configure'
        echo 'Configuring...'
        mkdir build_cmake
        pushd build_cmake
        cmake -G "$wxCMAKE_GENERATOR" $wxCMAKE_DEFINES -D wxBUILD_SAMPLES=$wxCMAKE_SAMPLES -D wxBUILD_TESTS=$wxCMAKE_TESTS ..
        echo 'travis_fold:end:configure'

        if [ "$wxCMAKE_GENERATOR" != "Xcode" ]; then
            echo 'travis_fold:start:building'
            echo 'Building...'
            cmake --build . -- $wxBUILD_ARGS
            echo 'travis_fold:end:building'
        fi

        echo 'travis_fold:start:install'
        if [ "$wxCMAKE_GENERATOR" == "Xcode" ]; then echo -n 'Building and '; fi
        echo 'Installing...'
        sudo env "PATH=$PATH" cmake --build . --target install -- $wxBUILD_ARGS
        echo 'travis_fold:end:install'

        if [ "$wxCMAKE_TESTS" != "OFF" ]; then
            echo 'travis_fold:start:httpbin'
            httpbin_launch
            echo 'travis_fold:end:httpbin'

            echo 'travis_fold:start:testing'
            echo 'Testing...'
            ctest -V -C Debug -E "test_drawing" --output-on-failure --interactive-debug-mode 0 . || rc=$?
            echo 'travis_fold:end:testing'
            if [ -n "$rc" ]; then
                httpbin_show_log
                exit $rc
            fi
        fi

        echo 'travis_fold:start:testinstall'
        echo 'Testing installation...'
        popd
        mkdir build_cmake_install_test
        pushd build_cmake_install_test
        cmake -G "$wxCMAKE_GENERATOR" $wxCMAKE_DEFINES ../samples/minimal
        cmake --build . -- $wxBUILD_ARGS
        popd
        echo 'travis_fold:end:testinstall'
        ;;
    *)
        echo 'travis_fold:start:configure'
        echo 'Configuring...'

        wxCONFIGURE_OPTIONS="--disable-optimise $wxCONFIGURE_FLAGS"
        if [ -n "$wxGTK_VERSION" ]; then
            wxCONFIGURE_OPTIONS="--with-gtk=$wxGTK_VERSION $wxCONFIGURE_OPTIONS"
        fi

        ./configure $wxCONFIGURE_OPTIONS --disable-debug_info || rc=$?

        if [ -n "$rc" ]; then
            echo '*** Configuring failed, contents of config.log follows: ***'
            echo '-----------------------------------------------------------'
            cat config.log
            echo '-----------------------------------------------------------'
            exit $rc
        fi
        echo 'travis_fold:end:configure'

        if [ "$wxALLOW_WARNINGS" != 1 ]; then
            # Under macOS TRAVIS_COMPILER is set to g++, but it's actually an
            # alias for clang.
            case "$(uname -s)" in
                Darwin)
                    real_compiler=clang
                    ;;

                *)
                    # Elsewhere either gcc or clang can be used.
                    real_compiler="$TRAVIS_COMPILER"
                    ;;
            esac

            case "$real_compiler" in
                clang)
                    allow_warn_opt="-Wno-error=#warnings"
                    ;;

                gcc | g++)
                    allow_warn_opt="-Wno-error=cpp"
                    ;;

                *)
                    echo "*** Unknown compiler: $real_compiler ***"
                    ;;
            esac

            error_opts="-Werror $allow_warn_opt"
            wxMAKEFILE_CXXFLAGS="$wxMAKEFILE_CXXFLAGS $error_opts"
            wxMAKEFILE_ERROR_CXXFLAGS=("CXXFLAGS=$error_opts")
        else
            wxMAKEFILE_ERROR_CXXFLAGS=()
        fi

        wxMAKEFILE_FLAGS=()
        if [ -n "$wxMAKEFILE_CXXFLAGS" ]; then
            wxMAKEFILE_FLAGS+=("CXXFLAGS=$wxMAKEFILE_CXXFLAGS")
        fi
        if [ -n "$wxMAKEFILE_LDFLAGS" ]; then
            wxMAKEFILE_FLAGS+=("LDFLAGS=$wxMAKEFILE_LDFLAGS")
        fi

        echo 'travis_fold:start:building'
        echo 'Building...'
        make -k $wxBUILD_ARGS "${wxMAKEFILE_ERROR_CXXFLAGS[@]}"
        echo 'travis_fold:end:building'

        echo 'travis_fold:start:tests'
        echo 'Building tests...'
        [ "$wxSKIP_GUI" = 1 ] || make -C tests $wxBUILD_ARGS failtest
        make -k -C tests $wxBUILD_ARGS "${wxMAKEFILE_FLAGS[@]}"
        echo 'travis_fold:end:tests'

        if [ "$wxSKIP_TESTING" = 1 ]; then
            echo 'Skipping running tests'
            exit 0
        fi

        echo 'travis_fold:start:httpbin'
        httpbin_launch
        echo 'travis_fold:end:httpbin'

        echo 'travis_fold:start:testing'
        echo 'Testing...'
        pushd tests
        ./test || rc=$?
        popd
        echo 'travis_fold:end:testing'
        if [ -n "$rc" ]; then
            httpbin_show_log
            exit $rc
        fi

        if [ "$wxSKIP_GUI" = 1 ]; then
            echo 'Skipping the rest of tests for non-GUI build.'
            exit 0
        fi

        if [ "$wxUSE_XVFB" = 1 ]; then
            echo 'travis_fold:start:testing_gui'
            echo 'Testing GUI using Xvfb...'
            pushd tests
            xvfb-run -a -s '-screen 0 1600x1200x24' ./test_gui
            popd
            echo 'travis_fold:end:testing_gui'
        fi

        echo 'travis_fold:start:samples'
        echo 'Building samples...'
        (test "$wxSKIP_SAMPLES" && echo 'SKIPPED') || make -k "${wxMAKEFILE_FLAGS[@]}" samples
        echo 'travis_fold:end:samples'

        echo 'travis_fold:start:install'
        echo 'Installing...'
        sudo make install
        echo 'travis_fold:end:install'

        echo 'travis_fold:start:testinstall'
        echo 'Testing installation...'
        make -C samples/minimal -f makefile.unx clean
        make -C samples/minimal -f makefile.unx "${wxMAKEFILE_FLAGS[@]}"
        echo 'travis_fold:end:testinstall'
        ;;
esac
