version: '{build}'

configuration:
  - Static Debug
  - Static Release
#  - Shared Debug
#  - Shared Release

platform:
  - x86
  - x64

environment:
  matrix:
#    - compiler: msvc-12-seh
    - compiler: msvc-14-seh
    - compiler: gcc-4.9.2-posix
#    - compiler: gcc-4.8.4-posix

artifacts:
  - path: '_build/CMakeFiles/*.log'
    name: logs
  - path: '_build/Testing/**/*.xml'
    name: test_results

install:
  # derive some extra information
  - for /f "tokens=1-2" %%a in ("%configuration%") do (@set "linkage=%%a")
  - for /f "tokens=1-2" %%a in ("%configuration%") do (@set "variant=%%b")
  - if "%linkage%"=="Shared" (set shared=YES) else (set shared=NO)
  - for /f "tokens=1-3 delims=-" %%a in ("%compiler%") do (@set "compiler_name=%%a")
  - for /f "tokens=1-3 delims=-" %%a in ("%compiler%") do (@set "compiler_version=%%b")
  - for /f "tokens=1-3 delims=-" %%a in ("%compiler%") do (@set "compiler_threading=%%c")
  - if "%platform%"=="x64" (set arch=x86_64)
  - if "%platform%"=="x86" (set arch=i686)
  # download the specific version of MinGW
  - if "%compiler_name%"=="gcc" (for /f %%a in ('python mingw.py --quiet --version "%compiler_version%" --arch "%arch%" --threading "%compiler_threading%" --location "C:\mingw-builds"') do @set "compiler_path=%%a")

before_build:
  # Set up mingw commands
  - if "%compiler_name%"=="gcc" (set "generator=MinGW Makefiles")
  - if "%compiler_name%"=="gcc" (set "build=mingw32-make -j4")
  - if "%compiler_name%"=="gcc" (set "test=mingw32-make CTEST_OUTPUT_ON_FAILURE=1 test")
  # msvc specific commands
  - if "%compiler_name%"=="msvc" if "%compiler_version%"=="12" if "%platform%"=="x86" (set "generator=Visual Studio 12 2013")
  - if "%compiler_name%"=="msvc" if "%compiler_version%"=="12" if "%platform%"=="x64" (set "generator=Visual Studio 12 2013 Win64")
  - if "%compiler_name%"=="msvc" if "%compiler_version%"=="14" if "%platform%"=="x86" (set "generator=Visual Studio 14 2015")
  - if "%compiler_name%"=="msvc" if "%compiler_version%"=="14" if "%platform%"=="x64" (set "generator=Visual Studio 14 2015 Win64")
  - if "%compiler_name%"=="msvc" (set "build=cmake --build . --config %variant%")
  - if "%compiler_name%"=="msvc" (set "test=ctest -c Release -D CTEST_OUTPUT_ON_FAILURE:STRING=1")
  # add the compiler path if needed
  - if not "%compiler_path%"=="" (set "PATH=%PATH%;%compiler_path%")
  # git bash conflicts with MinGW makefiles
  - if "%generator%"=="MinGW Makefiles" (set "PATH=%PATH:C:\Program Files\Git\usr\bin;=%")

build_script:
- ps: |
    md _build -Force
    cd _build
    & cmake -G "$env:generator" "-DCMAKE_BUILD_TYPE=$env:variant" "-DBUILD_SHARED_LIBS=$env:shared" ..
    if ($LastExitCode -ne 0) {
        throw "Exec: $ErrorMessage"
    }
    iex "& $env:build"
    if ($LastExitCode -ne 0) {
        throw "Exec: $ErrorMessage"
    }

test_script:
- ps: |
    iex "& $env:test"
    if ($LastExitCode -ne 0) {
        throw "Exec: $ErrorMessage"
    }

    function Add-CTest-Result($testResult)
    {
        $tests = ([xml](get-content $testResult)).Site.Testing
        $testsCount = 0
        $anyFailures = $FALSE

        foreach ($test in $tests.test) {
            $testsCount++
            $testName = $test.Name
            $testpath = $test.Path
            $timeNode = $test.SelectSingleNode('Results/NamedMeasurement[@name="Execution Time"]/Value')
            if ($test.status -eq "failure") {
                $time = ([double]$timeNode.InnerText * 1000)
                Add-AppveyorTest $testName -Outcome Failed -FileName $testpath -Duration $time -ErrorMessage $($test.results.measurement.value)
                Add-AppveyorMessage `"$testName failed`" -Category Error
                $anyFailures = $TRUE
            }
            elseif ($test.status -eq "skipped") {
                Add-AppveyorTest $testName -Outcome Ignored -Filename $testpath
            }
            else {
                $time = ([double]$timeNode.InnerText * 1000)
                Add-AppveyorTest $testName -Outcome Passed -FileName $testpath -Duration $time -StdOut $($test.results.measurement.value)
            }
        }
        return $testsCount, $anyFailures
    }

    $testsCount = 0
    $anyFailures = $FALSE

    # Run tests and upload results to AppVeyor one by one
    Get-ChildItem ".\Testing\*.xml" -Recurse | foreach {
        $testfile = $_.fullname
        $count, $testsResult = Add-CTest-Result $testfile
        Write-Host "Found $testfile with $count tests"
        $testsCount = $testsCount + $count
        $anyFailures = $anyFailures -or $testsResult
    }

    Write-Host "There are $testsCount tests found"

    if ($anyFailures -eq $TRUE){
        Write-Host "Failing build as there are broken tests"
        $host.SetShouldExit(1)
    }

matrix:
  fast_finish: true

cache:
  - C:\mingw-builds
