From e6cec64820e6b39d1e4878f5a1abb2576064d95b Mon Sep 17 00:00:00 2001 From: "Daniele E. Domenichelli" Date: Fri, 18 Oct 2013 12:35:04 +0200 Subject: CheckTypeSize: Add unit tests --- Tests/Module/CheckTypeSize/CMakeLists.txt | 15 +- Tests/Module/CheckTypeSize/CheckTypeSize.cxx | 172 +++++++++++++++++++++ Tests/Module/CheckTypeSize/config.hxx.in | 23 +++ Tests/Module/CheckTypeSize/someclass.hxx | 14 ++ .../CheckTypeSizeMissingLanguage-result.txt | 1 + .../CheckTypeSizeMissingLanguage-stderr.txt | 8 + .../CheckTypeSizeMissingLanguage.cmake | 2 + .../CheckModules/CheckTypeSizeMixedArgs-result.txt | 1 + .../CheckModules/CheckTypeSizeMixedArgs-stderr.txt | 10 ++ .../CheckModules/CheckTypeSizeMixedArgs.cmake | 2 + Tests/RunCMake/CheckModules/CheckTypeSizeOk.cmake | 10 ++ .../CheckTypeSizeUnknownArgument-result.txt | 1 + .../CheckTypeSizeUnknownArgument-stderr.txt | 8 + .../CheckTypeSizeUnknownArgument.cmake | 2 + .../CheckTypeSizeUnknownLanguage-result.txt | 1 + .../CheckTypeSizeUnknownLanguage-stderr.txt | 10 ++ .../CheckTypeSizeUnknownLanguage.cmake | 2 + Tests/RunCMake/CheckModules/RunCMakeTest.cmake | 6 + 18 files changed, 287 insertions(+), 1 deletion(-) create mode 100644 Tests/Module/CheckTypeSize/CheckTypeSize.cxx create mode 100644 Tests/Module/CheckTypeSize/config.hxx.in create mode 100644 Tests/Module/CheckTypeSize/someclass.hxx create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage-result.txt create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage-stderr.txt create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage.cmake create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs-result.txt create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs-stderr.txt create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs.cmake create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeOk.cmake create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument-result.txt create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument-stderr.txt create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument.cmake create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage-result.txt create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage-stderr.txt create mode 100644 Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage.cmake diff --git a/Tests/Module/CheckTypeSize/CMakeLists.txt b/Tests/Module/CheckTypeSize/CMakeLists.txt index abe617a..16989fe2 100644 --- a/Tests/Module/CheckTypeSize/CMakeLists.txt +++ b/Tests/Module/CheckTypeSize/CMakeLists.txt @@ -1,6 +1,7 @@ cmake_minimum_required(VERSION 2.8.1 FATAL_ERROR) -project(CheckTypeSize C) +project(CheckTypeSize) +# Check C types include(CheckTypeSize) check_type_size("void*" SIZEOF_DATA_PTR) check_type_size(char SIZEOF_CHAR) @@ -18,7 +19,19 @@ check_type_size("((struct somestruct*)0)->someint" SIZEOF_STRUCTMEMBER_INT) check_type_size("((struct somestruct*)0)->someptr" SIZEOF_STRUCTMEMBER_PTR) check_type_size("((struct somestruct*)0)->somechar" SIZEOF_STRUCTMEMBER_CHAR) +# Check CXX types +check_type_size(bool SIZEOF_BOOL LANGUAGE CXX) + +set(CMAKE_EXTRA_INCLUDE_FILES someclass.hxx) +check_type_size("((ns::someclass*)0)->someint" SIZEOF_NS_CLASSMEMBER_INT LANGUAGE CXX) +check_type_size("((ns::someclass*)0)->someptr" SIZEOF_NS_CLASSMEMBER_PTR LANGUAGE CXX) +check_type_size("((ns::someclass*)0)->somechar" SIZEOF_NS_CLASSMEMBER_CHAR LANGUAGE CXX) +check_type_size("((ns::someclass*)0)->somebool" SIZEOF_NS_CLASSMEMBER_BOOL LANGUAGE CXX) + configure_file(config.h.in config.h) +configure_file(config.hxx.in config.hxx) + include_directories("${CheckTypeSize_BINARY_DIR}") add_executable(CheckTypeSize CheckTypeSize.c) +add_executable(CheckTypeSizeCXX CheckTypeSize.cxx) diff --git a/Tests/Module/CheckTypeSize/CheckTypeSize.cxx b/Tests/Module/CheckTypeSize/CheckTypeSize.cxx new file mode 100644 index 0000000..b5692cd --- /dev/null +++ b/Tests/Module/CheckTypeSize/CheckTypeSize.cxx @@ -0,0 +1,172 @@ +#include "config.h" +#include "config.hxx" +#include "someclass.hxx" + +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_STDDEF_H +# include +#endif + +#include + +#define CHECK(t,m) do { \ + if(sizeof(t) != m) \ + { \ + printf(#m ": expected %d, got %d (line %d)\n", \ + (int)sizeof(t), (int)m, __LINE__); \ + result = 1; \ + } \ + } while(0) + +#define NODEF(m) do { \ + printf(#m": not defined (line %d)\n", __LINE__); \ + result = 1; \ + } while(0) + +int main() +{ + int result = 0; + ns::someclass y; + + /* void* */ +#if !defined(HAVE_SIZEOF_DATA_PTR) + NODEF(HAVE_SIZEOF_DATA_PTR); +#endif +#if defined(SIZEOF_DATA_PTR) + CHECK(void*, SIZEOF_DATA_PTR); +#else + NODEF(SIZEOF_DATA_PTR); +#endif + + /* char */ +#if !defined(HAVE_SIZEOF_CHAR) + NODEF(HAVE_SIZEOF_CHAR); +#endif +#if defined(SIZEOF_CHAR) + CHECK(char, SIZEOF_CHAR); +#else + NODEF(SIZEOF_CHAR); +#endif + + /* short */ +#if !defined(HAVE_SIZEOF_SHORT) + NODEF(HAVE_SIZEOF_SHORT); +#endif +#if defined(SIZEOF_SHORT) + CHECK(short, SIZEOF_SHORT); +#else + NODEF(SIZEOF_SHORT); +#endif + + /* int */ +#if !defined(HAVE_SIZEOF_INT) + NODEF(HAVE_SIZEOF_INT); +#endif +#if defined(SIZEOF_INT) + CHECK(int, SIZEOF_INT); +#else + NODEF(SIZEOF_INT); +#endif + + /* long */ +#if !defined(HAVE_SIZEOF_LONG) + NODEF(HAVE_SIZEOF_LONG); +#endif +#if defined(SIZEOF_LONG) + CHECK(long, SIZEOF_LONG); +#else + NODEF(SIZEOF_LONG); +#endif + + /* long long */ +#if defined(SIZEOF_LONG_LONG) + CHECK(long long, SIZEOF_LONG_LONG); +# if !defined(HAVE_SIZEOF_LONG_LONG) + NODEF(HAVE_SIZEOF_LONG_LONG); +# endif +#endif + + /* __int64 */ +#if defined(SIZEOF___INT64) + CHECK(__int64, SIZEOF___INT64); +# if !defined(HAVE_SIZEOF___INT64) + NODEF(HAVE_SIZEOF___INT64); +# endif +#elif defined(HAVE_SIZEOF___INT64) + NODEF(SIZEOF___INT64); +#endif + + /* size_t */ +#if !defined(HAVE_SIZEOF_SIZE_T) + NODEF(HAVE_SIZEOF_SIZE_T); +#endif +#if defined(SIZEOF_SIZE_T) + CHECK(size_t, SIZEOF_SIZE_T); +#else + NODEF(SIZEOF_SIZE_T); +#endif + + /* ssize_t */ +#if defined(SIZEOF_SSIZE_T) + CHECK(ssize_t, SIZEOF_SSIZE_T); +# if !defined(HAVE_SIZEOF_SSIZE_T) + NODEF(HAVE_SIZEOF_SSIZE_T); +# endif +#elif defined(HAVE_SIZEOF_SSIZE_T) + NODEF(SIZEOF_SSIZE_T); +#endif + + /* ns::someclass::someint */ +#if defined(SIZEOF_NS_CLASSMEMBER_INT) + CHECK(y.someint, SIZEOF_NS_CLASSMEMBER_INT); + CHECK(y.someint, SIZEOF_INT); +# if !defined(HAVE_SIZEOF_NS_CLASSMEMBER_INT) + NODEF(HAVE_SIZEOF_STRUCTMEMBER_INT); +# endif +#elif defined(HAVE_SIZEOF_STRUCTMEMBER_INT) + NODEF(SIZEOF_STRUCTMEMBER_INT); +#endif + + /* ns::someclass::someptr */ +#if defined(SIZEOF_NS_CLASSMEMBER_PTR) + CHECK(y.someptr, SIZEOF_NS_CLASSMEMBER_PTR); + CHECK(y.someptr, SIZEOF_DATA_PTR); +# if !defined(HAVE_SIZEOF_NS_CLASSMEMBER_PTR) + NODEF(HAVE_SIZEOF_NS_CLASSMEMBER_PTR); +# endif +#elif defined(HAVE_SIZEOF_NS_CLASSMEMBER_PTR) + NODEF(SIZEOF_NS_CLASSMEMBER_PTR); +#endif + + /* ns::someclass::somechar */ +#if defined(SIZEOF_NS_CLASSMEMBER_CHAR) + CHECK(y.somechar, SIZEOF_NS_CLASSMEMBER_CHAR); + CHECK(y.somechar, SIZEOF_CHAR); +# if !defined(HAVE_SIZEOF_NS_CLASSMEMBER_CHAR) + NODEF(HAVE_SIZEOF_NS_CLASSMEMBER_CHAR); +# endif +#elif defined(HAVE_SIZEOF_NS_CLASSMEMBER_CHAR) + NODEF(SIZEOF_NS_CLASSMEMBER_CHAR); +#endif + + /* ns::someclass::somebool */ +#if defined(SIZEOF_NS_CLASSMEMBER_BOOL) + CHECK(y.somechar, SIZEOF_NS_CLASSMEMBER_BOOL); + CHECK(y.somechar, SIZEOF_BOOL); +# if !defined(HAVE_SIZEOF_NS_CLASSMEMBER_BOOL) + NODEF(HAVE_SIZEOF_NS_CLASSMEMBER_BOOL); +# endif +#elif defined(HAVE_SIZEOF_NS_CLASSMEMBER_BOOL) + NODEF(SIZEOF_NS_CLASSMEMBER_BOOL); +#endif + + /* to avoid possible warnings about unused or write-only variable */ + y.someint = result; + + return y.someint; +} diff --git a/Tests/Module/CheckTypeSize/config.hxx.in b/Tests/Module/CheckTypeSize/config.hxx.in new file mode 100644 index 0000000..8c66ade --- /dev/null +++ b/Tests/Module/CheckTypeSize/config.hxx.in @@ -0,0 +1,23 @@ +#cmakedefine HAVE_SYS_TYPES_H +#cmakedefine HAVE_STDINT_H +#cmakedefine HAVE_STDDEF_H + +/* bool */ +#cmakedefine HAVE_SIZEOF_BOOL +@SIZEOF_BOOL_CODE@ + +/* struct ns::somestruct::someint */ +#cmakedefine HAVE_SIZEOF_NS_STRUCTMEMBER_INT +@SIZEOF_NS_STRUCTMEMBER_INT_CODE@ + +/* struct ns::somestruct::someptr */ +#cmakedefine HAVE_SIZEOF_NS_STRUCTMEMBER_PTR +@SIZEOF_NS_STRUCTMEMBER_PTR_CODE@ + +/* struct ns::somestruct::somechar */ +#cmakedefine HAVE_SIZEOF_NS_STRUCTMEMBER_CHAR +@SIZEOF_NS_STRUCTMEMBER_CHAR_CODE@ + +/* struct ns::somestruct::somebool */ +#cmakedefine HAVE_SIZEOF_NS_STRUCTMEMBER_BOOL +@SIZEOF_NS_STRUCTMEMBER_BOOL_CODE@ diff --git a/Tests/Module/CheckTypeSize/someclass.hxx b/Tests/Module/CheckTypeSize/someclass.hxx new file mode 100644 index 0000000..76c07ec --- /dev/null +++ b/Tests/Module/CheckTypeSize/someclass.hxx @@ -0,0 +1,14 @@ +#ifndef _CMAKE_SOMECLASS_HXX +#define _CMAKE_SOMECLASS_HXX + +namespace ns { +class someclass { +public: + int someint; + void *someptr; + char somechar; + bool somebool; +}; +} + +#endif diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage-result.txt b/Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage-stderr.txt b/Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage-stderr.txt new file mode 100644 index 0000000..07ec8e6 --- /dev/null +++ b/Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage-stderr.txt @@ -0,0 +1,8 @@ +CMake Error at .*/Modules/CheckTypeSize.cmake:[0-9]+ \(message\): + Missing argument: + + LANGUAGE arguments requires a value + +Call Stack \(most recent call first\): + CheckTypeSizeMissingLanguage.cmake:[0-9]+ \(check_type_size\) + CMakeLists.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage.cmake b/Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage.cmake new file mode 100644 index 0000000..3fae6c4 --- /dev/null +++ b/Tests/RunCMake/CheckModules/CheckTypeSizeMissingLanguage.cmake @@ -0,0 +1,2 @@ +include(CheckTypeSize) +check_type_size(int SIZEOF_INT LANGUAGE) diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs-result.txt b/Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs-stderr.txt b/Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs-stderr.txt new file mode 100644 index 0000000..a2d2fc0 --- /dev/null +++ b/Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs-stderr.txt @@ -0,0 +1,10 @@ +CMake Error at .*/Modules/CheckTypeSize.cmake:[0-9]+. \(message\): + Unknown language: + + . + + Supported languages: C, CXX. + +Call Stack \(most recent call first\): + CheckTypeSizeMixedArgs.cmake:[0-9]+ \(check_type_size\) + CMakeLists.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs.cmake b/Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs.cmake new file mode 100644 index 0000000..d2ccc0f --- /dev/null +++ b/Tests/RunCMake/CheckModules/CheckTypeSizeMixedArgs.cmake @@ -0,0 +1,2 @@ +include(CheckTypeSize) +check_type_size(int SIZEOF_INT LANGUAGE BUILTIN_TYPES_ONLY) diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeOk.cmake b/Tests/RunCMake/CheckModules/CheckTypeSizeOk.cmake new file mode 100644 index 0000000..558f07e --- /dev/null +++ b/Tests/RunCMake/CheckModules/CheckTypeSizeOk.cmake @@ -0,0 +1,10 @@ +include(CheckTypeSize) +check_type_size(int SIZEOF_INT) +check_type_size(int SIZEOF_INT BUILTIN_TYPES_ONLY) +check_type_size(int SIZEOF_INT LANGUAGE C) +check_type_size(int SIZEOF_INT LANGUAGE CXX) +check_type_size(int SIZEOF_INT BUILTIN_TYPES_ONLY LANGUAGE C) + +# Weird but ok... only last value is considered +check_type_size(int SIZEOF_INT BUILTIN_TYPES_ONLY BUILTIN_TYPES_ONLY) +check_type_size(int SIZEOF_INT LANGUAGE C LANGUAGE CXX) diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument-result.txt b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument-stderr.txt b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument-stderr.txt new file mode 100644 index 0000000..085488e --- /dev/null +++ b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument-stderr.txt @@ -0,0 +1,8 @@ +CMake Error at .*/Modules/CheckTypeSize.cmake:[0-9]+. \(message\): + Unknown argument: + + LANGUAG + +Call Stack \(most recent call first\): + CheckTypeSizeUnknownArgument.cmake:[0-9]+ \(check_type_size\) + CMakeLists.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument.cmake b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument.cmake new file mode 100644 index 0000000..6f24ee1 --- /dev/null +++ b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownArgument.cmake @@ -0,0 +1,2 @@ +include(CheckTypeSize) +check_type_size(int SIZEOF_INT BUILTIN_TYPES_ONLY LANGUAG CXX) diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage-result.txt b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage-stderr.txt b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage-stderr.txt new file mode 100644 index 0000000..502a717 --- /dev/null +++ b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage-stderr.txt @@ -0,0 +1,10 @@ +CMake Error at .*/Modules/CheckTypeSize.cmake:[0-9]+. \(message\): + Unknown language: + + FORTRAN. + + Supported languages: C, CXX. + +Call Stack \(most recent call first\): + CheckTypeSizeUnknownLanguage.cmake:[0-9]+ \(check_type_size\) + CMakeLists.txt:[0-9]+ \(include\) diff --git a/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage.cmake b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage.cmake new file mode 100644 index 0000000..2d5184c --- /dev/null +++ b/Tests/RunCMake/CheckModules/CheckTypeSizeUnknownLanguage.cmake @@ -0,0 +1,2 @@ +include(CheckTypeSize) +check_type_size(int SIZEOF_INT LANGUAGE FORTRAN) diff --git a/Tests/RunCMake/CheckModules/RunCMakeTest.cmake b/Tests/RunCMake/CheckModules/RunCMakeTest.cmake index 6a6b36e..fda7ebf 100644 --- a/Tests/RunCMake/CheckModules/RunCMakeTest.cmake +++ b/Tests/RunCMake/CheckModules/RunCMakeTest.cmake @@ -6,3 +6,9 @@ run_cmake(CheckStructHasMemberMissingLanguage) run_cmake(CheckStructHasMemberMissingKey) run_cmake(CheckStructHasMemberTooManyArguments) run_cmake(CheckStructHasMemberWrongKey) + +run_cmake(CheckTypeSizeOk) +run_cmake(CheckTypeSizeUnknownLanguage) +run_cmake(CheckTypeSizeMissingLanguage) +run_cmake(CheckTypeSizeUnknownArgument) +run_cmake(CheckTypeSizeMixedArgs) -- cgit v0.12