Replies: 3 comments 10 replies
-
|
Heya -- Since |
Beta Was this translation helpful? Give feedback.
-
|
I'm putting this on hold for additional test cases + the error proposal to go through, if that's alright @codetiger. I'll try to contribute some additional cases 😄 |
Beta Was this translation helpful? Give feedback.
-
|
Been talking a bit with @codetiger over this, This isn't fully organized at the time of linking this, but I've come up with the following set of tests:
|
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Background
JSONLogic includes comparison operators (
>,>=,<,<=). Current implementations are inconsistent:<and<=Proposal
This proposal seeks to standardize comparison operator behavior:
Examples
Benefits
Test Cases
[ "# Less Than (<) Operator Tests", "# Two Argument Tests", { "description": "Basic numbers comparison", "rule": {"<": [1, 2]}, "data": null, "result": true }, { "description": "Equal numbers", "rule": {"<": [2, 2]}, "data": null, "result": false }, { "description": "Reverse order numbers", "rule": {"<": [2, 1]}, "data": null, "result": false }, "# Three Argument Tests", { "description": "Three ascending numbers", "rule": {"<": [1, 2, 3]}, "data": null, "result": true }, { "description": "Three non-ascending numbers", "rule": {"<": [1, 3, 2]}, "data": null, "result": false }, "# Multiple Argument Tests", { "description": "Many ascending numbers", "rule": {"<": [1, 2, 3, 4, 5]}, "data": null, "result": true }, { "description": "Break in sequence", "rule": {"<": [1, 2, 2, 3]}, "data": null, "result": false }, "# Type Coercion Tests", { "description": "String numbers", "rule": {"<": ["1", "2"]}, "data": null, "result": true }, { "description": "Mixed types", "rule": {"<": [1, "2", 3]}, "data": null, "result": true }, { "description": "Boolean values", "rule": {"<": [false, true]}, "data": null, "result": true }, "# Data Context Tests", { "description": "Values from data", "rule": {"<": [{"var": "x"}, {"var": "y"}]}, "data": {"x": 1, "y": 2}, "result": true }, { "description": "Mixed literal and data", "rule": {"<": [{"var": "x"}, 5, {"var": "y"}]}, "data": {"x": 1, "y": 10}, "result": true }, "# Edge Cases", { "description": "Single argument", "rule": {"<": [1]}, "data": null, "result": false }, { "description": "Empty array", "rule": {"<": []}, "data": null, "result": false }, { "description": "Null values", "rule": {"<": [null, 1]}, "data": null, "result": true }, { "description": "Undefined var", "rule": {"<": [{"var": "missing"}, 1]}, "data": {}, "result": true }, "# Less Than or Equal (<=) Operator Tests", "# Two Argument Tests", { "description": "Basic numbers comparison", "rule": {"<=": [1, 2]}, "data": null, "result": true }, { "description": "Equal numbers", "rule": {"<=": [2, 2]}, "data": null, "result": true }, { "description": "Reverse order numbers", "rule": {"<=": [2, 1]}, "data": null, "result": false }, "# Three Argument Tests", { "description": "Three ascending numbers", "rule": {"<=": [1, 2, 3]}, "data": null, "result": true }, { "description": "Three non-ascending numbers", "rule": {"<=": [1, 3, 2]}, "data": null, "result": false }, "# Multiple Argument Tests", { "description": "Many ascending numbers", "rule": {"<=": [1, 2, 3, 4, 5]}, "data": null, "result": true }, { "description": "Break in sequence", "rule": {"<=": [1, 2, 2, 3]}, "data": null, "result": true }, "# Type Coercion Tests", { "description": "String numbers", "rule": {"<=": ["1", "2"]}, "data": null, "result": true }, { "description": "Mixed types", "rule": {"<=": [1, "2", 3]}, "data": null, "result": true }, { "description": "Boolean values", "rule": {"<=": [false, true]}, "data": null, "result": true }, "# Data Context Tests", { "description": "Values from data", "rule": {"<=": [{"var": "x"}, {"var": "y"}]}, "data": {"x": 1, "y": 2}, "result": true }, { "description": "Mixed literal and data", "rule": {"<=": [{"var": "x"}, 5, {"var": "y"}]}, "data": {"x": 1, "y": 10}, "result": true }, "# Edge Cases", { "description": "Single argument", "rule": {"<=": [1]}, "data": null, "result": false }, { "description": "Empty array", "rule": {"<=": []}, "data": null, "result": false }, { "description": "Null values", "rule": {"<=": [null, 1]}, "data": null, "result": true }, { "description": "Undefined var", "rule": {"<=": [{"var": "missing"}, 1]}, "data": {}, "result": true }, "# Greater Than (>) Operator Tests", "# Two Argument Tests", { "description": "Basic numbers comparison", "rule": {">": [2, 1]}, "data": null, "result": true }, { "description": "Equal numbers", "rule": {">": [2, 2]}, "data": null, "result": false }, { "description": "Reverse order numbers", "rule": {">": [1, 2]}, "data": null, "result": false }, "# Three Argument Tests", { "description": "Three descending numbers", "rule": {">": [3, 2, 1]}, "data": null, "result": true }, { "description": "Three non-descending numbers", "rule": {">": [3, 1, 2]}, "data": null, "result": false }, "# Multiple Argument Tests", { "description": "Many descending numbers", "rule": {">": [5, 4, 3, 2, 1]}, "data": null, "result": true }, { "description": "Break in sequence", "rule": {">": [3, 2, 2, 1]}, "data": null, "result": false }, "# Type Coercion Tests", { "description": "String numbers", "rule": {">": ["2", "1"]}, "data": null, "result": true }, { "description": "Mixed types", "rule": {">": [3, "2", 1]}, "data": null, "result": true }, { "description": "Boolean values", "rule": {">": [true, false]}, "data": null, "result": true }, "# Data Context Tests", { "description": "Values from data", "rule": {">": [{"var": "y"}, {"var": "x"}]}, "data": {"x": 1, "y": 2}, "result": true }, { "description": "Mixed literal and data", "rule": {">": [{"var": "y"}, 5, {"var": "x"}]}, "data": {"x": 1, "y": 10}, "result": true }, "# Edge Cases", { "description": "Single argument", "rule": {">": [1]}, "data": null, "result": false }, { "description": "Empty array", "rule": {">": []}, "data": null, "result": false }, { "description": "Null values", "rule": {">": [1, null]}, "data": null, "result": true }, { "description": "Undefined var", "rule": {">": [1, {"var": "missing"}]}, "data": {}, "result": true }, "# Greater Than or Equal (>=) Operator Tests", "# Two Argument Tests", { "description": "Basic numbers comparison", "rule": {">=": [2, 1]}, "data": null, "result": true }, { "description": "Equal numbers", "rule": {">=": [2, 2]}, "data": null, "result": true }, { "description": "Reverse order numbers", "rule": {">=": [1, 2]}, "data": null, "result": false }, "# Three Argument Tests", { "description": "Three descending numbers", "rule": {">=": [3, 2, 1]}, "data": null, "result": true }, { "description": "Three non-descending numbers", "rule": {">=": [3, 1, 2]}, "data": null, "result": false }, "# Multiple Argument Tests", { "description": "Many descending numbers", "rule": {">=": [5, 4, 3, 2, 1]}, "data": null, "result": true }, { "description": "Break in sequence", "rule": {">=": [3, 2, 2, 1]}, "data": null, "result": true }, "# Type Coercion Tests", { "description": "String numbers", "rule": {">=": ["2", "1"]}, "data": null, "result": true }, { "description": "Mixed types", "rule": {">=": [3, "2", 1]}, "data": null, "result": true }, { "description": "Boolean values", "rule": {">=": [true, false]}, "data": null, "result": true }, "# Data Context Tests", { "description": "Values from data", "rule": {">=": [{"var": "y"}, {"var": "x"}]}, "data": {"x": 1, "y": 2}, "result": true }, { "description": "Mixed literal and data", "rule": {">=": [{"var": "y"}, 5, {"var": "x"}]}, "data": {"x": 1, "y": 10}, "result": true }, "# Edge Cases", { "description": "Single argument", "rule": {">=": [1]}, "data": null, "result": false }, { "description": "Empty array", "rule": {">=": []}, "data": null, "result": false }, { "description": "Null values", "rule": {">=": [1, null]}, "data": null, "result": true }, { "description": "Undefined var", "rule": {">=": [1, {"var": "missing"}]}, "data": {}, "result": true }, "# Additional Sequential Comparison Tests", { "description": "Mixed equality in ascending sequence", "rule": {"<": [1, 2, 2, 2, 3]}, "data": null, "result": false }, { "description": "Mixed equality in descending sequence", "rule": {">": [3, 2, 2, 2, 1]}, "data": null, "result": false }, "# Extended Type Coercion Tests", { "description": "String and number mixed sequence", "rule": {"<=": ["1", 2, "2", 3, "3"]}, "data": null, "result": true }, { "description": "Complex mixed types", "rule": {">=": [true, 1, "0", false]}, "data": null, "result": true }, "# Short-Circuit Tests", { "description": "Early failure in sequence", "rule": {"<": [1, 3, 2, 4, 5]}, "data": null, "result": false }, { "description": "Late failure in sequence", "rule": {">": [5, 4, 3, 3, 2]}, "data": null, "result": false } ]Implementation Guidelines
Beta Was this translation helpful? Give feedback.
All reactions