# Following tests are run _only_ on `release` branch
# and on selected feature branch named `appveyorTest` or `visual*`

-
  version: 1.0.{build}
  branches:
    only:
    - release
    - master
    - /appveyor*/
    - /visual*/
  environment:
    matrix:
    - COMPILER: "gcc"
      HOST:     "mingw"
      PLATFORM: "x64"
      SCRIPT:   "make allzstd MOREFLAGS=-static"
      ARTIFACT: "true"
      BUILD:    "true"
    - COMPILER: "gcc"
      HOST:     "mingw"
      PLATFORM: "x86"
      SCRIPT:   "make allzstd MOREFLAGS=-static"
      ARTIFACT: "true"
      BUILD:    "true"

    - COMPILER: "clang-cl"
      HOST:     "cmake-visual"
      PLATFORM: "x64"
      CONFIGURATION: "Release"
      CMAKE_GENERATOR: "Visual Studio 15 2017"
      CMAKE_GENERATOR_PLATFORM: "x64"
      CMAKE_GENERATOR_TOOLSET: "LLVM"
      APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2017"

  install:
  - ECHO Installing %COMPILER% %PLATFORM% %CONFIGURATION%
  - SET PATH_ORIGINAL=%PATH%
  - if [%HOST%]==[mingw] (
      SET "PATH_MINGW32=C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\bin" &&
      SET "PATH_MINGW64=C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin" &&
      COPY C:\msys64\usr\bin\make.exe C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\bin\make.exe &&
      COPY C:\msys64\usr\bin\make.exe C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin\make.exe
    )
  - IF [%HOST%]==[visual] IF [%PLATFORM%]==[x64] (
      SET ADDITIONALPARAM=/p:LibraryPath="C:\Program Files\Microsoft SDKs\Windows\v7.1\lib\x64;c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64;C:\Program Files (x86)\Microsoft Visual Studio 10.0\;C:\Program Files (x86)\Microsoft Visual Studio 10.0\lib\amd64;"
    )

  build_script:
  - if [%HOST%]==[mingw] (
      ( if [%PLATFORM%]==[x64] (
        SET "PATH=%PATH_MINGW64%;%PATH_ORIGINAL%"
      ) else if [%PLATFORM%]==[x86] (
        SET "PATH=%PATH_MINGW32%;%PATH_ORIGINAL%"
      ) )
    )
  - if [%HOST%]==[mingw] if [%BUILD%]==[true] (
      make -v &&
      sh -c "%COMPILER% -v" &&
      ECHO Building zlib to static link &&
      SET "CC=%COMPILER%" &&
      sh -c "cd .. && git clone --depth 1 --branch v1.2.11 https://github.com/madler/zlib" &&
      sh -c "cd ../zlib && make -f win32/Makefile.gcc libz.a"
      ECHO Building zstd &&
      SET "CPPFLAGS=-I../../zlib" &&
      SET "LDFLAGS=../../zlib/libz.a" &&
      sh -c "%SCRIPT%" &&
      ( if [%COMPILER%]==[gcc] if [%ARTIFACT%]==[true]
          ECHO Creating artifacts &&
          ECHO %cd% &&
          lib\dll\example\build_package.bat &&
          make -C programs DEBUGFLAGS= clean zstd &&
          cd programs\ && 7z a -tzip -mx9 zstd-win-binary-%PLATFORM%.zip zstd.exe &&
          appveyor PushArtifact zstd-win-binary-%PLATFORM%.zip &&
          cp zstd.exe ..\bin\zstd.exe &&
          git clone --depth 1 --branch release https://github.com/facebook/zstd &&
          cd zstd &&
          git archive --format=tar release -o zstd-src.tar &&
          ..\zstd -19 zstd-src.tar &&
          appveyor PushArtifact zstd-src.tar.zst &&
          certUtil -hashfile zstd-src.tar.zst SHA256 > zstd-src.tar.zst.sha256.sig &&
          appveyor PushArtifact zstd-src.tar.zst.sha256.sig &&
          cd ..\..\bin\ &&
          7z a -tzip -mx9 zstd-win-release-%PLATFORM%.zip * &&
          appveyor PushArtifact zstd-win-release-%PLATFORM%.zip
      )
    )
  - if [%HOST%]==[cmake-visual] (
      ECHO *** &&
      ECHO *** Building %CMAKE_GENERATOR% ^(%CMAKE_GENERATOR_TOOLSET%^) %PLATFORM%\%CONFIGURATION% &&
      PUSHD build\cmake &&
      cmake -DBUILD_TESTING=ON . &&
      cmake --build . --config %CONFIGURATION% -j4 &&
      POPD &&
      ECHO ***
    )

  test_script:
  - ECHO Testing %COMPILER% %PLATFORM% %CONFIGURATION%
  - SET "CC=gcc"
  - SET "CXX=g++"
  - if [%TEST%]==[cmake] (
      mkdir build\cmake\build &&
      cd build\cmake\build &&
      SET FUZZERTEST=-T2mn &&
      SET ZSTREAM_TESTTIME=-T2mn &&
      cmake -G "Visual Studio 14 2015 Win64" .. &&
      cd ..\..\.. &&
      make clean
    )


# The following tests are for regular pushes
# into `dev` or some feature branch
# There run less tests, for shorter feedback loop

-
  version: 1.0.{build}
  environment:
    matrix:
    - COMPILER: "visual"
      HOST:     "visual"
      PLATFORM: "x64"
      CONFIGURATION: "Debug"
    - COMPILER: "visual"
      HOST:     "visual"
      PLATFORM: "Win32"
      CONFIGURATION: "Debug"
    - COMPILER: "visual"
      HOST:     "visual"
      PLATFORM: "x64"
      CONFIGURATION: "Release"
    - COMPILER: "visual"
      HOST:     "visual"
      PLATFORM: "Win32"
      CONFIGURATION: "Release"

    - COMPILER: "gcc"
      HOST:     "cygwin"
      PLATFORM: "x64"

    - COMPILER: "clang-cl"
      HOST:     "cmake-visual"
      PLATFORM: "x64"
      CONFIGURATION: "Release"
      CMAKE_GENERATOR: "Visual Studio 15 2017"
      CMAKE_GENERATOR_PLATFORM: "x64"
      CMAKE_GENERATOR_TOOLSET: "LLVM"
      APPVEYOR_BUILD_WORKER_IMAGE: "Visual Studio 2017"

  install:
  - ECHO Installing %COMPILER% %PLATFORM% %CONFIGURATION%
  - SET PATH_ORIGINAL=%PATH%
  - if [%HOST%]==[cygwin] (
      ECHO Installing Cygwin Packages &&
      C:\cygwin64\setup-x86_64.exe -qnNdO -R "C:\cygwin64" -g -P ^
        gcc,^
        cmake,^
        make
    )
  - IF [%HOST%]==[visual] IF [%PLATFORM%]==[x64] (
      SET ADDITIONALPARAM=/p:LibraryPath="C:\Program Files\Microsoft SDKs\Windows\v7.1\lib\x64;c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64;C:\Program Files (x86)\Microsoft Visual Studio 10.0\;C:\Program Files (x86)\Microsoft Visual Studio 10.0\lib\amd64;"
    )

  build_script:
  - ECHO Building %COMPILER% %PLATFORM% %CONFIGURATION%
  - if [%HOST%]==[cygwin] (
      set CHERE_INVOKING=yes &&
      set CC=%COMPILER% &&
      C:\cygwin64\bin\bash --login -c "
        set -e;
        cd build/cmake;
        CFLAGS='-Werror' cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE=Debug -DZSTD_BUILD_TESTS:BOOL=ON -DZSTD_FUZZER_FLAGS=-T20s -DZSTD_ZSTREAM_FLAGS=-T20s -DZSTD_FULLBENCH_FLAGS=-i0 .;
        make VERBOSE=1 -j;
        ctest -V -L Medium;
      "
    )
  - if [%HOST%]==[cmake-visual] (
      ECHO *** &&
      ECHO *** Building %CMAKE_GENERATOR% ^(%CMAKE_GENERATOR_TOOLSET%^) %PLATFORM%\%CONFIGURATION% &&
      PUSHD build\cmake &&
      cmake -DBUILD_TESTING=ON . &&
      cmake --build . --config %CONFIGURATION% -j4 &&
      POPD &&
      ECHO ***
    )
  - if [%HOST%]==[visual] (
      ECHO *** &&
      ECHO *** Building Visual Studio 2012 %PLATFORM%\%CONFIGURATION% &&
      ECHO *** &&
      msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v110 /p:ForceImportBeforeCppTargets=%APPVEYOR_BUILD_FOLDER%\build\VS2010\CompileAsCpp.props /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" &&
      DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe &&
      msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v110 /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" &&
      DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe
    )


  test_script:
  - ECHO Testing %COMPILER% %PLATFORM% %CONFIGURATION%
  - SET "FUZZERTEST=-T10s"
  - if [%HOST%]==[mingw] (
      set "CC=%COMPILER%" &&
      make clean &&
      make check
    )