8000 Mimic the behavior of the 'in' operator when applied to strings (inst… · jinja2cpp/Jinja2Cpp@af50a9c · GitHub
[go: up one dir, main page]

Skip to content

Commit af50a9c

Browse files
mrudenkormorozov
mrudenko
authored andcommitted
Mimic the behavior of the 'in' operator when applied to strings (instead of lists) from original Jinja - search for a substring.
1 parent 171b5bd commit af50a9c

File tree

2 files changed

+35
-22
lines changed

2 files changed

+35
-22
lines changed

src/testers.cpp

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -254,22 +254,33 @@ bool ValueTester::Test(const InternalValue& baseVal, RenderContext& context)
254254
{
255255
bool isConverted = false;
256256
auto seq = GetArgumentValue("seq", context);
257-
ListAdapter values = ConvertToList(seq, InternalValue(), isConverted);
258-
259-
if (!isConverted)
260-
return false;
261-
262-
auto equalComparator = [&baseVal](auto& val) {
263-
InternalValue cmpRes;
264-
265-
cmpRes = Apply2<visitors::BinaryMathOperation>(val, baseVal, BinaryExpression::LogicalEq);
266-
267-
return ConvertToBool(cmpRes);
268-
};
269-
270-
auto p = std::find_if(values.begin(), values.end(), equalComparator);
271-
result = p != values.end();
272-
257+
auto seqKind = Apply<ValueKindGetter>(seq);
258+
if (seqKind == ValueKind::List) {
259+
ListAdapter values = ConvertToList(seq, InternalValue(), isConverted);
260+
261+
if (!isConverted)
262+
return false;
263+
264+
auto equalComparator = [&baseVal](auto& val) {
265+
InternalValue cmpRes;
266+
cmpRes = Apply2<visitors::BinaryMathOperation>(val, baseVal, BinaryExpression::LogicalEq);
267+
return ConvertToBool(cmpRes);
268+
};
269+
270+
auto p = std::find_if(values.begin(), values.end(), equalComparator);
271+
result = p != values.end();
272+
} else if (seqKind == ValueKind::String) {
273+
result = ApplyStringConverter(baseVal, [&](const auto& srcStr) {
274+
std::decay_t<decltype(srcStr)> emptyStrView;
275+
using CharT = typename decltype(emptyStrView)::value_type;
276+
std::basic_string<CharT> emptyStr;
277+
278+
auto substring = sv_to_string(srcStr);
279+
auto seq = GetAsSameString(srcStr, this->GetArgumentValue("seq", context)).value_or(emptyStr);
280+
281+
return seq.find(substring) != std::string::npos;
282+
});
283+
}
273284
break;
274285
}
275286
case IsEvenMode:

test/testers_test.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -242,12 +242,14 @@ INSTANTIATE_TEST_SUITE_P(StringTest, TestersGenericTest, ::testing::Values(
242242

243243

244244
INSTANTIATE_TEST_SUITE_P(InTest, TestersGenericTest, ::testing::Values(
245-
InputOutputPair{"0 in (2, 1, 0)", "true"},
246-
InputOutputPair{"0 in (1, 2, 3)", "false"},
247-
InputOutputPair{"0 in intList", "true"},
248-
InputOutputPair{"1000 in intList", "false"},
249-
InputOutputPair{"'string9' in stringList", "true"},
250-
InputOutputPair{"'string90' in stringList", "false"}
245+
InputOutputPair{"0 in (2, 1, 0)", "true"},
246+
InputOutputPair{"0 in (1, 2, 3)", "false"},
247+
InputOutputPair{"0 in intList", "true"},
248+
InputOutputPair{"1000 in intList", "false"},
249+
InputOutputPair{"'string9' in stringList", "true"},
250+
InputOutputPair{"'string90' in stringList", "false"},
251+
InputOutputPair{"'string' in 'a big string'", "true"},
252+
InputOutputPair{"'a big string' in 'substr'", "false"}
251253
));
252254

253255
INSTANTIATE_TEST_SUITE_P(EvenTest, TestersGenericTest, ::testing::Values(

0 commit comments

Comments
 (0)
0