Version 0.1

This commit is contained in:
Michael Fabian 'Xaymar' Dirks
2022-07-04 03:09:56 +02:00
parent 4ba4b156fb
commit f46025f26c
14 changed files with 1075 additions and 0 deletions
+108
View File
@@ -0,0 +1,108 @@
cmake_minimum_required(VERSION 3.23)
project(cmake-version)
include("helpers.cmake")
# ToDo: Add even more test cases, as we don't want a burning bar because someone asked where the toilet is.
# Generation
message(STATUS "\n\n===== Generation =====")
# - Valid Cases
test_generate("0.0")
test_generate("1.0" MAJOR 1)
test_generate("0.2" MINOR 2)
test_generate("0.0.3" PATCH 3)
test_generate("0.0.0.4" TWEAK 4)
test_generate("0.0-5" COMPRESS PRERELEASE 5)
test_generate("0.0a5" COMPRESS PRERELEASE a5)
test_generate("0.0+6" BUILD 6)
# - Invalid Cases
test_generate("-1.0.0" FAIL MAJOR "-1")
test_generate("0.-1.0" FAIL MINOR "-1")
test_generate("0.0.-1" FAIL PATCH "-1")
test_generate("0.0.0.-1" FAIL TWEAK "-1")
test_generate("0.0.0-#" FAIL PRERELEASE "#")
test_generate("0.0.0-0 0" FAIL PRERELEASE "0 0")
test_generate("0.0.0+#" FAIL BUILD "#")
test_generate("0.0.0+0 0" FAIL BUILD "0 0")
# Parsing
message(STATUS "\n\n===== Parsing =====")
# - Valid Cases
test_parse("1.2" MAJOR 1 MINOR 2)
test_parse("1.2.3" MAJOR 1 MINOR 2 PATCH 3)
test_parse("1.2.3.4" MAJOR 1 MINOR 2 PATCH 3 TWEAK 4)
test_parse("1.2-5" MAJOR 1 MINOR 2 PRERELEASE 5)
test_parse("1.2.3-5" MAJOR 1 MINOR 2 PATCH 3 PRERELEASE 5)
test_parse("1.2.3.4-5" MAJOR 1 MINOR 2 PATCH 3 TWEAK 4 PRERELEASE 5)
test_parse("1.2a5" MAJOR 1 MINOR 2 PRERELEASE a5)
test_parse("1.2.3a5" MAJOR 1 MINOR 2 PATCH 3 PRERELEASE a5)
test_parse("1.2.3.4a5" MAJOR 1 MINOR 2 PATCH 3 TWEAK 4 PRERELEASE a5)
test_parse("1.2+6" MAJOR 1 MINOR 2 BUILD 6)
test_parse("1.2.3+6" MAJOR 1 MINOR 2 PATCH 3 BUILD 6)
test_parse("1.2.3.4+6" MAJOR 1 MINOR 2 PATCH 3 TWEAK 4 BUILD 6)
test_parse("1.2-5+6" MAJOR 1 MINOR 2 PRERELEASE 5 BUILD 6)
test_parse("1.2.3-5+6" MAJOR 1 MINOR 2 PATCH 3 PRERELEASE 5 BUILD 6)
test_parse("1.2.3.4-5+6" MAJOR 1 MINOR 2 PATCH 3 TWEAK 4 PRERELEASE 5 BUILD 6)
test_parse("1.2a5+6" MAJOR 1 MINOR 2 PRERELEASE a5 BUILD 6)
test_parse("1.2.3a5+6" MAJOR 1 MINOR 2 PATCH 3 PRERELEASE a5 BUILD 6)
test_parse("1.2.3.4a5+6" MAJOR 1 MINOR 2 PATCH 3 TWEAK 4 PRERELEASE a5 BUILD 6)
# - Invalid Cases
test_parse("" FAIL)
test_parse("cmake" FAIL)
test_parse("0" FAIL)
test_parse("-1.0.0" FAIL)
test_parse("11.bad.0" FAIL)
test_parse("0.0.0+.0" FAIL)
# Modifying
message(STATUS "\n\n===== Modifying =====")
# - Valid Cases
test_modify("1.0" "0.0" MAJOR 1)
test_modify("1.0" "0.0" MAJOR "+1")
test_modify("1.0" "2.0" MAJOR "-1")
test_modify("0.2" "0.0" MINOR 2)
test_modify("0.2" "0.0" MINOR "+2")
test_modify("0.2" "0.3" MINOR "-1")
test_modify("0.0.3" "0.0" PATCH 3)
test_modify("0.0.3" "0.0.2" PATCH "+1")
test_modify("0.0.3" "0.0.4" PATCH "-1")
test_modify("0.0.0.4" "0.0" TWEAK 4)
test_modify("0.0.0.4" "0.0.0.3" TWEAK "+1")
test_modify("0.0.0.4" "0.0.0.5" TWEAK "-1")
test_modify("0.0-5" "0.0" COMPRESS PRERELEASE 5)
test_modify("0.0a5" "0.0" COMPRESS PRERELEASE a5)
test_modify("0.0+6" "0.0" COMPRESS BUILD 6)
test_modify("0.0-5+6" "0.0" COMPRESS PRERELEASE 5 BUILD 6)
test_modify("0.0a5+6" "0.0" COMPRESS PRERELEASE a5 BUILD 6)
# - Invalid Cases
test_modify("0.0" "0.0" FAIL MAJOR -1)
test_modify("0.0" "0.0" FAIL MINOR -1)
test_modify("0.0" "0.0" FAIL PATCH -1)
test_modify("0.0" "0.0" FAIL TWEAK -1)
test_modify("0.0" "0.0" FAIL COMPRESS PRERELEASE "#")
test_modify("0.0" "0.0" FAIL COMPRESS BUILD "#")
# Comparing
message(STATUS "\n\n===== Comparing =====")
# - Base Components Comparison
test_compare("0.0" "" "0.0")
test_compare("1.0" ">MAJOR" "0.0")
test_compare("0.0" "<MAJOR" "1.0")
test_compare("0.2" ">MINOR" "0.0")
test_compare("0.0" "<MINOR" "0.2")
test_compare("0.0.3" ">PATCH" "0.0.0")
test_compare("0.0.0" "<PATCH" "0.0.3")
test_compare("0.0.0.4" ">TWEAK" "0.0.0.0")
test_compare("0.0.0.0" "<TWEAK" "0.0.0.4")
test_compare("0.0-5" "PRERELEASE" "0.0-6")
test_compare("0.0+6" "BUILD" "0.0+7")
# - Missing Components Tests
test_compare("0.0.3" "+PATCH" "0.0")
test_compare("0.0" "-PATCH" "0.0.3")
test_compare("0.0.0.4" "+TWEAK" "0.0.0")
test_compare("0.0.0" "-TWEAK" "0.0.0.4")
test_compare("0.0-5" "+PRERELEASE" "0.0")
test_compare("0.0" "-PRERELEASE" "0.0-5")
test_compare("0.0+6" "+BUILD" "0.0")
test_compare("0.0" "-BUILD" "0.0+6")
+234
View File
@@ -0,0 +1,234 @@
include("../version.cmake")
function(test_generate)
cmake_parse_arguments(
PARSE_ARGV 1
_ARGS
"COMPRESS;FAIL"
"MAJOR;MINOR;PATCH;TWEAK;PRERELEASE;BUILD"
""
)
set(ARGS "")
if(_ARGS_MAJOR)
set(ARGS "${ARGS} MAJOR \"${_ARGS_MAJOR}\"")
endif()
if(_ARGS_MINOR)
set(ARGS "${ARGS} MINOR \"${_ARGS_MINOR}\"")
endif()
if(_ARGS_PATCH)
set(ARGS "${ARGS} PATCH \"${_ARGS_PATCH}\"")
endif()
if(_ARGS_TWEAK)
set(ARGS "${ARGS} TWEAK \"${_ARGS_TWEAK}\"")
endif()
if(_ARGS_PRERELEASE)
set(ARGS "${ARGS} PRERELEASE \"${_ARGS_PRERELEASE}\"")
endif()
if(_ARGS_BUILD)
set(ARGS "${ARGS} BUILD \"${_ARGS_BUILD}\"")
endif()
if(_ARGS_COMPRESS)
set(ARGS "${ARGS} COMPRESS")
endif()
cmake_language(EVAL CODE "version(GENERATE _TEST ${ARGS})")
if(DEFINED _TEST_ERROR)
if(_ARGS_FAIL)
message(STATUS "PASSED: '${ARGV0}'.\n\t${_TEST_ERROR}")
else()
message(SEND_ERROR "FAILED: '${ARGV0}'.\n\t${_TEST_ERROR}")
endif()
else()
if((ARGV0 STREQUAL _TEST) AND (NOT _ARGS_FAIL))
message(STATUS "PASSED: '${ARGV0}'.")
else()
message(SEND_ERROR "FAILED: '${ARGV0}' != '${_TEST}'.")
endif()
endif()
endfunction()
function(test_parse)
cmake_parse_arguments(
PARSE_ARGV 1
_ARGS
"FAIL"
"MAJOR;MINOR;PATCH;TWEAK;PRERELEASE;BUILD"
""
)
version(PARSE _TEST "${ARGV0}")
set(FAILED OFF)
set(MESSAGE "${_TEST_ERROR}")
if(NOT DEFINED _TEST_ERROR)
if(DEFINED _ARGS_MAJOR)
if(NOT DEFINED _TEST_MAJOR)
set(MESSAGE "MAJOR component missing during parse.")
set(FAILED ON)
elseif(NOT (_TEST_MAJOR STREQUAL _ARGS_MAJOR))
set(MESSAGE "MAJOR component mismatch.")
set(FAILED ON)
endif()
endif()
if(DEFINED _ARGS_MINOR)
if(NOT DEFINED _TEST_MINOR)
set(MESSAGE "MINOR component missing during parse.")
set(FAILED ON)
elseif(NOT (_TEST_MINOR STREQUAL _ARGS_MINOR))
set(MESSAGE "MINOR component mismatch.")
set(FAILED ON)
endif()
endif()
if(DEFINED _ARGS_PATCH)
if(NOT DEFINED _TEST_PATCH)
set(MESSAGE "PATCH component missing during parse.")
set(FAILED ON)
elseif(NOT (_TEST_PATCH STREQUAL _ARGS_PATCH))
set(MESSAGE "PATCH component mismatch.")
set(FAILED ON)
endif()
endif()
if(DEFINED _ARGS_TWEAK)
if(NOT DEFINED _TEST_TWEAK)
set(MESSAGE "TWEAK component missing during parse.")
set(FAILED ON)
elseif(NOT (_TEST_TWEAK STREQUAL _ARGS_TWEAK))
set(MESSAGE "TWEAK component mismatch.")
set(FAILED ON)
endif()
endif()
if(DEFINED _ARGS_PRERELEASE)
if(NOT DEFINED _TEST_PRERELEASE)
set(MESSAGE "PRERELEASE component missing during parse.")
set(FAILED ON)
elseif(NOT (_TEST_PRERELEASE STREQUAL _ARGS_PRERELEASE))
set(MESSAGE "PRERELEASE component mismatch.")
set(FAILED ON)
endif()
endif()
if(DEFINED _ARGS_BUILD)
if(NOT DEFINED _TEST_BUILD)
set(MESSAGE "BUILD component missing during parse.")
set(FAILED ON)
elseif(NOT (_TEST_BUILD STREQUAL _ARGS_BUILD))
set(MESSAGE "BUILD component mismatch.")
set(FAILED ON)
endif()
endif()
else()
set(FAILED ON)
endif()
if(FAILED)
if(_ARGS_FAIL)
message(STATUS "PASSED: '${ARGV0}'.\n\t${MESSAGE}")
else()
message(SEND_ERROR "FAILED: '${ARGV0}'.\n\t${MESSAGE}")
endif()
else()
if(_ARGS_FAIL)
message(SEND_ERROR "FAILED: '${ARGV0}'.")
else()
message(STATUS "PASSED: '${ARGV0}'.")
endif()
endif()
endfunction()
function(test_modify)
cmake_parse_arguments(
PARSE_ARGV 2
_ARGS
"FAIL;COMPRESS"
"MAJOR;MINOR;PATCH;TWEAK;PRERELEASE;BUILD"
""
)
set(ARGS "")
if(_ARGS_MAJOR)
set(ARGS "${ARGS} MAJOR \"${_ARGS_MAJOR}\"")
endif()
if(_ARGS_MINOR)
set(ARGS "${ARGS} MINOR \"${_ARGS_MINOR}\"")
endif()
if(_ARGS_PATCH)
set(ARGS "${ARGS} PATCH \"${_ARGS_PATCH}\"")
endif()
if(_ARGS_TWEAK)
set(ARGS "${ARGS} TWEAK \"${_ARGS_TWEAK}\"")
endif()
if(_ARGS_PRERELEASE)
set(ARGS "${ARGS} PRERELEASE \"${_ARGS_PRERELEASE}\"")
endif()
if(_ARGS_BUILD)
set(ARGS "${ARGS} BUILD \"${_ARGS_BUILD}\"")
endif()
if(_ARGS_COMPRESS)
set(ARGS "${ARGS} COMPRESS")
endif()
cmake_language(EVAL CODE "version(MODIFY _TEST \"${ARGV1}\" ${ARGS})")
set(FAILED OFF)
if(DEFINED _TEST_ERROR)
set(MESSAGE "${_TEST_ERROR}")
set(FAILED ON)
else()
if(NOT (_TEST STREQUAL ARGV0))
set(FAILED ON)
endif()
endif()
if(FAILED)
if(_ARGS_FAIL)
message(STATUS "PASSED: '${ARGV0}'.\n\t${MESSAGE}")
else()
message(SEND_ERROR "FAILED: '${ARGV0}' != '${_TEST}'.\n\t${MESSAGE}")
endif()
else()
if(_ARGS_FAIL)
message(SEND_ERROR "FAILED: '${ARGV0}' != '${_TEST}'.\n\t${MESSAGE}")
else()
message(STATUS "PASSED: '${ARGV0}'.")
endif()
endif()
endfunction()
function(test_compare)
cmake_parse_arguments(
PARSE_ARGV 3
_ARGS
"FAIL"
"RESULT"
""
)
version(COMPARE _TEST "${ARGV0}" "${ARGV2}")
set(FAILED OFF)
if(DEFINED _TEST_ERROR)
set(MESSAGE "${_TEST_ERROR}")
set(FAILED ON)
else()
if(NOT (_TEST STREQUAL ARGV1))
set(MESSAGE "'${_TEST}' != '${ARGV1}'")
set(FAILED ON)
endif()
endif()
if(FAILED)
if(_ARGS_FAIL)
message(STATUS "PASSED: '${ARGV0}' '${ARGV1}' '${ARGV2}'.\n\t${MESSAGE}")
else()
message(SEND_ERROR "FAILED: '${ARGV0}' '${ARGV1}' '${ARGV2}'.\n\t${MESSAGE}")
endif()
else()
if(_ARGS_FAIL)
message(SEND_ERROR "FAILED: '${ARGV0}' '${ARGV1}' '${ARGV2}'.\n\t${MESSAGE}")
else()
message(STATUS "PASSED: '${ARGV0}' '${ARGV1}' '${ARGV2}'.")
endif()
endif()
endfunction()