diff --git a/exec/evaluator.go b/exec/evaluator.go index 71f1af6..6fc92a8 100644 --- a/exec/evaluator.go +++ b/exec/evaluator.go @@ -179,11 +179,17 @@ func (e *Evaluator) evalBinaryExpression(node *nodes.BinaryExpression) *Value { if left.IsFloat() || right.IsFloat() { return AsValue(left.Float() <= right.Float()) } + if left.IsString() || right.IsString() { + return AsValue(left.String() <= right.String()) + } return AsValue(left.Integer() <= right.Integer()) case tokens.GreaterThanOrEqual: if left.IsFloat() || right.IsFloat() { return AsValue(left.Float() >= right.Float()) } + if left.IsString() || right.IsString() { + return AsValue(left.String() >= right.String()) + } return AsValue(left.Integer() >= right.Integer()) case tokens.Equals: return AsValue(left.EqualValueTo(right)) @@ -191,11 +197,19 @@ func (e *Evaluator) evalBinaryExpression(node *nodes.BinaryExpression) *Value { if left.IsFloat() || right.IsFloat() { return AsValue(left.Float() > right.Float()) } + if left.IsString() || right.IsString() { + return AsValue(left.String() > right.String()) + } + return AsValue(left.Integer() > right.Integer()) case tokens.LowerThan: if left.IsFloat() || right.IsFloat() { return AsValue(left.Float() < right.Float()) } + if left.IsString() || right.IsString() { + return AsValue(left.String() < right.String()) + } + return AsValue(left.Integer() < right.Integer()) case tokens.Ne: return AsValue(!left.EqualValueTo(right)) diff --git a/tests/integration/tests_test.go b/tests/integration/tests_test.go index 8896cda..838a812 100644 --- a/tests/integration/tests_test.go +++ b/tests/integration/tests_test.go @@ -97,4 +97,42 @@ var _ = Context("tests", func() { "var1 in ['1', '2'] or var2 == '3': ok", ) }) + Context("https://github.com/NikolaLohinski/gonja/issues/30", func() { + shouldRender( + `{{ "a" < "b" }}`, + `True`, + ) + shouldRender( + `{{ "b" > "a" }}`, + `True`, + ) + shouldRender( + `{{ "a" > "b" }}`, + `False`, + ) + shouldRender( + `{{ "a" == "b" }}`, + `False`, + ) + shouldRender( + `{{ "a" == "a" }}`, + `True`, + ) + shouldRender( + `{{ "b" >= "a" }}`, + `True`, + ) + shouldRender( + `{{ "a" >= "b" }}`, + `False`, + ) + shouldRender( + `{{ "b" <= "a" }}`, + `False`, + ) + shouldRender( + `{{ "a" <= "b" }}`, + `True`, + ) + }) })