ifw-daq 3.1.0
IFW Data Acquisition modules
Loading...
Searching...
No Matches
testKeywordEx.cpp
Go to the documentation of this file.
1/**
2 * @file
3 * @ingroup daq_dpm_libmerge
4 * @copyright ESO - European Southern Observatory
5 */
7
8#include <gtest/gtest.h>
9
10namespace daq::dpm {
11
12class TestKeywordMatchP : public ::testing::Test,
13 public ::testing::WithParamInterface<fits::KeywordVariant> {};
14
15class TestKeywordMatch : public ::testing::Test {};
16class TestKeywordTransform : public ::testing::Test {};
17
18TEST(TestParseEx, FailsIfOperatorIsInvalid) {
19 using namespace detail;
20
21 EXPECT_THROW(ParseEx(""), std::invalid_argument);
22 EXPECT_THROW(ParseEx("? *"), std::invalid_argument);
23 EXPECT_THROW(ParseEx("a *"), std::invalid_argument);
24}
25
26TEST(TestParseEx, FailsIfScopeIsInValid) {
27 using namespace detail;
28
29 EXPECT_THROW(ParseEx("+"), std::invalid_argument);
30 EXPECT_THROW(ParseEx("+a *"), std::invalid_argument);
31 EXPECT_THROW(ParseEx("+ve *"), std::invalid_argument);
32 EXPECT_THROW(ParseEx("+cc *"), std::invalid_argument);
33}
34
35TEST(TestParseEx, FailsIfWhitespaceIsMssing) {
36 using namespace detail;
37
38 EXPECT_THROW(ParseEx("+pattern"), std::invalid_argument);
39 EXPECT_THROW(ParseEx("+vpattern"), std::invalid_argument);
40}
41
42TEST(TestParseEx, FailsIfPatternIsMissing) {
43 using namespace detail;
44
45 EXPECT_THROW(ParseEx("+ "), std::invalid_argument);
46 EXPECT_THROW(ParseEx("+e"), std::invalid_argument);
47}
48
49TEST(TestParseEx, IncludeEsoKw) {
50 using namespace detail;
51
52 Rule r = ParseEx("+e *");
53
54 EXPECT_EQ(r.op, Operator::Include);
55 EXPECT_EQ(r.scope, Scope::Eso);
56 EXPECT_EQ(r.pattern, "*");
57}
58
59TEST(TestParseEx, ExcludeEsoKw) {
60 using namespace detail;
61
62 Rule r = ParseEx("-e *");
63
64 EXPECT_EQ(r.op, Operator::Exclude);
65 EXPECT_EQ(r.scope, Scope::Eso);
66 EXPECT_EQ(r.pattern, "*");
67}
68
69TEST(TestParseEx, IncludeValueKw) {
70 using namespace detail;
71
72 Rule r = ParseEx("+v *");
73
74 EXPECT_EQ(r.op, Operator::Include);
75 EXPECT_EQ(r.scope, Scope::Value);
76 EXPECT_EQ(r.pattern, "*");
77}
78
79TEST(TestParseEx, IncludeCommentaryKw) {
80 using namespace detail;
81
82 Rule r = ParseEx("+c *");
83
84 EXPECT_EQ(r.op, Operator::Include);
85 EXPECT_EQ(r.scope, Scope::Commentary);
86 EXPECT_EQ(r.pattern, "*");
87}
88
89TEST(TestParseEx, IncludeAnyKw) {
90 using namespace detail;
91
92 Rule r = ParseEx("+ pat");
93
94 EXPECT_EQ(r.op, Operator::Include);
95 EXPECT_EQ(r.scope, Scope::Any);
96 EXPECT_EQ(r.pattern, "pat");
97}
98
99TEST(TestKeywordEx, Constructors) {
100 EXPECT_NO_THROW(KeywordEx()) << "Default constructor";
101 EXPECT_NO_THROW(KeywordEx("+ *")) << "Single rule";
102 EXPECT_NO_THROW(KeywordEx({"+ *", "- *"})) << "From initilizer list";
103 std::vector<std::string> strings = {"+ *", "- *"};
104 EXPECT_NO_THROW(KeywordEx(std::begin(strings), std::end(strings))) << "From iterators";
105}
106
107TEST_P(TestKeywordMatchP, EmptyPatternDoesntMatch) {
108 EXPECT_FALSE(KeywordMatch(GetParam(), KeywordEx()));
109}
110
111TEST_P(TestKeywordMatchP, MatchAnyWithSingle) {
112 EXPECT_TRUE(KeywordMatch(GetParam(), KeywordEx("+ *")));
113}
114
115TEST_P(TestKeywordMatchP, MatchAnyWithMultiple) {
116 EXPECT_TRUE(KeywordMatch(GetParam(), KeywordEx({"+e *", "+v *", "+c *"})));
117 EXPECT_TRUE(KeywordMatch(GetParam(), KeywordEx({"+e VALUE", "+v VALUE", "+c VALUE"})));
118}
119
122 testing::Values(fits::EsoKeyword("VALUE", "value"),
123 fits::ValueKeyword("VALUE", 0.0),
124 fits::LiteralKeyword("VALUE = 'tgt' / comment"),
125 fits::LiteralKeyword("VALUE Comment")));
126
127TEST_F(TestKeywordMatch, EsoSimpleInclusivePattern) {
128 auto kw = fits::EsoKeyword("CAT", "value");
129 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+ CAT")));
130 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+e CAT")));
131 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+e C?T")));
132 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+e *")));
133 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+ *")));
134
135 EXPECT_FALSE(KeywordMatch(kw, KeywordEx("+e C")));
136 EXPECT_FALSE(KeywordMatch(kw, KeywordEx("+v CAT")));
137 EXPECT_FALSE(KeywordMatch(kw, KeywordEx("+c CAT")));
138}
139
140TEST_F(TestKeywordMatch, ValueSimpleInclusivePattern) {
141 auto kw = fits::ValueKeyword("ORIGIN", "value");
142 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+ ORIGIN")));
143 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+v ORIGIN")));
144 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+v OR*IN")));
145 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+v *")));
146 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+ *")));
147
148 EXPECT_FALSE(KeywordMatch(kw, KeywordEx("+v ORIGI")));
149 EXPECT_FALSE(KeywordMatch(kw, KeywordEx("+e ORIGIN")));
150 EXPECT_FALSE(KeywordMatch(kw, KeywordEx("+c ORIGIN")));
151}
152
153TEST_F(TestKeywordMatch, LiteralSimpleInclusivePattern) {
154 auto kw = fits::LiteralKeyword("ORIGIN = 'value'");
155 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+ ORIGIN")));
156 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+v ORIGIN")));
157 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+v OR*IN")));
158 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+v *")));
159 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+ *")));
160
161 EXPECT_FALSE(KeywordMatch(kw, KeywordEx("+v ORIGI")));
162 EXPECT_FALSE(KeywordMatch(kw, KeywordEx("+e ORIGIN")));
163 EXPECT_FALSE(KeywordMatch(kw, KeywordEx("+c ORIGIN")));
164}
165
166TEST_F(TestKeywordMatch, CommentarySimpleInclusivePattern) {
167 auto kw = fits::LiteralKeyword("COMMENT value");
168 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+ COMMENT")));
169 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+c COMMENT")));
170 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+ COMME*")));
171 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+c *")));
172 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+ *")));
173
174 EXPECT_FALSE(KeywordMatch(kw, KeywordEx("+c COMME")));
175 EXPECT_FALSE(KeywordMatch(kw, KeywordEx("+e COMMENT")));
176 EXPECT_FALSE(KeywordMatch(kw, KeywordEx("+v COMMENT")));
177}
178
179TEST_F(TestKeywordMatch, SimpleExclusivePattern) {
180 EXPECT_FALSE(KeywordMatch(fits::EsoKeyword("CAT", "value"), KeywordEx("- CAT")));
181 EXPECT_FALSE(KeywordMatch(fits::EsoKeyword("CAT", "value"), KeywordEx("-e CAT")));
182 EXPECT_FALSE(KeywordMatch(fits::EsoKeyword("CAT", "value"), KeywordEx("-e C?T")));
183 EXPECT_FALSE(KeywordMatch(fits::EsoKeyword("CAT", "value"), KeywordEx("-e *")));
184 EXPECT_FALSE(KeywordMatch(fits::EsoKeyword("CAT", "value"), KeywordEx("- *")));
185
186 EXPECT_FALSE(KeywordMatch(fits::EsoKeyword("CAT", "value"), KeywordEx("-e C")));
187 EXPECT_FALSE(KeywordMatch(fits::EsoKeyword("CAT", "value"), KeywordEx("-v CAT")));
188 EXPECT_FALSE(KeywordMatch(fits::EsoKeyword("CAT", "value"), KeywordEx("-c CAT")));
189}
190
191TEST_F(TestKeywordMatch, EsoInclusiveExclusivePattern) {
192 auto kw = fits::EsoKeyword("CAT TEST", "value");
193 EXPECT_TRUE(KeywordMatch(kw, KeywordEx("+e CAT*")));
194
195 EXPECT_FALSE(KeywordMatch(kw, KeywordEx({"+e CAT", "-e CAT TEST"})));
196 EXPECT_FALSE(KeywordMatch(kw, KeywordEx({"+e *", "-e *"})));
197 EXPECT_FALSE(KeywordMatch(kw, KeywordEx({"+ *", "-e *"})));
198}
199
201 auto kw = fits::EsoKeyword("CAT FOO", "value");
202 EXPECT_EQ(KeywordTransform(kw, std::regex("^CAT"), "CAT1"),
203 fits::EsoKeyword("CAT1 FOO", "value"));
204 EXPECT_EQ(KeywordTransform(fits::KeywordVariant(kw), std::regex("^CAT"), "CAT1"),
205 fits::KeywordVariant(fits::EsoKeyword("CAT1 FOO", "value")));
206}
207
208TEST_F(TestKeywordTransform, InvalidEsoKeyword) {
209 std::string long_name(70, 'A');
210 auto kw = fits::EsoKeyword("CAT FOO", "value");
211 EXPECT_THROW(KeywordTransform(kw, std::regex("^CAT"), long_name.c_str()), std::runtime_error);
212}
213
215 auto kw = fits::ValueKeyword("FOOBAR", "value");
216 EXPECT_EQ(KeywordTransform(kw, std::regex("^FOO"), "F00"),
217 fits::ValueKeyword("F00BAR", "value"));
218 EXPECT_EQ(KeywordTransform(fits::KeywordVariant(kw), std::regex("^FOO"), "F00"),
219 fits::KeywordVariant(fits::ValueKeyword("F00BAR", "value")));
220}
221
222TEST_F(TestKeywordTransform, InvalidValueKeyword) {
223 std::string long_name(70, 'A');
224 auto kw = fits::ValueKeyword("CAT FOO", "value");
225 EXPECT_THROW(KeywordTransform(kw, std::regex("^CAT"), long_name.c_str()), std::runtime_error);
226 EXPECT_THROW(KeywordTransform(kw, std::regex("^CAT"), "%!@"), std::runtime_error);
227}
228
232 LiteralKeyword kw1("HIERARCH ESO A1 = B");
233 EXPECT_EQ(KeywordTransform(KeywordVariant(kw1), std::regex("^A1"), "$& B1"),
234 fits::KeywordVariant(LiteralKeyword("HIERARCH ESO A1 B1 = B /")));
235}
236
237} // namespace daq::dpm
Create keyword expression that memoize the provided string pattern.
Definition: keywordEx.hpp:59
Represents the literal 80-character FITS keyword record.
Definition: keyword.hpp:129
fits::KeywordVariant KeywordTransform(fits::KeywordVariant const &keyword, std::regex const &re, char const *fmt)
Transforms keyword name using regex.
Definition: keywordEx.cpp:164
bool KeywordMatch(fits::KeywordVariant const &keyword, KeywordEx const &ex)
Definition: keywordEx.cpp:150
INSTANTIATE_TEST_SUITE_P(Test, TestKeywordMatchP, testing::Values(fits::EsoKeyword("VALUE", "value"), fits::ValueKeyword("VALUE", 0.0), fits::LiteralKeyword("VALUE = 'tgt' / comment"), fits::LiteralKeyword("VALUE Comment")))
TEST_P(TestKeywordMatchP, EmptyPatternDoesntMatch)
TEST_F(TestDaqController, ScheduledTransitionsToCollecting)
TEST(TestParseEx, FailsIfOperatorIsInvalid)
std::variant< ValueKeyword, EsoKeyword, LiteralKeyword > KeywordVariant
The different variants of keywords that are supported.
Definition: keyword.hpp:409
BasicKeyword< ValueKeywordTraits > ValueKeyword
Standard FITS value keyword.
Definition: keyword.hpp:339
BasicKeyword< EsoKeywordTraits > EsoKeyword
ESO hiearchical keyword.
Definition: keyword.hpp:346
A type safe version of LiteralKeyword that consist of the three basic components of a FITS keyword ke...
Definition: keyword.hpp:275
EXPECT_EQ(meta.rr_uri, "zpb.rr://meta")