Bläddra i källkod

Increase coverage, add tests

Sebastien Barre 24 år sedan
förälder
incheckning
914e051fd7

+ 8 - 0
Tests/Complex/CMakeLists.txt

@@ -50,4 +50,12 @@ ENDIF (EXECUTABLE_OUTPUT_PATH)
 SUBDIRS(Library Executable)
 SUBDIR_DEPENDS(Executable Library)
 
+#
+# Exec program
+# Increase coverage.
+#
+OPTION(EXEC_PROGRAM "Test EXEC_PROGRAM" ON)
+IF (EXEC_PROGRAM) 
+  EXEC_PROGRAM("echo EXEC_PROGRAM")
+ENDIF (EXEC_PROGRAM) 
 

+ 139 - 19
Tests/Complex/Executable/complex.cxx

@@ -29,6 +29,26 @@ void Passed(const char* Message, const char* m2="")
   passed++;
 }
 
+void TestAndRemoveFile(const char* filename) 
+{
+  struct stat fs;
+  if (stat(filename, &fs) != 0)
+    {
+    Failed("Could not find file: ", filename);
+    }
+  else
+    {
+    if (unlink(filename) != 0)
+      {
+      Failed("Unable to remove file. It does not imply that this test failed, but it *will* be corrupted thereafter if this file is not removed: ", filename);
+      }
+    else
+      {
+      Passed("Find and remove file: ", filename);
+      }
+    }
+}
+
 int main()
 {
   if(sharedFunction() != 1)
@@ -82,6 +102,13 @@ int main()
   Passed("ONE_VAR is defined.");
 #endif
   
+#ifndef ONE_VAR_IS_DEFINED
+  Failed("cmakedefine, SET or VARIABLE_REQUIRES is broken, "
+         "ONE_VAR_IS_DEFINED is not defined.");
+#else
+  Passed("ONE_VAR_IS_DEFINED is defined.");
+#endif
+  
 #ifdef ZERO_VAR
   Failed("cmakedefine is broken, ZERO_VAR is defined.");
 #else
@@ -89,12 +116,11 @@ int main()
 #endif
   
 #ifndef STRING_VAR
-  Failed("configureFile is broken, STRING_VAR is not defined.");
+  Failed("the CONFIGURE_FILE command is broken, STRING_VAR is not defined.");
 #else
   if(strcmp(STRING_VAR, "CMake is great") != 0)
     {
-    Failed("CMake is not great, so the SET command,"
-           "or the configurefile comand is broken.  STRING_VAR== ", 
+    Failed("the SET or CONFIGURE_FILE command is broken. STRING_VAR == ", 
            STRING_VAR);
     }
   else
@@ -103,28 +129,122 @@ int main()
     }
 #endif
 
-  // Attach a post-build custom-command to the lib.
-  // It run ${CREATE_FILE_EXE} which will create the file
-  // ${Complex_BINARY_DIR}/postbuild.txt.
-  // The 'complex' executable will then test if this file exists,
-  // and remove it.
+#ifndef FOREACH_VAR1
+  Failed("the FOREACH, SET or CONFIGURE_FILE command is broken, "
+         "FOREACH_VAR1 is not defined.");
+#else
+  if(strcmp(FOREACH_VAR1, "VALUE1") != 0)
+    {
+    Failed("the FOREACH, SET or CONFIGURE_FILE command is broken, "
+           "FOREACH_VAR1 == ", FOREACH_VAR1);
+    }
+  else
+    {
+    Passed("FOREACH_VAR1 == ", FOREACH_VAR1);
+    }
+#endif
 
-  struct stat fs;
-  if (stat(BINARY_DIR "/postbuild.txt", &fs) != 0)
+#ifndef FOREACH_VAR2
+  Failed("the FOREACH, SET or CONFIGURE_FILE command is broken, "
+         "FOREACH_VAR2 is not defined.");
+#else
+  if(strcmp(FOREACH_VAR2, "VALUE2") != 0)
     {
-    Failed("Could not find " BINARY_DIR "/postbuild.txt (created as a post-build custom command for the shared lib).");
+    Failed("the FOREACH, SET or CONFIGURE_FILE command is broken, "
+           "FOREACH_VAR2 == ", FOREACH_VAR2);
     }
   else
     {
-    if (unlink(BINARY_DIR "/postbuild.txt") != 0)
-      {
-      Failed("Unable to remove " BINARY_DIR "/postbuild.txt (does not imply that this test failed, but it *will* be corrupted thereafter if this file is not removed).");
-      }
-    else
-      {
-      Passed("Find and remove " BINARY_DIR "/postbuild.txt (created as a post-build custom command for the shared lib).");
-      }
+    Passed("FOREACH_VAR2 == ", FOREACH_VAR2);
+    }
+#endif
+
+#ifndef FILENAME_VAR_PATH_NAME
+  Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+         "FILENAME_VAR_PATH_NAME is not defined.");
+#else
+  if(strcmp(FILENAME_VAR_PATH_NAME, "Complex") != 0)
+    {
+    Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+           "FILENAME_VAR_PATH_NAME == ", FILENAME_VAR_PATH_NAME);
+    }
+  else
+    {
+    Passed("FILENAME_VAR_PATH_NAME == ", FILENAME_VAR_PATH_NAME);
     }
+#endif
+
+#ifndef FILENAME_VAR_NAME
+  Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+         "FILENAME_VAR_NAME is not defined.");
+#else
+  if(strcmp(FILENAME_VAR_NAME, "VarTests.txt") != 0)
+    {
+    Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+           "FILENAME_VAR_NAME == ", FILENAME_VAR_NAME);
+    }
+  else
+    {
+    Passed("FILENAME_VAR_NAME == ", FILENAME_VAR_NAME);
+    }
+#endif
+
+#ifndef FILENAME_VAR_EXT
+  Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+         "FILENAME_VAR_EXT is not defined.");
+#else
+  if(strcmp(FILENAME_VAR_EXT, ".txt") != 0)
+    {
+    Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+           "FILENAME_VAR_EXT == ", FILENAME_VAR_EXT);
+    }
+  else
+    {
+    Passed("FILENAME_VAR_EXT == ", FILENAME_VAR_EXT);
+    }
+#endif
+
+#ifndef FILENAME_VAR_NAME_WE
+  Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+         "FILENAME_VAR_NAME_WE is not defined.");
+#else
+  if(strcmp(FILENAME_VAR_NAME_WE, "VarTests") != 0)
+    {
+    Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+           "FILENAME_VAR_NAME_WE == ", FILENAME_VAR_NAME_WE);
+    }
+  else
+    {
+    Passed("FILENAME_VAR_NAME_WE == ", FILENAME_VAR_NAME_WE);
+    }
+#endif
+
+#ifndef PATH_VAR_NAME
+  Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+         "PATH_VAR_NAME is not defined.");
+#else
+  if(strcmp(PATH_VAR_NAME, "Complex") != 0)
+    {
+    Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+           "PATH_VAR_NAME == ", PATH_VAR_NAME);
+    }
+  else
+    {
+    Passed("PATH_VAR_NAME == ", PATH_VAR_NAME);
+    }
+#endif
+
+  // A post-build custom-command has been attached to the lib.
+  // It run ${CREATE_FILE_EXE} which will create the file
+  // ${Complex_BINARY_DIR}/postbuild.txt.
+
+  TestAndRemoveFile(BINARY_DIR "/postbuild.txt");
+
+  // A custom target has been created.
+  // It run ${CREATE_FILE_EXE} which will create the file
+  // ${Complex_BINARY_DIR}/custom_target1.txt.
+
+  TestAndRemoveFile(BINARY_DIR "/custom_target1.txt");
 
   std::cout << "Passed: " << passed << "\n";
   if(failed)

+ 23 - 3
Tests/Complex/Library/CMakeLists.txt

@@ -1,24 +1,44 @@
 AUX_SOURCE_DIRECTORY(ExtraSources LibrarySources)
 
-SOURCE_FILES(LibrarySources file2)
+# SOURCE_FILES_REMOVE is used for Coverage
+SOURCE_FILES(LibrarySources file2 GENERATED create_file.cxx)
+SOURCE_FILES_REMOVE(LibrarySources create_file.cxx) 
 ADD_LIBRARY(CMakeTestLibrary LibrarySources)
 
 SOURCE_FILES(SharedLibrarySources sharedFile)
 ADD_LIBRARY(CMakeTestLibraryShared SHARED SharedLibrarySources)
 
+#
+# Small utility used to create file
+#
 UTILITY_SOURCE(CREATE_FILE_EXE create_file "." create_file.cxx)
 ADD_EXECUTABLE(create_file create_file.cxx)
 
-ADD_DEPENDENCIES(CMakeTestLibraryShared create_file)
-
+#
 # Attach a post-build custom-command to the lib.
 # It run ${CREATE_FILE_EXE} which will create the file
 # ${Complex_BINARY_DIR}/postbuild.txt.
 # The 'complex' executable will then test if this file exists,
 # and remove it.
+#
+ADD_DEPENDENCIES(CMakeTestLibraryShared create_file)
 
 ADD_CUSTOM_COMMAND(SOURCE CMakeTestLibraryShared
                    COMMAND ${CREATE_FILE_EXE}
                    ARGS "${Complex_BINARY_DIR}/postbuild.txt"
                    TARGET CMakeTestLibraryShared)
 
+#
+# Add custom target
+# It run ${CREATE_FILE_EXE} which will create the file
+# ${Complex_BINARY_DIR}/custom_target1.txt.
+# The 'complex' executable will then test if this file exists,
+# and remove it.
+#
+ADD_CUSTOM_TARGET(custom_target1
+                  ALL
+                  ${CREATE_FILE_EXE} 
+                  "${Complex_BINARY_DIR}/custom_target1.txt")
+
+ADD_DEPENDENCIES(custom_target1 create_file)
+

+ 1 - 1
Tests/Complex/Library/create_file.cxx

@@ -22,7 +22,7 @@ int main (int argc, char *argv[])
     return EXIT_FAILURE;
     }
 
-  fprintf(stdout, "Creating %s!\n", argv[1]);
+  fprintf(stdout, ">> Creating %s!\n", argv[1]);
   
   return EXIT_SUCCESS;
 }

+ 28 - 3
Tests/Complex/VarTests.txt

@@ -1,11 +1,36 @@
-
 SET (ZERO_VAR 0)
+
 IF(ZERO_VAR)
-ADD_DEFINITIONS(-DSHOULD_NOT_BE_DEFINED)
+  ADD_DEFINITIONS(-DSHOULD_NOT_BE_DEFINED)
 ELSE(ZERO_VAR)
-ADD_DEFINITIONS(-DSHOULD_BE_DEFINED)
+  ADD_DEFINITIONS(-DSHOULD_BE_DEFINED)
 ENDIF(ZERO_VAR)
 
 SET(ONE_VAR 1)
 
+VARIABLE_REQUIRES(ONE_VAR
+                  ONE_VAR_IS_DEFINED ONE_VAR)
+
 SET(STRING_VAR "CMake is great" CACHE STRING "test a cache variable")
+
+FOREACH (INDEX 1 2)
+  SET(FOREACH_VAR${INDEX} "VALUE${INDEX}")
+ENDFOREACH(INDEX)
+
+FIND_FILE(FILENAME_VAR "VarTests.txt" ${Complex_SOURCE_DIR})
+
+GET_FILENAME_COMPONENT(FILENAME_VAR_PATH ${FILENAME_VAR} PATH)
+GET_FILENAME_COMPONENT(FILENAME_VAR_PATH_NAME ${FILENAME_VAR_PATH} NAME)
+GET_FILENAME_COMPONENT(FILENAME_VAR_NAME ${FILENAME_VAR} NAME)
+GET_FILENAME_COMPONENT(FILENAME_VAR_EXT ${FILENAME_VAR} EXT)
+GET_FILENAME_COMPONENT(FILENAME_VAR_NAME_WE ${FILENAME_VAR} NAME_WE)
+
+FIND_PATH(PATH_VAR "VarTests.txt" ${Complex_SOURCE_DIR})
+GET_FILENAME_COMPONENT(PATH_VAR_NAME ${PATH_VAR} NAME)
+
+# Coverage only
+
+BUILD_COMMAND(BUILD_COMMAND_VAR ${CMAKE_MAKE_PROGRAM})
+BUILD_NAME(BUILD_NAME_VAR)
+SITE_NAME(SITE_NAME_VAR)
+

+ 21 - 1
Tests/Complex/cmTestConfigure.h.in

@@ -1,10 +1,30 @@
 #cmakedefine ONE_VAR
+#cmakedefine ONE_VAR_IS_DEFINED
 #cmakedefine ZERO_VAR
+
 #define STRING_VAR "${STRING_VAR}"
 
-#define BINARY_DIR "${Complex_BINARY_DIR}"
+#define FOREACH_VAR1 "${FOREACH_VAR1}"
+#define FOREACH_VAR2 "${FOREACH_VAR2}"
+
+#define FILENAME_VAR_PATH_NAME "${FILENAME_VAR_PATH_NAME}"
+#define FILENAME_VAR_NAME "${FILENAME_VAR_NAME}"
+#define FILENAME_VAR_EXT "${FILENAME_VAR_EXT}"
+#define FILENAME_VAR_NAME_WE "${FILENAME_VAR_NAME_WE}"
+
+#define PATH_VAR_NAME "${PATH_VAR_NAME}"
 
 #cmakedefine CMAKE_NO_STD_NAMESPACE
 #cmakedefine CMAKE_NO_ANSI_STREAM_HEADERS
 #cmakedefine CMAKE_NO_ANSI_FOR_SCOPE
 
+// Needed to check for files
+
+#define BINARY_DIR "${Complex_BINARY_DIR}"
+
+// Coverage only
+
+#define BUILD_COMMAND_VAR "${BUILD_COMMAND_VAR}"
+#define BUILD_NAME_VAR "${BUILD_NAME_VAR}"
+#define SITE_NAME_VAR "${SITE_NAME_VAR}"
+

+ 8 - 0
Tests/ComplexOneConfig/CMakeLists.txt

@@ -50,4 +50,12 @@ ENDIF (EXECUTABLE_OUTPUT_PATH)
 SUBDIRS(Library Executable)
 SUBDIR_DEPENDS(Executable Library)
 
+#
+# Exec program
+# Increase coverage.
+#
+OPTION(EXEC_PROGRAM "Test EXEC_PROGRAM" ON)
+IF (EXEC_PROGRAM) 
+  EXEC_PROGRAM("echo EXEC_PROGRAM")
+ENDIF (EXEC_PROGRAM) 
 

+ 139 - 19
Tests/ComplexOneConfig/Executable/complex.cxx

@@ -29,6 +29,26 @@ void Passed(const char* Message, const char* m2="")
   passed++;
 }
 
+void TestAndRemoveFile(const char* filename) 
+{
+  struct stat fs;
+  if (stat(filename, &fs) != 0)
+    {
+    Failed("Could not find file: ", filename);
+    }
+  else
+    {
+    if (unlink(filename) != 0)
+      {
+      Failed("Unable to remove file. It does not imply that this test failed, but it *will* be corrupted thereafter if this file is not removed: ", filename);
+      }
+    else
+      {
+      Passed("Find and remove file: ", filename);
+      }
+    }
+}
+
 int main()
 {
   if(sharedFunction() != 1)
@@ -82,6 +102,13 @@ int main()
   Passed("ONE_VAR is defined.");
 #endif
   
+#ifndef ONE_VAR_IS_DEFINED
+  Failed("cmakedefine, SET or VARIABLE_REQUIRES is broken, "
+         "ONE_VAR_IS_DEFINED is not defined.");
+#else
+  Passed("ONE_VAR_IS_DEFINED is defined.");
+#endif
+  
 #ifdef ZERO_VAR
   Failed("cmakedefine is broken, ZERO_VAR is defined.");
 #else
@@ -89,12 +116,11 @@ int main()
 #endif
   
 #ifndef STRING_VAR
-  Failed("configureFile is broken, STRING_VAR is not defined.");
+  Failed("the CONFIGURE_FILE command is broken, STRING_VAR is not defined.");
 #else
   if(strcmp(STRING_VAR, "CMake is great") != 0)
     {
-    Failed("CMake is not great, so the SET command,"
-           "or the configurefile comand is broken.  STRING_VAR== ", 
+    Failed("the SET or CONFIGURE_FILE command is broken. STRING_VAR == ", 
            STRING_VAR);
     }
   else
@@ -103,28 +129,122 @@ int main()
     }
 #endif
 
-  // Attach a post-build custom-command to the lib.
-  // It run ${CREATE_FILE_EXE} which will create the file
-  // ${Complex_BINARY_DIR}/postbuild.txt.
-  // The 'complex' executable will then test if this file exists,
-  // and remove it.
+#ifndef FOREACH_VAR1
+  Failed("the FOREACH, SET or CONFIGURE_FILE command is broken, "
+         "FOREACH_VAR1 is not defined.");
+#else
+  if(strcmp(FOREACH_VAR1, "VALUE1") != 0)
+    {
+    Failed("the FOREACH, SET or CONFIGURE_FILE command is broken, "
+           "FOREACH_VAR1 == ", FOREACH_VAR1);
+    }
+  else
+    {
+    Passed("FOREACH_VAR1 == ", FOREACH_VAR1);
+    }
+#endif
 
-  struct stat fs;
-  if (stat(BINARY_DIR "/postbuild.txt", &fs) != 0)
+#ifndef FOREACH_VAR2
+  Failed("the FOREACH, SET or CONFIGURE_FILE command is broken, "
+         "FOREACH_VAR2 is not defined.");
+#else
+  if(strcmp(FOREACH_VAR2, "VALUE2") != 0)
     {
-    Failed("Could not find " BINARY_DIR "/postbuild.txt (created as a post-build custom command for the shared lib).");
+    Failed("the FOREACH, SET or CONFIGURE_FILE command is broken, "
+           "FOREACH_VAR2 == ", FOREACH_VAR2);
     }
   else
     {
-    if (unlink(BINARY_DIR "/postbuild.txt") != 0)
-      {
-      Failed("Unable to remove " BINARY_DIR "/postbuild.txt (does not imply that this test failed, but it *will* be corrupted thereafter if this file is not removed).");
-      }
-    else
-      {
-      Passed("Find and remove " BINARY_DIR "/postbuild.txt (created as a post-build custom command for the shared lib).");
-      }
+    Passed("FOREACH_VAR2 == ", FOREACH_VAR2);
+    }
+#endif
+
+#ifndef FILENAME_VAR_PATH_NAME
+  Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+         "FILENAME_VAR_PATH_NAME is not defined.");
+#else
+  if(strcmp(FILENAME_VAR_PATH_NAME, "Complex") != 0)
+    {
+    Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+           "FILENAME_VAR_PATH_NAME == ", FILENAME_VAR_PATH_NAME);
+    }
+  else
+    {
+    Passed("FILENAME_VAR_PATH_NAME == ", FILENAME_VAR_PATH_NAME);
     }
+#endif
+
+#ifndef FILENAME_VAR_NAME
+  Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+         "FILENAME_VAR_NAME is not defined.");
+#else
+  if(strcmp(FILENAME_VAR_NAME, "VarTests.txt") != 0)
+    {
+    Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+           "FILENAME_VAR_NAME == ", FILENAME_VAR_NAME);
+    }
+  else
+    {
+    Passed("FILENAME_VAR_NAME == ", FILENAME_VAR_NAME);
+    }
+#endif
+
+#ifndef FILENAME_VAR_EXT
+  Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+         "FILENAME_VAR_EXT is not defined.");
+#else
+  if(strcmp(FILENAME_VAR_EXT, ".txt") != 0)
+    {
+    Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+           "FILENAME_VAR_EXT == ", FILENAME_VAR_EXT);
+    }
+  else
+    {
+    Passed("FILENAME_VAR_EXT == ", FILENAME_VAR_EXT);
+    }
+#endif
+
+#ifndef FILENAME_VAR_NAME_WE
+  Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+         "FILENAME_VAR_NAME_WE is not defined.");
+#else
+  if(strcmp(FILENAME_VAR_NAME_WE, "VarTests") != 0)
+    {
+    Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+           "FILENAME_VAR_NAME_WE == ", FILENAME_VAR_NAME_WE);
+    }
+  else
+    {
+    Passed("FILENAME_VAR_NAME_WE == ", FILENAME_VAR_NAME_WE);
+    }
+#endif
+
+#ifndef PATH_VAR_NAME
+  Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+         "PATH_VAR_NAME is not defined.");
+#else
+  if(strcmp(PATH_VAR_NAME, "Complex") != 0)
+    {
+    Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+           "PATH_VAR_NAME == ", PATH_VAR_NAME);
+    }
+  else
+    {
+    Passed("PATH_VAR_NAME == ", PATH_VAR_NAME);
+    }
+#endif
+
+  // A post-build custom-command has been attached to the lib.
+  // It run ${CREATE_FILE_EXE} which will create the file
+  // ${Complex_BINARY_DIR}/postbuild.txt.
+
+  TestAndRemoveFile(BINARY_DIR "/postbuild.txt");
+
+  // A custom target has been created.
+  // It run ${CREATE_FILE_EXE} which will create the file
+  // ${Complex_BINARY_DIR}/custom_target1.txt.
+
+  TestAndRemoveFile(BINARY_DIR "/custom_target1.txt");
 
   std::cout << "Passed: " << passed << "\n";
   if(failed)

+ 23 - 3
Tests/ComplexOneConfig/Library/CMakeLists.txt

@@ -1,24 +1,44 @@
 AUX_SOURCE_DIRECTORY(ExtraSources LibrarySources)
 
-SOURCE_FILES(LibrarySources file2)
+# SOURCE_FILES_REMOVE is used for Coverage
+SOURCE_FILES(LibrarySources file2 GENERATED create_file.cxx)
+SOURCE_FILES_REMOVE(LibrarySources create_file.cxx) 
 ADD_LIBRARY(CMakeTestLibrary LibrarySources)
 
 SOURCE_FILES(SharedLibrarySources sharedFile)
 ADD_LIBRARY(CMakeTestLibraryShared SHARED SharedLibrarySources)
 
+#
+# Small utility used to create file
+#
 UTILITY_SOURCE(CREATE_FILE_EXE create_file "." create_file.cxx)
 ADD_EXECUTABLE(create_file create_file.cxx)
 
-ADD_DEPENDENCIES(CMakeTestLibraryShared create_file)
-
+#
 # Attach a post-build custom-command to the lib.
 # It run ${CREATE_FILE_EXE} which will create the file
 # ${Complex_BINARY_DIR}/postbuild.txt.
 # The 'complex' executable will then test if this file exists,
 # and remove it.
+#
+ADD_DEPENDENCIES(CMakeTestLibraryShared create_file)
 
 ADD_CUSTOM_COMMAND(SOURCE CMakeTestLibraryShared
                    COMMAND ${CREATE_FILE_EXE}
                    ARGS "${Complex_BINARY_DIR}/postbuild.txt"
                    TARGET CMakeTestLibraryShared)
 
+#
+# Add custom target
+# It run ${CREATE_FILE_EXE} which will create the file
+# ${Complex_BINARY_DIR}/custom_target1.txt.
+# The 'complex' executable will then test if this file exists,
+# and remove it.
+#
+ADD_CUSTOM_TARGET(custom_target1
+                  ALL
+                  ${CREATE_FILE_EXE} 
+                  "${Complex_BINARY_DIR}/custom_target1.txt")
+
+ADD_DEPENDENCIES(custom_target1 create_file)
+

+ 1 - 1
Tests/ComplexOneConfig/Library/create_file.cxx

@@ -22,7 +22,7 @@ int main (int argc, char *argv[])
     return EXIT_FAILURE;
     }
 
-  fprintf(stdout, "Creating %s!\n", argv[1]);
+  fprintf(stdout, ">> Creating %s!\n", argv[1]);
   
   return EXIT_SUCCESS;
 }

+ 28 - 3
Tests/ComplexOneConfig/VarTests.txt

@@ -1,11 +1,36 @@
-
 SET (ZERO_VAR 0)
+
 IF(ZERO_VAR)
-ADD_DEFINITIONS(-DSHOULD_NOT_BE_DEFINED)
+  ADD_DEFINITIONS(-DSHOULD_NOT_BE_DEFINED)
 ELSE(ZERO_VAR)
-ADD_DEFINITIONS(-DSHOULD_BE_DEFINED)
+  ADD_DEFINITIONS(-DSHOULD_BE_DEFINED)
 ENDIF(ZERO_VAR)
 
 SET(ONE_VAR 1)
 
+VARIABLE_REQUIRES(ONE_VAR
+                  ONE_VAR_IS_DEFINED ONE_VAR)
+
 SET(STRING_VAR "CMake is great" CACHE STRING "test a cache variable")
+
+FOREACH (INDEX 1 2)
+  SET(FOREACH_VAR${INDEX} "VALUE${INDEX}")
+ENDFOREACH(INDEX)
+
+FIND_FILE(FILENAME_VAR "VarTests.txt" ${Complex_SOURCE_DIR})
+
+GET_FILENAME_COMPONENT(FILENAME_VAR_PATH ${FILENAME_VAR} PATH)
+GET_FILENAME_COMPONENT(FILENAME_VAR_PATH_NAME ${FILENAME_VAR_PATH} NAME)
+GET_FILENAME_COMPONENT(FILENAME_VAR_NAME ${FILENAME_VAR} NAME)
+GET_FILENAME_COMPONENT(FILENAME_VAR_EXT ${FILENAME_VAR} EXT)
+GET_FILENAME_COMPONENT(FILENAME_VAR_NAME_WE ${FILENAME_VAR} NAME_WE)
+
+FIND_PATH(PATH_VAR "VarTests.txt" ${Complex_SOURCE_DIR})
+GET_FILENAME_COMPONENT(PATH_VAR_NAME ${PATH_VAR} NAME)
+
+# Coverage only
+
+BUILD_COMMAND(BUILD_COMMAND_VAR ${CMAKE_MAKE_PROGRAM})
+BUILD_NAME(BUILD_NAME_VAR)
+SITE_NAME(SITE_NAME_VAR)
+

+ 21 - 1
Tests/ComplexOneConfig/cmTestConfigure.h.in

@@ -1,10 +1,30 @@
 #cmakedefine ONE_VAR
+#cmakedefine ONE_VAR_IS_DEFINED
 #cmakedefine ZERO_VAR
+
 #define STRING_VAR "${STRING_VAR}"
 
-#define BINARY_DIR "${Complex_BINARY_DIR}"
+#define FOREACH_VAR1 "${FOREACH_VAR1}"
+#define FOREACH_VAR2 "${FOREACH_VAR2}"
+
+#define FILENAME_VAR_PATH_NAME "${FILENAME_VAR_PATH_NAME}"
+#define FILENAME_VAR_NAME "${FILENAME_VAR_NAME}"
+#define FILENAME_VAR_EXT "${FILENAME_VAR_EXT}"
+#define FILENAME_VAR_NAME_WE "${FILENAME_VAR_NAME_WE}"
+
+#define PATH_VAR_NAME "${PATH_VAR_NAME}"
 
 #cmakedefine CMAKE_NO_STD_NAMESPACE
 #cmakedefine CMAKE_NO_ANSI_STREAM_HEADERS
 #cmakedefine CMAKE_NO_ANSI_FOR_SCOPE
 
+// Needed to check for files
+
+#define BINARY_DIR "${Complex_BINARY_DIR}"
+
+// Coverage only
+
+#define BUILD_COMMAND_VAR "${BUILD_COMMAND_VAR}"
+#define BUILD_NAME_VAR "${BUILD_NAME_VAR}"
+#define SITE_NAME_VAR "${SITE_NAME_VAR}"
+

+ 8 - 0
Tests/ComplexRelativePaths/CMakeLists.txt

@@ -50,4 +50,12 @@ ENDIF (EXECUTABLE_OUTPUT_PATH)
 SUBDIRS(Library Executable)
 SUBDIR_DEPENDS(Executable Library)
 
+#
+# Exec program
+# Increase coverage.
+#
+OPTION(EXEC_PROGRAM "Test EXEC_PROGRAM" ON)
+IF (EXEC_PROGRAM) 
+  EXEC_PROGRAM("echo EXEC_PROGRAM")
+ENDIF (EXEC_PROGRAM) 
 

+ 139 - 19
Tests/ComplexRelativePaths/Executable/complex.cxx

@@ -29,6 +29,26 @@ void Passed(const char* Message, const char* m2="")
   passed++;
 }
 
+void TestAndRemoveFile(const char* filename) 
+{
+  struct stat fs;
+  if (stat(filename, &fs) != 0)
+    {
+    Failed("Could not find file: ", filename);
+    }
+  else
+    {
+    if (unlink(filename) != 0)
+      {
+      Failed("Unable to remove file. It does not imply that this test failed, but it *will* be corrupted thereafter if this file is not removed: ", filename);
+      }
+    else
+      {
+      Passed("Find and remove file: ", filename);
+      }
+    }
+}
+
 int main()
 {
   if(sharedFunction() != 1)
@@ -82,6 +102,13 @@ int main()
   Passed("ONE_VAR is defined.");
 #endif
   
+#ifndef ONE_VAR_IS_DEFINED
+  Failed("cmakedefine, SET or VARIABLE_REQUIRES is broken, "
+         "ONE_VAR_IS_DEFINED is not defined.");
+#else
+  Passed("ONE_VAR_IS_DEFINED is defined.");
+#endif
+  
 #ifdef ZERO_VAR
   Failed("cmakedefine is broken, ZERO_VAR is defined.");
 #else
@@ -89,12 +116,11 @@ int main()
 #endif
   
 #ifndef STRING_VAR
-  Failed("configureFile is broken, STRING_VAR is not defined.");
+  Failed("the CONFIGURE_FILE command is broken, STRING_VAR is not defined.");
 #else
   if(strcmp(STRING_VAR, "CMake is great") != 0)
     {
-    Failed("CMake is not great, so the SET command,"
-           "or the configurefile comand is broken.  STRING_VAR== ", 
+    Failed("the SET or CONFIGURE_FILE command is broken. STRING_VAR == ", 
            STRING_VAR);
     }
   else
@@ -103,28 +129,122 @@ int main()
     }
 #endif
 
-  // Attach a post-build custom-command to the lib.
-  // It run ${CREATE_FILE_EXE} which will create the file
-  // ${Complex_BINARY_DIR}/postbuild.txt.
-  // The 'complex' executable will then test if this file exists,
-  // and remove it.
+#ifndef FOREACH_VAR1
+  Failed("the FOREACH, SET or CONFIGURE_FILE command is broken, "
+         "FOREACH_VAR1 is not defined.");
+#else
+  if(strcmp(FOREACH_VAR1, "VALUE1") != 0)
+    {
+    Failed("the FOREACH, SET or CONFIGURE_FILE command is broken, "
+           "FOREACH_VAR1 == ", FOREACH_VAR1);
+    }
+  else
+    {
+    Passed("FOREACH_VAR1 == ", FOREACH_VAR1);
+    }
+#endif
 
-  struct stat fs;
-  if (stat(BINARY_DIR "/postbuild.txt", &fs) != 0)
+#ifndef FOREACH_VAR2
+  Failed("the FOREACH, SET or CONFIGURE_FILE command is broken, "
+         "FOREACH_VAR2 is not defined.");
+#else
+  if(strcmp(FOREACH_VAR2, "VALUE2") != 0)
     {
-    Failed("Could not find " BINARY_DIR "/postbuild.txt (created as a post-build custom command for the shared lib).");
+    Failed("the FOREACH, SET or CONFIGURE_FILE command is broken, "
+           "FOREACH_VAR2 == ", FOREACH_VAR2);
     }
   else
     {
-    if (unlink(BINARY_DIR "/postbuild.txt") != 0)
-      {
-      Failed("Unable to remove " BINARY_DIR "/postbuild.txt (does not imply that this test failed, but it *will* be corrupted thereafter if this file is not removed).");
-      }
-    else
-      {
-      Passed("Find and remove " BINARY_DIR "/postbuild.txt (created as a post-build custom command for the shared lib).");
-      }
+    Passed("FOREACH_VAR2 == ", FOREACH_VAR2);
+    }
+#endif
+
+#ifndef FILENAME_VAR_PATH_NAME
+  Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+         "FILENAME_VAR_PATH_NAME is not defined.");
+#else
+  if(strcmp(FILENAME_VAR_PATH_NAME, "Complex") != 0)
+    {
+    Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+           "FILENAME_VAR_PATH_NAME == ", FILENAME_VAR_PATH_NAME);
+    }
+  else
+    {
+    Passed("FILENAME_VAR_PATH_NAME == ", FILENAME_VAR_PATH_NAME);
     }
+#endif
+
+#ifndef FILENAME_VAR_NAME
+  Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+         "FILENAME_VAR_NAME is not defined.");
+#else
+  if(strcmp(FILENAME_VAR_NAME, "VarTests.txt") != 0)
+    {
+    Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+           "FILENAME_VAR_NAME == ", FILENAME_VAR_NAME);
+    }
+  else
+    {
+    Passed("FILENAME_VAR_NAME == ", FILENAME_VAR_NAME);
+    }
+#endif
+
+#ifndef FILENAME_VAR_EXT
+  Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+         "FILENAME_VAR_EXT is not defined.");
+#else
+  if(strcmp(FILENAME_VAR_EXT, ".txt") != 0)
+    {
+    Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+           "FILENAME_VAR_EXT == ", FILENAME_VAR_EXT);
+    }
+  else
+    {
+    Passed("FILENAME_VAR_EXT == ", FILENAME_VAR_EXT);
+    }
+#endif
+
+#ifndef FILENAME_VAR_NAME_WE
+  Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+         "FILENAME_VAR_NAME_WE is not defined.");
+#else
+  if(strcmp(FILENAME_VAR_NAME_WE, "VarTests") != 0)
+    {
+    Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+           "FILENAME_VAR_NAME_WE == ", FILENAME_VAR_NAME_WE);
+    }
+  else
+    {
+    Passed("FILENAME_VAR_NAME_WE == ", FILENAME_VAR_NAME_WE);
+    }
+#endif
+
+#ifndef PATH_VAR_NAME
+  Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+         "PATH_VAR_NAME is not defined.");
+#else
+  if(strcmp(PATH_VAR_NAME, "Complex") != 0)
+    {
+    Failed("the FIND_FILE or GET_FILENAME_COMPONENT command is broken, "
+           "PATH_VAR_NAME == ", PATH_VAR_NAME);
+    }
+  else
+    {
+    Passed("PATH_VAR_NAME == ", PATH_VAR_NAME);
+    }
+#endif
+
+  // A post-build custom-command has been attached to the lib.
+  // It run ${CREATE_FILE_EXE} which will create the file
+  // ${Complex_BINARY_DIR}/postbuild.txt.
+
+  TestAndRemoveFile(BINARY_DIR "/postbuild.txt");
+
+  // A custom target has been created.
+  // It run ${CREATE_FILE_EXE} which will create the file
+  // ${Complex_BINARY_DIR}/custom_target1.txt.
+
+  TestAndRemoveFile(BINARY_DIR "/custom_target1.txt");
 
   std::cout << "Passed: " << passed << "\n";
   if(failed)

+ 23 - 3
Tests/ComplexRelativePaths/Library/CMakeLists.txt

@@ -1,24 +1,44 @@
 AUX_SOURCE_DIRECTORY(ExtraSources LibrarySources)
 
-SOURCE_FILES(LibrarySources file2)
+# SOURCE_FILES_REMOVE is used for Coverage
+SOURCE_FILES(LibrarySources file2 GENERATED create_file.cxx)
+SOURCE_FILES_REMOVE(LibrarySources create_file.cxx) 
 ADD_LIBRARY(CMakeTestLibrary LibrarySources)
 
 SOURCE_FILES(SharedLibrarySources sharedFile)
 ADD_LIBRARY(CMakeTestLibraryShared SHARED SharedLibrarySources)
 
+#
+# Small utility used to create file
+#
 UTILITY_SOURCE(CREATE_FILE_EXE create_file "." create_file.cxx)
 ADD_EXECUTABLE(create_file create_file.cxx)
 
-ADD_DEPENDENCIES(CMakeTestLibraryShared create_file)
-
+#
 # Attach a post-build custom-command to the lib.
 # It run ${CREATE_FILE_EXE} which will create the file
 # ${Complex_BINARY_DIR}/postbuild.txt.
 # The 'complex' executable will then test if this file exists,
 # and remove it.
+#
+ADD_DEPENDENCIES(CMakeTestLibraryShared create_file)
 
 ADD_CUSTOM_COMMAND(SOURCE CMakeTestLibraryShared
                    COMMAND ${CREATE_FILE_EXE}
                    ARGS "${Complex_BINARY_DIR}/postbuild.txt"
                    TARGET CMakeTestLibraryShared)
 
+#
+# Add custom target
+# It run ${CREATE_FILE_EXE} which will create the file
+# ${Complex_BINARY_DIR}/custom_target1.txt.
+# The 'complex' executable will then test if this file exists,
+# and remove it.
+#
+ADD_CUSTOM_TARGET(custom_target1
+                  ALL
+                  ${CREATE_FILE_EXE} 
+                  "${Complex_BINARY_DIR}/custom_target1.txt")
+
+ADD_DEPENDENCIES(custom_target1 create_file)
+

+ 1 - 1
Tests/ComplexRelativePaths/Library/create_file.cxx

@@ -22,7 +22,7 @@ int main (int argc, char *argv[])
     return EXIT_FAILURE;
     }
 
-  fprintf(stdout, "Creating %s!\n", argv[1]);
+  fprintf(stdout, ">> Creating %s!\n", argv[1]);
   
   return EXIT_SUCCESS;
 }

+ 28 - 3
Tests/ComplexRelativePaths/VarTests.txt

@@ -1,11 +1,36 @@
-
 SET (ZERO_VAR 0)
+
 IF(ZERO_VAR)
-ADD_DEFINITIONS(-DSHOULD_NOT_BE_DEFINED)
+  ADD_DEFINITIONS(-DSHOULD_NOT_BE_DEFINED)
 ELSE(ZERO_VAR)
-ADD_DEFINITIONS(-DSHOULD_BE_DEFINED)
+  ADD_DEFINITIONS(-DSHOULD_BE_DEFINED)
 ENDIF(ZERO_VAR)
 
 SET(ONE_VAR 1)
 
+VARIABLE_REQUIRES(ONE_VAR
+                  ONE_VAR_IS_DEFINED ONE_VAR)
+
 SET(STRING_VAR "CMake is great" CACHE STRING "test a cache variable")
+
+FOREACH (INDEX 1 2)
+  SET(FOREACH_VAR${INDEX} "VALUE${INDEX}")
+ENDFOREACH(INDEX)
+
+FIND_FILE(FILENAME_VAR "VarTests.txt" ${Complex_SOURCE_DIR})
+
+GET_FILENAME_COMPONENT(FILENAME_VAR_PATH ${FILENAME_VAR} PATH)
+GET_FILENAME_COMPONENT(FILENAME_VAR_PATH_NAME ${FILENAME_VAR_PATH} NAME)
+GET_FILENAME_COMPONENT(FILENAME_VAR_NAME ${FILENAME_VAR} NAME)
+GET_FILENAME_COMPONENT(FILENAME_VAR_EXT ${FILENAME_VAR} EXT)
+GET_FILENAME_COMPONENT(FILENAME_VAR_NAME_WE ${FILENAME_VAR} NAME_WE)
+
+FIND_PATH(PATH_VAR "VarTests.txt" ${Complex_SOURCE_DIR})
+GET_FILENAME_COMPONENT(PATH_VAR_NAME ${PATH_VAR} NAME)
+
+# Coverage only
+
+BUILD_COMMAND(BUILD_COMMAND_VAR ${CMAKE_MAKE_PROGRAM})
+BUILD_NAME(BUILD_NAME_VAR)
+SITE_NAME(SITE_NAME_VAR)
+

+ 21 - 1
Tests/ComplexRelativePaths/cmTestConfigure.h.in

@@ -1,10 +1,30 @@
 #cmakedefine ONE_VAR
+#cmakedefine ONE_VAR_IS_DEFINED
 #cmakedefine ZERO_VAR
+
 #define STRING_VAR "${STRING_VAR}"
 
-#define BINARY_DIR "${Complex_BINARY_DIR}"
+#define FOREACH_VAR1 "${FOREACH_VAR1}"
+#define FOREACH_VAR2 "${FOREACH_VAR2}"
+
+#define FILENAME_VAR_PATH_NAME "${FILENAME_VAR_PATH_NAME}"
+#define FILENAME_VAR_NAME "${FILENAME_VAR_NAME}"
+#define FILENAME_VAR_EXT "${FILENAME_VAR_EXT}"
+#define FILENAME_VAR_NAME_WE "${FILENAME_VAR_NAME_WE}"
+
+#define PATH_VAR_NAME "${PATH_VAR_NAME}"
 
 #cmakedefine CMAKE_NO_STD_NAMESPACE
 #cmakedefine CMAKE_NO_ANSI_STREAM_HEADERS
 #cmakedefine CMAKE_NO_ANSI_FOR_SCOPE
 
+// Needed to check for files
+
+#define BINARY_DIR "${Complex_BINARY_DIR}"
+
+// Coverage only
+
+#define BUILD_COMMAND_VAR "${BUILD_COMMAND_VAR}"
+#define BUILD_NAME_VAR "${BUILD_NAME_VAR}"
+#define SITE_NAME_VAR "${SITE_NAME_VAR}"
+