OGS
ApplicationsLib::TestDefinition Class Referencefinal

Detailed Description

Definition at line 25 of file TestDefinition.h.

#include <TestDefinition.h>

Public Member Functions

 TestDefinition (BaseLib::ConfigTree const &config_tree, std::string const &reference_path, std::string const &output_directory)
 
bool runTests () const
 
std::vector< std::string > const & getOutputFiles () const
 
std::size_t numberOfTests () const
 

Private Attributes

std::vector< std::string > _command_lines
 
std::vector< std::string > _output_files
 

Constructor & Destructor Documentation

◆ TestDefinition()

ApplicationsLib::TestDefinition::TestDefinition ( BaseLib::ConfigTree const &  config_tree,
std::string const &  reference_path,
std::string const &  output_directory 
)

Constructs test definition from the config and reference path essentially constructing the command lines to be run on run() function call.

Input File Parameter:
prj__test_definition__vtkdiff
Input File Parameter:
prj__test_definition__vtkdiff__field
Input File Parameter:
prj__test_definition__vtkdiff__regex
Input File Parameter:
prj__test_definition__vtkdiff__file
Input File Parameter:
prj__test_definition__vtkdiff__absolute_tolerance
Input File Parameter:
prj__test_definition__vtkdiff__relative_tolerance

Definition at line 147 of file TestDefinition.cpp.

150 {
151  if (reference_path.empty())
152  {
153  OGS_FATAL(
154  "Reference path containing expected result files can not be "
155  "empty.");
156  }
157 
158  std::string const vtkdiff = findVtkdiff();
159 
160  // Construct command lines for each entry.
162  auto const& vtkdiff_configs = config_tree.getConfigSubtreeList("vtkdiff");
163  _command_lines.reserve(vtkdiff_configs.size());
164  for (auto const& vtkdiff_config : vtkdiff_configs)
165  {
166  std::string const& field_name =
168  vtkdiff_config.getConfigParameter<std::string>("field");
169  DBUG("vtkdiff will compare field '{:s}'.", field_name);
170 
171  std::vector<std::string> filenames;
172  if (auto const regex_string =
174  vtkdiff_config.getConfigParameterOptional<std::string>("regex"))
175  {
176  // TODO: insert rank into regex for mpi case
177  DBUG("vtkdiff regex is '{}'.", *regex_string);
178  auto const regex = std::regex(*regex_string);
179  for (auto const& p :
180  fs::directory_iterator(fs::path(reference_path)))
181  {
182  auto const filename = p.path().filename().string();
183  if (std::regex_match(filename, regex))
184  {
185  DBUG(" -> matched '{}'", filename);
186  filenames.push_back(filename);
187  }
188  }
189  }
190  else
191  {
192 #ifdef USE_PETSC
193  int rank;
194  MPI_Comm_rank(PETSC_COMM_WORLD, &rank);
195  int mpi_size;
196  MPI_Comm_size(PETSC_COMM_WORLD, &mpi_size);
197  std::string const& filename =
200  vtkdiff_config.getConfigParameter<std::string>("file")) +
201  "_" + std::to_string(rank) + ".vtu";
202 #else
203  std::string const& filename =
205  vtkdiff_config.getConfigParameter<std::string>("file");
206 #endif // OGS_USE_PETSC
207  filenames.push_back(filename);
208  }
209 
210  if (empty(filenames))
211  {
212  OGS_FATAL(
213  "No files from test definitions were added for tests but {} "
214  "{:s} specified.",
215  size(vtkdiff_configs),
216  (size(vtkdiff_configs) == 1 ? "test was" : "tests were"));
217  }
218 
219  auto const absolute_tolerance =
221  vtkdiff_config.getConfigParameter<std::string>("absolute_tolerance",
222  "");
223  if (!absolute_tolerance.empty() &&
224  !isConvertibleToDouble(absolute_tolerance))
225  {
226  OGS_FATAL(
227  "The absolute tolerance value '{:s}' is not convertible to "
228  "double.",
229  absolute_tolerance);
230  }
231  std::string const absolute_tolerance_parameter =
232  "--abs " + absolute_tolerance;
233  auto const relative_tolerance =
235  vtkdiff_config.getConfigParameter<std::string>("relative_tolerance",
236  "");
237  if (!relative_tolerance.empty() &&
238  !isConvertibleToDouble(relative_tolerance))
239  {
240  OGS_FATAL(
241  "The relative tolerance value '{:s}' is not convertible to "
242  "double.",
243  relative_tolerance);
244  }
245  std::string const relative_tolerance_parameter =
246  "--rel " + relative_tolerance;
247 
248  for (auto const& filename : filenames)
249  {
250  std::string const& output_filename =
251  BaseLib::joinPaths(output_directory, filename);
252  _output_files.push_back(output_filename);
253  std::string const& reference_filename =
254  BaseLib::joinPaths(reference_path, filename);
255 
256  //
257  // Construct command line.
258  //
259  std::string command_line =
260  vtkdiff + " -a " + safeString(field_name) + " -b " +
261  safeString(field_name) + " " + safeString(reference_filename) +
262  " " + safeString(output_filename) + " " +
263  absolute_tolerance_parameter + " " +
264  relative_tolerance_parameter;
265  INFO("Will run '{:s}'", command_line);
266  _command_lines.emplace_back(std::move(command_line));
267  }
268  }
269 }
#define OGS_FATAL(...)
Definition: Error.h:26
void INFO(char const *fmt, Args const &... args)
Definition: Logging.h:32
void DBUG(char const *fmt, Args const &... args)
Definition: Logging.h:27
std::vector< std::string > _output_files
std::vector< std::string > _command_lines
std::string joinPaths(std::string const &pathA, std::string const &pathB)
Definition: FileTools.cpp:212
std::string getVtuFileNameForPetscOutputWithoutExtension(std::string const &file_name)
bool isConvertibleToDouble(std::string const &s)
Test if the given string is convertible to a valid double value, not a NaN.
std::string safeString(std::string const &s)
Wraps a string into double ticks.

References _command_lines, _output_files, DBUG(), anonymous_namespace{TestDefinition.cpp}::findVtkdiff(), BaseLib::ConfigTree::getConfigSubtreeList(), MeshLib::IO::getVtuFileNameForPetscOutputWithoutExtension(), INFO(), anonymous_namespace{TestDefinition.cpp}::isConvertibleToDouble(), BaseLib::joinPaths(), OGS_FATAL, and anonymous_namespace{TestDefinition.cpp}::safeString().

Member Function Documentation

◆ getOutputFiles()

std::vector< std::string > const & ApplicationsLib::TestDefinition::getOutputFiles ( ) const

Definition at line 291 of file TestDefinition.cpp.

292 {
293  return _output_files;
294 }

References _output_files.

◆ numberOfTests()

std::size_t ApplicationsLib::TestDefinition::numberOfTests ( ) const

Definition at line 296 of file TestDefinition.cpp.

297 {
298  return size(_command_lines);
299 }

References _command_lines.

◆ runTests()

bool ApplicationsLib::TestDefinition::runTests ( ) const

Definition at line 271 of file TestDefinition.cpp.

272 {
273  std::vector<int> return_values;
274  transform(begin(_command_lines), end(_command_lines),
275  back_inserter(return_values),
276  [](std::string const& command_line)
277  {
278  int const return_value = std::system(command_line.c_str());
279  if (return_value != 0)
280  {
281  WARN("Return value {:d} was returned by '{:s}'.",
282  return_value, command_line);
283  }
284  return return_value;
285  });
286  return !return_values.empty() &&
287  all_of(begin(return_values), end(return_values),
288  [](int const& return_value) { return return_value == 0; });
289 }
void WARN(char const *fmt, Args const &... args)
Definition: Logging.h:37

References _command_lines, and WARN().

Member Data Documentation

◆ _command_lines

std::vector<std::string> ApplicationsLib::TestDefinition::_command_lines
private

Definition at line 40 of file TestDefinition.h.

Referenced by TestDefinition(), numberOfTests(), and runTests().

◆ _output_files

std::vector<std::string> ApplicationsLib::TestDefinition::_output_files
private

Definition at line 41 of file TestDefinition.h.

Referenced by TestDefinition(), and getOutputFiles().


The documentation for this class was generated from the following files: