diff --git a/lib/src/evaluator.dart b/lib/src/evaluator.dart index a40984e..0f4c7bb 100644 --- a/lib/src/evaluator.dart +++ b/lib/src/evaluator.dart @@ -2,6 +2,7 @@ import 'package:liquify/parser.dart' show parseInput; import 'package:liquify/src/context.dart'; import 'package:liquify/src/drop.dart'; import 'package:liquify/src/tag_registry.dart'; +import 'package:liquify/src/util.dart'; import 'ast.dart'; import 'buffer.dart'; @@ -139,10 +140,10 @@ class Evaluator implements ASTVisitor { result = left >= right; break; case 'and': - result = left && right; + result = isTruthy(left) && isTruthy(right); break; case 'or': - result = left || right; + result = isTruthy(left) || isTruthy(right); break; case '..': result = List.generate(right - left + 1, (index) => left + index); diff --git a/test/tags_test.dart b/test/tags_test.dart index 329cb22..2a3d669 100644 --- a/test/tags_test.dart +++ b/test/tags_test.dart @@ -777,5 +777,53 @@ void main() { expect(evaluator.buffer.toString(), contains('not truthy')); }); }); + + test('empty string', () { + testParser(''' + {% assign name = "" %} + {% if name %} + truthy. + {% endif %} + ''', (document) { + evaluator.evaluate(document); + expect(evaluator.buffer.toString(), contains('truthy')); + }); + }); + + test('null', () { + testParser(''' + {% assign name = null %} + {% if name %} + truthy. + {% endif %} + ''', (document) { + evaluator.evaluate(document); + expect(evaluator.buffer.toString(), isNot(contains('truthy'))); + }); + }); + + test('binary operator and', () { + testParser(''' + {% assign name = null %} + {% if name and "" %} + truthy. + {% endif %} + ''', (document) { + evaluator.evaluate(document); + expect(evaluator.buffer.toString(), isNot(contains('truthy'))); + }); + }); + + test('binary operator or', () { + testParser(''' + {% assign name = null %} + {% if name or "" %} + truthy. + {% endif %} + ''', (document) { + evaluator.evaluate(document); + expect(evaluator.buffer.toString(), contains('truthy')); + }); + }); }); }