stages:
  - update-dewesoft
  - build
  - check
  - build-patch
  - check-patch

variables:
  VS_SOLUTION_PATH: .
  DEWESOFT_INTERNAL_PATH: $ext_TestProcessing$\dewesoft_internal
  # SYSTEM_TEST_FOLDER_PATH: _ST
  # UNIT_TEST_EXECUTABLE: $ext_TestProcessing$PluginTest.exe
  
update-dewesoft:
  stage: update-dewesoft
  tags:
    - ProcessingPlugin
  variables:
    DEWESOFT_SYSTEM_DIR: C:\DXEProjects\DewesoftX\Dewesoft\System
    CONFIGURATION: Debug
  script:
    - py "$env:DEWESOFT_CI_DIR\scripts\UpdateLibs.py"
    - py "$env:DEWESOFT_CI_DIR\UpdateDewesoftFromFTP.py" development $env:CONFIGURATION x64 $env:DEWESOFT_EXE_X64 $env:DEWESOFT_SYSTEM_DIR
    - py "$env:DEWESOFT_CI_DIR\UpdateDewesoftFromFTP.py" development $env:CONFIGURATION x86 $env:DEWESOFT_EXE_X86 $env:DEWESOFT_SYSTEM_DIR

.compile: &compile
  tags:
    - ProcessingPlugin
  script:
    - $env:CONFIGURATION_BUILD_PATH = "${env:BUILD_PATH}_${env:PLATFORM}_${env:CONFIGURATION}"
    - mkdir "$env:CONFIGURATION_BUILD_PATH"
    - msbuild "$env:CI_PROJECT_DIR\$env:VS_SOLUTION_PATH" /t:Rebuild /property:Configuration=$env:CONFIGURATION /property:Platform=$env:PLATFORM /property:OutDir="$env:CI_PROJECT_DIR\$env:CONFIGURATION_BUILD_PATH" | tee "$env:CONFIGURATION_BUILD_PATH\build_output.txt"
  parallel:
    matrix:
      - PLATFORM: [x64, x86]
        CONFIGURATION: [Debug, Release]
  artifacts:
    paths:
      - "${env:BUILD_PATH}_${env:PLATFORM}_${env:CONFIGURATION}"
    expire_in: 1 week

.warnings: &warnings
  tags:
    - ProcessingPlugin
  script:
    - Select-String -Pattern " warning"  "${env:BUILD_PATH}_${env:PLATFORM}_${env:CONFIGURATION}\build_output.txt"
    - $no_warnings = Select-String -Pattern " 0 Warning\(s\)" "${env:BUILD_PATH}_${env:PLATFORM}_${env:CONFIGURATION}\build_output.txt" -Quiet; if (!$no_warnings) { exit 1 }
  parallel:
    matrix:
      - PLATFORM: [x64, x86]
        CONFIGURATION: [Debug, Release]
  allow_failure: true
  
.system-tests: &system-tests
  tags:
    - ProcessingPlugin
  before_script:
    - $env:DEWESOFT_ADDONS_DIR = "$env:DEWESOFT_EXE_X64\Addons64"
  script:
    - if (!(Test-Path -Path "$env:DEWESOFT_ADDONS_DIR\$env:CI_PROJECT_NAME")) {mkdir "$env:DEWESOFT_ADDONS_DIR\$env:CI_PROJECT_NAME"}
    - Copy-Item -Path "$env:BUILD_PATH\*" -Destination "$env:DEWESOFT_ADDONS_DIR\$env:CI_PROJECT_NAME" -Force
    - if (!(Test-Path -Path "$env:CI_PROJECT_DIR\$env:SYSTEM_TEST_FOLDER_PATH\reports")) {mkdir "$env:CI_PROJECT_DIR\$env:SYSTEM_TEST_FOLDER_PATH\reports"}
    - Start-Process -Wait "$env:DEWESOFT_EXE_X64\Dewesoft.exe" "/CI $env:CI_PROJECT_DIR\$env:SYSTEM_TEST_FOLDER_PATH $env:CI_PROJECT_DIR\$env:SYSTEM_TEST_FOLDER_PATH\TestSuite.xml $env:CI_PROJECT_DIR\$env:SYSTEM_TEST_FOLDER_PATH\reports\$env:REPORT_NAME"
    - $failed_tests = Select-String -Pattern 'failure message' "$env:CI_PROJECT_DIR\$env:SYSTEM_TEST_FOLDER_PATH\reports\$env:REPORT_NAME" -Quiet; if ($failed_tests) { exit 1 }
  artifacts:
    reports:
      junit: $env:CI_PROJECT_DIR\$env:SYSTEM_TEST_FOLDER_PATH\reports\$env:REPORT_NAME
    expire_in: 1 week

.unit-tests: &unit-tests
  tags:
    - ProcessingPlugin
  script:
    - cd "$env:CI_PROJECT_DIR\$env:BUILD_PATH"
    - Start-Process "$env:UNIT_TEST_EXECUTABLE" "--gtest_output=xml:unit_tests.xml"
  artifacts:
    reports:
      junit: $env:CI_PROJECT_DIR\$env:BUILD_PATH\unit_tests.xml
    expire_in: 1 week

compile:
  stage: build
  variables:
    BUILD_PATH: build
  except: 
    - pipelines
  <<: *compile
  
warning:
  stage: check
  variables:
    BUILD_PATH: build
  needs: ["compile"]
  except: 
    - pipelines
  <<: *warnings
  
compile_patched:
  stage: build-patch
  before_script:
    - git clone --depth 1 ssh://git@gitlab.dewesoft.com:2345/Common/TestMathPlugin.git
    - Copy-Item -Path "$env:CI_PROJECT_DIR\TestMathPlugin\$ext_TestProcessing$\dewesoft_internal\*" -Destination "$env:CI_PROJECT_DIR\$env:DEWESOFT_INTERNAL_PATH" -recurse -Force
  variables:
    BUILD_PATH: build_patched
  <<: *compile
  
warning_patched:
  stage: check-patch
  variables:
    BUILD_PATH: build_patched
  needs: ["compile_patched"]
  <<: *warnings

# system_test:
  # stage: check
  # variables:
    # PLATFORM: X64
    # BUILD_PATH: build_x64_Release
    # REPORT_NAME: report.xml
  # except: 
    # - pipelines
  # <<: *system-tests
  
# unit_test:
  # stage: check
  # variables:
    # BUILD_PATH: build_x64_Release
  # except: 
    # - pipelines
  # <<: *unit-tests
  
# system_test_patched:
  # stage: check-patch
  # variables:
    # PLATFORM: X64
    # BUILD_PATH: build_patched_x64_Release
    # REPORT_NAME: report_patched.xml
  # <<: *system-tests

# unit_test_patched:
  # stage: check-patch
  # variables:
    # BUILD_PATH: build_patched_x64_Release
  # <<: *unit-tests
