/*=========================================================================

  Program:   ParaView
  Module:    vtkCPTestDriver.h

  Copyright (c) Kitware, Inc.
  All rights reserved.
  See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.

     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notice for more information.

=========================================================================*/
// .NAME vtkCPTestDriver - Class for creating a co-processor test driver.
// .SECTION Description
// Class for creating a co-processor test driver.  It is intended
// as a framework for creating custom inputs replicating a simulation for 
// the co-processing library.

#ifndef vtkCPTestDriver_h
#define vtkCPTestDriver_h

#include "vtkObject.h"
#include "vtkPVCatalystTestDriverModule.h" // needed for export macros

class vtkCPBaseGridBuilder;

class VTKPVCATALYSTTESTDRIVER_EXPORT vtkCPTestDriver : public vtkObject
{
public:
  static vtkCPTestDriver * New();
  vtkTypeMacro(vtkCPTestDriver, vtkObject);
  void PrintSelf(ostream& os, vtkIndent indent);

  // Description:
  // Run the test driver.  Returns 0 if there were no errors.
  virtual int Run();

  // Description:
  // Set/get NumberOfTimeSteps.
  vtkSetMacro(NumberOfTimeSteps, unsigned long);
  vtkGetMacro(NumberOfTimeSteps, unsigned long);

  // Description:
  // Given a TimeStep, return the simulation time corresponding to 
  // that time step.  This implementation has constant time
  // steps between StartTime and EndTime.
  virtual double GetTime(unsigned long timeStep);

  // Description:
  // Set/get GridBuilder.  
  void SetGridBuilder(vtkCPBaseGridBuilder* gridBuilder);
  vtkCPBaseGridBuilder* GetGridBuilder();

  // Description:
  // Set/get the start and end times of the simulation.
  vtkSetMacro(StartTime, double);
  vtkGetMacro(StartTime, double);
  vtkSetMacro(EndTime, double);
  vtkGetMacro(EndTime, double);

protected:
  vtkCPTestDriver();
  ~vtkCPTestDriver();

private:
  vtkCPTestDriver(const vtkCPTestDriver&) VTK_DELETE_FUNCTION;
  void operator=(const vtkCPTestDriver&) VTK_DELETE_FUNCTION;

  // Description:
  // The grid builder for creating the input grids to the coprocessing library.
  vtkCPBaseGridBuilder* GridBuilder;

  // Description:
  // The total number of time steps the test driver will compute.
  // The time steps are numbered 0 through NumberOfTimeSteps-1.
  unsigned long NumberOfTimeSteps;

  // Description:
  // The start and end times of the simulation.
  double StartTime;
  double EndTime;
};

#endif
