diff --git a/Sources/Jinja/Tests.swift b/Sources/Jinja/Tests.swift index a623781..0e42774 100644 --- a/Sources/Jinja/Tests.swift +++ b/Sources/Jinja/Tests.swift @@ -137,7 +137,7 @@ public enum Tests { case let .int(num): return num % 2 == 0 case let .double(num): - return Int(num) % 2 == 0 + return num.isFinite && num.truncatingRemainder(dividingBy: 2.0) == 0.0 default: return false } @@ -160,7 +160,8 @@ public enum Tests { case let .int(num): return num % 2 != 0 case let .double(num): - return Int(num) % 2 != 0 + return num.isFinite && num.truncatingRemainder(dividingBy: 1.0) == 0.0 + && num.truncatingRemainder(dividingBy: 2.0) != 0.0 default: return false } diff --git a/Tests/JinjaTests/TemplateTests.swift b/Tests/JinjaTests/TemplateTests.swift index 38b995b..159e659 100644 --- a/Tests/JinjaTests/TemplateTests.swift +++ b/Tests/JinjaTests/TemplateTests.swift @@ -2042,6 +2042,24 @@ struct TemplateTests { #expect(rendered == "|true|false|true|") } + @Test("Is operator with fractional numbers even") + func isOperatorWithFractionalNumbersEven() throws { + let string = #"|{{ 4.5 is even }}|{{ 3.7 is even }}|{{ 0.1 is even }}|{{ 2.0 is even }}|"# + let context: Context = [:] + + let rendered = try Template(string).render(context) + #expect(rendered == "|false|false|false|true|") + } + + @Test("Is operator with fractional numbers odd") + func isOperatorWithFractionalNumbersOdd() throws { + let string = #"|{{ 4.5 is odd }}|{{ 3.7 is odd }}|{{ 0.1 is odd }}|{{ 3.0 is odd }}|"# + let context: Context = [:] + + let rendered = try Template(string).render(context) + #expect(rendered == "|false|false|false|true|") + } + @Test("Is operator with mapping") func isOperatorWithMapping() throws { let string = diff --git a/Tests/JinjaTests/TestsTests.swift b/Tests/JinjaTests/TestsTests.swift index 098e179..8d503de 100644 --- a/Tests/JinjaTests/TestsTests.swift +++ b/Tests/JinjaTests/TestsTests.swift @@ -219,6 +219,18 @@ struct TestsTests { } } + @Test("even test with fractional numbers") + func evenWithFractionalNumbers() throws { + let result1 = try Tests.even([.double(4.5)], kwargs: [:], env: env) + #expect(result1 == false) + + let result2 = try Tests.even([.double(3.7)], kwargs: [:], env: env) + #expect(result2 == false) + + let result3 = try Tests.even([.double(0.1)], kwargs: [:], env: env) + #expect(result3 == false) + } + @Test("odd test with odd integer") func oddWithOddInteger() throws { let result = try Tests.odd([.int(3)], kwargs: [:], env: env) @@ -256,6 +268,18 @@ struct TestsTests { } } + @Test("odd test with fractional numbers") + func oddWithFractionalNumbers() throws { + let result1 = try Tests.odd([.double(4.5)], kwargs: [:], env: env) + #expect(result1 == false) + + let result2 = try Tests.odd([.double(3.7)], kwargs: [:], env: env) + #expect(result2 == false) + + let result3 = try Tests.odd([.double(0.1)], kwargs: [:], env: env) + #expect(result3 == false) + } + @Test("divisibleby test with divisible integers") func divisiblebyWithDivisibleIntegers() throws { let result = try Tests.divisibleby([.int(10), .int(2)], kwargs: [:], env: env)