144 std::string
const& reference_path,
145 std::string
const& output_directory)
147 if (reference_path.empty())
150 "Reference path containing expected result files can not be "
154 std::string
const vtkdiff = findVtkdiff();
160 for (
auto const& vtkdiff_config : vtkdiff_configs)
162 std::string
const& field_name =
164 vtkdiff_config.getConfigParameter<std::string>(
"field");
165 DBUG(
"vtkdiff will compare field '{:s}'.", field_name);
167 std::vector<std::string> filenames;
168 if (
auto const regex_string =
170 vtkdiff_config.getConfigParameterOptional<std::string>(
"regex"))
173 DBUG(
"vtkdiff regex is '{}'.", *regex_string);
174 auto const regex = std::regex(*regex_string);
175 for (
auto const& p : std::filesystem::directory_iterator(
176 std::filesystem::path(reference_path)))
178 auto const filename = p.path().filename().string();
179 if (std::regex_match(filename, regex))
181 DBUG(
" -> matched '{}'", filename);
182 filenames.push_back(filename);
188 std::string filename =
190 vtkdiff_config.getConfigParameter<std::string>(
"file");
198 "_" + std::to_string(mpi.rank) +
".vtu";
201 filenames.push_back(filename);
204 if (empty(filenames))
207 "No files from test definitions were added for tests but {} "
209 std::size(vtkdiff_configs),
210 (std::size(vtkdiff_configs) == 1 ?
"test was" :
"tests were"));
213 auto const absolute_tolerance =
215 vtkdiff_config.getConfigParameter<std::string>(
"absolute_tolerance",
217 if (!absolute_tolerance.empty() &&
218 !isConvertibleToDouble(absolute_tolerance))
221 "The absolute tolerance value '{:s}' is not convertible to "
225 std::string
const absolute_tolerance_parameter =
226 "--abs " + absolute_tolerance;
227 auto const relative_tolerance =
229 vtkdiff_config.getConfigParameter<std::string>(
"relative_tolerance",
231 if (!relative_tolerance.empty() &&
232 !isConvertibleToDouble(relative_tolerance))
235 "The relative tolerance value '{:s}' is not convertible to "
239 std::string
const relative_tolerance_parameter =
240 "--rel " + relative_tolerance;
242 for (
auto const& filename : filenames)
244 std::string output_filename =
247 std::string reference_filename =
255 auto const& long_path_indicator = R
"(\\?\)";
258 std::filesystem::absolute(reference_filename).string();
259 reference_filename = std::format("\"{}{}\"", long_path_indicator,
262 std::filesystem::absolute(output_filename).string();
264 std::format(
"\"{}{}\"", long_path_indicator, output_filename);
267 output_filename = safeString(output_filename);
268 reference_filename = safeString(reference_filename);
273 std::string command_line =
274 vtkdiff +
" -a " + safeString(field_name) +
" -b " +
275 safeString(field_name) +
" " + reference_filename +
" " +
276 output_filename +
" " + absolute_tolerance_parameter +
" " +
277 relative_tolerance_parameter;
278 INFO(
"Will run '{:s}'", command_line);
286 std::vector<int> return_values;
288 back_inserter(return_values),
289 [](std::string
const& command_line)
291 INFO(
"---------- vtkdiff begin ----------");
292 int const return_value = std::system(command_line.c_str());
293 if (return_value != 0)
295 WARN(
"Return value {:d} was returned by '{:s}'.",
296 return_value, command_line);
298 INFO(
"---------- vtkdiff end ----------\n");
301 return !return_values.empty() &&
302 all_of(begin(return_values), end(return_values),
303 [](
int const& return_value) {
return return_value == 0; });