diff --git a/include/inja/renderer.hpp b/include/inja/renderer.hpp index e7a90d4..5b8747d 100644 --- a/include/inja/renderer.hpp +++ b/include/inja/renderer.hpp @@ -509,7 +509,8 @@ class Renderer { for (auto it = level.values.begin(), end = level.values.end(); it != end; ++it) { level.map_values.emplace_back(it.key(), &it.value()); } - std::sort(level.map_values.begin(), level.map_values.end(), [](const LoopLevel::KeyValue& a, const LoopLevel::KeyValue& b) { return a.first < b.first; }); + auto sort_lambda = [](const LoopLevel::KeyValue& a, const LoopLevel::KeyValue& b) { return a.first < b.first; }; + std::sort(level.map_values.begin(), level.map_values.end(), sort_lambda); level.map_it = level.map_values.begin(); } else { if (!level.values.is_array()) { diff --git a/test/benchmark.cpp b/test/benchmark.cpp index 8856b62..56c4bac 100644 --- a/test/benchmark.cpp +++ b/test/benchmark.cpp @@ -1,3 +1,5 @@ +// Copyright (c) 2019 Pantor. All rights reserved. + #include "hayai/hayai.hpp" #include diff --git a/test/unit-files.cpp b/test/unit-files.cpp index 8292f47..d365e2c 100644 --- a/test/unit-files.cpp +++ b/test/unit-files.cpp @@ -1,3 +1,5 @@ +// Copyright (c) 2019 Pantor. All rights reserved. + #include "catch/catch.hpp" #include "inja/inja.hpp" @@ -13,21 +15,21 @@ TEST_CASE("loading") { data["name"] = "Jeff"; SECTION("Files should be loaded") { - CHECK( env.load_file(test_file_directory + "simple.txt") == "Hello {{ name }}." ); + CHECK(env.load_file(test_file_directory + "simple.txt") == "Hello {{ name }}."); } SECTION("Files should be rendered") { - CHECK( env.render_file(test_file_directory + "simple.txt", data) == "Hello Jeff." ); + CHECK(env.render_file(test_file_directory + "simple.txt", data) == "Hello Jeff."); } SECTION("File includes should be rendered") { - CHECK( env.render_file(test_file_directory + "include.txt", data) == "Answer: Hello Jeff." ); + CHECK(env.render_file(test_file_directory + "include.txt", data) == "Answer: Hello Jeff."); } SECTION("File error should throw") { std::string path(test_file_directory + "does-not-exist"); - CHECK_THROWS_WITH( env.load_file(path), "[inja.exception.file_error] failed accessing file at '" + path + "'" ); - CHECK_THROWS_WITH( env.load_json(path), "[inja.exception.file_error] failed accessing file at '" + path + "'" ); + CHECK_THROWS_WITH(env.load_file(path), "[inja.exception.file_error] failed accessing file at '" + path + "'"); + CHECK_THROWS_WITH(env.load_json(path), "[inja.exception.file_error] failed accessing file at '" + path + "'"); } } @@ -36,7 +38,7 @@ TEST_CASE("complete-files") { for (std::string test_name : {"simple-file", "nested", "nested-line", "html"}) { SECTION(test_name) { - CHECK( env.render_file_with_json_file(test_name + "/template.txt", test_name + "/data.json") == env.load_file(test_name + "/result.txt") ); + CHECK(env.render_file_with_json_file(test_name + "/template.txt", test_name + "/data.json") == env.load_file(test_name + "/result.txt")); } } } @@ -48,7 +50,7 @@ TEST_CASE("complete-files-whitespace-control") { for (std::string test_name : {"nested-whitespace"}) { SECTION(test_name) { - CHECK( env.render_file_with_json_file(test_name + "/template.txt", test_name + "/data.json") == env.load_file(test_name + "/result.txt") ); + CHECK(env.render_file_with_json_file(test_name + "/template.txt", test_name + "/data.json") == env.load_file(test_name + "/result.txt")); } } } @@ -61,6 +63,6 @@ TEST_CASE("global-path") { SECTION("Files should be written") { env.write("simple.txt", data, "global-path-result.txt"); - CHECK( env_result.load_file("global-path-result.txt") == "Hello Jeff." ); + CHECK(env_result.load_file("global-path-result.txt") == "Hello Jeff."); } } diff --git a/test/unit-renderer.cpp b/test/unit-renderer.cpp index 728f358..b06f1a3 100644 --- a/test/unit-renderer.cpp +++ b/test/unit-renderer.cpp @@ -1,3 +1,5 @@ +// Copyright (c) 2019 Pantor. All rights reserved. + #include "catch/catch.hpp" #include "inja/inja.hpp" @@ -7,9 +9,9 @@ using json = nlohmann::json; TEST_CASE("dot-to-pointer") { std::string buffer; - CHECK( inja::convert_dot_to_json_pointer("test", buffer) == "/test" ); - CHECK( inja::convert_dot_to_json_pointer("guests.2", buffer) == "/guests/2" ); - CHECK( inja::convert_dot_to_json_pointer("person.names.surname", buffer) == "/person/names/surname" ); + CHECK(inja::convert_dot_to_json_pointer("test", buffer) == "/test"); + CHECK(inja::convert_dot_to_json_pointer("guests.2", buffer) == "/guests/2"); + CHECK(inja::convert_dot_to_json_pointer("person.names.surname", buffer) == "/person/names/surname"); } TEST_CASE("types") { @@ -31,42 +33,42 @@ TEST_CASE("types") { SECTION("basic") { - CHECK( env.render("", data) == "" ); - CHECK( env.render("Hello World!", data) == "Hello World!" ); + CHECK(env.render("", data) == ""); + CHECK(env.render("Hello World!", data) == "Hello World!"); } SECTION("variables") { - CHECK( env.render("Hello {{ name }}!", data) == "Hello Peter!" ); - CHECK( env.render("{{ name }}", data) == "Peter" ); - CHECK( env.render("{{name}}", data) == "Peter" ); - CHECK( env.render("{{ name }} is {{ age }} years old.", data) == "Peter is 29 years old." ); - CHECK( env.render("Hello {{ name }}! I come from {{ city }}.", data) == "Hello Peter! I come from Brunswick." ); - CHECK( env.render("Hello {{ names.1 }}!", data) == "Hello Seb!" ); - CHECK( env.render("Hello {{ brother.name }}!", data) == "Hello Chris!" ); - CHECK( env.render("Hello {{ brother.daughter0.name }}!", data) == "Hello Maria!" ); - CHECK( env.render("{{ \"{{ no_value }}\" }}", data) == "{{ no_value }}" ); + CHECK(env.render("Hello {{ name }}!", data) == "Hello Peter!"); + CHECK(env.render("{{ name }}", data) == "Peter"); + CHECK(env.render("{{name}}", data) == "Peter"); + CHECK(env.render("{{ name }} is {{ age }} years old.", data) == "Peter is 29 years old."); + CHECK(env.render("Hello {{ name }}! I come from {{ city }}.", data) == "Hello Peter! I come from Brunswick."); + CHECK(env.render("Hello {{ names.1 }}!", data) == "Hello Seb!"); + CHECK(env.render("Hello {{ brother.name }}!", data) == "Hello Chris!"); + CHECK(env.render("Hello {{ brother.daughter0.name }}!", data) == "Hello Maria!"); + CHECK(env.render("{{ \"{{ no_value }}\" }}", data) == "{{ no_value }}"); - CHECK_THROWS_WITH( env.render("{{unknown}}", data), "[inja.exception.render_error] variable 'unknown' not found" ); + CHECK_THROWS_WITH(env.render("{{unknown}}", data), "[inja.exception.render_error] variable 'unknown' not found"); } SECTION("comments") { - CHECK( env.render("Hello{# This is a comment #}!", data) == "Hello!" ); - CHECK( env.render("{# --- #Todo --- #}", data) == "" ); + CHECK(env.render("Hello{# This is a comment #}!", data) == "Hello!"); + CHECK(env.render("{# --- #Todo --- #}", data) == ""); } SECTION("loops") { - CHECK( env.render("{% for name in names %}a{% endfor %}", data) == "aa" ); - CHECK( env.render("Hello {% for name in names %}{{ name }} {% endfor %}!", data) == "Hello Jeff Seb !" ); - CHECK( env.render("Hello {% for name in names %}{{ loop.index }}: {{ name }}, {% endfor %}!", data) == "Hello 0: Jeff, 1: Seb, !" ); - CHECK( env.render("{% for type, name in relatives %}{{ type }}: {{ name }}, {% endfor %}", data) == "brother: Chris, mother: Maria, sister: Jenny, " ); - CHECK( env.render("{% for v in vars %}{% if v > 0 %}+{% endif %}{% endfor %}", data) == "+++" ); - CHECK( env.render("{% for name in names %}{{ loop.index }}: {{ name }}{% if not loop.is_last %}, {% endif %}{% endfor %}!", data) == "0: Jeff, 1: Seb!" ); - CHECK( env.render("{% for name in names %}{{ loop.index }}: {{ name }}{% if loop.is_last == false %}, {% endif %}{% endfor %}!", data) == "0: Jeff, 1: Seb!" ); + CHECK(env.render("{% for name in names %}a{% endfor %}", data) == "aa"); + CHECK(env.render("Hello {% for name in names %}{{ name }} {% endfor %}!", data) == "Hello Jeff Seb !"); + CHECK(env.render("Hello {% for name in names %}{{ loop.index }}: {{ name }}, {% endfor %}!", data) == "Hello 0: Jeff, 1: Seb, !"); + CHECK(env.render("{% for type, name in relatives %}{{ type }}: {{ name }}, {% endfor %}", data) == "brother: Chris, mother: Maria, sister: Jenny, "); + CHECK(env.render("{% for v in vars %}{% if v > 0 %}+{% endif %}{% endfor %}", data) == "+++" ); + CHECK(env.render("{% for name in names %}{{ loop.index }}: {{ name }}{% if not loop.is_last %}, {% endif %}{% endfor %}!", data) == "0: Jeff, 1: Seb!"); + CHECK(env.render("{% for name in names %}{{ loop.index }}: {{ name }}{% if loop.is_last == false %}, {% endif %}{% endfor %}!", data) == "0: Jeff, 1: Seb!"); - CHECK( env.render("{% for name in {} %}a{% endfor %}", data) == "" ); + CHECK( env.render("{% for name in {} %}a{% endfor %}", data) == ""); - CHECK_THROWS_WITH( env.render("{% for name ins names %}a{% endfor %}", data), "[inja.exception.parser_error] expected 'in', got 'ins'" ); - CHECK_THROWS_WITH( env.render("{% for name in empty_loop %}a{% endfor %}", data), "[inja.exception.render_error] variable 'empty_loop' not found" ); + CHECK_THROWS_WITH(env.render("{% for name ins names %}a{% endfor %}", data), "[inja.exception.parser_error] expected 'in', got 'ins'"); + CHECK_THROWS_WITH(env.render("{% for name in empty_loop %}a{% endfor %}", data), "[inja.exception.render_error] variable 'empty_loop' not found"); // CHECK_THROWS_WITH( env.render("{% for name in relatives %}{{ name }}{% endfor %}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is object" ); } @@ -99,35 +101,35 @@ R"DELIM( } SECTION("conditionals") { - CHECK( env.render("{% if is_happy %}Yeah!{% endif %}", data) == "Yeah!" ); - CHECK( env.render("{% if is_sad %}Yeah!{% endif %}", data) == "" ); - CHECK( env.render("{% if is_sad %}Yeah!{% else %}Nooo...{% endif %}", data) == "Nooo..." ); - CHECK( env.render("{% if age == 29 %}Right{% else %}Wrong{% endif %}", data) == "Right" ); - CHECK( env.render("{% if age > 29 %}Right{% else %}Wrong{% endif %}", data) == "Wrong" ); - CHECK( env.render("{% if age <= 29 %}Right{% else %}Wrong{% endif %}", data) == "Right" ); - CHECK( env.render("{% if age != 28 %}Right{% else %}Wrong{% endif %}", data) == "Right" ); - CHECK( env.render("{% if age >= 30 %}Right{% else %}Wrong{% endif %}", data) == "Wrong" ); - CHECK( env.render("{% if age in [28, 29, 30] %}True{% endif %}", data) == "True" ); - CHECK( env.render("{% if age == 28 %}28{% else if age == 29 %}29{% endif %}", data) == "29" ); - CHECK( env.render("{% if age == 26 %}26{% else if age == 27 %}27{% else if age == 28 %}28{% else %}29{% endif %}", data) == "29" ); - CHECK( env.render("{% if age == 25 %}+{% endif %}{% if age == 29 %}+{% else %}-{% endif %}", data) == "+" ); + CHECK(env.render("{% if is_happy %}Yeah!{% endif %}", data) == "Yeah!"); + CHECK(env.render("{% if is_sad %}Yeah!{% endif %}", data) == ""); + CHECK(env.render("{% if is_sad %}Yeah!{% else %}Nooo...{% endif %}", data) == "Nooo..."); + CHECK(env.render("{% if age == 29 %}Right{% else %}Wrong{% endif %}", data) == "Right"); + CHECK(env.render("{% if age > 29 %}Right{% else %}Wrong{% endif %}", data) == "Wrong"); + CHECK(env.render("{% if age <= 29 %}Right{% else %}Wrong{% endif %}", data) == "Right"); + CHECK(env.render("{% if age != 28 %}Right{% else %}Wrong{% endif %}", data) == "Right"); + CHECK(env.render("{% if age >= 30 %}Right{% else %}Wrong{% endif %}", data) == "Wrong"); + CHECK(env.render("{% if age in [28, 29, 30] %}True{% endif %}", data) == "True"); + CHECK(env.render("{% if age == 28 %}28{% else if age == 29 %}29{% endif %}", data) == "29"); + CHECK(env.render("{% if age == 26 %}26{% else if age == 27 %}27{% else if age == 28 %}28{% else %}29{% endif %}", data) == "29"); + CHECK(env.render("{% if age == 25 %}+{% endif %}{% if age == 29 %}+{% else %}-{% endif %}", data) == "+"); - CHECK_THROWS_WITH( env.render("{% if is_happy %}{% if is_happy %}{% endif %}", data), "[inja.exception.parser_error] unmatched if" ); - CHECK_THROWS_WITH( env.render("{% if is_happy %}{% else if is_happy %}{% end if %}", data), "[inja.exception.parser_error] expected statement, got 'end'" ); + CHECK_THROWS_WITH(env.render("{% if is_happy %}{% if is_happy %}{% endif %}", data), "[inja.exception.parser_error] unmatched if"); + CHECK_THROWS_WITH(env.render("{% if is_happy %}{% else if is_happy %}{% end if %}", data), "[inja.exception.parser_error] expected statement, got 'end'"); } SECTION("line statements") { - CHECK( env.render(R"(## if is_happy + CHECK(env.render(R"(## if is_happy Yeah! ## endif)", data) == R"(Yeah! -)" ); +)"); - CHECK( env.render(R"(## if is_happy + CHECK(env.render(R"(## if is_happy ## if is_happy Yeah! ## endif ## endif )", data) == R"(Yeah! -)" ); +)"); } } @@ -150,142 +152,142 @@ TEST_CASE("functions") { data["vars"] = {2, 3, 4, 0, -1, -2, -3}; SECTION("upper") { - CHECK( env.render("{{ upper(name) }}", data) == "PETER" ); - CHECK( env.render("{{ upper( name ) }}", data) == "PETER" ); - CHECK( env.render("{{ upper(city) }}", data) == "NEW YORK" ); - CHECK( env.render("{{ upper(upper(name)) }}", data) == "PETER" ); + CHECK(env.render("{{ upper(name) }}", data) == "PETER"); + CHECK(env.render("{{ upper( name ) }}", data) == "PETER"); + CHECK(env.render("{{ upper(city) }}", data) == "NEW YORK"); + CHECK(env.render("{{ upper(upper(name)) }}", data) == "PETER"); // CHECK_THROWS_WITH( env.render("{{ upper(5) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be string, but is number" ); // CHECK_THROWS_WITH( env.render("{{ upper(true) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be string, but is boolean" ); } SECTION("lower") { - CHECK( env.render("{{ lower(name) }}", data) == "peter" ); - CHECK( env.render("{{ lower(city) }}", data) == "new york" ); + CHECK(env.render("{{ lower(name) }}", data) == "peter"); + CHECK(env.render("{{ lower(city) }}", data) == "new york"); // CHECK_THROWS_WITH( env.render("{{ lower(5.45) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be string, but is number" ); } SECTION("range") { - CHECK( env.render("{{ range(2) }}", data) == "[0,1]" ); - CHECK( env.render("{{ range(4) }}", data) == "[0,1,2,3]" ); + CHECK(env.render("{{ range(2) }}", data) == "[0,1]"); + CHECK(env.render("{{ range(4) }}", data) == "[0,1,2,3]"); // CHECK_THROWS_WITH( env.render("{{ range(name) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be number, but is string" ); } SECTION("length") { - CHECK( env.render("{{ length(names) }}", data) == "4" ); // Length of array - CHECK( env.render("{{ length(name) }}", data) == "5" ); // Length of string + CHECK(env.render("{{ length(names) }}", data) == "4"); // Length of array + CHECK(env.render("{{ length(name) }}", data) == "5"); // Length of string // CHECK_THROWS_WITH( env.render("{{ length(5) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is number" ); } SECTION("sort") { - CHECK( env.render("{{ sort([3, 2, 1]) }}", data) == "[1,2,3]" ); - CHECK( env.render("{{ sort([\"bob\", \"charlie\", \"alice\"]) }}", data) == "[\"alice\",\"bob\",\"charlie\"]" ); + CHECK(env.render("{{ sort([3, 2, 1]) }}", data) == "[1,2,3]"); + CHECK(env.render("{{ sort([\"bob\", \"charlie\", \"alice\"]) }}", data) == "[\"alice\",\"bob\",\"charlie\"]"); // CHECK_THROWS_WITH( env.render("{{ sort(5) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is number" ); } SECTION("at") { - CHECK( env.render("{{ at(names, 0) }}", data) == "Jeff" ); - CHECK( env.render("{{ at(names, i) }}", data) == "Seb" ); + CHECK(env.render("{{ at(names, 0) }}", data) == "Jeff"); + CHECK(env.render("{{ at(names, i) }}", data) == "Seb"); } SECTION("first") { - CHECK( env.render("{{ first(names) }}", data) == "Jeff" ); + CHECK(env.render("{{ first(names) }}", data) == "Jeff"); // CHECK_THROWS_WITH( env.render("{{ first(5) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is number" ); } SECTION("last") { - CHECK( env.render("{{ last(names) }}", data) == "Tom" ); + CHECK(env.render("{{ last(names) }}", data) == "Tom"); // CHECK_THROWS_WITH( env.render("{{ last(5) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is number" ); } SECTION("round") { - CHECK( env.render("{{ round(4, 0) }}", data) == "4.0" ); - CHECK( env.render("{{ round(temperature, 2) }}", data) == "25.68" ); + CHECK(env.render("{{ round(4, 0) }}", data) == "4.0"); + CHECK(env.render("{{ round(temperature, 2) }}", data) == "25.68"); // CHECK_THROWS_WITH( env.render("{{ round(name, 2) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be number, but is string" ); } SECTION("divisibleBy") { - CHECK( env.render("{{ divisibleBy(50, 5) }}", data) == "true" ); - CHECK( env.render("{{ divisibleBy(12, 3) }}", data) == "true" ); - CHECK( env.render("{{ divisibleBy(11, 3) }}", data) == "false" ); + CHECK(env.render("{{ divisibleBy(50, 5) }}", data) == "true"); + CHECK(env.render("{{ divisibleBy(12, 3) }}", data) == "true"); + CHECK(env.render("{{ divisibleBy(11, 3) }}", data) == "false"); // CHECK_THROWS_WITH( env.render("{{ divisibleBy(name, 2) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be number, but is string" ); } SECTION("odd") { - CHECK( env.render("{{ odd(11) }}", data) == "true" ); - CHECK( env.render("{{ odd(12) }}", data) == "false" ); + CHECK(env.render("{{ odd(11) }}", data) == "true"); + CHECK(env.render("{{ odd(12) }}", data) == "false"); // CHECK_THROWS_WITH( env.render("{{ odd(name) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be number, but is string" ); } SECTION("even") { - CHECK( env.render("{{ even(11) }}", data) == "false" ); - CHECK( env.render("{{ even(12) }}", data) == "true" ); + CHECK(env.render("{{ even(11) }}", data) == "false"); + CHECK(env.render("{{ even(12) }}", data) == "true"); // CHECK_THROWS_WITH( env.render("{{ even(name) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be number, but is string" ); } SECTION("max") { - CHECK( env.render("{{ max([1, 2, 3]) }}", data) == "3" ); - CHECK( env.render("{{ max([-5.2, 100.2, 2.4]) }}", data) == "100.2" ); + CHECK(env.render("{{ max([1, 2, 3]) }}", data) == "3"); + CHECK(env.render("{{ max([-5.2, 100.2, 2.4]) }}", data) == "100.2"); // CHECK_THROWS_WITH( env.render("{{ max(name) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is string" ); } SECTION("min") { - CHECK( env.render("{{ min([1, 2, 3]) }}", data) == "1" ); - CHECK( env.render("{{ min([-5.2, 100.2, 2.4]) }}", data) == "-5.2" ); + CHECK(env.render("{{ min([1, 2, 3]) }}", data) == "1"); + CHECK(env.render("{{ min([-5.2, 100.2, 2.4]) }}", data) == "-5.2"); // CHECK_THROWS_WITH( env.render("{{ min(name) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is string" ); } SECTION("float") { - CHECK( env.render("{{ float(\"2.2\") == 2.2 }}", data) == "true" ); - CHECK( env.render("{{ float(\"-1.25\") == -1.25 }}", data) == "true" ); + CHECK(env.render("{{ float(\"2.2\") == 2.2 }}", data) == "true"); + CHECK(env.render("{{ float(\"-1.25\") == -1.25 }}", data) == "true"); // CHECK_THROWS_WITH( env.render("{{ max(name) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is string" ); } SECTION("int") { - CHECK( env.render("{{ int(\"2\") == 2 }}", data) == "true" ); - CHECK( env.render("{{ int(\"-1.25\") == -1 }}", data) == "true" ); + CHECK(env.render("{{ int(\"2\") == 2 }}", data) == "true"); + CHECK(env.render("{{ int(\"-1.25\") == -1 }}", data) == "true"); // CHECK_THROWS_WITH( env.render("{{ max(name) }}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is string" ); } SECTION("default") { - CHECK( env.render("{{ default(11, 0) }}", data) == "11" ); - CHECK( env.render("{{ default(nothing, 0) }}", data) == "0" ); - CHECK( env.render("{{ default(name, \"nobody\") }}", data) == "Peter" ); - CHECK( env.render("{{ default(surname, \"nobody\") }}", data) == "nobody" ); - CHECK( env.render("{{ default(surname, \"{{ surname }}\") }}", data) == "{{ surname }}" ); - CHECK_THROWS_WITH( env.render("{{ default(surname, lastname) }}", data), "[inja.exception.render_error] variable 'lastname' not found" ); + CHECK(env.render("{{ default(11, 0) }}", data) == "11"); + CHECK(env.render("{{ default(nothing, 0) }}", data) == "0"); + CHECK(env.render("{{ default(name, \"nobody\") }}", data) == "Peter"); + CHECK(env.render("{{ default(surname, \"nobody\") }}", data) == "nobody"); + CHECK(env.render("{{ default(surname, \"{{ surname }}\") }}", data) == "{{ surname }}"); + CHECK_THROWS_WITH( env.render("{{ default(surname, lastname) }}", data), "[inja.exception.render_error] variable 'lastname' not found"); } SECTION("exists") { - CHECK( env.render("{{ exists(\"name\") }}", data) == "true" ); - CHECK( env.render("{{ exists(\"zipcode\") }}", data) == "false" ); - CHECK( env.render("{{ exists(name) }}", data) == "false" ); - CHECK( env.render("{{ exists(property) }}", data) == "true" ); + CHECK(env.render("{{ exists(\"name\") }}", data) == "true"); + CHECK(env.render("{{ exists(\"zipcode\") }}", data) == "false"); + CHECK(env.render("{{ exists(name) }}", data) == "false"); + CHECK(env.render("{{ exists(property) }}", data) == "true"); } SECTION("existsIn") { - CHECK( env.render("{{ existsIn(brother, \"name\") }}", data) == "true" ); - CHECK( env.render("{{ existsIn(brother, \"parents\") }}", data) == "false" ); - CHECK( env.render("{{ existsIn(brother, property) }}", data) == "true" ); - CHECK( env.render("{{ existsIn(brother, name) }}", data) == "false" ); - CHECK_THROWS_WITH( env.render("{{ existsIn(sister, \"lastname\") }}", data), "[inja.exception.render_error] variable 'sister' not found" ); - CHECK_THROWS_WITH( env.render("{{ existsIn(brother, sister) }}", data), "[inja.exception.render_error] variable 'sister' not found" ); + CHECK(env.render("{{ existsIn(brother, \"name\") }}", data) == "true"); + CHECK(env.render("{{ existsIn(brother, \"parents\") }}", data) == "false"); + CHECK(env.render("{{ existsIn(brother, property) }}", data) == "true"); + CHECK(env.render("{{ existsIn(brother, name) }}", data) == "false"); + CHECK_THROWS_WITH(env.render("{{ existsIn(sister, \"lastname\") }}", data), "[inja.exception.render_error] variable 'sister' not found"); + CHECK_THROWS_WITH(env.render("{{ existsIn(brother, sister) }}", data), "[inja.exception.render_error] variable 'sister' not found"); } SECTION("isType") { - CHECK( env.render("{{ isBoolean(is_happy) }}", data) == "true" ); - CHECK( env.render("{{ isBoolean(vars) }}", data) == "false" ); - CHECK( env.render("{{ isNumber(age) }}", data) == "true" ); - CHECK( env.render("{{ isNumber(name) }}", data) == "false" ); - CHECK( env.render("{{ isInteger(age) }}", data) == "true" ); - CHECK( env.render("{{ isInteger(is_happy) }}", data) == "false" ); - CHECK( env.render("{{ isFloat(temperature) }}", data) == "true" ); - CHECK( env.render("{{ isFloat(age) }}", data) == "false" ); - CHECK( env.render("{{ isObject(brother) }}", data) == "true" ); - CHECK( env.render("{{ isObject(vars) }}", data) == "false" ); - CHECK( env.render("{{ isArray(vars) }}", data) == "true" ); - CHECK( env.render("{{ isArray(name) }}", data) == "false" ); - CHECK( env.render("{{ isString(name) }}", data) == "true" ); - CHECK( env.render("{{ isString(names) }}", data) == "false" ); + CHECK(env.render("{{ isBoolean(is_happy) }}", data) == "true"); + CHECK(env.render("{{ isBoolean(vars) }}", data) == "false"); + CHECK(env.render("{{ isNumber(age) }}", data) == "true"); + CHECK(env.render("{{ isNumber(name) }}", data) == "false"); + CHECK(env.render("{{ isInteger(age) }}", data) == "true"); + CHECK(env.render("{{ isInteger(is_happy) }}", data) == "false"); + CHECK(env.render("{{ isFloat(temperature) }}", data) == "true"); + CHECK(env.render("{{ isFloat(age) }}", data) == "false"); + CHECK(env.render("{{ isObject(brother) }}", data) == "true"); + CHECK(env.render("{{ isObject(vars) }}", data) == "false"); + CHECK(env.render("{{ isArray(vars) }}", data) == "true"); + CHECK(env.render("{{ isArray(name) }}", data) == "false"); + CHECK(env.render("{{ isString(name) }}", data) == "true"); + CHECK(env.render("{{ isString(names) }}", data) == "false"); } } @@ -327,13 +329,13 @@ TEST_CASE("callbacks") { return 1.0; }); - CHECK( env.render("{{ double(age) }}", data) == "56" ); - CHECK( env.render("{{ half(age) }}", data) == "14" ); - CHECK( env.render("{{ double-greetings }}", data) == "Hello Hello!" ); - CHECK( env.render("{{ double-greetings() }}", data) == "Hello Hello!" ); - CHECK( env.render("{{ multiply(4, 5) }}", data) == "20.0" ); - CHECK( env.render("{{ multiply(3, 4, 5) }}", data) == "60.0" ); - CHECK( env.render("{{ multiply }}", data) == "1.0" ); + CHECK(env.render("{{ double(age) }}", data) == "56"); + CHECK(env.render("{{ half(age) }}", data) == "14"); + CHECK(env.render("{{ double-greetings }}", data) == "Hello Hello!"); + CHECK(env.render("{{ double-greetings() }}", data) == "Hello Hello!"); + CHECK(env.render("{{ multiply(4, 5) }}", data) == "20.0"); + CHECK(env.render("{{ multiply(3, 4, 5) }}", data) == "60.0"); + CHECK(env.render("{{ multiply }}", data) == "1.0"); } @@ -349,9 +351,9 @@ TEST_CASE("combinations") { data["brother"]["daughter0"] = { { "name", "Maria" } }; data["is_happy"] = true; - CHECK( env.render("{% if upper(\"Peter\") == \"PETER\" %}TRUE{% endif %}", data) == "TRUE" ); - CHECK( env.render("{% if lower(upper(name)) == \"peter\" %}TRUE{% endif %}", data) == "TRUE" ); - CHECK( env.render("{% for i in range(4) %}{{ loop.index1 }}{% endfor %}", data) == "1234" ); + CHECK(env.render("{% if upper(\"Peter\") == \"PETER\" %}TRUE{% endif %}", data) == "TRUE"); + CHECK(env.render("{% if lower(upper(name)) == \"peter\" %}TRUE{% endif %}", data) == "TRUE"); + CHECK(env.render("{% for i in range(4) %}{{ loop.index1 }}{% endfor %}", data) == "1234"); } TEST_CASE("templates") { @@ -364,11 +366,11 @@ TEST_CASE("templates") { inja::Environment env; inja::Template temp = env.parse("{% if is_happy %}{{ name }}{% else %}{{ city }}{% endif %}"); - CHECK( env.render(temp, data) == "Peter" ); + CHECK(env.render(temp, data) == "Peter"); data["is_happy"] = false; - CHECK( env.render(temp, data) == "Brunswick" ); + CHECK(env.render(temp, data) == "Brunswick"); } SECTION("include") { @@ -377,8 +379,8 @@ TEST_CASE("templates") { env.include_template("greeting", t1); inja::Template t2 = env.parse("{% include \"greeting\" %}!"); - CHECK( env.render(t2, data) == "Hello Peter!" ); - CHECK_THROWS_WITH( env.parse("{% include \"does-not-exist\" %}!"), "[inja.exception.file_error] failed accessing file at 'does-not-exist'" ); + CHECK(env.render(t2, data) == "Hello Peter!"); + CHECK_THROWS_WITH(env.parse("{% include \"does-not-exist\" %}!"), "[inja.exception.file_error] failed accessing file at 'does-not-exist'"); } SECTION("include-in-loop") { @@ -388,7 +390,7 @@ TEST_CASE("templates") { inja::Environment env; env.include_template("city.tpl", env.parse("{{ loop.index }}:{{ city.name }};")); - CHECK( env.render("{% for city in cities %}{% include \"city.tpl\" %}{% endfor %}", loop_data) == "0:Munich;1:New York;" ); + CHECK(env.render("{% for city in cities %}{% include \"city.tpl\" %}{% endfor %}", loop_data) == "0:Munich;1:New York;"); } } @@ -408,31 +410,31 @@ TEST_CASE("other-syntax") { inja::Environment env; env.set_element_notation(inja::ElementNotation::Pointer); - CHECK( env.render("{{ name }}", data) == "Peter" ); - CHECK( env.render("Hello {{ names/1 }}!", data) == "Hello Seb!" ); - CHECK( env.render("Hello {{ brother/name }}!", data) == "Hello Chris!" ); - CHECK( env.render("Hello {{ brother/daughter0/name }}!", data) == "Hello Maria!" ); + CHECK(env.render("{{ name }}", data) == "Peter"); + CHECK(env.render("Hello {{ names/1 }}!", data) == "Hello Seb!"); + CHECK(env.render("Hello {{ brother/name }}!", data) == "Hello Chris!"); + CHECK(env.render("Hello {{ brother/daughter0/name }}!", data) == "Hello Maria!"); - CHECK_THROWS_WITH( env.render("{{unknown/name}}", data), "[inja.exception.render_error] variable 'unknown/name' not found" ); + CHECK_THROWS_WITH(env.render("{{unknown/name}}", data), "[inja.exception.render_error] variable 'unknown/name' not found"); } SECTION("other expression syntax") { inja::Environment env; - CHECK( env.render("Hello {{ name }}!", data) == "Hello Peter!" ); + CHECK(env.render("Hello {{ name }}!", data) == "Hello Peter!"); env.set_expression("(&", "&)"); - CHECK( env.render("Hello {{ name }}!", data) == "Hello {{ name }}!" ); - CHECK( env.render("Hello (& name &)!", data) == "Hello Peter!" ); + CHECK(env.render("Hello {{ name }}!", data) == "Hello {{ name }}!"); + CHECK(env.render("Hello (& name &)!", data) == "Hello Peter!"); } SECTION("other comment syntax") { inja::Environment env; env.set_comment("(&", "&)"); - CHECK( env.render("Hello {# Test #}", data) == "Hello {# Test #}" ); - CHECK( env.render("Hello (& Test &)", data) == "Hello " ); + CHECK(env.render("Hello {# Test #}", data) == "Hello {# Test #}"); + CHECK(env.render("Hello (& Test &)", data) == "Hello "); } SECTION("multiple changes") { @@ -445,6 +447,7 @@ $$ if name == "Peter" You really are <%name%> $$ endif )DELIM"; - CHECK( env.render(string_template, data) == "Hello Peter\n You really are Peter\n"); + + CHECK(env.render(string_template, data) == "Hello Peter\n You really are Peter\n"); } } diff --git a/test/unit.cpp b/test/unit.cpp index 1c77b13..96c87b1 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -1,2 +1,4 @@ +// Copyright (c) 2019 Pantor. All rights reserved. + #define CATCH_CONFIG_MAIN #include "catch/catch.hpp"