From 51a1db5a724bcf64c7907cd91614e3adcefbae27 Mon Sep 17 00:00:00 2001 From: grf53 Date: Thu, 1 May 2025 16:27:43 +0900 Subject: [PATCH 1/2] feat: add `true` and `false` as operands of `is` and `is not` --- include/minja/minja.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/minja/minja.hpp b/include/minja/minja.hpp index ec89bc7..39821cd 100644 --- a/include/minja/minja.hpp +++ b/include/minja/minja.hpp @@ -1306,6 +1306,8 @@ class BinaryOpExpr : public Expression { if (name == "iterable") return l.is_iterable(); if (name == "sequence") return l.is_array(); if (name == "defined") return !l.is_null(); + if (name == "true") return l.to_bool(); + if (name == "false") return !l.to_bool(); throw std::runtime_error("Unknown type for 'is' operator: " + name); }; auto value = eval(); From 964dc690ebb2f34c0ea34c7d03b5bc758ed470b8 Mon Sep 17 00:00:00 2001 From: grf53 Date: Thu, 1 May 2025 16:30:00 +0900 Subject: [PATCH 2/2] test: add tests for `is true/false` and `is not true/false` --- tests/test-syntax.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/test-syntax.cpp b/tests/test-syntax.cpp index 5bc82fa..a5a2707 100644 --- a/tests/test-syntax.cpp +++ b/tests/test-syntax.cpp @@ -217,6 +217,18 @@ TEST(SyntaxTest, SimpleCases) { EXPECT_EQ( "False", render(R"({% set foo = true %}{{ not foo is defined }})", {}, {})); + EXPECT_EQ( + "True", + render(R"({% set foo = true %}{{ foo is true }})", {}, {})); + EXPECT_EQ( + "False", + render(R"({% set foo = true %}{{ foo is false }})", {}, {})); + EXPECT_EQ( + "True", + render(R"({% set foo = false %}{{ foo is not true }})", {}, {})); + EXPECT_EQ( + "False", + render(R"({% set foo = false %}{{ foo is not false }})", {}, {})); EXPECT_EQ( R"({"a": "b"})", render(R"({{ {"a": "b"} | tojson }})", {}, {}));