[
"# Non-rules get passed through",
{"description": "true", "rule": true, "result": true},
{"description": "false", "rule": false, "result": false},
{"description": "17", "rule": 17, "result": 17},
{"description": "3.14", "rule": 3.14, "result": 3.14},
{"description": "\"apple\"", "rule": "apple", "result": "apple"},
{"description": "null", "rule": null, "result": null},
{ "description": "[\"a\",\"b\"]", "rule": ["a", "b"], "result": ["a", "b"] },
"# Single operator tests",
{
"description": "{\"==\":[1,1]}",
"rule": { "==": [1, 1] },
"result": true
},
{
"description": "{\"==\":[1,\"1\"]}",
"rule": { "==": [1, "1"] },
"result": true
},
{
"description": "{\"==\":[1,2]}",
"rule": { "==": [1, 2] },
"result": false
},
{
"description": "{\"===\":[1,1]}",
"rule": { "===": [1, 1] },
"result": true
},
{
"description": "{\"===\":[1,\"1\"]}",
"rule": { "===": [1, "1"] },
"result": false
},
{
"description": "{\"===\":[1,2]}",
"rule": { "===": [1, 2] },
"result": false
},
{
"description": "{\"!=\":[1,2]}",
"rule": { "!=": [1, 2] },
"result": true
},
{
"description": "{\"!=\":[1,1]}",
"rule": { "!=": [1, 1] },
"result": false
},
{
"description": "{\"!=\":[1,\"1\"]}",
"rule": { "!=": [1, "1"] },
"result": false
},
{
"description": "{\"!==\":[1,2]}",
"rule": { "!==": [1, 2] },
"result": true
},
{
"description": "{\"!==\":[1,1]}",
"rule": { "!==": [1, 1] },
"result": false
},
{
"description": "{\"!==\":[1,\"1\"]}",
"rule": { "!==": [1, "1"] },
"result": true
},
{
"description": "{\">\":[2,1]}",
"rule": { ">": [2, 1] },
"result": true
},
{
"description": "{\">\":[1,1]}",
"rule": { ">": [1, 1] },
"result": false
},
{
"description": "{\">\":[1,2]}",
"rule": { ">": [1, 2] },
"result": false
},
{
"description": "{\">\":[\"2\",1]}",
"rule": { ">": ["2", 1] },
"result": true
},
{
"description": "{\">=\":[2,1]}",
"rule": { ">=": [2, 1] },
"result": true
},
{
"description": "{\">=\":[1,1]}",
"rule": { ">=": [1, 1] },
"result": true
},
{
"description": "{\">=\":[1,2]}",
"rule": { ">=": [1, 2] },
"result": false
},
{
"description": "{\">=\":[\"2\",1]}",
"rule": { ">=": ["2", 1] },
"result": true
},
{
"description": "{\"<\":[2,1]}",
"rule": { "<": [2, 1] },
"result": false
},
{
"description": "{\"<\":[1,1]}",
"rule": { "<": [1, 1] },
"result": false
},
{
"description": "{\"<\":[1,2]}",
"rule": { "<": [1, 2] },
"result": true
},
{
"description": "{\"<\":[\"1\",2]}",
"rule": { "<": ["1", 2] },
"result": true
},
{
"description": "{\"<\":[1,2,3]}",
"rule": { "<": [1, 2, 3] },
"result": true
},
{
"description": "{\"<\":[1,1,3]}",
"rule": { "<": [1, 1, 3] },
"result": false
},
{
"description": "{\"<\":[1,4,3]}",
"rule": { "<": [1, 4, 3] },
"result": false
},
{
"description": "{\"<=\":[2,1]}",
"rule": { "<=": [2, 1] },
"result": false
},
{
"description": "{\"<=\":[1,1]}",
"rule": { "<=": [1, 1] },
"result": true
},
{
"description": "{\"<=\":[1,2]}",
"rule": { "<=": [1, 2] },
"result": true
},
{
"description": "{\"<=\":[\"1\",2]}",
"rule": { "<=": ["1", 2] },
"result": true
},
{
"description": "{\"<=\":[1,2,3]}",
"rule": { "<=": [1, 2, 3] },
"result": true
},
{
"description": "{\"<=\":[1,4,3]}",
"rule": { "<=": [1, 4, 3] },
"result": false
},
{
"description": "{\"!\":[false]}",
"rule": { "!": [false] },
"result": true
},
{ "description": "{\"!\":false}", "rule": {"!": false}, "result": true },
{
"description": "{\"!\":[true]}",
"rule": { "!": [true] },
"result": false
},
{ "description": "{\"!\":true}", "rule": {"!": true}, "result": false },
{ "description": "{\"!\":0}", "rule": {"!": 0}, "result": true },
{ "description": "{\"!\":1}", "rule": {"!": 1}, "result": false },
{
"description": "{\"or\":[true,true]}",
"rule": { "or": [true, true] },
"result": true
},
{
"description": "{\"or\":[false,true]}",
"rule": { "or": [false, true] },
"result": true
},
{
"description": "{\"or\":[true,false]}",
"rule": { "or": [true, false] },
"result": true
},
{
"description": "{\"or\":[false,false]}",
"rule": { "or": [false, false] },
"result": false
},
{
"description": "{\"or\":[false,false,true]}",
"rule": { "or": [false, false, true] },
"result": true
},
{
"description": "{\"or\":[false,false,false]}",
"rule": { "or": [false, false, false] },
"result": false
},
{
"description": "{\"or\":[false]}",
"rule": { "or": [false] },
"result": false
},
{
"description": "{\"or\":[true]}",
"rule": { "or": [true] },
"result": true
},
{
"description": "{\"or\":[1,3]}",
"rule": { "or": [1, 3] },
"result": 1
},
{
"description": "{\"or\":[3,false]}",
"rule": { "or": [3, false] },
"result": 3
},
{
"description": "{\"or\":[false,3]}",
"rule": { "or": [false, 3] },
"result": 3
},
{
"description": "{\"and\":[true,true]}",
"rule": { "and": [true, true] },
"result": true
},
{
"description": "{\"and\":[false,true]}",
"rule": { "and": [false, true] },
"result": false
},
{
"description": "{\"and\":[true,false]}",
"rule": { "and": [true, false] },
"result": false
},
{
"description": "{\"and\":[false,false]}",
"rule": { "and": [false, false] },
"result": false
},
{
"description": "{\"and\":[true,true,true]}",
"rule": { "and": [true, true, true] },
"result": true
},
{
"description": "{\"and\":[true,true,false]}",
"rule": { "and": [true, true, false] },
"result": false
},
{
"description": "{\"and\":[false]}",
"rule": { "and": [false] },
"result": false
},
{
"description": "{\"and\":[true]}",
"rule": { "and": [true] },
"result": true
},
{
"description": "{\"and\":[1,3]}",
"rule": { "and": [1, 3] },
"result": 3
},
{
"description": "{\"and\":[3,false]}",
"rule": { "and": [3, false] },
"result": false
},
{
"description": "{\"and\":[false,3]}",
"rule": { "and": [false, 3] },
"result": false
},
{
"description": "{\"?:\":[true,1,2]}",
"rule": { "?:": [true, 1, 2] },
"result": 1
},
{
"description": "{\"?:\":[false,1,2]}",
"rule": { "?:": [false, 1, 2] },
"result": 2
},
{
"description": "{\"in\":[\"Bart\",[\"Bart\",\"Homer\",\"Lisa\",\"Marge\",\"Maggie\"]]}",
"rule": {
"in": [ "Bart", ["Bart", "Homer", "Lisa", "Marge", "Maggie"] ]
},
"result": true
},
{
"description": "{\"in\":[\"Milhouse\",[\"Bart\",\"Homer\",\"Lisa\",\"Marge\",\"Maggie\"]]}",
"rule": {
"in": [ "Milhouse", ["Bart", "Homer", "Lisa", "Marge", "Maggie"] ]
},
"result": false
},
{
"description": "{\"in\":[\"Spring\",\"Springfield\"]}",
"rule": { "in": ["Spring", "Springfield"] },
"result": true
},
{
"description": "{\"in\":[\"i\",\"team\"]}",
"rule": { "in": ["i", "team"] },
"result": false
},
{ "description": "{\"cat\":\"ice\"}", "rule": {"cat": "ice"}, "result": "ice" },
{
"description": "{\"cat\":[\"ice\"]}",
"rule": { "cat": ["ice"] },
"result": "ice"
},
{
"description": "{\"cat\":[\"ice\",\"cream\"]}",
"rule": { "cat": ["ice", "cream"] },
"result": "icecream"
},
{
"description": "{\"cat\":[1,2]}",
"rule": { "cat": [1, 2] },
"result": "12"
},
{
"description": "{\"cat\":[\"Robocop\",2]}",
"rule": { "cat": ["Robocop", 2] },
"result": "Robocop2"
},
{
"description": "{\"cat\":[\"we all scream for \",\"ice\",\"cream\"]}",
"rule": { "cat": ["we all scream for ", "ice", "cream"] },
"result": "we all scream for icecream"
},
{
"description": "{\"%\":[1,2]}",
"rule": { "%": [1, 2] },
"result": 1
},
{
"description": "{\"%\":[2,2]}",
"rule": { "%": [2, 2] },
"result": 0
},
{
"description": "{\"%\":[3,2]}",
"rule": { "%": [3, 2] },
"result": 1
},
{
"description": "{\"max\":[1,2,3]}",
"rule": { "max": [1, 2, 3] },
"result": 3
},
{
"description": "{\"max\":[1,3,3]}",
"rule": { "max": [1, 3, 3] },
"result": 3
},
{
"description": "{\"max\":[3,2,1]}",
"rule": { "max": [3, 2, 1] },
"result": 3
},
{
"description": "{\"max\":[1]}",
"rule": { "max": [1] },
"result": 1
},
{
"description": "{\"min\":[1,2,3]}",
"rule": { "min": [1, 2, 3] },
"result": 1
},
{
"description": "{\"min\":[1,1,3]}",
"rule": { "min": [1, 1, 3] },
"result": 1
},
{
"description": "{\"min\":[3,2,1]}",
"rule": { "min": [3, 2, 1] },
"result": 1
},
{
"description": "{\"min\":[1]}",
"rule": { "min": [1] },
"result": 1
},
{
"description": "{\"+\":[1,2]}",
"rule": { "+": [1, 2] },
"result": 3
},
{
"description": "{\"+\":[2,2,2]}",
"rule": { "+": [2, 2, 2] },
"result": 6
},
{
"description": "{\"+\":[1]}",
"rule": { "+": [1] },
"result": 1
},
{
"description": "{\"+\":[\"1\",1]}",
"rule": { "+": ["1", 1] },
"result": 2
},
{
"description": "{\"*\":[3,2]}",
"rule": { "*": [3, 2] },
"result": 6
},
{
"description": "{\"*\":[2,2,2]}",
"rule": { "*": [2, 2, 2] },
"result": 8
},
{
"description": "{\"*\":[1]}",
"rule": { "*": [1] },
"result": 1
},
{
"description": "{\"*\":[\"1\",1]}",
"rule": { "*": ["1", 1] },
"result": 1
},
{
"description": "{\"-\":[2,3]}",
"rule": { "-": [2, 3] },
"result": -1
},
{
"description": "{\"-\":[3,2]}",
"rule": { "-": [3, 2] },
"result": 1
},
{
"description": "{\"-\":[3]}",
"rule": { "-": [3] },
"result": -3
},
{
"description": "{\"-\":[\"1\",1]}",
"rule": { "-": ["1", 1] },
"result": 0
},
{
"description": "{\"/\":[4,2]}",
"rule": { "/": [4, 2] },
"result": 2
},
{
"description": "{\"/\":[2,4]}",
"rule": { "/": [2, 4] },
"result": 0.5
},
{
"description": "{\"/\":[\"1\",1]}",
"rule": { "/": ["1", 1] },
"result": 1
},
"Substring",
{
"description": "{\"substr\":[\"jsonlogic\",4]}",
"rule": { "substr": ["jsonlogic", 4] },
"data": null,
"result": "logic"
},
{
"description": "{\"substr\":[\"jsonlogic\",-5]}",
"rule": { "substr": ["jsonlogic", -5] },
"data": null,
"result": "logic"
},
{
"description": "{\"substr\":[\"jsonlogic\",0,1]}",
"rule": { "substr": ["jsonlogic", 0, 1] },
"data": null,
"result": "j"
},
{
"description": "{\"substr\":[\"jsonlogic\",-1,1]}",
"rule": { "substr": ["jsonlogic", -1, 1] },
"data": null,
"result": "c"
},
{
"description": "{\"substr\":[\"jsonlogic\",4,5]}",
"rule": { "substr": ["jsonlogic", 4, 5] },
"data": null,
"result": "logic"
},
{
"description": "{\"substr\":[\"jsonlogic\",-5,5]}",
"rule": { "substr": ["jsonlogic", -5, 5] },
"data": null,
"result": "logic"
},
{
"description": "{\"substr\":[\"jsonlogic\",-5,-2]}",
"rule": { "substr": ["jsonlogic", -5, -2] },
"data": null,
"result": "log"
},
{
"description": "{\"substr\":[\"jsonlogic\",1,-5]}",
"rule": { "substr": ["jsonlogic", 1, -5] },
"data": null,
"result": "son"
},
"Merge arrays",
{ "description": "{\"merge\":[]}", "rule": {"merge": []}, "data": null, "result": [] },
{
"description": "{\"merge\":[[1]]}",
"rule": {
"merge": [ [1] ]
},
"data": null,
"result": [1]
},
{
"description": "{\"merge\":[[1],[]]}",
"rule": {
"merge": [ [1], [] ]
},
"data": null,
"result": [1]
},
{
"description": "{\"merge\":[[1],[2]]}",
"rule": {
"merge": [ [1], [2] ]
},
"data": null,
"result": [1, 2]
},
{
"description": "{\"merge\":[[1],[2],[3]]}",
"rule": {
"merge": [ [1], [2], [3] ]
},
"data": null,
"result": [1, 2, 3]
},
{
"description": "{\"merge\":[[1,2],[3]]}",
"rule": {
"merge": [ [1, 2], [3] ]
},
"data": null,
"result": [1, 2, 3]
},
{
"description": "{\"merge\":[[1],[2,3]]}",
"rule": {
"merge": [ [1], [2, 3] ]
},
"data": null,
"result": [1, 2, 3]
},
"Given non-array arguments, merge converts them to arrays",
{ "description": "{\"merge\":1}", "rule": {"merge": 1}, "data": null, "result": [1] },
{
"description": "{\"merge\":[1,2]}",
"rule": { "merge": [1, 2] },
"data": null,
"result": [1, 2]
},
{
"description": "{\"merge\":[1,[2]]}",
"rule": {
"merge": [ 1, [2] ]
},
"data": null,
"result": [1, 2]
},
"Too few args",
{ "description": "{\"if\":[]}", "rule": {"if": []}, "data": null, "result": null },
{
"description": "{\"if\":[true]}",
"rule": { "if": [true] },
"data": null,
"result": true
},
{
"description": "{\"if\":[false]}",
"rule": { "if": [false] },
"data": null,
"result": false
},
{
"description": "{\"if\":[\"apple\"]}",
"rule": { "if": ["apple"] },
"data": null,
"result": "apple"
},
"Simple if/then/else cases",
{
"description": "{\"if\":[true,\"apple\"]}",
"rule": { "if": [true, "apple"] },
"data": null,
"result": "apple"
},
{
"description": "{\"if\":[false,\"apple\"]}",
"rule": { "if": [false, "apple"] },
"data": null,
"result": null
},
{
"description": "{\"if\":[true,\"apple\",\"banana\"]}",
"rule": { "if": [true, "apple", "banana"] },
"data": null,
"result": "apple"
},
{
"description": "{\"if\":[false,\"apple\",\"banana\"]}",
"rule": { "if": [false, "apple", "banana"] },
"data": null,
"result": "banana"
},
"Empty arrays are falsey",
{
"description": "{\"if\":[[],\"apple\",\"banana\"]}",
"rule": { "if": [[], "apple", "banana"] },
"data": null,
"result": "banana"
},
{
"description": "{\"if\":[[1],\"apple\",\"banana\"]}",
"rule": {
"if": [ [1], "apple", "banana" ]
},
"data": null,
"result": "apple"
},
{
"description": "{\"if\":[[1,2,3,4],\"apple\",\"banana\"]}",
"rule": {
"if": [ [1, 2, 3, 4], "apple", "banana" ]
},
"data": null,
"result": "apple"
},
"Empty strings are falsey, all other strings are truthy",
{
"description": "{\"if\":[\"\",\"apple\",\"banana\"]}",
"rule": { "if": ["", "apple", "banana"] },
"data": null,
"result": "banana"
},
{
"description": "{\"if\":[\"zucchini\",\"apple\",\"banana\"]}",
"rule": { "if": ["zucchini", "apple", "banana"] },
"data": null,
"result": "apple"
},
{
"description": "{\"if\":[\"0\",\"apple\",\"banana\"]}",
"rule": { "if": ["0", "apple", "banana"] },
"data": null,
"result": "apple"
},
"You can cast a string to numeric with a unary + ",
{
"description": "{\"===\":[0,\"0\"]}",
"rule": { "===": [0, "0"] },
"data": null,
"result": false
},
{
"description": "{\"===\":[0,{\"+\":\"0\"}]}",
"rule": {
"===": [ 0, {"+": "0"} ]
},
"data": null,
"result": true
},
{
"description": "{\"if\":[{\"+\":\"0\"},\"apple\",\"banana\"]}",
"rule": {
"if": [ {"+": "0"}, "apple", "banana" ]
},
"data": null,
"result": "banana"
},
{
"description": "{\"if\":[{\"+\":\"1\"},\"apple\",\"banana\"]}",
"rule": {
"if": [ {"+": "1"}, "apple", "banana" ]
},
"data": null,
"result": "apple"
},
"Zero is falsy, all other numbers are truthy",
{
"description": "{\"if\":[0,\"apple\",\"banana\"]}",
"rule": { "if": [0, "apple", "banana"] },
"data": null,
"result": "banana"
},
{
"description": "{\"if\":[1,\"apple\",\"banana\"]}",
"rule": { "if": [1, "apple", "banana"] },
"data": null,
"result": "apple"
},
{
"description": "{\"if\":[3.1416,\"apple\",\"banana\"]}",
"rule": { "if": [3.1416, "apple", "banana"] },
"data": null,
"result": "apple"
},
{
"description": "{\"if\":[-1,\"apple\",\"banana\"]}",
"rule": { "if": [-1, "apple", "banana"] },
"data": null,
"result": "apple"
},
"Truthy and falsy definitions matter in Boolean operations",
{
"description": "{\"!\":[[]]}",
"rule": { "!": [[]] },
"result": true
},
{
"description": "{\"!!\":[[]]}",
"rule": { "!!": [[]] },
"result": false
},
{
"description": "{\"and\":[[],true]}",
"rule": { "and": [[], true] },
"result": []
},
{
"description": "{\"or\":[[],true]}",
"rule": { "or": [[], true] },
"result": true
},
{
"description": "{\"!\":[0]}",
"rule": { "!": [0] },
"result": true
},
{
"description": "{\"!!\":[0]}",
"rule": { "!!": [0] },
"result": false
},
{
"description": "{\"and\":[0,true]}",
"rule": { "and": [0, true] },
"result": 0
},
{
"description": "{\"or\":[0,true]}",
"rule": { "or": [0, true] },
"result": true
},
{
"description": "{\"!\":[\"\"]}",
"rule": { "!": [""] },
"result": true
},
{
"description": "{\"!!\":[\"\"]}",
"rule": { "!!": [""] },
"result": false
},
{
"description": "{\"and\":[\"\",true]}",
"rule": { "and": ["", true] },
"result": ""
},
{
"description": "{\"or\":[\"\",true]}",
"rule": { "or": ["", true] },
"result": true
},
{
"description": "{\"!\":[\"0\"]}",
"rule": { "!": ["0"] },
"result": false
},
{
"description": "{\"!!\":[\"0\"]}",
"rule": { "!!": ["0"] },
"result": true
},
{
"description": "{\"and\":[\"0\",true]}",
"rule": { "and": ["0", true] },
"result": true
},
{
"description": "{\"or\":[\"0\",true]}",
"rule": { "or": ["0", true] },
"result": "0"
},
"If the conditional is logic, it gets evaluated",
{
"description": "{\"if\":[{\">\":[2,1]},\"apple\",\"banana\"]}",
"rule": {
"if": [
{ ">": [2, 1] },
"apple",
"banana"
]
},
"data": null,
"result": "apple"
},
{
"description": "{\"if\":[{\">\":[1,2]},\"apple\",\"banana\"]}",
"rule": {
"if": [
{ ">": [1, 2] },
"apple",
"banana"
]
},
"data": null,
"result": "banana"
},
"If the consequents are logic, they get evaluated",
{
"description": "{\"if\":[true,{\"cat\":[\"ap\",\"ple\"]},{\"cat\":[\"ba\",\"na\",\"na\"]}]}",
"rule": {
"if": [
true,
{ "cat": ["ap", "ple"] },
{ "cat": ["ba", "na", "na"] }
]
},
"data": null,
"result": "apple"
},
{
"description": "{\"if\":[false,{\"cat\":[\"ap\",\"ple\"]},{\"cat\":[\"ba\",\"na\",\"na\"]}]}",
"rule": {
"if": [
false,
{ "cat": ["ap", "ple"] },
{ "cat": ["ba", "na", "na"] }
]
},
"data": null,
"result": "banana"
},
"If/then/elseif/then cases",
{
"description": "{\"if\":[true,\"apple\",true,\"banana\"]}",
"rule": { "if": [true, "apple", true, "banana"] },
"data": null,
"result": "apple"
},
{
"description": "{\"if\":[true,\"apple\",false,\"banana\"]}",
"rule": { "if": [true, "apple", false, "banana"] },
"data": null,
"result": "apple"
},
{
"description": "{\"if\":[false,\"apple\",true,\"banana\"]}",
"rule": { "if": [false, "apple", true, "banana"] },
"data": null,
"result": "banana"
},
{
"description": "{\"if\":[false,\"apple\",false,\"banana\"]}",
"rule": { "if": [false, "apple", false, "banana"] },
"data": null,
"result": null
},
{
"description": "{\"if\":[true,\"apple\",true,\"banana\",\"carrot\"]}",
"rule": { "if": [true, "apple", true, "banana", "carrot"] },
"data": null,
"result": "apple"
},
{
"description": "{\"if\":[true,\"apple\",false,\"banana\",\"carrot\"]}",
"rule": { "if": [true, "apple", false, "banana", "carrot"] },
"data": null,
"result": "apple"
},
{
"description": "{\"if\":[false,\"apple\",true,\"banana\",\"carrot\"]}",
"rule": { "if": [false, "apple", true, "banana", "carrot"] },
"data": null,
"result": "banana"
},
{
"description": "{\"if\":[false,\"apple\",false,\"banana\",\"carrot\"]}",
"rule": { "if": [false, "apple", false, "banana", "carrot"] },
"data": null,
"result": "carrot"
},
{
"description": "{\"if\":[false,\"apple\",false,\"banana\",false,\"carrot\"]}",
"rule": { "if": [false, "apple", false, "banana", false, "carrot"] },
"data": null,
"result": null
},
{
"description": "{\"if\":[false,\"apple\",false,\"banana\",false,\"carrot\",\"date\"]}",
"rule": { "if": [false, "apple", false, "banana", false, "carrot", "date"] },
"data": null,
"result": "date"
},
{
"description": "{\"if\":[false,\"apple\",false,\"banana\",true,\"carrot\",\"date\"]}",
"rule": { "if": [false, "apple", false, "banana", true, "carrot", "date"] },
"data": null,
"result": "carrot"
},
{
"description": "{\"if\":[false,\"apple\",true,\"banana\",false,\"carrot\",\"date\"]}",
"rule": { "if": [false, "apple", true, "banana", false, "carrot", "date"] },
"data": null,
"result": "banana"
},
{
"description": "{\"if\":[false,\"apple\",true,\"banana\",true,\"carrot\",\"date\"]}",
"rule": { "if": [false, "apple", true, "banana", true, "carrot", "date"] },
"data": null,
"result": "banana"
},
{
"description": "{\"if\":[true,\"apple\",false,\"banana\",false,\"carrot\",\"date\"]}",
"rule": { "if": [true, "apple", false, "banana", false, "carrot", "date"] },
"data": null,
"result": "apple"
},
{
"description": "{\"if\":[true,\"apple\",false,\"banana\",true,\"carrot\",\"date\"]}",
"rule": { "if": [true, "apple", false, "banana", true, "carrot", "date"] },
"data": null,
"result": "apple"
},
{
"description": "{\"if\":[true,\"apple\",true,\"banana\",false,\"carrot\",\"date\"]}",
"rule": { "if": [true, "apple", true, "banana", false, "carrot", "date"] },
"data": null,
"result": "apple"
},
{
"description": "{\"if\":[true,\"apple\",true,\"banana\",true,\"carrot\",\"date\"]}",
"rule": { "if": [true, "apple", true, "banana", true, "carrot", "date"] },
"data": null,
"result": "apple"
},
"Arrays with logic",
{
"description": "[1,{\"var\":\"x\"},3]",
"rule": [ 1, {"var": "x"}, 3 ],
"data": {"x": 2},
"result": [1, 2, 3]
},
{
"description": "{\"if\":[{\"var\":\"x\"},[{\"var\":\"y\"}],99]}",
"rule": {
"if": [
{"var": "x"},
[ {"var": "y"} ],
99
]
},
"data": {"x": true, "y": 42},
"result": [42]
},
"# Compound Tests",
{
"description": "{\"and\":[{\">\":[3,1]},true]}",
"rule": {
"and": [
{ ">": [3, 1] },
true
]
},
"result": true
},
{
"description": "{\"and\":[{\">\":[3,1]},false]}",
"rule": {
"and": [
{ ">": [3, 1] },
false
]
},
"result": false
},
{
"description": "{\"and\":[{\">\":[3,1]},{\"!\":true}]}",
"rule": {
"and": [
{ ">": [3, 1] },
{ "!": true }
]
},
"result": false
},
{
"description": "{\"and\":[{\">\":[3,1]},{\"<\":[1,3]}]}",
"rule": {
"and": [
{ ">": [3, 1] },
{ "<": [1, 3] }
]
},
"result": true
},
{
"description": "{\"?:\":[{\">\":[3,1]},\"visible\",\"hidden\"]}",
"rule": {
"?:": [
{ ">": [3, 1] },
"visible",
"hidden"
]
},
"result": "visible"
},
"# Data-Driven",
{
"description": "{\"var\":[\"a\"]}",
"rule": { "var": ["a"] },
"data": {"a": 1},
"result": 1
},
{
"description": "{\"var\":[\"b\"]}",
"rule": { "var": ["b"] },
"data": {"a": 1},
"result": null
},
{
"description": "{\"var\":[\"a\"]}",
"rule": { "var": ["a"] },
"data": null,
"result": null
},
{ "description": "{\"var\":\"a\"}", "rule": {"var": "a"}, "data": {"a": 1}, "result": 1 },
{ "description": "{\"var\":\"b\"}", "rule": {"var": "b"}, "data": {"a": 1}, "result": null },
{ "description": "{\"var\":\"a\"}", "rule": {"var": "a"}, "data": null, "result": null },
{
"description": "{\"var\":[\"a\",1]}",
"rule": { "var": ["a", 1] },
"data": null,
"result": 1
},
{
"description": "{\"var\":[\"b\",2]}",
"rule": { "var": ["b", 2] },
"data": {"a": 1},
"result": 2
},
{
"description": "{\"var\":\"a.b\"}",
"rule": {"var": "a.b"},
"data": { "a": {"b": "c"} },
"result": "c"
},
{
"description": "{\"var\":\"a.q\"}",
"rule": {"var": "a.q"},
"data": { "a": {"b": "c"} },
"result": null
},
{
"description": "{\"var\":[\"a.q\",9]}",
"rule": { "var": ["a.q", 9] },
"data": { "a": {"b": "c"} },
"result": 9
},
{
"description": "{\"var\":1}",
"rule": {"var": 1},
"data": ["apple", "banana"],
"result": "banana"
},
{
"description": "{\"var\":\"1\"}",
"rule": {"var": "1"},
"data": ["apple", "banana"],
"result": "banana"
},
{
"description": "{\"var\":\"1.1\"}",
"rule": {"var": "1.1"},
"data": [ "apple", ["banana", "beer"] ],
"result": "beer"
},
{
"description": "{\"and\":[{\"<\":[{\"var\":\"temp\"},110]},{\"==\":[{\"var\":\"pie.filling\"},\"apple\"]}]}",
"rule": {
"and": [
{
"<": [ {"var": "temp"}, 110 ]
},
{
"==": [ {"var": "pie.filling"}, "apple" ]
}
]
},
"data": { "temp": 100, "pie": {"filling": "apple"} },
"result": true
},
{
"description": "{\"var\":[{\"?:\":[{\"<\":[{\"var\":\"temp\"},110]},\"pie.filling\",\"pie.eta\"]}]}",
"rule": {
"var": [
{
"?:": [
{
"<": [ {"var": "temp"}, 110 ]
},
"pie.filling",
"pie.eta"
]
}
]
},
"data": { "temp": 100, "pie": {"filling": "apple", "eta": "60s"} },
"result": "apple"
},
{
"description": "{\"in\":[{\"var\":\"filling\"},[\"apple\",\"cherry\"]]}",
"rule": {
"in": [ {"var": "filling"}, ["apple", "cherry"] ]
},
"data": {"filling": "apple"},
"result": true
},
{
"description": "{\"var\":\"a.b.c\"}",
"rule": {"var": "a.b.c"},
"data": null,
"result": null
},
{
"description": "{\"var\":\"a.b.c\"}",
"rule": {"var": "a.b.c"},
"data": {"a": null},
"result": null
},
{
"description": "{\"var\":\"a.b.c\"}",
"rule": {"var": "a.b.c"},
"data": { "a": {"b": null} },
"result": null
},
{ "description": "{\"var\":\"\"}", "rule": {"var": ""}, "data": 1, "result": 1 },
{ "description": "{\"var\":null}", "rule": {"var": null}, "data": 1, "result": 1 },
{ "description": "{\"var\":[]}", "rule": {"var": []}, "data": 1, "result": 1 },
"Missing",
{ "description": "{\"missing\":[]}", "rule": {"missing": []}, "data": null, "result": [] },
{
"description": "{\"missing\":[\"a\"]}",
"rule": { "missing": ["a"] },
"data": null,
"result": ["a"]
},
{
"description": "{\"missing\":\"a\"}",
"rule": {"missing": "a"},
"data": null,
"result": ["a"]
},
{
"description": "{\"missing\":\"a\"}",
"rule": {"missing": "a"},
"data": {"a": "apple"},
"result": []
},
{
"description": "{\"missing\":[\"a\"]}",
"rule": { "missing": ["a"] },
"data": {"a": "apple"},
"result": []
},
{
"description": "{\"missing\":[\"a\",\"b\"]}",
"rule": { "missing": ["a", "b"] },
"data": {"a": "apple"},
"result": ["b"]
},
{
"description": "{\"missing\":[\"a\",\"b\"]}",
"rule": { "missing": ["a", "b"] },
"data": {"b": "banana"},
"result": ["a"]
},
{
"description": "{\"missing\":[\"a\",\"b\"]}",
"rule": { "missing": ["a", "b"] },
"data": {"a": "apple", "b": "banana"},
"result": []
},
{
"description": "{\"missing\":[\"a\",\"b\"]}",
"rule": { "missing": ["a", "b"] },
"result": ["a", "b"]
},
{
"description": "{\"missing\":[\"a\",\"b\"]}",
"rule": { "missing": ["a", "b"] },
"data": null,
"result": ["a", "b"]
},
{
"description": "{\"missing\":[\"a.b\"]}",
"rule": { "missing": ["a.b"] },
"data": null,
"result": ["a.b"]
},
{
"description": "{\"missing\":[\"a.b\"]}",
"rule": { "missing": ["a.b"] },
"data": {"a": "apple"},
"result": ["a.b"]
},
{
"description": "{\"missing\":[\"a.b\"]}",
"rule": { "missing": ["a.b"] },
"data": { "a": {"c": "apple cake"} },
"result": ["a.b"]
},
{
"description": "{\"missing\":[\"a.b\"]}",
"rule": { "missing": ["a.b"] },
"data": { "a": {"b": "apple brownie"} },
"result": []
},
{
"description": "{\"missing\":[\"a.b\",\"a.c\"]}",
"rule": { "missing": ["a.b", "a.c"] },
"data": { "a": {"b": "apple brownie"} },
"result": ["a.c"]
},
"Missing some",
{
"description": "{\"missing_some\":[1,[\"a\",\"b\"]]}",
"rule": {
"missing_some": [ 1, ["a", "b"] ]
},
"data": {"a": "apple"},
"result": []
},
{
"description": "{\"missing_some\":[1,[\"a\",\"b\"]]}",
"rule": {
"missing_some": [ 1, ["a", "b"] ]
},
"data": {"b": "banana"},
"result": []
},
{
"description": "{\"missing_some\":[1,[\"a\",\"b\"]]}",
"rule": {
"missing_some": [ 1, ["a", "b"] ]
},
"data": {"a": "apple", "b": "banana"},
"result": []
},
{
"description": "{\"missing_some\":[1,[\"a\",\"b\"]]}",
"rule": {
"missing_some": [ 1, ["a", "b"] ]
},
"data": {"c": "carrot"},
"result": ["a", "b"]
},
{
"description": "{\"missing_some\":[2,[\"a\",\"b\",\"c\"]]}",
"rule": {
"missing_some": [ 2, ["a", "b", "c"] ]
},
"data": {"a": "apple", "b": "banana"},
"result": []
},
{
"description": "{\"missing_some\":[2,[\"a\",\"b\",\"c\"]]}",
"rule": {
"missing_some": [ 2, ["a", "b", "c"] ]
},
"data": {"a": "apple", "c": "carrot"},
"result": []
},
{
"description": "{\"missing_some\":[2,[\"a\",\"b\",\"c\"]]}",
"rule": {
"missing_some": [ 2, ["a", "b", "c"] ]
},
"data": {"a": "apple", "b": "banana", "c": "carrot"},
"result": []
},
{
"description": "{\"missing_some\":[2,[\"a\",\"b\",\"c\"]]}",
"rule": {
"missing_some": [ 2, ["a", "b", "c"] ]
},
"data": {"a": "apple", "d": "durian"},
"result": ["b", "c"]
},
{
"description": "{\"missing_some\":[2,[\"a\",\"b\",\"c\"]]}",
"rule": {
"missing_some": [ 2, ["a", "b", "c"] ]
},
"data": {"d": "durian", "e": "eggplant"},
"result": ["a", "b", "c"]
},
"Missing and If are friends, because empty arrays are falsey in JsonLogic",
{
"description": "{\"if\":[{\"missing\":\"a\"},\"missed it\",\"found it\"]}",
"rule": {
"if": [ {"missing": "a"}, "missed it", "found it" ]
},
"data": {"a": "apple"},
"result": "found it"
},
{
"description": "{\"if\":[{\"missing\":\"a\"},\"missed it\",\"found it\"]}",
"rule": {
"if": [ {"missing": "a"}, "missed it", "found it" ]
},
"data": {"b": "banana"},
"result": "missed it"
},
"Missing, Merge, and If are friends. VIN is always required, APR is only required if financing is true.",
{
"description": "{\"missing\":{\"merge\":[\"vin\",{\"if\":[{\"var\":\"financing\"},[\"apr\"],[]]}]}}",
"rule": {
"missing": {
"merge": [
"vin",
{
"if": [ {"var": "financing"}, ["apr"], [] ]
}
]
}
},
"data": {"financing": true},
"result": ["vin", "apr"]
},
{
"description": "{\"missing\":{\"merge\":[\"vin\",{\"if\":[{\"var\":\"financing\"},[\"apr\"],[]]}]}}",
"rule": {
"missing": {
"merge": [
"vin",
{
"if": [ {"var": "financing"}, ["apr"], [] ]
}
]
}
},
"data": {"financing": false},
"result": ["vin"]
},
"Filter, map, all, none, and some",
{
"description": "{\"filter\":[{\"var\":\"integers\"},true]}",
"rule": {
"filter": [ {"var": "integers"}, true ]
},
"data": { "integers": [1, 2, 3] },
"result": [1, 2, 3]
},
{
"description": "{\"filter\":[{\"var\":\"integers\"},false]}",
"rule": {
"filter": [ {"var": "integers"}, false ]
},
"data": { "integers": [1, 2, 3] },
"result": []
},
{
"description": "{\"filter\":[{\"var\":\"integers\"},{\">=\":[{\"var\":\"\"},2]}]}",
"rule": {
"filter": [
{"var": "integers"},
{
">=": [ {"var": ""}, 2 ]
}
]
},
"data": { "integers": [1, 2, 3] },
"result": [2, 3]
},
{
"description": "{\"filter\":[{\"var\":\"integers\"},{\"%\":[{\"var\":\"\"},2]}]}",
"rule": {
"filter": [
{"var": "integers"},
{
"%": [ {"var": ""}, 2 ]
}
]
},
"data": { "integers": [1, 2, 3] },
"result": [1, 3]
},
{
"description": "{\"map\":[{\"var\":\"integers\"},{\"*\":[{\"var\":\"\"},2]}]}",
"rule": {
"map": [
{"var": "integers"},
{
"*": [ {"var": ""}, 2 ]
}
]
},
"data": { "integers": [1, 2, 3] },
"result": [2, 4, 6]
},
{
"description": "{\"map\":[{\"var\":\"integers\"},{\"*\":[{\"var\":\"\"},2]}]}",
"rule": {
"map": [
{"var": "integers"},
{
"*": [ {"var": ""}, 2 ]
}
]
},
"data": null,
"result": []
},
{
"description": "{\"map\":[{\"var\":\"desserts\"},{\"var\":\"qty\"}]}",
"rule": {
"map": [ {"var": "desserts"}, {"var": "qty"} ]
},
"data": {
"desserts": [
{"name": "apple" , "qty": 1},
{"name": "brownie", "qty": 2},
{"name": "cupcake", "qty": 3}
]
},
"result": [1, 2, 3]
},
{
"description": "{\"reduce\":[{\"var\":\"integers\"},{\"+\":[{\"var\":\"current\"},{\"var\":\"accumulator\"}]},0]}",
"rule": {
"reduce": [
{"var": "integers"},
{
"+": [ {"var": "current"}, {"var": "accumulator"} ]
},
0
]
},
"data": { "integers": [1, 2, 3, 4] },
"result": 10
},
{
"description": "{\"reduce\":[{\"var\":\"integers\"},{\"+\":[{\"var\":\"current\"},{\"var\":\"accumulator\"}]},{\"var\":\"start_with\"}]}",
"rule": {
"reduce": [
{"var": "integers"},
{
"+": [ {"var": "current"}, {"var": "accumulator"} ]
},
{"var": "start_with"}
]
},
"data": { "integers": [1, 2, 3, 4], "start_with": 59 },
"result": 69
},
{
"description": "{\"reduce\":[{\"var\":\"integers\"},{\"+\":[{\"var\":\"current\"},{\"var\":\"accumulator\"}]},0]}",
"rule": {
"reduce": [
{"var": "integers"},
{
"+": [ {"var": "current"}, {"var": "accumulator"} ]
},
0
]
},
"data": null,
"result": 0
},
{
"description": "{\"reduce\":[{\"var\":\"integers\"},{\"*\":[{\"var\":\"current\"},{\"var\":\"accumulator\"}]},1]}",
"rule": {
"reduce": [
{"var": "integers"},
{
"*": [ {"var": "current"}, {"var": "accumulator"} ]
},
1
]
},
"data": { "integers": [1, 2, 3, 4] },
"result": 24
},
{
"description": "{\"reduce\":[{\"var\":\"integers\"},{\"*\":[{\"var\":\"current\"},{\"var\":\"accumulator\"}]},0]}",
"rule": {
"reduce": [
{"var": "integers"},
{
"*": [ {"var": "current"}, {"var": "accumulator"} ]
},
0
]
},
"data": { "integers": [1, 2, 3, 4] },
"result": 0
},
{
"description": "{\"reduce\":[{\"var\":\"desserts\"},{\"+\":[{\"var\":\"accumulator\"},{\"var\":\"current.qty\"}]},0]}",
"rule": {
"reduce": [
{"var": "desserts"},
{
"+": [ {"var": "accumulator"}, {"var": "current.qty"} ]
},
0
]
},
"data": {
"desserts": [
{"name": "apple" , "qty": 1},
{"name": "brownie", "qty": 2},
{"name": "cupcake", "qty": 3}
]
},
"result": 6
},
{
"description": "{\"all\":[{\"var\":\"integers\"},{\">=\":[{\"var\":\"\"},1]}]}",
"rule": {
"all": [
{"var": "integers"},
{
">=": [ {"var": ""}, 1 ]
}
]
},
"data": { "integers": [1, 2, 3] },
"result": true
},
{
"description": "{\"all\":[{\"var\":\"integers\"},{\"==\":[{\"var\":\"\"},1]}]}",
"rule": {
"all": [
{"var": "integers"},
{
"==": [ {"var": ""}, 1 ]
}
]
},
"data": { "integers": [1, 2, 3] },
"result": false
},
{
"description": "{\"all\":[{\"var\":\"integers\"},{\"<\":[{\"var\":\"\"},1]}]}",
"rule": {
"all": [
{"var": "integers"},
{
"<": [ {"var": ""}, 1 ]
}
]
},
"data": { "integers": [1, 2, 3] },
"result": false
},
{
"description": "{\"all\":[{\"var\":\"integers\"},{\"<\":[{\"var\":\"\"},1]}]}",
"rule": {
"all": [
{"var": "integers"},
{
"<": [ {"var": ""}, 1 ]
}
]
},
"data": {"integers": []},
"result": false
},
{
"description": "{\"all\":[{\"var\":\"items\"},{\">=\":[{\"var\":\"qty\"},1]}]}",
"rule": {
"all": [
{"var": "items"},
{
">=": [ {"var": "qty"}, 1 ]
}
]
},
"data": {
"items": [ {"qty": 1, "sku": "apple"}, {"qty": 2, "sku": "banana"} ]
},
"result": true
},
{
"description": "{\"all\":[{\"var\":\"items\"},{\">\":[{\"var\":\"qty\"},1]}]}",
"rule": {
"all": [
{"var": "items"},
{
">": [ {"var": "qty"}, 1 ]
}
]
},
"data": {
"items": [ {"qty": 1, "sku": "apple"}, {"qty": 2, "sku": "banana"} ]
},
"result": false
},
{
"description": "{\"all\":[{\"var\":\"items\"},{\"<\":[{\"var\":\"qty\"},1]}]}",
"rule": {
"all": [
{"var": "items"},
{
"<": [ {"var": "qty"}, 1 ]
}
]
},
"data": {
"items": [ {"qty": 1, "sku": "apple"}, {"qty": 2, "sku": "banana"} ]
},
"result": false
},
{
"description": "{\"all\":[{\"var\":\"items\"},{\">=\":[{\"var\":\"qty\"},1]}]}",
"rule": {
"all": [
{"var": "items"},
{
">=": [ {"var": "qty"}, 1 ]
}
]
},
"data": {"items": []},
"result": false
},
{
"description": "{\"none\":[{\"var\":\"integers\"},{\">=\":[{\"var\":\"\"},1]}]}",
"rule": {
"none": [
{"var": "integers"},
{
">=": [ {"var": ""}, 1 ]
}
]
},
"data": { "integers": [1, 2, 3] },
"result": false
},
{
"description": "{\"none\":[{\"var\":\"integers\"},{\"==\":[{\"var\":\"\"},1]}]}",
"rule": {
"none": [
{"var": "integers"},
{
"==": [ {"var": ""}, 1 ]
}
]
},
"data": { "integers": [1, 2, 3] },
"result": false
},
{
"description": "{\"none\":[{\"var\":\"integers\"},{\"<\":[{\"var\":\"\"},1]}]}",
"rule": {
"none": [
{"var": "integers"},
{
"<": [ {"var": ""}, 1 ]
}
]
},
"data": { "integers": [1, 2, 3] },
"result": true
},
{
"description": "{\"none\":[{\"var\":\"integers\"},{\"<\":[{\"var\":\"\"},1]}]}",
"rule": {
"none": [
{"var": "integers"},
{
"<": [ {"var": ""}, 1 ]
}
]
},
"data": {"integers": []},
"result": true
},
{
"description": "{\"none\":[{\"var\":\"items\"},{\">=\":[{\"var\":\"qty\"},1]}]}",
"rule": {
"none": [
{"var": "items"},
{
">=": [ {"var": "qty"}, 1 ]
}
]
},
"data": {
"items": [ {"qty": 1, "sku": "apple"}, {"qty": 2, "sku": "banana"} ]
},
"result": false
},
{
"description": "{\"none\":[{\"var\":\"items\"},{\">\":[{\"var\":\"qty\"},1]}]}",
"rule": {
"none": [
{"var": "items"},
{
">": [ {"var": "qty"}, 1 ]
}
]
},
"data": {
"items": [ {"qty": 1, "sku": "apple"}, {"qty": 2, "sku": "banana"} ]
},
"result": false
},
{
"description": "{\"none\":[{\"var\":\"items\"},{\"<\":[{\"var\":\"qty\"},1]}]}",
"rule": {
"none": [
{"var": "items"},
{
"<": [ {"var": "qty"}, 1 ]
}
]
},
"data": {
"items": [ {"qty": 1, "sku": "apple"}, {"qty": 2, "sku": "banana"} ]
},
"result": true
},
{
"description": "{\"none\":[{\"var\":\"items\"},{\">=\":[{\"var\":\"qty\"},1]}]}",
"rule": {
"none": [
{"var": "items"},
{
">=": [ {"var": "qty"}, 1 ]
}
]
},
"data": {"items": []},
"result": true
},
{
"description": "{\"some\":[{\"var\":\"integers\"},{\">=\":[{\"var\":\"\"},1]}]}",
"rule": {
"some": [
{"var": "integers"},
{
">=": [ {"var": ""}, 1 ]
}
]
},
"data": { "integers": [1, 2, 3] },
"result": true
},
{
"description": "{\"some\":[{\"var\":\"integers\"},{\"==\":[{\"var\":\"\"},1]}]}",
"rule": {
"some": [
{"var": "integers"},
{
"==": [ {"var": ""}, 1 ]
}
]
},
"data": { "integers": [1, 2, 3] },
"result": true
},
{
"description": "{\"some\":[{\"var\":\"integers\"},{\"<\":[{\"var\":\"\"},1]}]}",
"rule": {
"some": [
{"var": "integers"},
{
"<": [ {"var": ""}, 1 ]
}
]
},
"data": { "integers": [1, 2, 3] },
"result": false
},
{
"description": "{\"some\":[{\"var\":\"integers\"},{\"<\":[{\"var\":\"\"},1]}]}",
"rule": {
"some": [
{"var": "integers"},
{
"<": [ {"var": ""}, 1 ]
}
]
},
"data": {"integers": []},
"result": false
},
{
"description": "{\"some\":[{\"var\":\"items\"},{\">=\":[{\"var\":\"qty\"},1]}]}",
"rule": {
"some": [
{"var": "items"},
{
">=": [ {"var": "qty"}, 1 ]
}
]
},
"data": {
"items": [ {"qty": 1, "sku": "apple"}, {"qty": 2, "sku": "banana"} ]
},
"result": true
},
{
"description": "{\"some\":[{\"var\":\"items\"},{\">\":[{\"var\":\"qty\"},1]}]}",
"rule": {
"some": [
{"var": "items"},
{
">": [ {"var": "qty"}, 1 ]
}
]
},
"data": {
"items": [ {"qty": 1, "sku": "apple"}, {"qty": 2, "sku": "banana"} ]
},
"result": true
},
{
"description": "{\"some\":[{\"var\":\"items\"},{\"<\":[{\"var\":\"qty\"},1]}]}",
"rule": {
"some": [
{"var": "items"},
{
"<": [ {"var": "qty"}, 1 ]
}
]
},
"data": {
"items": [ {"qty": 1, "sku": "apple"}, {"qty": 2, "sku": "banana"} ]
},
"result": false
},
{
"description": "{\"some\":[{\"var\":\"items\"},{\">=\":[{\"var\":\"qty\"},1]}]}",
"rule": {
"some": [
{"var": "items"},
{
">=": [ {"var": "qty"}, 1 ]
}
]
},
"data": {"items": []},
"result": false
},
"EOF"
]