/*============================================================================
  CMake - Cross Platform Makefile Generator
  Copyright 2000-2009 Kitware, Inc., Insight Software Consortium

  Distributed under the OSI-approved BSD License (the "License");
  see accompanying file Copyright.txt for details.

  This software is distributed WITHOUT ANY WARRANTY; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the License for more information.
============================================================================*/
#ifndef cmAddTestCommand_h
#define cmAddTestCommand_h

#include "cmCommand.h"

/** \class cmAddTestCommand
 * \brief Add a test to the lists of tests to run.
 *
 * cmAddTestCommand adds a test to the list of tests to run .
 */
class cmAddTestCommand : public cmCommand
{
public:
  /**
   * This is a virtual constructor for the command.
   */
  virtual cmCommand* Clone() 
    {
    return new cmAddTestCommand;
    }

  /**
   * This is called when the command is first encountered in
   * the CMakeLists.txt file.
   */
  virtual bool InitialPass(std::vector<std::string> const& args,
                           cmExecutionStatus &status);

  /**
   * The name of the command as specified in CMakeList.txt.
   */
  virtual const char* GetName() { return "add_test";}

  /**
   * Succinct documentation.
   */
  virtual const char* GetTerseDocumentation() 
    {
    return "Add a test to the project with the specified arguments.";
    }
  
  /**
   * More documentation.
   */
  virtual const char* GetFullDocumentation()
    {
    return
      "  add_test(testname Exename arg1 arg2 ... )\n"
      "If the ENABLE_TESTING command has been run, this command adds a "
      "test target to the current directory. If ENABLE_TESTING has not "
      "been run, this command does nothing.  "
      "The tests are run by the testing subsystem by executing Exename "
      "with the specified arguments.  Exename can be either an executable "
      "built by this project or an arbitrary executable on the "
      "system (like tclsh).  The test will be run with the current working "
      "directory set to the CMakeList.txt files corresponding directory "
      "in the binary tree.\n"
      "\n"
      "  add_test(NAME <name> [CONFIGURATIONS [Debug|Release|...]]\n"
      "           COMMAND <command> [arg1 [arg2 ...]])\n"
      "If COMMAND specifies an executable target (created by "
      "add_executable) it will automatically be replaced by the location "
      "of the executable created at build time.  "
      "If a CONFIGURATIONS option is given then the test will be executed "
      "only when testing under one of the named configurations."
      "\n"
      "Arguments after COMMAND may use \"generator expressions\" with the "
      "syntax \"$<...>\".  "
      "These expressions are evaluted during build system generation and "
      "produce information specific to each generated build configuration.  "
      "Valid expressions are:\n"
      "  $<CONFIGURATION>          = configuration name\n"
      "  $<TARGET_FILE:tgt>        = main file (.exe, .so.1.2, .a)\n"
      "  $<TARGET_LINKER_FILE:tgt> = file used to link (.a, .lib, .so)\n"
      "  $<TARGET_SONAME_FILE:tgt> = file with soname (.so.3)\n"
      "where \"tgt\" is the name of a target.  "
      "Target file expressions produce a full path, but _DIR and _NAME "
      "versions can produce the directory and file name components:\n"
      "  $<TARGET_FILE_DIR:tgt>/$<TARGET_FILE_NAME:tgt>\n"
      "  $<TARGET_LINKER_FILE_DIR:tgt>/$<TARGET_LINKER_FILE_NAME:tgt>\n"
      "  $<TARGET_SONAME_FILE_DIR:tgt>/$<TARGET_SONAME_FILE_NAME:tgt>\n"
      "Example usage:\n"
      "  add_test(NAME mytest\n"
      "           COMMAND testDriver --config $<CONFIGURATION>\n"
      "                              --exe $<TARGET_FILE:myexe>)\n"
      "This creates a test \"mytest\" whose command runs a testDriver "
      "tool passing the configuration name and the full path to the "
      "executable file produced by target \"myexe\"."
      ;
    }
  
  cmTypeMacro(cmAddTestCommand, cmCommand);
private:
  bool HandleNameMode(std::vector<std::string> const& args);
};


#endif
