2#include <catch2/catch_approx.hpp>
3#include <catch2/catch_test_macros.hpp>
4#include <catch2/matchers/catch_matchers_string.hpp>
7#include "Framework/Configure/Python.h"
13using Catch::Matchers::ContainsSubstring;
35 CHECK(name ==
"test_instance");
52 CHECK(parameters.get<
int>(
"test_int") == 9);
53 CHECK(parameters.get<
double>(
"test_double") == Approx(7.7));
54 CHECK(parameters.get<std::string>(
"test_string") ==
"Yay!");
58 CHECK(test_dict.get<
int>(
"one") == 1);
59 CHECK(test_dict.get<
double>(
"two") == 2.0);
62 std::vector<int> int_vect{1, 2, 3};
63 auto test_int_vec{parameters.get<std::vector<int>>(
"test_int_vec")};
64 REQUIRE(test_int_vec.size() == int_vect.size());
65 for (std::size_t i{0}; i < test_int_vec.size(); i++)
66 CHECK(test_int_vec.at(i) == int_vect.at(i));
69 std::vector<double> double_vec{0.1, 0.2, 0.3};
71 parameters.get<std::vector<double>>(
"test_double_vec")};
72 REQUIRE(test_double_vec.size() == double_vec.size());
73 for (std::size_t i{0}; i < test_double_vec.size(); i++)
74 CHECK(test_double_vec.at(i) == double_vec.at(i));
77 std::vector<std::string> string_vec{
"first",
"second",
"third"};
79 parameters.get<std::vector<std::string>>(
"test_string_vec")};
80 REQUIRE(test_string_vec.size() == string_vec.size());
81 for (std::size_t i{0}; i < test_string_vec.size(); i++)
82 CHECK(test_string_vec.at(i) == string_vec.at(i));
85 std::vector<std::vector<int>> twod_vec{
86 {11, 12, 13}, {21, 22}, {31, 32, 33, 34}};
88 parameters.get<std::vector<std::vector<int>>>(
"test_2dlist")};
89 REQUIRE(test_2d_vec.size() == twod_vec.size());
90 for (std::size_t i{0}; i < twod_vec.size(); i++) {
91 REQUIRE(test_2d_vec.at(i).size() == twod_vec.at(i).size());
92 for (std::size_t j{0}; j < twod_vec.at(i).size(); j++) {
93 CHECK(test_2d_vec.at(i).at(j) == twod_vec.at(i).at(j));
116TEST_CASE(
"Configure Python Test",
"[Framework][functionality]") {
117 const std::string config_file_name{
"config_python_test_config.py"};
126 SECTION(
"No arguments to python script") {
128 "ldmxcfg.Process.lastProcess", config_file_name, args, 0)};
129 p = std::make_unique<framework::Process>(config);
131 CHECK(p->getPassName() ==
"test");
135 std::ifstream in_file;
136 std::ofstream out_file;
138 in_file.open(config_file_name.c_str(), std::ios::in | std::ios::binary);
140 const std::string config_file_name_arg{
141 "/tmp/config_python_test_config_arg.py"};
142 out_file.open(config_file_name_arg, std::ios::out | std::ios::binary);
143 out_file << in_file.rdbuf();
144 out_file <<
"import sys" << std::endl;
145 out_file <<
"p.logFrequency = int(sys.argv[1])" << std::endl;
152 auto correct_log_freq{9000};
153 SECTION(
"Single argument to python script") {
154 args[0] = (
char *)
"9000";
156 config_file_name_arg, args, 1)};
157 p = std::make_unique<framework::Process>(config);
158 CHECK(p->getLogFrequency() == correct_log_freq);
162 in_file.open(config_file_name.c_str(), std::ios::in | std::ios::binary);
164 out_file.open(config_file_name_arg, std::ios::out | std::ios::binary);
165 out_file << in_file.rdbuf();
166 out_file <<
"p.sequence[0].bad_param = ('tuples','are','not','supported')"
173 SECTION(
"Bad parameter exception test") {
176 config_file_name_arg, args, 0),
177 ContainsSubstring(
"('tuples', 'are', 'not', 'supported')"));
Base classes for all user event processing components to extend.
#define DECLARE_PRODUCER_NS(NS, CLASS)
Macro which allows the framework to construct a producer given its name during configuration.
Class which represents the process under execution.
Implements an event buffer system for storing event data.
Class which represents the process under execution.
Base class for a module which produces a data product.
Class encapsulating parameters for configuring a processor.
Defines a test Producer to test the passing of configuration variables.
virtual void produce(framework::Event &) override
Process the event and put new data products into it.
TestConfig(const std::string &name, framework::Process &process)
Constructor.
void configure(framework::config::Parameters ¶meters) final override
Configure function.
Parameters run(const std::string &root_object, const std::string &pythonScript, char *args[], int nargs)
run the python script and extract the parameters
All classes in the ldmx-sw project use this namespace.
std::unique_ptr< Process > ProcessHandle
A handle to the current process Used to pass a process from ConfigurePython to fire....