* jinja : add missing 'in' test to template engine (#19004) The jinja template parser was missing the 'in' test from global_builtins(), causing templates using reject("in", ...), select("in", ...), or 'x is in(y)' to fail with "selectattr: unknown test 'in'". This broke tool-calling for Qwen3-Coder and any other model whose chat template uses the 'in' test. Added test_is_in supporting array, string, and object containment checks, mirroring the existing 'in' operator logic in runtime.cpp. Includes test cases for all three containment types plus reject/select filter usage. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * reuse test_is_in in binary op --------- Co-authored-by: Sid Mohan <sidmohan0@users.noreply.github.com> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Xuan Son Nguyen <son@huggingface.co>
This commit is contained in:
+49
-1
@@ -189,12 +189,24 @@ static void test_conditionals(testing & t) {
|
||||
"negated"
|
||||
);
|
||||
|
||||
test_template(t, "in operator",
|
||||
test_template(t, "in operator (element in array)",
|
||||
"{% if 'x' in items %}found{% endif %}",
|
||||
{{"items", json::array({"x", "y"})}},
|
||||
"found"
|
||||
);
|
||||
|
||||
test_template(t, "in operator (substring)",
|
||||
"{% if 'bc' in 'abcd' %}found{% endif %}",
|
||||
json::object(),
|
||||
"found"
|
||||
);
|
||||
|
||||
test_template(t, "in operator (object key)",
|
||||
"{% if 'key' in obj %}found{% endif %}",
|
||||
{{"obj", {{"key", 1}, {"other", 2}}}},
|
||||
"found"
|
||||
);
|
||||
|
||||
test_template(t, "is defined",
|
||||
"{% if x is defined %}yes{% else %}no{% endif %}",
|
||||
{{"x", 1}},
|
||||
@@ -1036,6 +1048,42 @@ static void test_tests(testing & t) {
|
||||
json::object(),
|
||||
"yes"
|
||||
);
|
||||
|
||||
test_template(t, "is in (array, true)",
|
||||
"{{ 'yes' if 2 is in([1, 2, 3]) }}",
|
||||
json::object(),
|
||||
"yes"
|
||||
);
|
||||
|
||||
test_template(t, "is in (array, false)",
|
||||
"{{ 'yes' if 5 is in([1, 2, 3]) else 'no' }}",
|
||||
json::object(),
|
||||
"no"
|
||||
);
|
||||
|
||||
test_template(t, "is in (string)",
|
||||
"{{ 'yes' if 'bc' is in('abcde') }}",
|
||||
json::object(),
|
||||
"yes"
|
||||
);
|
||||
|
||||
test_template(t, "is in (object keys)",
|
||||
"{{ 'yes' if 'a' is in(obj) }}",
|
||||
{{"obj", {{"a", 1}, {"b", 2}}}},
|
||||
"yes"
|
||||
);
|
||||
|
||||
test_template(t, "reject with in test",
|
||||
"{{ items | reject('in', skip) | join(', ') }}",
|
||||
{{"items", json::array({"a", "b", "c", "d"})}, {"skip", json::array({"b", "d"})}},
|
||||
"a, c"
|
||||
);
|
||||
|
||||
test_template(t, "select with in test",
|
||||
"{{ items | select('in', keep) | join(', ') }}",
|
||||
{{"items", json::array({"a", "b", "c", "d"})}, {"keep", json::array({"b", "c"})}},
|
||||
"b, c"
|
||||
);
|
||||
}
|
||||
|
||||
static void test_string_methods(testing & t) {
|
||||
|
||||
Reference in New Issue
Block a user