mirror of
https://github.com/duhanbalci/dexpr.git
synced 2026-07-01 16:19:16 +00:00
1289 lines
34 KiB
JSON
1289 lines
34 KiB
JSON
[
|
|
{
|
|
"name": "single number literal",
|
|
"code": "42",
|
|
"expected": { "type": "number", "value": "42" }
|
|
},
|
|
{
|
|
"name": "single string literal",
|
|
"code": "\"hello\"",
|
|
"expected": { "type": "string", "value": "hello" }
|
|
},
|
|
{
|
|
"name": "single boolean literal",
|
|
"code": "true",
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "false literal",
|
|
"code": "false",
|
|
"expected": { "type": "boolean", "value": false }
|
|
},
|
|
|
|
{
|
|
"name": "last result: only assignments returns null",
|
|
"code": "x = 10\ny = 20",
|
|
"expected": { "type": "null" }
|
|
},
|
|
{
|
|
"name": "last result: bare expression at end",
|
|
"code": "x = 10\ny = 20\nx + y",
|
|
"expected": { "type": "number", "value": "30" }
|
|
},
|
|
{
|
|
"name": "last result: multiple bare expressions, last wins",
|
|
"code": "1\n2\n3",
|
|
"expected": { "type": "number", "value": "3" }
|
|
},
|
|
{
|
|
"name": "last result: expression then assignment returns null",
|
|
"code": "42\nx = 10",
|
|
"expected": { "type": "null" }
|
|
},
|
|
{
|
|
"name": "last result: assignment then bare variable",
|
|
"code": "x = 99\nx",
|
|
"expected": { "type": "number", "value": "99" }
|
|
},
|
|
{
|
|
"name": "last result: string expression at end",
|
|
"code": "x = \"hello\"\nx + \" world\"",
|
|
"expected": { "type": "string", "value": "hello world" }
|
|
},
|
|
{
|
|
"name": "last result: boolean expression at end",
|
|
"code": "x = 10\nx > 5",
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "last result: if/else returns value",
|
|
"code": "if true then\n \"yes\"\nelse\n \"no\"\nend",
|
|
"expected": { "type": "string", "value": "yes" }
|
|
},
|
|
{
|
|
"name": "last result: if/else false branch",
|
|
"code": "if false then\n \"yes\"\nelse\n \"no\"\nend",
|
|
"expected": { "type": "string", "value": "no" }
|
|
},
|
|
{
|
|
"name": "last result: if/else with number",
|
|
"code": "x = 10\nif x > 5 then\n x * 2\nelse\n x * 3\nend",
|
|
"expected": { "type": "number", "value": "20" }
|
|
},
|
|
{
|
|
"name": "last result: nested if/else",
|
|
"code": "x = 2\nif x == 1 then\n \"one\"\nelse if x == 2 then\n \"two\"\nelse\n \"other\"\nend",
|
|
"expected": { "type": "string", "value": "two" }
|
|
},
|
|
{
|
|
"name": "last result: if/else followed by expression",
|
|
"code": "if true then\n x = 10\nelse\n x = 20\nend\nx + 5",
|
|
"expected": { "type": "number", "value": "15" }
|
|
},
|
|
{
|
|
"name": "last result: assignment after if/else clears result",
|
|
"code": "if true then\n 100\nend\ny = 5",
|
|
"expected": { "type": "null" }
|
|
},
|
|
{
|
|
"name": "last result: complex multi-step, last expression wins",
|
|
"code": "a = 10\nb = 20\nc = a + b\nd = c * 2\nd - 1",
|
|
"expected": { "type": "number", "value": "59" }
|
|
},
|
|
{
|
|
"name": "last result: log does not affect last result",
|
|
"code": "log(\"hello\")\n42",
|
|
"expected": { "type": "number", "value": "42" }
|
|
},
|
|
|
|
{
|
|
"name": "arithmetic: addition",
|
|
"code": "10 + 20",
|
|
"expected": { "type": "number", "value": "30" }
|
|
},
|
|
{
|
|
"name": "arithmetic: subtraction",
|
|
"code": "50 - 17",
|
|
"expected": { "type": "number", "value": "33" }
|
|
},
|
|
{
|
|
"name": "arithmetic: multiplication",
|
|
"code": "6 * 7",
|
|
"expected": { "type": "number", "value": "42" }
|
|
},
|
|
{
|
|
"name": "arithmetic: division",
|
|
"code": "100 / 4",
|
|
"expected": { "type": "number", "value": "25" }
|
|
},
|
|
{
|
|
"name": "arithmetic: modulo",
|
|
"code": "10 % 3",
|
|
"expected": { "type": "number", "value": "1" }
|
|
},
|
|
{
|
|
"name": "arithmetic: power",
|
|
"code": "2 ** 10",
|
|
"expected": { "type": "number", "value": "1024" }
|
|
},
|
|
{
|
|
"name": "arithmetic: negative number",
|
|
"code": "-5 + 3",
|
|
"expected": { "type": "number", "value": "-2" }
|
|
},
|
|
{
|
|
"name": "arithmetic: decimal",
|
|
"code": "10.5 + 0.5",
|
|
"expected": { "type": "number", "value": "11.0" }
|
|
},
|
|
{
|
|
"name": "arithmetic: precedence mul before add",
|
|
"code": "2 + 3 * 4",
|
|
"expected": { "type": "number", "value": "14" }
|
|
},
|
|
{
|
|
"name": "arithmetic: parentheses override precedence",
|
|
"code": "(2 + 3) * 4",
|
|
"expected": { "type": "number", "value": "20" }
|
|
},
|
|
{
|
|
"name": "arithmetic: complex expression",
|
|
"code": "(3 + 3) * 2 / 3",
|
|
"expected": { "type": "number", "value": "4" }
|
|
},
|
|
|
|
{
|
|
"name": "comparison: greater than true",
|
|
"code": "10 > 5",
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "comparison: greater than false",
|
|
"code": "3 > 5",
|
|
"expected": { "type": "boolean", "value": false }
|
|
},
|
|
{
|
|
"name": "comparison: less than",
|
|
"code": "3 < 5",
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "comparison: greater equal",
|
|
"code": "5 >= 5",
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "comparison: less equal",
|
|
"code": "5 <= 5",
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "comparison: equal numbers",
|
|
"code": "42 == 42",
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "comparison: not equal",
|
|
"code": "42 != 43",
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "comparison: equal numbers exact",
|
|
"code": "100 == 100",
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
|
|
{
|
|
"name": "logical: and true",
|
|
"code": "true && true",
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "logical: and false",
|
|
"code": "true && false",
|
|
"expected": { "type": "boolean", "value": false }
|
|
},
|
|
{
|
|
"name": "logical: or",
|
|
"code": "false || true",
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "logical: not",
|
|
"code": "!false",
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "logical: complex",
|
|
"code": "2 > 1 && 2 >= 2 && !false",
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
|
|
{
|
|
"name": "string: concatenation",
|
|
"code": "\"hello\" + \" world\"",
|
|
"expected": { "type": "string", "value": "hello world" }
|
|
},
|
|
{
|
|
"name": "string: upper",
|
|
"code": "\"hello\".upper()",
|
|
"expected": { "type": "string", "value": "HELLO" }
|
|
},
|
|
{
|
|
"name": "string: lower",
|
|
"code": "\"HELLO\".lower()",
|
|
"expected": { "type": "string", "value": "hello" }
|
|
},
|
|
{
|
|
"name": "string: trim",
|
|
"code": "\" hello \".trim()",
|
|
"expected": { "type": "string", "value": "hello" }
|
|
},
|
|
{
|
|
"name": "string: trimStart",
|
|
"code": "\" hello \".trimStart()",
|
|
"expected": { "type": "string", "value": "hello " }
|
|
},
|
|
{
|
|
"name": "string: trimEnd",
|
|
"code": "\" hello \".trimEnd()",
|
|
"expected": { "type": "string", "value": " hello" }
|
|
},
|
|
{
|
|
"name": "string: contains true",
|
|
"code": "\"hello world\".contains(\"world\")",
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "string: contains false",
|
|
"code": "\"hello world\".contains(\"xyz\")",
|
|
"expected": { "type": "boolean", "value": false }
|
|
},
|
|
{
|
|
"name": "string: startsWith",
|
|
"code": "\"hello world\".startsWith(\"hello\")",
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "string: endsWith",
|
|
"code": "\"hello world\".endsWith(\"world\")",
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "string: replace",
|
|
"code": "\"hello world\".replace(\"world\", \"rust\")",
|
|
"expected": { "type": "string", "value": "hello rust" }
|
|
},
|
|
{
|
|
"name": "string: length method",
|
|
"code": "\"hello\".length()",
|
|
"expected": { "type": "number", "value": "5" }
|
|
},
|
|
{
|
|
"name": "string: charAt",
|
|
"code": "\"hello\".charAt(1)",
|
|
"expected": { "type": "string", "value": "e" }
|
|
},
|
|
{
|
|
"name": "string: substring",
|
|
"code": "\"hello world\".substring(0, 5)",
|
|
"expected": { "type": "string", "value": "hello" }
|
|
},
|
|
{
|
|
"name": "string: concat with method result",
|
|
"code": "\"Merhaba\" + \" duhan\".upper()",
|
|
"expected": { "type": "string", "value": "Merhaba DUHAN" }
|
|
},
|
|
|
|
{
|
|
"name": "in operator: string in string",
|
|
"code": "\"hello\" in \"hello world\"",
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "in operator: string not in string",
|
|
"code": "\"xyz\" in \"hello world\"",
|
|
"expected": { "type": "boolean", "value": false }
|
|
},
|
|
|
|
{
|
|
"name": "compound: plus equals",
|
|
"code": "x = 10\nx += 5\nx",
|
|
"expected": { "type": "number", "value": "15" }
|
|
},
|
|
{
|
|
"name": "compound: minus equals",
|
|
"code": "x = 10\nx -= 3\nx",
|
|
"expected": { "type": "number", "value": "7" }
|
|
},
|
|
{
|
|
"name": "compound: times equals",
|
|
"code": "x = 10\nx *= 3\nx",
|
|
"expected": { "type": "number", "value": "30" }
|
|
},
|
|
{
|
|
"name": "compound: divide equals",
|
|
"code": "x = 10\nx /= 2\nx",
|
|
"expected": { "type": "number", "value": "5" }
|
|
},
|
|
{
|
|
"name": "compound: modulo equals",
|
|
"code": "x = 10\nx %= 3\nx",
|
|
"expected": { "type": "number", "value": "1" }
|
|
},
|
|
|
|
{
|
|
"name": "if/else: simple true",
|
|
"code": "if true then \"yes\" else \"no\" end",
|
|
"expected": { "type": "string", "value": "yes" }
|
|
},
|
|
{
|
|
"name": "if/else: simple false",
|
|
"code": "if false then \"yes\" else \"no\" end",
|
|
"expected": { "type": "string", "value": "no" }
|
|
},
|
|
{
|
|
"name": "if/else: else if chain",
|
|
"code": "x = 3\nif x == 1 then\n \"one\"\nelse if x == 2 then\n \"two\"\nelse if x == 3 then\n \"three\"\nelse\n \"other\"\nend",
|
|
"expected": { "type": "string", "value": "three" }
|
|
},
|
|
{
|
|
"name": "if/else: with computed condition",
|
|
"code": "score = 85\nif score >= 90 then\n \"A\"\nelse if score >= 80 then\n \"B\"\nelse if score >= 70 then\n \"C\"\nelse\n \"F\"\nend",
|
|
"expected": { "type": "string", "value": "B" }
|
|
},
|
|
{
|
|
"name": "if/else: nested if",
|
|
"code": "x = 5\ny = 10\nif x > 3 then\n if y > 8 then\n \"both\"\n else\n \"only x\"\n end\nelse\n \"neither\"\nend",
|
|
"expected": { "type": "string", "value": "both" }
|
|
},
|
|
|
|
{
|
|
"name": "comments: line comment ignored",
|
|
"code": "// this is a comment\n42",
|
|
"expected": { "type": "number", "value": "42" }
|
|
},
|
|
{
|
|
"name": "comments: block comment ignored",
|
|
"code": "/* block comment */ 42",
|
|
"expected": { "type": "number", "value": "42" }
|
|
},
|
|
{
|
|
"name": "comments: inline comment after expression",
|
|
"code": "10 + 20 // should be 30",
|
|
"expected": { "type": "number", "value": "30" }
|
|
},
|
|
|
|
{
|
|
"name": "split: basic split",
|
|
"code": "\"a,b,c\".split(\",\").length()",
|
|
"expected": { "type": "number", "value": "3" }
|
|
},
|
|
{
|
|
"name": "split: join back",
|
|
"code": "\"a,b,c\".split(\",\").join(\"-\")",
|
|
"expected": { "type": "string", "value": "a-b-c" }
|
|
},
|
|
{
|
|
"name": "split: first element",
|
|
"code": "\"hello world\".split(\" \").first()",
|
|
"expected": { "type": "string", "value": "hello" }
|
|
},
|
|
{
|
|
"name": "split: last element",
|
|
"code": "\"hello world\".split(\" \").last()",
|
|
"expected": { "type": "string", "value": "world" }
|
|
},
|
|
{
|
|
"name": "split: contains",
|
|
"code": "\"a,b,c\".split(\",\").contains(\"b\")",
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
|
|
{
|
|
"name": "last result: expression between assignments returns null",
|
|
"code": "x = 10\n42\ny = 20",
|
|
"expected": { "type": "null" }
|
|
},
|
|
{
|
|
"name": "last result: compound assignment does not set result",
|
|
"code": "x = 10\nx += 5",
|
|
"expected": { "type": "null" }
|
|
},
|
|
{
|
|
"name": "last result: if without else, true branch",
|
|
"code": "if true then\n 99\nend",
|
|
"expected": { "type": "number", "value": "99" }
|
|
},
|
|
{
|
|
"name": "last result: chained operations then result",
|
|
"code": "a = 1\nb = 2\nc = 3\na + b + c",
|
|
"expected": { "type": "number", "value": "6" }
|
|
},
|
|
{
|
|
"name": "last result: string method as last expr",
|
|
"code": "name = \"duhan\"\nname.upper()",
|
|
"expected": { "type": "string", "value": "DUHAN" }
|
|
},
|
|
{
|
|
"name": "last result: comparison as last expr",
|
|
"code": "x = 10\ny = 20\nx < y",
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "last result: logical as last expr",
|
|
"code": "a = true\nb = false\na && !b",
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "last result: multiple if/else, last one wins",
|
|
"code": "if true then\n \"first\"\nend\nif true then\n \"second\"\nend",
|
|
"expected": { "type": "string", "value": "second" }
|
|
},
|
|
{
|
|
"name": "last result: complex formula",
|
|
"code": "base = 1000\nrate = 18\nbase * rate / 100",
|
|
"expected": { "type": "number", "value": "180" }
|
|
},
|
|
|
|
{
|
|
"name": "globals: simple number",
|
|
"code": "x * 2",
|
|
"globals": { "x": { "type": "number", "value": "21" } },
|
|
"expected": { "type": "number", "value": "42" }
|
|
},
|
|
{
|
|
"name": "globals: string global method",
|
|
"code": "name.upper()",
|
|
"globals": {
|
|
"name": { "type": "string", "value": "duhan" }
|
|
},
|
|
"expected": { "type": "string", "value": "DUHAN" }
|
|
},
|
|
{
|
|
"name": "globals: formula with external values",
|
|
"code": "toplamTutar * kdv / 100",
|
|
"globals": {
|
|
"toplamTutar": { "type": "number", "value": "1000" },
|
|
"kdv": { "type": "number", "value": "18" }
|
|
},
|
|
"expected": { "type": "number", "value": "180" }
|
|
},
|
|
{
|
|
"name": "globals: boolean global in condition",
|
|
"code": "if active then \"yes\" else \"no\" end",
|
|
"globals": { "active": { "type": "boolean", "value": true } },
|
|
"expected": { "type": "string", "value": "yes" }
|
|
},
|
|
{
|
|
"name": "globals: override global with assignment",
|
|
"code": "x = x + 10\nx",
|
|
"globals": { "x": { "type": "number", "value": "5" } },
|
|
"expected": { "type": "number", "value": "15" }
|
|
},
|
|
{
|
|
"name": "globals: compound assignment on global",
|
|
"code": "x += 100\nx",
|
|
"globals": { "x": { "type": "number", "value": "50" } },
|
|
"expected": { "type": "number", "value": "150" }
|
|
},
|
|
{
|
|
"name": "globals: string method on global",
|
|
"code": "name.upper()",
|
|
"globals": { "name": { "type": "string", "value": "duhan" } },
|
|
"expected": { "type": "string", "value": "DUHAN" }
|
|
},
|
|
{
|
|
"name": "globals: comparison with global",
|
|
"code": "if price > 100 then\n price * discount / 100\nelse\n 0\nend",
|
|
"globals": {
|
|
"price": { "type": "number", "value": "200" },
|
|
"discount": { "type": "number", "value": "10" }
|
|
},
|
|
"expected": { "type": "number", "value": "20" }
|
|
},
|
|
{
|
|
"name": "globals: multiple globals in complex expression",
|
|
"code": "subtotal = quantity * unitPrice\ntax = subtotal * taxRate / 100\nsubtotal + tax",
|
|
"globals": {
|
|
"quantity": { "type": "number", "value": "5" },
|
|
"unitPrice": { "type": "number", "value": "100" },
|
|
"taxRate": { "type": "number", "value": "18" }
|
|
},
|
|
"expected": { "type": "number", "value": "590" }
|
|
},
|
|
{
|
|
"name": "globals: in operator with global string",
|
|
"code": "keyword in text",
|
|
"globals": {
|
|
"keyword": { "type": "string", "value": "finans" },
|
|
"text": { "type": "string", "value": "bu bir finans raporu" }
|
|
},
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "globals: nested if with number global",
|
|
"code": "if level == 1 then\n \"low\"\nelse if level == 2 then\n \"mid\"\nelse\n \"high\"\nend",
|
|
"globals": { "level": { "type": "number", "value": "2" } },
|
|
"expected": { "type": "string", "value": "mid" }
|
|
},
|
|
{
|
|
"name": "globals: last result with globals, assignment only returns null",
|
|
"code": "result = x + y",
|
|
"globals": {
|
|
"x": { "type": "number", "value": "10" },
|
|
"y": { "type": "number", "value": "20" }
|
|
},
|
|
"expected": { "type": "null" }
|
|
},
|
|
{
|
|
"name": "globals: last result with globals, expression returns value",
|
|
"code": "result = x + y\nresult",
|
|
"globals": {
|
|
"x": { "type": "number", "value": "10" },
|
|
"y": { "type": "number", "value": "20" }
|
|
},
|
|
"expected": { "type": "number", "value": "30" }
|
|
},
|
|
{
|
|
"name": "globals: pricing formula",
|
|
"code": "base = basePrice * (1 + margin / 100)\nif base > maxPrice then\n maxPrice\nelse\n base\nend",
|
|
"globals": {
|
|
"basePrice": { "type": "number", "value": "100" },
|
|
"margin": { "type": "number", "value": "20" },
|
|
"maxPrice": { "type": "number", "value": "150" }
|
|
},
|
|
"expected": { "type": "number", "value": "120" }
|
|
},
|
|
{
|
|
"name": "globals: pricing formula exceeds max",
|
|
"code": "base = basePrice * (1 + margin / 100)\nif base > maxPrice then\n maxPrice\nelse\n base\nend",
|
|
"globals": {
|
|
"basePrice": { "type": "number", "value": "200" },
|
|
"margin": { "type": "number", "value": "50" },
|
|
"maxPrice": { "type": "number", "value": "250" }
|
|
},
|
|
"expected": { "type": "number", "value": "250" }
|
|
},
|
|
{
|
|
"name": "globals: object property access",
|
|
"code": "user.name",
|
|
"globals": {
|
|
"user": { "type": "object", "value": { "name": "Duhan", "age": "30" } }
|
|
},
|
|
"expected": { "type": "string", "value": "Duhan" }
|
|
},
|
|
{
|
|
"name": "globals: object in condition",
|
|
"code": "if user.age > 18 then \"adult\" else \"minor\" end",
|
|
"globals": {
|
|
"user": { "type": "object", "value": { "name": "Duhan", "age": "30" } }
|
|
},
|
|
"expected": { "type": "string", "value": "adult" }
|
|
},
|
|
{
|
|
"name": "globals: nested object property access",
|
|
"code": "order.customer.name",
|
|
"globals": {
|
|
"order": {
|
|
"type": "object",
|
|
"value": {
|
|
"id": "1001",
|
|
"customer": {
|
|
"name": "Duhan",
|
|
"email": "duhan@test.com"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "string", "value": "Duhan" }
|
|
},
|
|
{
|
|
"name": "globals: deeply nested object",
|
|
"code": "config.db.connection.port",
|
|
"globals": {
|
|
"config": {
|
|
"type": "object",
|
|
"value": {
|
|
"db": {
|
|
"connection": {
|
|
"host": "localhost",
|
|
"port": "5432"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "number", "value": "5432" }
|
|
},
|
|
{
|
|
"name": "globals: nested object in formula",
|
|
"code": "item.price * item.quantity",
|
|
"globals": {
|
|
"item": {
|
|
"type": "object",
|
|
"value": {
|
|
"name": "Widget",
|
|
"price": "25",
|
|
"quantity": "4"
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "number", "value": "100" }
|
|
},
|
|
{
|
|
"name": "globals: nested object in condition",
|
|
"code": "if order.payment.method == 1 then\n order.total * 0.95\nelse\n order.total\nend",
|
|
"globals": {
|
|
"order": {
|
|
"type": "object",
|
|
"value": {
|
|
"total": "200",
|
|
"payment": {
|
|
"method": "1",
|
|
"status": "paid"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "number", "value": "190.00" }
|
|
},
|
|
{
|
|
"name": "globals: multiple nested objects",
|
|
"code": "if customer.tier == 1 then\n product.price * 0.9\nelse\n product.price\nend",
|
|
"globals": {
|
|
"customer": {
|
|
"type": "object",
|
|
"value": { "name": "Duhan", "tier": "1" }
|
|
},
|
|
"product": {
|
|
"type": "object",
|
|
"value": { "name": "Laptop", "price": "1000" }
|
|
}
|
|
},
|
|
"expected": { "type": "number", "value": "900.0" }
|
|
},
|
|
{
|
|
"name": "globals: nested object with string method",
|
|
"code": "user.email.upper()",
|
|
"globals": {
|
|
"user": {
|
|
"type": "object",
|
|
"value": {
|
|
"name": "Duhan",
|
|
"email": "duhan@test.com"
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "string", "value": "DUHAN@TEST.COM" }
|
|
},
|
|
{
|
|
"name": "globals: object keys method",
|
|
"code": "user.keys().length()",
|
|
"globals": {
|
|
"user": {
|
|
"type": "object",
|
|
"value": { "name": "Duhan", "age": "30", "city": "Istanbul" }
|
|
}
|
|
},
|
|
"expected": { "type": "number", "value": "3" }
|
|
},
|
|
{
|
|
"name": "globals: object contains key",
|
|
"code": "user.contains(\"email\")",
|
|
"globals": {
|
|
"user": {
|
|
"type": "object",
|
|
"value": { "name": "Duhan", "email": "duhan@test.com" }
|
|
}
|
|
},
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "globals: object contains missing key",
|
|
"code": "user.contains(\"phone\")",
|
|
"globals": {
|
|
"user": {
|
|
"type": "object",
|
|
"value": { "name": "Duhan", "email": "duhan@test.com" }
|
|
}
|
|
},
|
|
"expected": { "type": "boolean", "value": false }
|
|
},
|
|
{
|
|
"name": "globals: in operator with object",
|
|
"code": "\"name\" in user",
|
|
"globals": {
|
|
"user": {
|
|
"type": "object",
|
|
"value": { "name": "Duhan", "age": "30" }
|
|
}
|
|
},
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "globals: nested object assign to field",
|
|
"code": "order.status = \"shipped\"\norder.status",
|
|
"globals": {
|
|
"order": {
|
|
"type": "object",
|
|
"value": { "id": "1001", "status": "pending" }
|
|
}
|
|
},
|
|
"expected": { "type": "string", "value": "shipped" }
|
|
},
|
|
{
|
|
"name": "globals: complex pricing with nested objects",
|
|
"code": "basePrice = product.price * order.quantity\ndiscountRate = customer.discount\nfinalPrice = basePrice * (1 - discountRate / 100)\nfinalPrice",
|
|
"globals": {
|
|
"product": {
|
|
"type": "object",
|
|
"value": { "name": "Widget", "price": "50" }
|
|
},
|
|
"order": {
|
|
"type": "object",
|
|
"value": { "quantity": "10", "urgent": "false" }
|
|
},
|
|
"customer": {
|
|
"type": "object",
|
|
"value": { "name": "Acme Corp", "discount": "15" }
|
|
}
|
|
},
|
|
"expected": { "type": "number", "value": "425.0" }
|
|
},
|
|
|
|
{
|
|
"name": "globals: deep path + string method",
|
|
"code": "order.customer.name.upper()",
|
|
"globals": {
|
|
"order": {
|
|
"type": "object",
|
|
"value": {
|
|
"id": "1001",
|
|
"customer": {
|
|
"name": "duhan",
|
|
"email": "duhan@test.com"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "string", "value": "DUHAN" }
|
|
},
|
|
{
|
|
"name": "globals: deep path + lower method",
|
|
"code": "config.app.title.lower()",
|
|
"globals": {
|
|
"config": {
|
|
"type": "object",
|
|
"value": {
|
|
"app": {
|
|
"title": "MY APPLICATION",
|
|
"version": "1"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "string", "value": "my application" }
|
|
},
|
|
{
|
|
"name": "globals: deep path + trim method",
|
|
"code": "data.record.value.trim()",
|
|
"globals": {
|
|
"data": {
|
|
"type": "object",
|
|
"value": {
|
|
"record": {
|
|
"value": " hello "
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "string", "value": "hello" }
|
|
},
|
|
{
|
|
"name": "globals: deep path + contains method",
|
|
"code": "order.customer.email.contains(\"@\")",
|
|
"globals": {
|
|
"order": {
|
|
"type": "object",
|
|
"value": {
|
|
"id": "1001",
|
|
"customer": {
|
|
"name": "Duhan",
|
|
"email": "duhan@test.com"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "globals: deep path + startsWith method",
|
|
"code": "company.address.city.startsWith(\"Ist\")",
|
|
"globals": {
|
|
"company": {
|
|
"type": "object",
|
|
"value": {
|
|
"name": "Acme",
|
|
"address": {
|
|
"city": "Istanbul",
|
|
"country": "TR"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "globals: deep path + replace method",
|
|
"code": "config.db.host.replace(\"localhost\", \"production.db\")",
|
|
"globals": {
|
|
"config": {
|
|
"type": "object",
|
|
"value": {
|
|
"db": {
|
|
"host": "localhost",
|
|
"port": "5432"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "string", "value": "production.db" }
|
|
},
|
|
{
|
|
"name": "globals: deep path + split + first",
|
|
"code": "user.profile.fullName.split(\" \").first()",
|
|
"globals": {
|
|
"user": {
|
|
"type": "object",
|
|
"value": {
|
|
"id": "42",
|
|
"profile": {
|
|
"fullName": "Duhan Balci",
|
|
"age": "30"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "string", "value": "Duhan" }
|
|
},
|
|
{
|
|
"name": "globals: deep path + split + last",
|
|
"code": "user.profile.fullName.split(\" \").last()",
|
|
"globals": {
|
|
"user": {
|
|
"type": "object",
|
|
"value": {
|
|
"id": "42",
|
|
"profile": {
|
|
"fullName": "Duhan Balci",
|
|
"age": "30"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "string", "value": "Balci" }
|
|
},
|
|
{
|
|
"name": "globals: deep path + split + join chain",
|
|
"code": "data.csv.row.split(\",\").join(\" | \")",
|
|
"globals": {
|
|
"data": {
|
|
"type": "object",
|
|
"value": {
|
|
"csv": {
|
|
"row": "a,b,c,d"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "string", "value": "a | b | c | d" }
|
|
},
|
|
{
|
|
"name": "globals: deep path + split + length",
|
|
"code": "data.csv.row.split(\",\").length()",
|
|
"globals": {
|
|
"data": {
|
|
"type": "object",
|
|
"value": {
|
|
"csv": {
|
|
"row": "a,b,c,d"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "number", "value": "4" }
|
|
},
|
|
{
|
|
"name": "globals: deep path + split + contains",
|
|
"code": "data.tags.raw.split(\",\").contains(\"finans\")",
|
|
"globals": {
|
|
"data": {
|
|
"type": "object",
|
|
"value": {
|
|
"tags": {
|
|
"raw": "tech,finans,health"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "globals: deep path + substring method",
|
|
"code": "order.ref.code.substring(0, 3)",
|
|
"globals": {
|
|
"order": {
|
|
"type": "object",
|
|
"value": {
|
|
"ref": {
|
|
"code": "ORD-12345"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "string", "value": "ORD" }
|
|
},
|
|
{
|
|
"name": "globals: deep path + charAt method",
|
|
"code": "config.app.code.charAt(0)",
|
|
"globals": {
|
|
"config": {
|
|
"type": "object",
|
|
"value": {
|
|
"app": {
|
|
"code": "XYZ",
|
|
"version": "1"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "string", "value": "X" }
|
|
},
|
|
{
|
|
"name": "globals: deep path + length method on string",
|
|
"code": "user.profile.bio.length()",
|
|
"globals": {
|
|
"user": {
|
|
"type": "object",
|
|
"value": {
|
|
"profile": {
|
|
"bio": "hello world"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "number", "value": "11" }
|
|
},
|
|
{
|
|
"name": "globals: deep path arithmetic",
|
|
"code": "invoice.line.qty * invoice.line.unitPrice",
|
|
"globals": {
|
|
"invoice": {
|
|
"type": "object",
|
|
"value": {
|
|
"id": "INV-001",
|
|
"line": {
|
|
"product": "Widget",
|
|
"qty": "10",
|
|
"unitPrice": "25"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "number", "value": "250" }
|
|
},
|
|
{
|
|
"name": "globals: deep path in condition",
|
|
"code": "if order.customer.tier == 1 then\n order.total * 0.9\nelse\n order.total\nend",
|
|
"globals": {
|
|
"order": {
|
|
"type": "object",
|
|
"value": {
|
|
"total": "500",
|
|
"customer": {
|
|
"name": "Acme",
|
|
"tier": "1"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "number", "value": "450.0" }
|
|
},
|
|
{
|
|
"name": "globals: deep path + upper in concat",
|
|
"code": "\"Dear \" + user.info.name.upper()",
|
|
"globals": {
|
|
"user": {
|
|
"type": "object",
|
|
"value": {
|
|
"info": {
|
|
"name": "duhan",
|
|
"role": "admin"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "string", "value": "Dear DUHAN" }
|
|
},
|
|
{
|
|
"name": "globals: 4-level deep path",
|
|
"code": "a.b.c.d",
|
|
"globals": {
|
|
"a": {
|
|
"type": "object",
|
|
"value": {
|
|
"b": {
|
|
"c": {
|
|
"d": "42"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "number", "value": "42" }
|
|
},
|
|
{
|
|
"name": "globals: 4-level deep path + method",
|
|
"code": "a.b.c.d.upper()",
|
|
"globals": {
|
|
"a": {
|
|
"type": "object",
|
|
"value": {
|
|
"b": {
|
|
"c": {
|
|
"d": "hello"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "string", "value": "HELLO" }
|
|
},
|
|
{
|
|
"name": "globals: deep path object keys",
|
|
"code": "org.department.team.keys().length()",
|
|
"globals": {
|
|
"org": {
|
|
"type": "object",
|
|
"value": {
|
|
"department": {
|
|
"team": {
|
|
"lead": "Ali",
|
|
"dev1": "Veli",
|
|
"dev2": "Ayse"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "number", "value": "3" }
|
|
},
|
|
{
|
|
"name": "globals: deep path object contains",
|
|
"code": "org.department.team.contains(\"lead\")",
|
|
"globals": {
|
|
"org": {
|
|
"type": "object",
|
|
"value": {
|
|
"department": {
|
|
"team": {
|
|
"lead": "Ali",
|
|
"dev1": "Veli"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "globals: deep path + in operator on nested object",
|
|
"code": "\"dev1\" in org.department.team",
|
|
"globals": {
|
|
"org": {
|
|
"type": "object",
|
|
"value": {
|
|
"department": {
|
|
"team": {
|
|
"lead": "Ali",
|
|
"dev1": "Veli"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "boolean", "value": true }
|
|
},
|
|
{
|
|
"name": "globals: multiple deep paths from different roots",
|
|
"code": "customer.address.city.upper().length() + order.shipping.cost",
|
|
"globals": {
|
|
"customer": {
|
|
"type": "object",
|
|
"value": {
|
|
"address": {
|
|
"city": "istanbul"
|
|
}
|
|
}
|
|
},
|
|
"order": {
|
|
"type": "object",
|
|
"value": {
|
|
"shipping": {
|
|
"cost": "50",
|
|
"method": "express"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"expected": { "type": "number", "value": "58" }
|
|
},
|
|
|
|
{
|
|
"name": "string concat: variable + variable",
|
|
"code": "a = \"hello\"\nb = \" world\"\na + b",
|
|
"expected": { "type": "string", "value": "hello world" }
|
|
},
|
|
{
|
|
"name": "string concat: string + number coercion",
|
|
"code": "\"count: \" + 42",
|
|
"expected": { "type": "string", "value": "count: 42" }
|
|
},
|
|
{
|
|
"name": "string concat: number + string coercion",
|
|
"code": "100 + \" items\"",
|
|
"expected": { "type": "string", "value": "100 items" }
|
|
},
|
|
{
|
|
"name": "string concat: string + boolean coercion",
|
|
"code": "\"active: \" + true",
|
|
"expected": { "type": "string", "value": "active: true" }
|
|
},
|
|
{
|
|
"name": "string concat: global string variables",
|
|
"code": "first + \" \" + last",
|
|
"globals": {
|
|
"first": { "type": "string", "value": "Duhan" },
|
|
"last": { "type": "string", "value": "Balci" }
|
|
},
|
|
"expected": { "type": "string", "value": "Duhan Balci" }
|
|
},
|
|
{
|
|
"name": "string concat: string + decimal coercion",
|
|
"code": "\"price: \" + 19.99",
|
|
"expected": { "type": "string", "value": "price: 19.99" }
|
|
},
|
|
|
|
{
|
|
"name": "builtin: abs positive",
|
|
"code": "abs(42)",
|
|
"expected": { "type": "number", "value": "42" }
|
|
},
|
|
{
|
|
"name": "builtin: abs negative",
|
|
"code": "abs(-42)",
|
|
"expected": { "type": "number", "value": "42" }
|
|
},
|
|
{
|
|
"name": "builtin: min two args",
|
|
"code": "min(10, 3)",
|
|
"expected": { "type": "number", "value": "3" }
|
|
},
|
|
{
|
|
"name": "builtin: min three args",
|
|
"code": "min(10, 3, 7)",
|
|
"expected": { "type": "number", "value": "3" }
|
|
},
|
|
{
|
|
"name": "builtin: max two args",
|
|
"code": "max(10, 3)",
|
|
"expected": { "type": "number", "value": "10" }
|
|
},
|
|
{
|
|
"name": "builtin: max three args",
|
|
"code": "max(10, 3, 7)",
|
|
"expected": { "type": "number", "value": "10" }
|
|
},
|
|
{
|
|
"name": "builtin: floor",
|
|
"code": "floor(3.7)",
|
|
"expected": { "type": "number", "value": "3" }
|
|
},
|
|
{
|
|
"name": "builtin: floor negative",
|
|
"code": "floor(-2.3)",
|
|
"expected": { "type": "number", "value": "-3" }
|
|
},
|
|
{
|
|
"name": "builtin: ceil",
|
|
"code": "ceil(3.2)",
|
|
"expected": { "type": "number", "value": "4" }
|
|
},
|
|
{
|
|
"name": "builtin: ceil negative",
|
|
"code": "ceil(-2.7)",
|
|
"expected": { "type": "number", "value": "-2" }
|
|
},
|
|
{
|
|
"name": "builtin: round default",
|
|
"code": "round(3.5)",
|
|
"expected": { "type": "number", "value": "4" }
|
|
},
|
|
{
|
|
"name": "builtin: round with decimal places",
|
|
"code": "round(3.14159, 2)",
|
|
"expected": { "type": "number", "value": "3.14" }
|
|
},
|
|
{
|
|
"name": "builtin: sqrt",
|
|
"code": "sqrt(16)",
|
|
"expected": { "type": "number", "value": "4" }
|
|
},
|
|
{
|
|
"name": "builtin: len string",
|
|
"code": "len(\"hello\")",
|
|
"expected": { "type": "number", "value": "5" }
|
|
},
|
|
{
|
|
"name": "builtin: toString number",
|
|
"code": "toString(42)",
|
|
"expected": { "type": "string", "value": "42" }
|
|
},
|
|
{
|
|
"name": "builtin: toString boolean",
|
|
"code": "toString(true)",
|
|
"expected": { "type": "string", "value": "true" }
|
|
},
|
|
{
|
|
"name": "builtin: toNumber string",
|
|
"code": "toNumber(\"42\")",
|
|
"expected": { "type": "number", "value": "42" }
|
|
},
|
|
{
|
|
"name": "builtin: toNumber boolean true",
|
|
"code": "toNumber(true)",
|
|
"expected": { "type": "number", "value": "1" }
|
|
},
|
|
{
|
|
"name": "builtin: abs in formula",
|
|
"code": "x = -50\nabs(x) + 10",
|
|
"expected": { "type": "number", "value": "60" }
|
|
},
|
|
{
|
|
"name": "builtin: round in pricing",
|
|
"code": "price = 99.999\nround(price, 2)",
|
|
"expected": { "type": "number", "value": "100.00" }
|
|
},
|
|
{
|
|
"name": "builtin: min/max with globals",
|
|
"code": "min(max(price, minPrice), maxPrice)",
|
|
"globals": {
|
|
"price": { "type": "number", "value": "250" },
|
|
"minPrice": { "type": "number", "value": "100" },
|
|
"maxPrice": { "type": "number", "value": "200" }
|
|
},
|
|
"expected": { "type": "number", "value": "200" }
|
|
}
|
|
]
|