67
84
parser::xpath_grammar<std::string::iterator> g;
69
86
std::string result;
70
ASSERT_EQ( expect_pass, test_parser_attr(input, g.node_name, result) );
87
ASSERT_EQ( expect_pass, test_parser_attr(input, g.spec_node_name, result) );
72
89
ASSERT_EQ(input, result);
75
TEST_P(TestXPathParser, test_param_name)
92
INSTANTIATE_TEST_CASE_P(BasicNodeNames,
93
TestXPathParserNodeNames,
95
std::pair<std::string, bool>("a b", true),
96
std::pair<std::string, bool>("a ", false),
97
std::pair<std::string, bool>(" ", false),
98
std::pair<std::string, bool>(" b", false),
99
std::pair<std::string, bool>("a b", true),
100
std::pair<std::string, bool>("a b b a", true),
101
std::pair<std::string, bool>("a*", false),
102
std::pair<std::string, bool>("HelloWorld", true),
103
std::pair<std::string, bool>("H", true),
104
std::pair<std::string, bool>("h", true),
105
std::pair<std::string, bool>("1", true),
106
std::pair<std::string, bool>("node-name", true),
107
std::pair<std::string, bool>("node_name", true),
108
std::pair<std::string, bool>("node\\name", true)
111
class TestXPathParserParamNames : public ::testing::TestWithParam<std::pair<std::string, bool> >
115
TEST_P(TestXPathParserParamNames, test_param_name)
77
117
auto p = GetParam();
87
127
ASSERT_EQ(input, result);
90
TEST_P(TestXPathParser, test_param_value)
130
INSTANTIATE_TEST_CASE_P(BasicNodeNames,
131
TestXPathParserParamNames,
133
std::pair<std::string, bool>("a b", false),
134
std::pair<std::string, bool>("a*", false),
135
std::pair<std::string, bool>("HelloWorld", true),
136
std::pair<std::string, bool>("H", true),
137
std::pair<std::string, bool>("h", true),
138
std::pair<std::string, bool>("1", true),
139
std::pair<std::string, bool>("node-name", true),
140
std::pair<std::string, bool>("node_name", true),
141
std::pair<std::string, bool>("node\\name", true),
142
std::pair<std::string, bool>("node.name", false),
143
std::pair<std::string, bool>("node name", false)
146
class TestXPathParserParamValues : public ::testing::TestWithParam<std::pair<std::string, bool> >
150
TEST_P(TestXPathParserParamValues, test_param_value)
92
152
auto p = GetParam();
105
165
INSTANTIATE_TEST_CASE_P(BasicNodeNames,
166
TestXPathParserParamValues,
107
167
::testing::Values(
108
std::pair<std::string, bool>("a b", false),
168
std::pair<std::string, bool>("a b", true),
109
169
std::pair<std::string, bool>("a*", false),
110
170
std::pair<std::string, bool>("HelloWorld", true),
111
171
std::pair<std::string, bool>("H", true),
112
172
std::pair<std::string, bool>("h", true),
113
173
std::pair<std::string, bool>("1", true),
114
174
std::pair<std::string, bool>("node-name", true),
115
std::pair<std::string, bool>("node_name", true)
175
std::pair<std::string, bool>("node_name", true),
176
std::pair<std::string, bool>("node\\name", true),
177
std::pair<std::string, bool>("node name", true),
178
std::pair<std::string, bool>("node.name", true)
118
TEST(TestXPathParser, test_node_name_accepts_wildcards)
182
TEST(TestXPathParser, test_wildcard_node_name_accepts_wildcards)
120
184
std::string input("*");
122
186
parser::xpath_grammar<std::string::iterator> g;
124
188
std::string result;
125
ASSERT_EQ( true, test_parser_attr(input, g.node_name, result) );
189
ASSERT_EQ( true, test_parser_attr(input, g.wildcard_node_name, result) );
126
190
ASSERT_EQ(input, result);
129
TEST(TestXPathParser, test_full_node)
131
std::string input("node_name[param_name=123]");
133
parser::xpath_grammar<std::string::iterator> g;
135
xpathselect::XPathQueryPart result;
136
ASSERT_EQ( true, test_parser_attr(input, g.node, result) );
137
ASSERT_EQ("node_name", result.node_name_);
138
ASSERT_TRUE(result.parameter);
139
ASSERT_EQ("param_name", result.parameter->param_name);
140
ASSERT_EQ("123", result.parameter->param_value);
143
TEST(TestXPathParser, test_partial_node_name_only)
145
std::string input("node_name");
147
parser::xpath_grammar<std::string::iterator> g;
149
xpathselect::XPathQueryPart result;
150
ASSERT_EQ( true, test_parser_attr(input, g.node, result) );
151
ASSERT_EQ("node_name", result.node_name_);
152
ASSERT_FALSE(result.parameter);
155
TEST(TestXPathParser, test_partial_node_wildcard)
157
std::string input("*");
159
parser::xpath_grammar<std::string::iterator> g;
161
xpathselect::XPathQueryPart result;
162
ASSERT_EQ( true, test_parser_attr(input, g.node, result) );
163
ASSERT_EQ("*", result.node_name_);
164
ASSERT_FALSE(result.parameter);
167
TEST(TestXPathParser, test_full_node_wildcard)
169
std::string input("*[param_name=123]");
171
parser::xpath_grammar<std::string::iterator> g;
173
xpathselect::XPathQueryPart result;
174
ASSERT_EQ( true, test_parser_attr(input, g.node, result) );
175
ASSERT_EQ("*", result.node_name_);
176
ASSERT_TRUE(result.parameter);
177
ASSERT_EQ("param_name", result.parameter->param_name);
178
ASSERT_EQ("123", result.parameter->param_value);
193
class TestXPathParserWildcardNodeName : public ::testing::TestWithParam<std::pair<std::string, bool> >
197
TEST_P(TestXPathParserWildcardNodeName, test_wildcard_node_name_rejects_everything_else)
201
std::string input = p.first;
202
bool expect_pass = p.second;
204
parser::xpath_grammar<std::string::iterator> g;
207
ASSERT_EQ( expect_pass, test_parser_attr(input, g.wildcard_node_name, result) );
209
ASSERT_EQ(input, result);
212
INSTANTIATE_TEST_CASE_P(BasicNodeNames,
213
TestXPathParserWildcardNodeName,
215
std::pair<std::string, bool>("", false),
216
std::pair<std::string, bool>("* ", false),
217
std::pair<std::string, bool>("**", false),
218
std::pair<std::string, bool>(" ", false),
219
std::pair<std::string, bool>("8", false),
220
std::pair<std::string, bool>("\t", false),
221
std::pair<std::string, bool>("node-name", false),
222
std::pair<std::string, bool>("node_name", false),
223
std::pair<std::string, bool>("*", true)
181
227
TEST(TestXPathParser, test_param_parser_works)
201
246
ASSERT_FALSE( test_parser_attr(input, g.param, result) );
204
TEST(TestXPathParser, test_search_node)
249
TEST(TestXPathParser, test_param_list_single_value)
251
std::string input("[name=123]");
253
parser::xpath_grammar<std::string::iterator> g;
255
xpathselect::ParamList result;
256
ASSERT_EQ( true, test_parser_attr(input, g.param_list, result) );
257
ASSERT_EQ(1, result.size());
258
ASSERT_EQ("name", result.at(0).param_name);
259
ASSERT_EQ("123", result.at(0).param_value);
262
TEST(TestXPathParser, test_param_list_two_values)
264
std::string input("[name=value,other=foo]");
266
parser::xpath_grammar<std::string::iterator> g;
268
xpathselect::ParamList result;
269
ASSERT_EQ( true, test_parser_attr(input, g.param_list, result) );
270
ASSERT_EQ(2, result.size());
271
ASSERT_EQ("name", result.at(0).param_name);
272
ASSERT_EQ("value", result.at(0).param_value);
273
ASSERT_EQ("other", result.at(1).param_name);
274
ASSERT_EQ("foo", result.at(1).param_value);
277
TEST(TestXPathParser, test_spec_node_with_parameter)
279
std::string input("node_name[param_name=123]");
281
parser::xpath_grammar<std::string::iterator> g;
283
xpathselect::XPathQueryPart result;
284
ASSERT_EQ( true, test_parser_attr(input, g.spec_node, result) );
285
ASSERT_EQ("node_name", result.node_name_);
286
ASSERT_FALSE(result.parameter.empty());
287
ASSERT_EQ("param_name", result.parameter.at(0).param_name);
288
ASSERT_EQ("123", result.parameter.at(0).param_value);
291
TEST(TestXPathParser, test_spec_node_without_parameter)
293
std::string input("node_name");
295
parser::xpath_grammar<std::string::iterator> g;
297
xpathselect::XPathQueryPart result;
298
ASSERT_EQ( true, test_parser_attr(input, g.spec_node, result) );
299
ASSERT_EQ("node_name", result.node_name_);
300
ASSERT_TRUE(result.parameter.empty());
303
TEST(TestXPathParser, test_wildcard_node)
305
std::string input("*");
307
parser::xpath_grammar<std::string::iterator> g;
309
xpathselect::XPathQueryPart result;
310
ASSERT_EQ( true, test_parser_attr(input, g.wildcard_node, result) );
311
ASSERT_EQ("*", result.node_name_);
312
ASSERT_TRUE(result.parameter.empty());
315
TEST(TestXPathParser, test_wildcard_node_rejects_parameters)
317
std::string input("*[foo=bar]");
319
parser::xpath_grammar<std::string::iterator> g;
321
xpathselect::XPathQueryPart result;
322
ASSERT_FALSE( test_parser_attr(input, g.wildcard_node, result) );
325
TEST(TestXPathParser, test_wildcard_node_with_params)
327
std::string input("*[param_name=123]");
329
parser::xpath_grammar<std::string::iterator> g;
331
xpathselect::XPathQueryPart result;
332
ASSERT_EQ( true, test_parser_attr(input, g.wildcard_node_with_params, result) );
333
ASSERT_EQ("*", result.node_name_);
334
ASSERT_FALSE(result.parameter.empty());
335
ASSERT_EQ("param_name", result.parameter.at(0).param_name);
336
ASSERT_EQ("123", result.parameter.at(0).param_value);
340
TEST(TestXPathParser, test_node_can_be_a_wildcard_node_with_params)
342
std::string input("*[name=value]");
344
parser::xpath_grammar<std::string::iterator> g;
346
xpathselect::XPathQueryPart result;
347
ASSERT_EQ( true, test_parser_attr(input, g.node, result) );
348
ASSERT_EQ( "*", result.node_name_ );
349
ASSERT_EQ( xpathselect::XPathQueryPart::QueryPartType::Normal, result.Type() );
350
ASSERT_EQ( 1, result.parameter.size() );
351
ASSERT_EQ( "name", result.parameter.at(0).param_name );
352
ASSERT_EQ( "value", result.parameter.at(0).param_value );
355
TEST(TestXPathParser, test_node_can_be_a_wildcard_node_without_params)
357
std::string input("*");
359
parser::xpath_grammar<std::string::iterator> g;
361
xpathselect::XPathQueryPart result;
362
ASSERT_EQ( true, test_parser_attr(input, g.node, result) );
363
ASSERT_EQ( "*", result.node_name_ );
364
ASSERT_EQ( xpathselect::XPathQueryPart::QueryPartType::Normal, result.Type() );
367
TEST(TestXPathParser, test_node_can_be_a_spec_node_with_params)
369
std::string input("foo[name=value]");
371
parser::xpath_grammar<std::string::iterator> g;
373
xpathselect::XPathQueryPart result;
374
ASSERT_EQ( true, test_parser_attr(input, g.node, result) );
375
ASSERT_EQ( "foo", result.node_name_ );
376
ASSERT_EQ( xpathselect::XPathQueryPart::QueryPartType::Normal, result.Type() );
377
ASSERT_EQ( 1, result.parameter.size() );
378
ASSERT_EQ( "name", result.parameter.at(0).param_name );
379
ASSERT_EQ( "value", result.parameter.at(0).param_value );
382
TEST(TestXPathParser, test_node_can_be_a_spec_node_without_params)
384
std::string input("foo");
386
parser::xpath_grammar<std::string::iterator> g;
388
xpathselect::XPathQueryPart result;
389
ASSERT_EQ( true, test_parser_attr(input, g.node, result) );
390
ASSERT_EQ( "foo", result.node_name_ );
391
ASSERT_EQ( xpathselect::XPathQueryPart::QueryPartType::Normal, result.Type() );
394
TEST(TestXPathParser, test_search_node_followed_by_normal_node)
206
396
// the search_node grammar fails if it's at the end of the line, so we need
207
397
// to give it some more data, even though we're not actually matching it.
332
557
std::pair<std::string, bool>("//root", true),
333
558
std::pair<std::string, bool>("/root//node1/node2", true),
334
559
std::pair<std::string, bool>("/root[p=1]//node1[p=2]/node3", true),
560
std::pair<std::string, bool>("/root[p=1,n=2,d=e3]", true),
561
std::pair<std::string, bool>("//root[p=1,n=2,d=e3]", true),
562
std::pair<std::string, bool>("/Root//*[p=1]", true),
563
std::pair<std::string, bool>("/Root//*[p=1,v=sj,c=true]", true),
335
564
// queries that must not parse correctly:
336
565
std::pair<std::string, bool>("//", false),
337
566
std::pair<std::string, bool>("/root//", false),