Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 86 additions & 4 deletions common/jinja/value.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1003,7 +1003,12 @@ const func_builtins & value_none_t::get_builtins() const {
static const func_builtins builtins = {
{"default", default_value},
{"tojson", tojson},
{"string", [](const func_args &) -> value { return mk_val<value_string>("None"); }}
{"string", [](const func_args &) -> value {
return mk_val<value_string>("None");
}},
{"safe", [](const func_args &) -> value {
return mk_val<value_string>("None");
}},
};
return builtins;
}
Expand All @@ -1012,9 +1017,86 @@ const func_builtins & value_none_t::get_builtins() const {
const func_builtins & value_undefined_t::get_builtins() const {
static const func_builtins builtins = {
{"default", default_value},
{"tojson", [](const func_args & args) -> value {
args.ensure_vals<value_undefined>();
return mk_val<value_string>("null");
{"capitalize", [](const func_args &) -> value {
Comment thread
CISC marked this conversation as resolved.
Outdated
return mk_val<value_string>();
}},
{"first", [](const func_args &) -> value {
return mk_val<value_string>();
}},
{"items", [](const func_args &) -> value {
return mk_val<value_array>();
}},
{"join", [](const func_args &) -> value {
return mk_val<value_string>();
}},
{"last", [](const func_args &) -> value {
return mk_val<value_string>();
}},
{"length", [](const func_args &) -> value {
return mk_val<value_int>(0);
}},
{"list", [](const func_args &) -> value {
return mk_val<value_array>();
}},
{"lower", [](const func_args &) -> value {
return mk_val<value_string>();
}},
{"map", [](const func_args &) -> value {
return mk_val<value_array>();
}},
{"max", [](const func_args &) -> value {
return mk_val<value_string>();
}},
{"min", [](const func_args &) -> value {
return mk_val<value_string>();
}},
{"reject", [](const func_args &) -> value {
return mk_val<value_array>();
}},
{"rejectattr", [](const func_args &) -> value {
return mk_val<value_array>();
}},
{"replace", [](const func_args &) -> value {
return mk_val<value_string>();
}},
{"reverse", [](const func_args &) -> value {
return mk_val<value_array>();
}},
{"safe", [](const func_args &) -> value {
return mk_val<value_string>();
}},
{"select", [](const func_args &) -> value {
return mk_val<value_array>();
}},
{"selectattr", [](const func_args &) -> value {
return mk_val<value_array>();
}},
{"sort", [](const func_args &) -> value {
return mk_val<value_array>();
}},
{"string", [](const func_args &) -> value {
return mk_val<value_string>();
}},
{"strip", [](const func_args &) -> value {
return mk_val<value_string>();
}},
{"sum", [](const func_args &) -> value {
return mk_val<value_int>(0);
}},
{"title", [](const func_args &) -> value {
return mk_val<value_string>();
}},
{"truncate", [](const func_args &) -> value {
return mk_val<value_string>();
}},
{"unique", [](const func_args &) -> value {
return mk_val<value_array>();
}},
{"upper", [](const func_args &) -> value {
return mk_val<value_string>();
}},
{"wordcount", [](const func_args &) -> value {
return mk_val<value_int>(0);
}},
};
return builtins;
Expand Down
162 changes: 162 additions & 0 deletions tests/test-jinja.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,12 @@ static void test_loops(testing & t) {
"empty"
);

test_template(t, "for undefined empty",
"{% for i in items %}{{ i }}{% else %}empty{% endfor %}",
json::object(),
"empty"
);

test_template(t, "nested for",
"{% for i in a %}{% for j in b %}{{ i }}{{ j }}{% endfor %}{% endfor %}",
{{"a", json::array({1, 2})}, {"b", json::array({"x", "y"})}},
Expand Down Expand Up @@ -1122,6 +1128,54 @@ static void test_string_methods(testing & t) {
{{"s", "banana"}},
"bXnXna"
);

test_template(t, "undefined|capitalize",
"{{ arr|capitalize }}",
json::object(),
""
);

test_template(t, "undefined|title",
"{{ arr|title }}",
json::object(),
""
);

test_template(t, "undefined|truncate",
"{{ arr|truncate(9) }}",
json::object(),
""
);

test_template(t, "undefined|upper",
"{{ arr|upper }}",
json::object(),
""
);

test_template(t, "undefined|lower",
"{{ arr|lower }}",
json::object(),
""
);

test_template(t, "undefined|replace",
"{{ arr|replace('a', 'b') }}",
json::object(),
""
);

test_template(t, "undefined|trim",
"{{ arr|trim }}",
json::object(),
""
);

test_template(t, "undefined|wordcount",
"{{ arr|wordcount }}",
json::object(),
"0"
);
}

static void test_array_methods(testing & t) {
Expand Down Expand Up @@ -1289,6 +1343,108 @@ static void test_array_methods(testing & t) {
// {{"arr", json::array({"a", "b", "c"})}},
// "a,x,b,c"
// );

test_template(t, "undefined|select",
"{% for item in items|select('odd') %}{{ item.name }} {% endfor %}",
json::object(),
""
);

test_template(t, "undefined|selectattr",
"{% for item in items|selectattr('active') %}{{ item.name }} {% endfor %}",
json::object(),
""
);

test_template(t, "undefined|reject",
"{% for item in items|reject('even') %}{{ item.name }} {% endfor %}",
json::object(),
""
);

test_template(t, "undefined|rejectattr",
"{% for item in items|rejectattr('active') %}{{ item.name }} {% endfor %}",
json::object(),
""
);

test_template(t, "undefined|list",
"{{ arr|list|string }}",
json::object(),
"[]"
);

test_template(t, "undefined|string",
"{{ arr|string }}",
json::object(),
""
);

test_template(t, "undefined|first",
"{{ arr|first }}",
json::object(),
""
);

test_template(t, "undefined|last",
"{{ arr|last }}",
json::object(),
""
);

test_template(t, "undefined|length",
"{{ arr|length }}",
json::object(),
"0"
);

test_template(t, "undefined|join",
"{{ arr|join }}",
json::object(),
""
);

test_template(t, "undefined|sort",
"{{ arr|sort|string }}",
json::object(),
"[]"
);

test_template(t, "undefined|reverse",
"{{ arr|reverse|join }}",
json::object(),
""
);

test_template(t, "undefined|map",
"{% for v in arr|map(attribute='age') %}{{ v }} {% endfor %}",
json::object(),
""
);

test_template(t, "undefined|min",
"{{ arr|min }}",
json::object(),
""
);

test_template(t, "undefined|max",
"{{ arr|max }}",
json::object(),
""
);

test_template(t, "undefined|unique",
"{{ arr|unique|join }}",
json::object(),
""
);

test_template(t, "undefined|sum",
"{{ arr|sum }}",
json::object(),
"0"
);
}

static void test_object_methods(testing & t) {
Expand Down Expand Up @@ -1393,6 +1549,12 @@ static void test_object_methods(testing & t) {
json::object(),
"True"
);

test_template(t, "undefined|items",
"{{ arr|items|join }}",
json::object(),
""
);
}

static void test_hasher(testing & t) {
Expand Down
Loading