septima-lang 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/jest-output.json CHANGED
@@ -1 +1 @@
1
- {"numFailedTestSuites":0,"numFailedTests":0,"numPassedTestSuites":3,"numPassedTests":191,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":13,"numTotalTestSuites":3,"numTotalTests":204,"openHandles":[],"snapshot":{"added":0,"didUpdate":false,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0},"startTime":1662575824628,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":["parser"],"failureMessages":[],"fullName":"parser show()","location":null,"status":"passed","title":"show()"},{"ancestorTitles":["parser"],"failureMessages":[],"fullName":"parser syntax errors","location":null,"status":"passed","title":"syntax errors"}],"endTime":1662575825739,"message":"","name":"/home/imaman/code/imaman/bigband/modules/cdl/dist/tests/parser.spec.js","startTime":1662575825030,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value arithmetics","location":null,"status":"passed","title":"arithmetics"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value comparisons of numbers","location":null,"status":"passed","title":"comparisons of numbers"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value booleans","location":null,"status":"passed","title":"booleans"},{"ancestorTitles":["value","boolean operators"],"failureMessages":[],"fullName":"value boolean operators or","location":null,"status":"passed","title":"or"},{"ancestorTitles":["value","boolean operators"],"failureMessages":[],"fullName":"value boolean operators and","location":null,"status":"passed","title":"and"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value comparisons of booleans","location":null,"status":"passed","title":"comparisons of booleans"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value strings","location":null,"status":"passed","title":"strings"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value comparisons of strings","location":null,"status":"passed","title":"comparisons of strings"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value arrays","location":null,"status":"passed","title":"arrays"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value objects","location":null,"status":"passed","title":"objects"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value yells if access() is called with value which is neither string or num","location":null,"status":"passed","title":"yells if access() is called with value which is neither string or num"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value json","location":null,"status":"passed","title":"json"},{"ancestorTitles":["value","ifElse"],"failureMessages":[],"fullName":"value ifElse when applied to true evaluates the positive branch","location":null,"status":"passed","title":"when applied to true evaluates the positive branch"},{"ancestorTitles":["value","ifElse"],"failureMessages":[],"fullName":"value ifElse when applied to false evaluates the positive branch","location":null,"status":"passed","title":"when applied to false evaluates the positive branch"},{"ancestorTitles":["value","ifElse"],"failureMessages":[],"fullName":"value ifElse errors if applied to a non-boolean","location":null,"status":"passed","title":"errors if applied to a non-boolean"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink exported as undefined","location":null,"status":"passed","title":"exported as undefined"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink arithmetic operations on sink evaluate to sink","location":null,"status":"passed","title":"arithmetic operations on sink evaluate to sink"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink boolean operations on sink evaluate to sink","location":null,"status":"passed","title":"boolean operations on sink evaluate to sink"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink when sink is the right-hand-side of a boolean expression, the result is sink only if the left-hand-side dictates so","location":null,"status":"passed","title":"when sink is the right-hand-side of a boolean expression, the result is sink only if the left-hand-side dictates so"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink ifElse with sink condition evaluates to sink","location":null,"status":"passed","title":"ifElse with sink condition evaluates to sink"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink ifElse with sink positive expression evaluates to sink only if the condition is true","location":null,"status":"passed","title":"ifElse with sink positive expression evaluates to sink only if the condition is true"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink ifElse with sink negative expression evaluates to sink only if the condition is false","location":null,"status":"passed","title":"ifElse with sink negative expression evaluates to sink only if the condition is false"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink access to an attribute of a sink evaluates to sink","location":null,"status":"passed","title":"access to an attribute of a sink evaluates to sink"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink calling a sink evaluates to sink","location":null,"status":"passed","title":"calling a sink evaluates to sink"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink applying .keys() to sink evaluates to sink","location":null,"status":"passed","title":"applying .keys() to sink evaluates to sink"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink applying .entries() to sink evaluates to sink","location":null,"status":"passed","title":"applying .entries() to sink evaluates to sink"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink applying .fromEntries() to sink evaluates to sink","location":null,"status":"passed","title":"applying .fromEntries() to sink evaluates to sink"},{"ancestorTitles":["value","sink","unsink()"],"failureMessages":[],"fullName":"value sink unsink() when applied to a non-sink value evaluates to it","location":null,"status":"passed","title":"when applied to a non-sink value evaluates to it"},{"ancestorTitles":["value","sink","unsink()"],"failureMessages":[],"fullName":"value sink unsink() when applied to a sink value evaluates to its argument","location":null,"status":"passed","title":"when applied to a sink value evaluates to its argument"},{"ancestorTitles":["value","sink","comparisons"],"failureMessages":[],"fullName":"value sink comparisons comparing a sink with itself evaluates to true","location":null,"status":"passed","title":"comparing a sink with itself evaluates to true"},{"ancestorTitles":["value","sink","comparisons"],"failureMessages":[],"fullName":"value sink comparisons comparing a sink with other types evaluates to false","location":null,"status":"passed","title":"comparing a sink with other types evaluates to false"},{"ancestorTitles":["value","sink","comparisons"],"failureMessages":[],"fullName":"value sink comparisons erros when trying to order a sink with a non-sink","location":null,"status":"passed","title":"erros when trying to order a sink with a non-sink"},{"ancestorTitles":["value","type erros"],"failureMessages":[],"fullName":"value type erros emits erros when numeric operations are applied to a boolean (either lhs or rhs)","location":null,"status":"passed","title":"emits erros when numeric operations are applied to a boolean (either lhs or rhs)"},{"ancestorTitles":["value","type erros"],"failureMessages":[],"fullName":"value type erros emits erros when boolean operations are applied to a number (either lhs or rhs)","location":null,"status":"passed","title":"emits erros when boolean operations are applied to a number (either lhs or rhs)"},{"ancestorTitles":["value","foreign code calls"],"failureMessages":[],"fullName":"value foreign code calls invokes the given function","location":null,"status":"passed","title":"invokes the given function"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios .length","location":null,"status":"passed","title":".length"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .at() method","location":null,"status":"passed","title":"provides the .at() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .at() method","location":null,"status":"passed","title":"provides the .at() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .charAt() method","location":null,"status":"passed","title":"provides the .charAt() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .concat() method","location":null,"status":"passed","title":"provides the .concat() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .endsWith() method","location":null,"status":"passed","title":"provides the .endsWith() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .endsWith() method","location":null,"status":"passed","title":"provides the .endsWith() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .includes() method","location":null,"status":"passed","title":"provides the .includes() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .includes() method","location":null,"status":"passed","title":"provides the .includes() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .indexOf() method","location":null,"status":"passed","title":"provides the .indexOf() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .lastIndexOf() method","location":null,"status":"passed","title":"provides the .lastIndexOf() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .match() method","location":null,"status":"passed","title":"provides the .match() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .matchAll() method","location":null,"status":"passed","title":"provides the .matchAll() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .padEnd() method","location":null,"status":"passed","title":"provides the .padEnd() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .padStart() method","location":null,"status":"passed","title":"provides the .padStart() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .repeat() method","location":null,"status":"passed","title":"provides the .repeat() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .replace() method","location":null,"status":"passed","title":"provides the .replace() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .replaceAll() method","location":null,"status":"passed","title":"provides the .replaceAll() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .search() method","location":null,"status":"passed","title":"provides the .search() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .slice() method","location":null,"status":"passed","title":"provides the .slice() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .split() method","location":null,"status":"passed","title":"provides the .split() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .startsWith() method","location":null,"status":"passed","title":"provides the .startsWith() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .startsWith() method","location":null,"status":"passed","title":"provides the .startsWith() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .substring() method","location":null,"status":"passed","title":"provides the .substring() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .substring() method","location":null,"status":"passed","title":"provides the .substring() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .toLowerCase() method","location":null,"status":"passed","title":"provides the .toLowerCase() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .toUpperCase() method","location":null,"status":"passed","title":"provides the .toUpperCase() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .trim() method","location":null,"status":"passed","title":"provides the .trim() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .trimEnd() method","location":null,"status":"passed","title":"provides the .trimEnd() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .trimStart() method","location":null,"status":"passed","title":"provides the .trimStart() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations .length","location":null,"status":"passed","title":".length"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .at() method","location":null,"status":"passed","title":"provides the .at() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .at() method","location":null,"status":"passed","title":"provides the .at() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .concat() method","location":null,"status":"passed","title":"provides the .concat() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .entries() method","location":null,"status":"passed","title":"provides the .entries() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .includes() method","location":null,"status":"passed","title":"provides the .includes() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .includes() method","location":null,"status":"passed","title":"provides the .includes() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .indexOf() method","location":null,"status":"passed","title":"provides the .indexOf() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .join() method","location":null,"status":"passed","title":"provides the .join() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .lastIndexOf() method","location":null,"status":"passed","title":"provides the .lastIndexOf() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .lastIndexOf() method","location":null,"status":"passed","title":"provides the .lastIndexOf() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .reverse() method","location":null,"status":"passed","title":"provides the .reverse() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .slice() method","location":null,"status":"passed","title":"provides the .slice() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .slice() method","location":null,"status":"passed","title":"provides the .slice() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .slice() method","location":null,"status":"passed","title":"provides the .slice() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations .flat() flattens","location":null,"status":"passed","title":".flat() flattens"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value array.sort()","location":null,"status":"todo","title":"array.sort()"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value what happens when we get an undefined from a foreign call (like Array.get())","location":null,"status":"todo","title":"what happens when we get an undefined from a foreign call (like Array.get())"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value access to non-existing string method (a sad path test)","location":null,"status":"todo","title":"access to non-existing string method (a sad path test)"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value access to non-existing array method (a sad path test)","location":null,"status":"todo","title":"access to non-existing array method (a sad path test)"}],"endTime":1662575825878,"message":"","name":"/home/imaman/code/imaman/bigband/modules/cdl/dist/tests/value.spec.js","startTime":1662575825026,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["cdl"],"failureMessages":[],"fullName":"cdl basics","location":null,"status":"passed","title":"basics"},{"ancestorTitles":["cdl"],"failureMessages":[],"fullName":"cdl booleans","location":null,"status":"passed","title":"booleans"},{"ancestorTitles":["cdl"],"failureMessages":[],"fullName":"cdl arithmetics","location":null,"status":"passed","title":"arithmetics"},{"ancestorTitles":["cdl"],"failureMessages":[],"fullName":"cdl error message specifies the location in the file","location":null,"status":"passed","title":"error message specifies the location in the file"},{"ancestorTitles":["cdl"],"failureMessages":[],"fullName":"cdl equality","location":null,"status":"passed","title":"equality"},{"ancestorTitles":["cdl"],"failureMessages":[],"fullName":"cdl comparison","location":null,"status":"passed","title":"comparison"},{"ancestorTitles":["cdl"],"failureMessages":[],"fullName":"cdl combined arithmetics and logical expressions","location":null,"status":"passed","title":"combined arithmetics and logical expressions"},{"ancestorTitles":["cdl"],"failureMessages":[],"fullName":"cdl the rhs of a logical-or expression is evaluated only if lhs is false","location":null,"status":"passed","title":"the rhs of a logical-or expression is evaluated only if lhs is false"},{"ancestorTitles":["cdl"],"failureMessages":[],"fullName":"cdl the rhs of a logical-and expression is evaluated only if lhs is true","location":null,"status":"passed","title":"the rhs of a logical-and expression is evaluated only if lhs is true"},{"ancestorTitles":["cdl"],"failureMessages":[],"fullName":"cdl eats whitespace","location":null,"status":"passed","title":"eats whitespace"},{"ancestorTitles":["cdl","unary expressions"],"failureMessages":[],"fullName":"cdl unary expressions +","location":null,"status":"passed","title":"+"},{"ancestorTitles":["cdl","unary expressions"],"failureMessages":[],"fullName":"cdl unary expressions errors if + is applied to non-number","location":null,"status":"passed","title":"errors if + is applied to non-number"},{"ancestorTitles":["cdl","unary expressions"],"failureMessages":[],"fullName":"cdl unary expressions -","location":null,"status":"passed","title":"-"},{"ancestorTitles":["cdl","strings"],"failureMessages":[],"fullName":"cdl strings can be specified via the double-quotes notation","location":null,"status":"passed","title":"can be specified via the double-quotes notation"},{"ancestorTitles":["cdl","strings"],"failureMessages":[],"fullName":"cdl strings can be specified via the single-quotes notation","location":null,"status":"passed","title":"can be specified via the single-quotes notation"},{"ancestorTitles":["cdl","strings"],"failureMessages":[],"fullName":"cdl strings does not trim leading/trailing whitespace","location":null,"status":"passed","title":"does not trim leading/trailing whitespace"},{"ancestorTitles":["cdl","strings"],"failureMessages":[],"fullName":"cdl strings supports string methods","location":null,"status":"passed","title":"supports string methods"},{"ancestorTitles":["cdl","strings"],"failureMessages":[],"fullName":"cdl strings supports optional arguments of string methods","location":null,"status":"passed","title":"supports optional arguments of string methods"},{"ancestorTitles":["cdl","let"],"failureMessages":[],"fullName":"cdl let binds values to variables","location":null,"status":"passed","title":"binds values to variables"},{"ancestorTitles":["cdl","let"],"failureMessages":[],"fullName":"cdl let fails if the variable was not defined","location":null,"status":"passed","title":"fails if the variable was not defined"},{"ancestorTitles":["cdl","let"],"failureMessages":[],"fullName":"cdl let parenthsized expression can have let defintions","location":null,"status":"passed","title":"parenthsized expression can have let defintions"},{"ancestorTitles":["cdl","let"],"failureMessages":[],"fullName":"cdl let inner expressions can access variables from enclosing scopes","location":null,"status":"passed","title":"inner expressions can access variables from enclosing scopes"},{"ancestorTitles":["cdl","let"],"failureMessages":[],"fullName":"cdl let definitions from inner scopes overshadow definitions from outer scopes","location":null,"status":"passed","title":"definitions from inner scopes overshadow definitions from outer scopes"},{"ancestorTitles":["cdl","let"],"failureMessages":[],"fullName":"cdl let the body of a definition can reference an earlier definition from the same scope","location":null,"status":"passed","title":"the body of a definition can reference an earlier definition from the same scope"},{"ancestorTitles":["cdl","let"],"failureMessages":[],"fullName":"cdl let the body of a definition cannot reference a latter definition from the same scope","location":null,"status":"passed","title":"the body of a definition cannot reference a latter definition from the same scope"},{"ancestorTitles":["cdl","let"],"failureMessages":[],"fullName":"cdl let the body of a definition cannot reference itself","location":null,"status":"passed","title":"the body of a definition cannot reference itself"},{"ancestorTitles":["cdl","let"],"failureMessages":[],"fullName":"cdl let uses lexical scoping (and not dynamic scoping)","location":null,"status":"passed","title":"uses lexical scoping (and not dynamic scoping)"},{"ancestorTitles":["cdl","let"],"failureMessages":[],"fullName":"cdl let definitions go out of scope","location":null,"status":"passed","title":"definitions go out of scope"},{"ancestorTitles":["cdl","arrays"],"failureMessages":[],"fullName":"cdl arrays array literals are specified via the enclosing brackets notation ([])","location":null,"status":"passed","title":"array literals are specified via the enclosing brackets notation ([])"},{"ancestorTitles":["cdl","arrays"],"failureMessages":[],"fullName":"cdl arrays individual elements of an array can be accessed via the [<index>] notation","location":null,"status":"passed","title":"individual elements of an array can be accessed via the [<index>] notation"},{"ancestorTitles":["cdl","arrays"],"failureMessages":[],"fullName":"cdl arrays the <index> value at the [<index>] notation can be a computed value","location":null,"status":"passed","title":"the <index> value at the [<index>] notation can be a computed value"},{"ancestorTitles":["cdl","objects","literals"],"failureMessages":[],"fullName":"cdl objects literals are specified via JSON format","location":null,"status":"passed","title":"are specified via JSON format"},{"ancestorTitles":["cdl","objects","literals"],"failureMessages":[],"fullName":"cdl objects literals supports computed attributes names via the [<expression>]: <value> notation","location":null,"status":"passed","title":"supports computed attributes names via the [<expression>]: <value> notation"},{"ancestorTitles":["cdl","objects","attributes"],"failureMessages":[],"fullName":"cdl objects attributes can be accessed via the .<ident> notation","location":null,"status":"passed","title":"can be accessed via the .<ident> notation"},{"ancestorTitles":["cdl","objects","attributes"],"failureMessages":[],"fullName":"cdl objects attributes can be accessed via the [<name>] notation","location":null,"status":"passed","title":"can be accessed via the [<name>] notation"},{"ancestorTitles":["cdl","objects","attributes"],"failureMessages":[],"fullName":"cdl objects attributes supports chains of attribute accesses mixing the .<ident> and the [<name>] notations","location":null,"status":"passed","title":"supports chains of attribute accesses mixing the .<ident> and the [<name>] notations"},{"ancestorTitles":["cdl","objects","attributes"],"failureMessages":[],"fullName":"cdl objects attributes supports chains of calls to nested attributes which are lambda expressions","location":null,"status":"passed","title":"supports chains of calls to nested attributes which are lambda expressions"},{"ancestorTitles":["cdl","objects","attributes"],"failureMessages":[],"fullName":"cdl objects attributes the <name> value at the [<name>] notation can be a computed value","location":null,"status":"passed","title":"the <name> value at the [<name>] notation can be a computed value"},{"ancestorTitles":["cdl","spread operator in objects"],"failureMessages":[],"fullName":"cdl spread operator in objects shallow copies an object into an object literal","location":null,"status":"passed","title":"shallow copies an object into an object literal"},{"ancestorTitles":["cdl","spread operator in objects"],"failureMessages":[],"fullName":"cdl spread operator in objects can be combined with hard-coded (literal) attributes","location":null,"status":"passed","title":"can be combined with hard-coded (literal) attributes"},{"ancestorTitles":["cdl","spread operator in objects"],"failureMessages":[],"fullName":"cdl spread operator in objects can be used multiple times inside a single object literal","location":null,"status":"passed","title":"can be used multiple times inside a single object literal"},{"ancestorTitles":["cdl","spread operator in objects"],"failureMessages":[],"fullName":"cdl spread operator in objects overrides attributes to its left","location":null,"status":"passed","title":"overrides attributes to its left"},{"ancestorTitles":["cdl","spread operator in objects"],"failureMessages":[],"fullName":"cdl spread operator in objects overridden by attributes to its right","location":null,"status":"passed","title":"overridden by attributes to its right"},{"ancestorTitles":["cdl","spread operator in objects"],"failureMessages":[],"fullName":"cdl spread operator in objects can be mixed with computed attribute names","location":null,"status":"passed","title":"can be mixed with computed attribute names"},{"ancestorTitles":["cdl","spread operator in objects"],"failureMessages":[],"fullName":"cdl spread operator in objects errors if applied to a non-object value","location":null,"status":"passed","title":"errors if applied to a non-object value"},{"ancestorTitles":["cdl","spread operator in arrays"],"failureMessages":[],"fullName":"cdl spread operator in arrays shallow copies an array into an array literal","location":null,"status":"passed","title":"shallow copies an array into an array literal"},{"ancestorTitles":["cdl","spread operator in arrays"],"failureMessages":[],"fullName":"cdl spread operator in arrays can be mixed with array elements","location":null,"status":"passed","title":"can be mixed with array elements"},{"ancestorTitles":["cdl","spread operator in arrays"],"failureMessages":[],"fullName":"cdl spread operator in arrays can be used multiple times inside an array literal","location":null,"status":"passed","title":"can be used multiple times inside an array literal"},{"ancestorTitles":["cdl","spread operator in arrays"],"failureMessages":[],"fullName":"cdl spread operator in arrays errors if applied to a non-array value","location":null,"status":"passed","title":"errors if applied to a non-array value"},{"ancestorTitles":["cdl","if"],"failureMessages":[],"fullName":"cdl if returns the value of the first branch if the condition is true","location":null,"status":"passed","title":"returns the value of the first branch if the condition is true"},{"ancestorTitles":["cdl","if"],"failureMessages":[],"fullName":"cdl if evaluates the first branch only if the condition is true","location":null,"status":"passed","title":"evaluates the first branch only if the condition is true"},{"ancestorTitles":["cdl","if"],"failureMessages":[],"fullName":"cdl if returns the value of the second branch if the condition is false","location":null,"status":"passed","title":"returns the value of the second branch if the condition is false"},{"ancestorTitles":["cdl","if"],"failureMessages":[],"fullName":"cdl if evaluates the second branch only if the condition is false","location":null,"status":"passed","title":"evaluates the second branch only if the condition is false"},{"ancestorTitles":["cdl","if"],"failureMessages":[],"fullName":"cdl if yells if conditions is not boolean","location":null,"status":"passed","title":"yells if conditions is not boolean"},{"ancestorTitles":["cdl","lambda expressions"],"failureMessages":[],"fullName":"cdl lambda expressions binds the value of the actual arg to the formal arg","location":null,"status":"passed","title":"binds the value of the actual arg to the formal arg"},{"ancestorTitles":["cdl","lambda expressions"],"failureMessages":[],"fullName":"cdl lambda expressions can be stored in a variable","location":null,"status":"passed","title":"can be stored in a variable"},{"ancestorTitles":["cdl","lambda expressions"],"failureMessages":[],"fullName":"cdl lambda expressions can have no args","location":null,"status":"passed","title":"can have no args"},{"ancestorTitles":["cdl","lambda expressions"],"failureMessages":[],"fullName":"cdl lambda expressions error on arg list mismatch","location":null,"status":"passed","title":"error on arg list mismatch"},{"ancestorTitles":["cdl","lambda expressions"],"failureMessages":[],"fullName":"cdl lambda expressions can be recursive","location":null,"status":"passed","title":"can be recursive"},{"ancestorTitles":["cdl","lambda expressions"],"failureMessages":[],"fullName":"cdl lambda expressions can access definitions from the enclosing scope","location":null,"status":"passed","title":"can access definitions from the enclosing scope"},{"ancestorTitles":["cdl","lambda expressions"],"failureMessages":[],"fullName":"cdl lambda expressions expression trace on error","location":null,"status":"passed","title":"expression trace on error"},{"ancestorTitles":["cdl","lambda expressions"],"failureMessages":[],"fullName":"cdl lambda expressions only lexical scope is considered when looking up a definition","location":null,"status":"passed","title":"only lexical scope is considered when looking up a definition"},{"ancestorTitles":["cdl","lambda expressions"],"failureMessages":[],"fullName":"cdl lambda expressions can return another lambda expression (a-la currying)","location":null,"status":"passed","title":"can return another lambda expression (a-la currying)"},{"ancestorTitles":["cdl","sink"],"failureMessages":[],"fullName":"cdl sink specified via the \"sink\" literal","location":null,"status":"passed","title":"specified via the \"sink\" literal"},{"ancestorTitles":["cdl","sink"],"failureMessages":[],"fullName":"cdl sink access to non-existing attribute of an object evalutes to a sink","location":null,"status":"passed","title":"access to non-existing attribute of an object evalutes to a sink"},{"ancestorTitles":["cdl","sink"],"failureMessages":[],"fullName":"cdl sink an expression involving a sink evaluates to sink","location":null,"status":"passed","title":"an expression involving a sink evaluates to sink"},{"ancestorTitles":["cdl","sink"],"failureMessages":[],"fullName":"cdl sink an array can hold a sink without becoming a sink itself","location":null,"status":"passed","title":"an array can hold a sink without becoming a sink itself"},{"ancestorTitles":["cdl","sink"],"failureMessages":[],"fullName":"cdl sink an object can hold a sink without becoming a sink itself","location":null,"status":"passed","title":"an object can hold a sink without becoming a sink itself"},{"ancestorTitles":["cdl","sink"],"failureMessages":[],"fullName":"cdl sink an if() expression an have a sink positive/negative branch without becoming a sink itself","location":null,"status":"passed","title":"an if() expression an have a sink positive/negative branch without becoming a sink itself"},{"ancestorTitles":["cdl","sink"],"failureMessages":[],"fullName":"cdl sink an if() expression becomes a sink itself if the branch dictated by the condition evaluates to sink","location":null,"status":"passed","title":"an if() expression becomes a sink itself if the branch dictated by the condition evaluates to sink"},{"ancestorTitles":["cdl","sink"],"failureMessages":[],"fullName":"cdl sink an if() expression becomes a sink itself if the the condition expression evaluates to sink","location":null,"status":"passed","title":"an if() expression becomes a sink itself if the the condition expression evaluates to sink"},{"ancestorTitles":["cdl","sink"],"failureMessages":[],"fullName":"cdl sink an && expression with sinks","location":null,"status":"passed","title":"an && expression with sinks"},{"ancestorTitles":["cdl","sink"],"failureMessages":[],"fullName":"cdl sink an || expression with sinks","location":null,"status":"passed","title":"an || expression with sinks"},{"ancestorTitles":["cdl","sink"],"failureMessages":[],"fullName":"cdl sink access to an attribute of a sink evaluates to sink","location":null,"status":"passed","title":"access to an attribute of a sink evaluates to sink"},{"ancestorTitles":["cdl","sink"],"failureMessages":[],"fullName":"cdl sink calling a sink evaluates to sink","location":null,"status":"passed","title":"calling a sink evaluates to sink"},{"ancestorTitles":["cdl","sink"],"failureMessages":[],"fullName":"cdl sink a sink compared with itself evaluates to true","location":null,"status":"passed","title":"a sink compared with itself evaluates to true"},{"ancestorTitles":["cdl","sink"],"failureMessages":[],"fullName":"cdl sink a sink compared with other types evaluates to false","location":null,"status":"passed","title":"a sink compared with other types evaluates to false"},{"ancestorTitles":["cdl","sink"],"failureMessages":[],"fullName":"cdl sink errors when a sink is ordered with other types","location":null,"status":"passed","title":"errors when a sink is ordered with other types"},{"ancestorTitles":["cdl","sink"],"failureMessages":[],"fullName":"cdl sink the ?? operator evaluates to its right-hand-side if its left-hand-side is a sink","location":null,"status":"passed","title":"the ?? operator evaluates to its right-hand-side if its left-hand-side is a sink"},{"ancestorTitles":["cdl","sink"],"failureMessages":[],"fullName":"cdl sink the ?? operator evaluates to its left-hand-side if it is a non-sink","location":null,"status":"passed","title":"the ?? operator evaluates to its left-hand-side if it is a non-sink"},{"ancestorTitles":["cdl","sink"],"failureMessages":[],"fullName":"cdl sink the .where attribure of the result holds the source code of the sink","location":null,"status":"passed","title":"the .where attribure of the result holds the source code of the sink"},{"ancestorTitles":["cdl","sink"],"failureMessages":[],"fullName":"cdl sink the .message attribure of the result provides a human readable summary","location":null,"status":"passed","title":"the .message attribure of the result provides a human readable summary"},{"ancestorTitles":["cdl","sink!"],"failureMessages":[],"fullName":"cdl sink! captures the expression trace at runtime","location":null,"status":"passed","title":"captures the expression trace at runtime"},{"ancestorTitles":["cdl","sink!!"],"failureMessages":[],"fullName":"cdl sink!! captures the expression trace and the symbol-table at runtime","location":null,"status":"passed","title":"captures the expression trace and the symbol-table at runtime"},{"ancestorTitles":["cdl","array methods"],"failureMessages":[],"fullName":"cdl array methods concat","location":null,"status":"passed","title":"concat"},{"ancestorTitles":["cdl","array methods"],"failureMessages":[],"fullName":"cdl array methods every","location":null,"status":"passed","title":"every"},{"ancestorTitles":["cdl","array methods"],"failureMessages":[],"fullName":"cdl array methods filter","location":null,"status":"passed","title":"filter"},{"ancestorTitles":["cdl","array methods"],"failureMessages":[],"fullName":"cdl array methods find","location":null,"status":"passed","title":"find"},{"ancestorTitles":["cdl","array methods"],"failureMessages":[],"fullName":"cdl array methods find returns sink if no matching element exists","location":null,"status":"passed","title":"find returns sink if no matching element exists"},{"ancestorTitles":["cdl","array methods"],"failureMessages":[],"fullName":"cdl array methods findIndex","location":null,"status":"passed","title":"findIndex"},{"ancestorTitles":["cdl","array methods"],"failureMessages":[],"fullName":"cdl array methods findIndex returns -1 if no matching element exists","location":null,"status":"passed","title":"findIndex returns -1 if no matching element exists"},{"ancestorTitles":["cdl","array methods"],"failureMessages":[],"fullName":"cdl array methods flatMap","location":null,"status":"passed","title":"flatMap"},{"ancestorTitles":["cdl","array methods"],"failureMessages":[],"fullName":"cdl array methods map","location":null,"status":"passed","title":"map"},{"ancestorTitles":["cdl","array methods"],"failureMessages":[],"fullName":"cdl array methods reduce","location":null,"status":"passed","title":"reduce"},{"ancestorTitles":["cdl","array methods"],"failureMessages":[],"fullName":"cdl array methods reduceRight","location":null,"status":"passed","title":"reduceRight"},{"ancestorTitles":["cdl","array methods"],"failureMessages":[],"fullName":"cdl array methods some","location":null,"status":"passed","title":"some"},{"ancestorTitles":["cdl","Object.keys()"],"failureMessages":[],"fullName":"cdl Object.keys() returns names of all attributes of the given object","location":null,"status":"passed","title":"returns names of all attributes of the given object"},{"ancestorTitles":["cdl","Object.keys()"],"failureMessages":[],"fullName":"cdl Object.keys() fails if applied to a non-object value","location":null,"status":"passed","title":"fails if applied to a non-object value"},{"ancestorTitles":["cdl","Object.entries()"],"failureMessages":[],"fullName":"cdl Object.entries() returns a [key, value] pair for each attribute of the given object","location":null,"status":"passed","title":"returns a [key, value] pair for each attribute of the given object"},{"ancestorTitles":["cdl","Object.entries()"],"failureMessages":[],"fullName":"cdl Object.entries() fails if applied to a non-object value","location":null,"status":"passed","title":"fails if applied to a non-object value"},{"ancestorTitles":["cdl","Object.fromEntries()"],"failureMessages":[],"fullName":"cdl Object.fromEntries() constructs an object from a list of [key, value] pairs describing its attributes","location":null,"status":"passed","title":"constructs an object from a list of [key, value] pairs describing its attributes"},{"ancestorTitles":["cdl","Object.fromEntries()"],"failureMessages":[],"fullName":"cdl Object.fromEntries() fails if applied to a non-array value","location":null,"status":"passed","title":"fails if applied to a non-array value"},{"ancestorTitles":["cdl","Object.fromEntries()"],"failureMessages":[],"fullName":"cdl Object.fromEntries() the input array must be an array of pairs","location":null,"status":"passed","title":"the input array must be an array of pairs"},{"ancestorTitles":["cdl","Object.fromEntries()"],"failureMessages":[],"fullName":"cdl Object.fromEntries() the first element in each pair must be a string","location":null,"status":"passed","title":"the first element in each pair must be a string"},{"ancestorTitles":["cdl","comments"],"failureMessages":[],"fullName":"cdl comments anything from '//' up to the end-of-line is ignored","location":null,"status":"passed","title":"anything from '//' up to the end-of-line is ignored"},{"ancestorTitles":["cdl","comments"],"failureMessages":[],"fullName":"cdl comments allow consecutive lines which are all commented out","location":null,"status":"passed","title":"allow consecutive lines which are all commented out"},{"ancestorTitles":["cdl","comments"],"failureMessages":[],"fullName":"cdl comments a comment inside a comment has no effect","location":null,"status":"passed","title":"a comment inside a comment has no effect"},{"ancestorTitles":["cdl","evaluation stack"],"failureMessages":[],"fullName":"cdl evaluation stack max recursion depth","location":null,"status":"passed","title":"max recursion depth"},{"ancestorTitles":["cdl"],"failureMessages":[],"fullName":"cdl left associativity of +/-","location":null,"status":"todo","title":"left associativity of +/-"},{"ancestorTitles":["cdl"],"failureMessages":[],"fullName":"cdl comparison of arrays","location":null,"status":"todo","title":"comparison of arrays"},{"ancestorTitles":["cdl"],"failureMessages":[],"fullName":"cdl comparison of lambdas?","location":null,"status":"todo","title":"comparison of lambdas?"},{"ancestorTitles":["cdl"],"failureMessages":[],"fullName":"cdl deep equality of objects","location":null,"status":"todo","title":"deep equality of objects"},{"ancestorTitles":["cdl"],"failureMessages":[],"fullName":"cdl \"abcdef\"[1] == \"b\"","location":null,"status":"todo","title":"\"abcdef\"[1] == \"b\""},{"ancestorTitles":["cdl"],"failureMessages":[],"fullName":"cdl an object literal cannot have a repeated attribute name that","location":null,"status":"todo","title":"an object literal cannot have a repeated attribute name that"},{"ancestorTitles":["cdl"],"failureMessages":[],"fullName":"cdl quoting of a ticks inside a string","location":null,"status":"todo","title":"quoting of a ticks inside a string"},{"ancestorTitles":["cdl"],"failureMessages":[],"fullName":"cdl number in scientific notation","location":null,"status":"todo","title":"number in scientific notation"},{"ancestorTitles":["cdl"],"failureMessages":[],"fullName":"cdl number methods","location":null,"status":"todo","title":"number methods"}],"endTime":1662575826499,"message":"","name":"/home/imaman/code/imaman/bigband/modules/cdl/dist/tests/cdl.spec.js","startTime":1662575825000,"status":"passed","summary":""}],"wasInterrupted":false}
1
+ {"numFailedTestSuites":0,"numFailedTests":0,"numPassedTestSuites":3,"numPassedTests":204,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":20,"numTotalTestSuites":3,"numTotalTests":224,"openHandles":[],"snapshot":{"added":0,"didUpdate":false,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0},"startTime":1662711377947,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":["parser"],"failureMessages":[],"fullName":"parser show()","location":null,"status":"passed","title":"show()"},{"ancestorTitles":["parser"],"failureMessages":[],"fullName":"parser syntax errors","location":null,"status":"passed","title":"syntax errors"}],"endTime":1662711379159,"message":"","name":"/home/imaman/code/imaman/bigband/modules/septima-lang/dist/tests/parser.spec.js","startTime":1662711378444,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value arithmetics","location":null,"status":"passed","title":"arithmetics"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value comparisons of numbers","location":null,"status":"passed","title":"comparisons of numbers"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value booleans","location":null,"status":"passed","title":"booleans"},{"ancestorTitles":["value","boolean operators"],"failureMessages":[],"fullName":"value boolean operators or","location":null,"status":"passed","title":"or"},{"ancestorTitles":["value","boolean operators"],"failureMessages":[],"fullName":"value boolean operators and","location":null,"status":"passed","title":"and"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value comparisons of booleans","location":null,"status":"passed","title":"comparisons of booleans"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value strings","location":null,"status":"passed","title":"strings"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value comparisons of strings","location":null,"status":"passed","title":"comparisons of strings"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value arrays","location":null,"status":"passed","title":"arrays"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value objects","location":null,"status":"passed","title":"objects"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value yells if access() is called with value which is neither string or num","location":null,"status":"passed","title":"yells if access() is called with value which is neither string or num"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value json","location":null,"status":"passed","title":"json"},{"ancestorTitles":["value","ifElse"],"failureMessages":[],"fullName":"value ifElse when applied to true evaluates the positive branch","location":null,"status":"passed","title":"when applied to true evaluates the positive branch"},{"ancestorTitles":["value","ifElse"],"failureMessages":[],"fullName":"value ifElse when applied to false evaluates the positive branch","location":null,"status":"passed","title":"when applied to false evaluates the positive branch"},{"ancestorTitles":["value","ifElse"],"failureMessages":[],"fullName":"value ifElse errors if applied to a non-boolean","location":null,"status":"passed","title":"errors if applied to a non-boolean"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink exported as undefined","location":null,"status":"passed","title":"exported as undefined"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink arithmetic operations on sink evaluate to sink","location":null,"status":"passed","title":"arithmetic operations on sink evaluate to sink"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink boolean operations on sink evaluate to sink","location":null,"status":"passed","title":"boolean operations on sink evaluate to sink"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink when sink is the right-hand-side of a boolean expression, the result is sink only if the left-hand-side dictates so","location":null,"status":"passed","title":"when sink is the right-hand-side of a boolean expression, the result is sink only if the left-hand-side dictates so"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink ifElse with sink condition evaluates to sink","location":null,"status":"passed","title":"ifElse with sink condition evaluates to sink"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink ifElse with sink positive expression evaluates to sink only if the condition is true","location":null,"status":"passed","title":"ifElse with sink positive expression evaluates to sink only if the condition is true"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink ifElse with sink negative expression evaluates to sink only if the condition is false","location":null,"status":"passed","title":"ifElse with sink negative expression evaluates to sink only if the condition is false"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink access to an attribute of a sink evaluates to sink","location":null,"status":"passed","title":"access to an attribute of a sink evaluates to sink"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink calling a sink evaluates to sink","location":null,"status":"passed","title":"calling a sink evaluates to sink"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink applying .keys() to sink evaluates to sink","location":null,"status":"passed","title":"applying .keys() to sink evaluates to sink"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink applying .entries() to sink evaluates to sink","location":null,"status":"passed","title":"applying .entries() to sink evaluates to sink"},{"ancestorTitles":["value","sink"],"failureMessages":[],"fullName":"value sink applying .fromEntries() to sink evaluates to sink","location":null,"status":"passed","title":"applying .fromEntries() to sink evaluates to sink"},{"ancestorTitles":["value","sink","unsink()"],"failureMessages":[],"fullName":"value sink unsink() when applied to a non-sink value evaluates to it","location":null,"status":"passed","title":"when applied to a non-sink value evaluates to it"},{"ancestorTitles":["value","sink","unsink()"],"failureMessages":[],"fullName":"value sink unsink() when applied to a sink value evaluates to its argument","location":null,"status":"passed","title":"when applied to a sink value evaluates to its argument"},{"ancestorTitles":["value","sink","comparisons"],"failureMessages":[],"fullName":"value sink comparisons comparing a sink with itself evaluates to true","location":null,"status":"passed","title":"comparing a sink with itself evaluates to true"},{"ancestorTitles":["value","sink","comparisons"],"failureMessages":[],"fullName":"value sink comparisons comparing a sink with other types evaluates to false","location":null,"status":"passed","title":"comparing a sink with other types evaluates to false"},{"ancestorTitles":["value","sink","comparisons"],"failureMessages":[],"fullName":"value sink comparisons erros when trying to order a sink with a non-sink","location":null,"status":"passed","title":"erros when trying to order a sink with a non-sink"},{"ancestorTitles":["value","type erros"],"failureMessages":[],"fullName":"value type erros emits erros when numeric operations are applied to a boolean (either lhs or rhs)","location":null,"status":"passed","title":"emits erros when numeric operations are applied to a boolean (either lhs or rhs)"},{"ancestorTitles":["value","type erros"],"failureMessages":[],"fullName":"value type erros emits erros when boolean operations are applied to a number (either lhs or rhs)","location":null,"status":"passed","title":"emits erros when boolean operations are applied to a number (either lhs or rhs)"},{"ancestorTitles":["value","foreign code calls"],"failureMessages":[],"fullName":"value foreign code calls invokes the given function","location":null,"status":"passed","title":"invokes the given function"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios .length","location":null,"status":"passed","title":".length"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .at() method","location":null,"status":"passed","title":"provides the .at() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .at() method","location":null,"status":"passed","title":"provides the .at() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .charAt() method","location":null,"status":"passed","title":"provides the .charAt() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .concat() method","location":null,"status":"passed","title":"provides the .concat() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .endsWith() method","location":null,"status":"passed","title":"provides the .endsWith() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .endsWith() method","location":null,"status":"passed","title":"provides the .endsWith() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .includes() method","location":null,"status":"passed","title":"provides the .includes() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .includes() method","location":null,"status":"passed","title":"provides the .includes() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .indexOf() method","location":null,"status":"passed","title":"provides the .indexOf() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .lastIndexOf() method","location":null,"status":"passed","title":"provides the .lastIndexOf() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .match() method","location":null,"status":"passed","title":"provides the .match() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .matchAll() method","location":null,"status":"passed","title":"provides the .matchAll() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .padEnd() method","location":null,"status":"passed","title":"provides the .padEnd() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .padStart() method","location":null,"status":"passed","title":"provides the .padStart() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .repeat() method","location":null,"status":"passed","title":"provides the .repeat() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .replace() method","location":null,"status":"passed","title":"provides the .replace() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .replaceAll() method","location":null,"status":"passed","title":"provides the .replaceAll() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .search() method","location":null,"status":"passed","title":"provides the .search() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .slice() method","location":null,"status":"passed","title":"provides the .slice() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .split() method","location":null,"status":"passed","title":"provides the .split() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .startsWith() method","location":null,"status":"passed","title":"provides the .startsWith() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .startsWith() method","location":null,"status":"passed","title":"provides the .startsWith() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .substring() method","location":null,"status":"passed","title":"provides the .substring() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .substring() method","location":null,"status":"passed","title":"provides the .substring() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .toLowerCase() method","location":null,"status":"passed","title":"provides the .toLowerCase() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .toUpperCase() method","location":null,"status":"passed","title":"provides the .toUpperCase() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .trim() method","location":null,"status":"passed","title":"provides the .trim() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .trimEnd() method","location":null,"status":"passed","title":"provides the .trimEnd() method"},{"ancestorTitles":["value","string operatios"],"failureMessages":[],"fullName":"value string operatios provides the .trimStart() method","location":null,"status":"passed","title":"provides the .trimStart() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations .length","location":null,"status":"passed","title":".length"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .at() method","location":null,"status":"passed","title":"provides the .at() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .at() method","location":null,"status":"passed","title":"provides the .at() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .concat() method","location":null,"status":"passed","title":"provides the .concat() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .entries() method","location":null,"status":"passed","title":"provides the .entries() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .includes() method","location":null,"status":"passed","title":"provides the .includes() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .includes() method","location":null,"status":"passed","title":"provides the .includes() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .indexOf() method","location":null,"status":"passed","title":"provides the .indexOf() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .join() method","location":null,"status":"passed","title":"provides the .join() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .lastIndexOf() method","location":null,"status":"passed","title":"provides the .lastIndexOf() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .lastIndexOf() method","location":null,"status":"passed","title":"provides the .lastIndexOf() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .reverse() method","location":null,"status":"passed","title":"provides the .reverse() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .slice() method","location":null,"status":"passed","title":"provides the .slice() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .slice() method","location":null,"status":"passed","title":"provides the .slice() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations provides the .slice() method","location":null,"status":"passed","title":"provides the .slice() method"},{"ancestorTitles":["value","array operations"],"failureMessages":[],"fullName":"value array operations .flat() flattens","location":null,"status":"passed","title":".flat() flattens"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value array.sort()","location":null,"status":"todo","title":"array.sort()"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value what happens when we get an undefined from a foreign call (like Array.get())","location":null,"status":"todo","title":"what happens when we get an undefined from a foreign call (like Array.get())"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value access to non-existing string method (a sad path test)","location":null,"status":"todo","title":"access to non-existing string method (a sad path test)"},{"ancestorTitles":["value"],"failureMessages":[],"fullName":"value access to non-existing array method (a sad path test)","location":null,"status":"todo","title":"access to non-existing array method (a sad path test)"}],"endTime":1662711379437,"message":"","name":"/home/imaman/code/imaman/bigband/modules/septima-lang/dist/tests/value.spec.js","startTime":1662711378424,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima basics","location":null,"status":"passed","title":"basics"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima an optional return keyword can be placed before the result","location":null,"status":"passed","title":"an optional return keyword can be placed before the result"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima booleans","location":null,"status":"passed","title":"booleans"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima arithmetics","location":null,"status":"passed","title":"arithmetics"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima error message specifies the location in the file","location":null,"status":"passed","title":"error message specifies the location in the file"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima equality","location":null,"status":"passed","title":"equality"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima comparison","location":null,"status":"passed","title":"comparison"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima combined arithmetics and logical expressions","location":null,"status":"passed","title":"combined arithmetics and logical expressions"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima the rhs of a logical-or expression is evaluated only if lhs is false","location":null,"status":"passed","title":"the rhs of a logical-or expression is evaluated only if lhs is false"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima the rhs of a logical-and expression is evaluated only if lhs is true","location":null,"status":"passed","title":"the rhs of a logical-and expression is evaluated only if lhs is true"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima eats whitespace","location":null,"status":"passed","title":"eats whitespace"},{"ancestorTitles":["septima","unary expressions"],"failureMessages":[],"fullName":"septima unary expressions +","location":null,"status":"passed","title":"+"},{"ancestorTitles":["septima","unary expressions"],"failureMessages":[],"fullName":"septima unary expressions errors if + is applied to non-number","location":null,"status":"passed","title":"errors if + is applied to non-number"},{"ancestorTitles":["septima","unary expressions"],"failureMessages":[],"fullName":"septima unary expressions -","location":null,"status":"passed","title":"-"},{"ancestorTitles":["septima","strings"],"failureMessages":[],"fullName":"septima strings can be specified via the double-quotes notation","location":null,"status":"passed","title":"can be specified via the double-quotes notation"},{"ancestorTitles":["septima","strings"],"failureMessages":[],"fullName":"septima strings can be specified via the single-quotes notation","location":null,"status":"passed","title":"can be specified via the single-quotes notation"},{"ancestorTitles":["septima","strings"],"failureMessages":[],"fullName":"septima strings does not trim leading/trailing whitespace","location":null,"status":"passed","title":"does not trim leading/trailing whitespace"},{"ancestorTitles":["septima","strings"],"failureMessages":[],"fullName":"septima strings supports string methods","location":null,"status":"passed","title":"supports string methods"},{"ancestorTitles":["septima","strings"],"failureMessages":[],"fullName":"septima strings supports optional arguments of string methods","location":null,"status":"passed","title":"supports optional arguments of string methods"},{"ancestorTitles":["septima","let"],"failureMessages":[],"fullName":"septima let binds values to variables","location":null,"status":"passed","title":"binds values to variables"},{"ancestorTitles":["septima","let"],"failureMessages":[],"fullName":"septima let do not need the trailing semicolon","location":null,"status":"passed","title":"do not need the trailing semicolon"},{"ancestorTitles":["septima","let"],"failureMessages":[],"fullName":"septima let fails if the variable was not defined","location":null,"status":"passed","title":"fails if the variable was not defined"},{"ancestorTitles":["septima","let"],"failureMessages":[],"fullName":"septima let parenthsized expression can have let defintions","location":null,"status":"passed","title":"parenthsized expression can have let defintions"},{"ancestorTitles":["septima","let"],"failureMessages":[],"fullName":"septima let inner expressions can access variables from enclosing scopes","location":null,"status":"passed","title":"inner expressions can access variables from enclosing scopes"},{"ancestorTitles":["septima","let"],"failureMessages":[],"fullName":"septima let definitions from inner scopes overshadow definitions from outer scopes","location":null,"status":"passed","title":"definitions from inner scopes overshadow definitions from outer scopes"},{"ancestorTitles":["septima","let"],"failureMessages":[],"fullName":"septima let the body of a definition can reference an earlier definition from the same scope","location":null,"status":"passed","title":"the body of a definition can reference an earlier definition from the same scope"},{"ancestorTitles":["septima","let"],"failureMessages":[],"fullName":"septima let the body of a definition cannot reference a latter definition from the same scope","location":null,"status":"passed","title":"the body of a definition cannot reference a latter definition from the same scope"},{"ancestorTitles":["septima","let"],"failureMessages":[],"fullName":"septima let the body of a definition cannot reference itself","location":null,"status":"passed","title":"the body of a definition cannot reference itself"},{"ancestorTitles":["septima","let"],"failureMessages":[],"fullName":"septima let uses lexical scoping (and not dynamic scoping)","location":null,"status":"passed","title":"uses lexical scoping (and not dynamic scoping)"},{"ancestorTitles":["septima","let"],"failureMessages":[],"fullName":"septima let definitions go out of scope","location":null,"status":"passed","title":"definitions go out of scope"},{"ancestorTitles":["septima","arrays"],"failureMessages":[],"fullName":"septima arrays array literals are specified via the enclosing brackets notation ([])","location":null,"status":"passed","title":"array literals are specified via the enclosing brackets notation ([])"},{"ancestorTitles":["septima","arrays"],"failureMessages":[],"fullName":"septima arrays individual elements of an array can be accessed via the [<index>] notation","location":null,"status":"passed","title":"individual elements of an array can be accessed via the [<index>] notation"},{"ancestorTitles":["septima","arrays"],"failureMessages":[],"fullName":"septima arrays the <index> value at the [<index>] notation can be a computed value","location":null,"status":"passed","title":"the <index> value at the [<index>] notation can be a computed value"},{"ancestorTitles":["septima","objects","literals"],"failureMessages":[],"fullName":"septima objects literals are specified via JSON format","location":null,"status":"passed","title":"are specified via JSON format"},{"ancestorTitles":["septima","objects","literals"],"failureMessages":[],"fullName":"septima objects literals allow a dangling comma","location":null,"status":"passed","title":"allow a dangling comma"},{"ancestorTitles":["septima","objects","literals"],"failureMessages":[],"fullName":"septima objects literals a dangling comma in an empty object is not allowed","location":null,"status":"passed","title":"a dangling comma in an empty object is not allowed"},{"ancestorTitles":["septima","objects","literals"],"failureMessages":[],"fullName":"septima objects literals supports computed attributes names via the [<expression>]: <value> notation","location":null,"status":"passed","title":"supports computed attributes names via the [<expression>]: <value> notation"},{"ancestorTitles":["septima","objects","attributes"],"failureMessages":[],"fullName":"septima objects attributes can be accessed via the .<ident> notation","location":null,"status":"passed","title":"can be accessed via the .<ident> notation"},{"ancestorTitles":["septima","objects","attributes"],"failureMessages":[],"fullName":"septima objects attributes can be accessed via the [<name>] notation","location":null,"status":"passed","title":"can be accessed via the [<name>] notation"},{"ancestorTitles":["septima","objects","attributes"],"failureMessages":[],"fullName":"septima objects attributes supports chains of attribute accesses mixing the .<ident> and the [<name>] notations","location":null,"status":"passed","title":"supports chains of attribute accesses mixing the .<ident> and the [<name>] notations"},{"ancestorTitles":["septima","objects","attributes"],"failureMessages":[],"fullName":"septima objects attributes supports chains of calls to nested attributes which are lambda expressions","location":null,"status":"passed","title":"supports chains of calls to nested attributes which are lambda expressions"},{"ancestorTitles":["septima","objects","attributes"],"failureMessages":[],"fullName":"septima objects attributes the <name> value at the [<name>] notation can be a computed value","location":null,"status":"passed","title":"the <name> value at the [<name>] notation can be a computed value"},{"ancestorTitles":["septima","spread operator in objects"],"failureMessages":[],"fullName":"septima spread operator in objects shallow copies an object into an object literal","location":null,"status":"passed","title":"shallow copies an object into an object literal"},{"ancestorTitles":["septima","spread operator in objects"],"failureMessages":[],"fullName":"septima spread operator in objects can be combined with hard-coded (literal) attributes","location":null,"status":"passed","title":"can be combined with hard-coded (literal) attributes"},{"ancestorTitles":["septima","spread operator in objects"],"failureMessages":[],"fullName":"septima spread operator in objects can be used multiple times inside a single object literal","location":null,"status":"passed","title":"can be used multiple times inside a single object literal"},{"ancestorTitles":["septima","spread operator in objects"],"failureMessages":[],"fullName":"septima spread operator in objects overrides attributes to its left","location":null,"status":"passed","title":"overrides attributes to its left"},{"ancestorTitles":["septima","spread operator in objects"],"failureMessages":[],"fullName":"septima spread operator in objects overridden by attributes to its right","location":null,"status":"passed","title":"overridden by attributes to its right"},{"ancestorTitles":["septima","spread operator in objects"],"failureMessages":[],"fullName":"septima spread operator in objects can be mixed with computed attribute names","location":null,"status":"passed","title":"can be mixed with computed attribute names"},{"ancestorTitles":["septima","spread operator in objects"],"failureMessages":[],"fullName":"septima spread operator in objects errors if applied to a non-object value","location":null,"status":"passed","title":"errors if applied to a non-object value"},{"ancestorTitles":["septima","spread operator in arrays"],"failureMessages":[],"fullName":"septima spread operator in arrays shallow copies an array into an array literal","location":null,"status":"passed","title":"shallow copies an array into an array literal"},{"ancestorTitles":["septima","spread operator in arrays"],"failureMessages":[],"fullName":"septima spread operator in arrays can be mixed with array elements","location":null,"status":"passed","title":"can be mixed with array elements"},{"ancestorTitles":["septima","spread operator in arrays"],"failureMessages":[],"fullName":"septima spread operator in arrays can be used multiple times inside an array literal","location":null,"status":"passed","title":"can be used multiple times inside an array literal"},{"ancestorTitles":["septima","spread operator in arrays"],"failureMessages":[],"fullName":"septima spread operator in arrays errors if applied to a non-array value","location":null,"status":"passed","title":"errors if applied to a non-array value"},{"ancestorTitles":["septima","if"],"failureMessages":[],"fullName":"septima if returns the value of the first branch if the condition is true","location":null,"status":"passed","title":"returns the value of the first branch if the condition is true"},{"ancestorTitles":["septima","if"],"failureMessages":[],"fullName":"septima if evaluates the first branch only if the condition is true","location":null,"status":"passed","title":"evaluates the first branch only if the condition is true"},{"ancestorTitles":["septima","if"],"failureMessages":[],"fullName":"septima if returns the value of the second branch if the condition is false","location":null,"status":"passed","title":"returns the value of the second branch if the condition is false"},{"ancestorTitles":["septima","if"],"failureMessages":[],"fullName":"septima if evaluates the second branch only if the condition is false","location":null,"status":"passed","title":"evaluates the second branch only if the condition is false"},{"ancestorTitles":["septima","if"],"failureMessages":[],"fullName":"septima if yells if conditions is not boolean","location":null,"status":"passed","title":"yells if conditions is not boolean"},{"ancestorTitles":["septima","lambda expressions"],"failureMessages":[],"fullName":"septima lambda expressions binds the value of the actual arg to the formal arg","location":null,"status":"passed","title":"binds the value of the actual arg to the formal arg"},{"ancestorTitles":["septima","lambda expressions"],"failureMessages":[],"fullName":"septima lambda expressions can be stored in a variable","location":null,"status":"passed","title":"can be stored in a variable"},{"ancestorTitles":["septima","lambda expressions","arrow function notation"],"failureMessages":[],"fullName":"septima lambda expressions arrow function notation a single formal argument does not need to be surrounded with parenthesis","location":null,"status":"passed","title":"a single formal argument does not need to be surrounded with parenthesis"},{"ancestorTitles":["septima","lambda expressions","arrow function notation"],"failureMessages":[],"fullName":"septima lambda expressions arrow function notation (a) => <expression>","location":null,"status":"passed","title":"(a) => <expression>"},{"ancestorTitles":["septima","lambda expressions","arrow function notation"],"failureMessages":[],"fullName":"septima lambda expressions arrow function notation () => <expression>","location":null,"status":"passed","title":"() => <expression>"},{"ancestorTitles":["septima","lambda expressions","arrow function notation"],"failureMessages":[],"fullName":"septima lambda expressions arrow function notation (a,b) => <expression>","location":null,"status":"passed","title":"(a,b) => <expression>"},{"ancestorTitles":["septima","lambda expressions","arrow function notation"],"failureMessages":[],"fullName":"septima lambda expressions arrow function notation body of an arrow function can be { return <expression>}","location":null,"status":"passed","title":"body of an arrow function can be { return <expression>}"},{"ancestorTitles":["septima","lambda expressions","arrow function notation"],"failureMessages":[],"fullName":"septima lambda expressions arrow function notation body of an arrow function can include let definitions","location":null,"status":"passed","title":"body of an arrow function can include let definitions"},{"ancestorTitles":["septima","lambda expressions"],"failureMessages":[],"fullName":"septima lambda expressions can have no args","location":null,"status":"passed","title":"can have no args"},{"ancestorTitles":["septima","lambda expressions"],"failureMessages":[],"fullName":"septima lambda expressions error on arg list mismatch","location":null,"status":"passed","title":"error on arg list mismatch"},{"ancestorTitles":["septima","lambda expressions"],"failureMessages":[],"fullName":"septima lambda expressions can be recursive","location":null,"status":"passed","title":"can be recursive"},{"ancestorTitles":["septima","lambda expressions"],"failureMessages":[],"fullName":"septima lambda expressions can access definitions from the enclosing scope","location":null,"status":"passed","title":"can access definitions from the enclosing scope"},{"ancestorTitles":["septima","lambda expressions"],"failureMessages":[],"fullName":"septima lambda expressions expression trace on error","location":null,"status":"passed","title":"expression trace on error"},{"ancestorTitles":["septima","lambda expressions"],"failureMessages":[],"fullName":"septima lambda expressions only lexical scope is considered when looking up a definition","location":null,"status":"passed","title":"only lexical scope is considered when looking up a definition"},{"ancestorTitles":["septima","lambda expressions"],"failureMessages":[],"fullName":"septima lambda expressions can return another lambda expression (a-la currying)","location":null,"status":"passed","title":"can return another lambda expression (a-la currying)"},{"ancestorTitles":["septima","sink"],"failureMessages":[],"fullName":"septima sink specified via the \"sink\" literal","location":null,"status":"passed","title":"specified via the \"sink\" literal"},{"ancestorTitles":["septima","sink"],"failureMessages":[],"fullName":"septima sink access to non-existing attribute of an object evalutes to a sink","location":null,"status":"passed","title":"access to non-existing attribute of an object evalutes to a sink"},{"ancestorTitles":["septima","sink"],"failureMessages":[],"fullName":"septima sink an expression involving a sink evaluates to sink","location":null,"status":"passed","title":"an expression involving a sink evaluates to sink"},{"ancestorTitles":["septima","sink"],"failureMessages":[],"fullName":"septima sink an array can hold a sink without becoming a sink itself","location":null,"status":"passed","title":"an array can hold a sink without becoming a sink itself"},{"ancestorTitles":["septima","sink"],"failureMessages":[],"fullName":"septima sink an object can hold a sink without becoming a sink itself","location":null,"status":"passed","title":"an object can hold a sink without becoming a sink itself"},{"ancestorTitles":["septima","sink"],"failureMessages":[],"fullName":"septima sink an if() expression an have a sink positive/negative branch without becoming a sink itself","location":null,"status":"passed","title":"an if() expression an have a sink positive/negative branch without becoming a sink itself"},{"ancestorTitles":["septima","sink"],"failureMessages":[],"fullName":"septima sink an if() expression becomes a sink itself if the branch dictated by the condition evaluates to sink","location":null,"status":"passed","title":"an if() expression becomes a sink itself if the branch dictated by the condition evaluates to sink"},{"ancestorTitles":["septima","sink"],"failureMessages":[],"fullName":"septima sink an if() expression becomes a sink itself if the the condition expression evaluates to sink","location":null,"status":"passed","title":"an if() expression becomes a sink itself if the the condition expression evaluates to sink"},{"ancestorTitles":["septima","sink"],"failureMessages":[],"fullName":"septima sink an && expression with sinks","location":null,"status":"passed","title":"an && expression with sinks"},{"ancestorTitles":["septima","sink"],"failureMessages":[],"fullName":"septima sink an || expression with sinks","location":null,"status":"passed","title":"an || expression with sinks"},{"ancestorTitles":["septima","sink"],"failureMessages":[],"fullName":"septima sink access to an attribute of a sink evaluates to sink","location":null,"status":"passed","title":"access to an attribute of a sink evaluates to sink"},{"ancestorTitles":["septima","sink"],"failureMessages":[],"fullName":"septima sink calling a sink evaluates to sink","location":null,"status":"passed","title":"calling a sink evaluates to sink"},{"ancestorTitles":["septima","sink"],"failureMessages":[],"fullName":"septima sink a sink compared with itself evaluates to true","location":null,"status":"passed","title":"a sink compared with itself evaluates to true"},{"ancestorTitles":["septima","sink"],"failureMessages":[],"fullName":"septima sink a sink compared with other types evaluates to false","location":null,"status":"passed","title":"a sink compared with other types evaluates to false"},{"ancestorTitles":["septima","sink"],"failureMessages":[],"fullName":"septima sink errors when a sink is ordered with other types","location":null,"status":"passed","title":"errors when a sink is ordered with other types"},{"ancestorTitles":["septima","sink"],"failureMessages":[],"fullName":"septima sink the ?? operator evaluates to its right-hand-side if its left-hand-side is a sink","location":null,"status":"passed","title":"the ?? operator evaluates to its right-hand-side if its left-hand-side is a sink"},{"ancestorTitles":["septima","sink"],"failureMessages":[],"fullName":"septima sink the ?? operator evaluates to its left-hand-side if it is a non-sink","location":null,"status":"passed","title":"the ?? operator evaluates to its left-hand-side if it is a non-sink"},{"ancestorTitles":["septima","sink"],"failureMessages":[],"fullName":"septima sink the .where attribure of the result holds the source code of the sink","location":null,"status":"passed","title":"the .where attribure of the result holds the source code of the sink"},{"ancestorTitles":["septima","sink"],"failureMessages":[],"fullName":"septima sink the .message attribure of the result provides a human readable summary","location":null,"status":"passed","title":"the .message attribure of the result provides a human readable summary"},{"ancestorTitles":["septima","sink!"],"failureMessages":[],"fullName":"septima sink! captures the expression trace at runtime","location":null,"status":"passed","title":"captures the expression trace at runtime"},{"ancestorTitles":["septima","sink!!"],"failureMessages":[],"fullName":"septima sink!! captures the expression trace and the symbol-table at runtime","location":null,"status":"passed","title":"captures the expression trace and the symbol-table at runtime"},{"ancestorTitles":["septima","sink!!"],"failureMessages":[],"fullName":"septima sink!! can be used to recover values of definitions from a crash site","location":null,"status":"passed","title":"can be used to recover values of definitions from a crash site"},{"ancestorTitles":["septima","array methods"],"failureMessages":[],"fullName":"septima array methods concat","location":null,"status":"passed","title":"concat"},{"ancestorTitles":["septima","array methods"],"failureMessages":[],"fullName":"septima array methods every","location":null,"status":"passed","title":"every"},{"ancestorTitles":["septima","array methods"],"failureMessages":[],"fullName":"septima array methods filter","location":null,"status":"passed","title":"filter"},{"ancestorTitles":["septima","array methods"],"failureMessages":[],"fullName":"septima array methods find","location":null,"status":"passed","title":"find"},{"ancestorTitles":["septima","array methods"],"failureMessages":[],"fullName":"septima array methods find returns sink if no matching element exists","location":null,"status":"passed","title":"find returns sink if no matching element exists"},{"ancestorTitles":["septima","array methods"],"failureMessages":[],"fullName":"septima array methods findIndex","location":null,"status":"passed","title":"findIndex"},{"ancestorTitles":["septima","array methods"],"failureMessages":[],"fullName":"septima array methods findIndex returns -1 if no matching element exists","location":null,"status":"passed","title":"findIndex returns -1 if no matching element exists"},{"ancestorTitles":["septima","array methods"],"failureMessages":[],"fullName":"septima array methods flatMap","location":null,"status":"passed","title":"flatMap"},{"ancestorTitles":["septima","array methods"],"failureMessages":[],"fullName":"septima array methods map","location":null,"status":"passed","title":"map"},{"ancestorTitles":["septima","array methods"],"failureMessages":[],"fullName":"septima array methods reduce","location":null,"status":"passed","title":"reduce"},{"ancestorTitles":["septima","array methods"],"failureMessages":[],"fullName":"septima array methods reduceRight","location":null,"status":"passed","title":"reduceRight"},{"ancestorTitles":["septima","array methods"],"failureMessages":[],"fullName":"septima array methods some","location":null,"status":"passed","title":"some"},{"ancestorTitles":["septima","Object.keys()"],"failureMessages":[],"fullName":"septima Object.keys() returns names of all attributes of the given object","location":null,"status":"passed","title":"returns names of all attributes of the given object"},{"ancestorTitles":["septima","Object.keys()"],"failureMessages":[],"fullName":"septima Object.keys() fails if applied to a non-object value","location":null,"status":"passed","title":"fails if applied to a non-object value"},{"ancestorTitles":["septima","Object.entries()"],"failureMessages":[],"fullName":"septima Object.entries() returns a [key, value] pair for each attribute of the given object","location":null,"status":"passed","title":"returns a [key, value] pair for each attribute of the given object"},{"ancestorTitles":["septima","Object.entries()"],"failureMessages":[],"fullName":"septima Object.entries() fails if applied to a non-object value","location":null,"status":"passed","title":"fails if applied to a non-object value"},{"ancestorTitles":["septima","Object.fromEntries()"],"failureMessages":[],"fullName":"septima Object.fromEntries() constructs an object from a list of [key, value] pairs describing its attributes","location":null,"status":"passed","title":"constructs an object from a list of [key, value] pairs describing its attributes"},{"ancestorTitles":["septima","Object.fromEntries()"],"failureMessages":[],"fullName":"septima Object.fromEntries() fails if applied to a non-array value","location":null,"status":"passed","title":"fails if applied to a non-array value"},{"ancestorTitles":["septima","Object.fromEntries()"],"failureMessages":[],"fullName":"septima Object.fromEntries() the input array must be an array of pairs","location":null,"status":"passed","title":"the input array must be an array of pairs"},{"ancestorTitles":["septima","Object.fromEntries()"],"failureMessages":[],"fullName":"septima Object.fromEntries() the first element in each pair must be a string","location":null,"status":"passed","title":"the first element in each pair must be a string"},{"ancestorTitles":["septima","comments"],"failureMessages":[],"fullName":"septima comments anything from '//' up to the end-of-line is ignored","location":null,"status":"passed","title":"anything from '//' up to the end-of-line is ignored"},{"ancestorTitles":["septima","comments"],"failureMessages":[],"fullName":"septima comments allow consecutive lines which are all commented out","location":null,"status":"passed","title":"allow consecutive lines which are all commented out"},{"ancestorTitles":["septima","comments"],"failureMessages":[],"fullName":"septima comments a comment inside a comment has no effect","location":null,"status":"passed","title":"a comment inside a comment has no effect"},{"ancestorTitles":["septima","evaluation stack"],"failureMessages":[],"fullName":"septima evaluation stack max recursion depth","location":null,"status":"passed","title":"max recursion depth"},{"ancestorTitles":["septima","preimport"],"failureMessages":[],"fullName":"septima preimport definitions from a preimported file can be used","location":null,"status":"passed","title":"definitions from a preimported file can be used"},{"ancestorTitles":["septima","preimport"],"failureMessages":[],"fullName":"septima preimport supports multiple preimports","location":null,"status":"passed","title":"supports multiple preimports"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima support file names in locations","location":null,"status":"todo","title":"support file names in locations"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima string interpolation via `foo` strings","location":null,"status":"todo","title":"string interpolation via `foo` strings"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima imports","location":null,"status":"todo","title":"imports"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima arrow functions","location":null,"status":"todo","title":"arrow functions"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima optional parameters","location":null,"status":"todo","title":"optional parameters"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima optional type annotations?","location":null,"status":"todo","title":"optional type annotations?"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima allow redundant commas","location":null,"status":"todo","title":"allow redundant commas"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima left associativity of +/-","location":null,"status":"todo","title":"left associativity of +/-"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima comparison of arrays","location":null,"status":"todo","title":"comparison of arrays"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima comparison of lambdas?","location":null,"status":"todo","title":"comparison of lambdas?"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima deep equality of objects","location":null,"status":"todo","title":"deep equality of objects"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima \"abcdef\"[1] == \"b\"","location":null,"status":"todo","title":"\"abcdef\"[1] == \"b\""},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima an object literal cannot have a repeated attribute name that","location":null,"status":"todo","title":"an object literal cannot have a repeated attribute name that"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima quoting of a ticks inside a string","location":null,"status":"todo","title":"quoting of a ticks inside a string"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima number in scientific notation","location":null,"status":"todo","title":"number in scientific notation"},{"ancestorTitles":["septima"],"failureMessages":[],"fullName":"septima number methods","location":null,"status":"todo","title":"number methods"}],"endTime":1662711379978,"message":"","name":"/home/imaman/code/imaman/bigband/modules/septima-lang/dist/tests/septima.spec.js","startTime":1662711378341,"status":"passed","summary":""}],"wasInterrupted":false}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "septima-lang",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "license": "MIT",
package/src/a.js ADDED
@@ -0,0 +1,66 @@
1
+ // something interesting goes in here.
2
+ let generation = 'prod'
3
+ let stackName = 'd'
4
+ let account = '091530143433'
5
+ let casPrefix = 'build-raptor/cache-v1/cas'
6
+ let codeBucket = 'moojo-dev-infra'
7
+
8
+ // options: {
9
+ // // size of the ephemeral storage allocated for the lambda function, in MB. Defaults to 512.
10
+ // storageInMb: number
11
+ // // size of the RAM allocated for the lambda function, in MB. Defaults to 128.
12
+ // ramInMb: number
13
+ // // max amount of time for handling a request, in seconds. Defaults to 3.
14
+ // timeoutInSeconds: number
15
+ // }
16
+ let lambda = (name, cas, options) => {
17
+ let roleName = name + 'Role'
18
+
19
+ return {
20
+ [name]: {
21
+ Type: 'AWS::Lambda::Function',
22
+ Properties: {
23
+ Code: {
24
+ S3Bucket: codeBucket,
25
+ S3Key: casPrefix + '/' + cas,
26
+ },
27
+ EphemeralStorage: { Size: options.storageInMb ?? 512 },
28
+ FunctionName: stackName + '-' + generation + '-' + name,
29
+ Handler: 'index.handler',
30
+ MemorySize: options.ramInMb ?? 128,
31
+ Role: 'arn:aws:iam::' + account + ':role/' + stackName + '-' + generation + '-' + roleName,
32
+ Runtime: 'nodejs16.x',
33
+ Timeout: options.timeoutInSeconds ?? 3,
34
+ },
35
+ DependsOn: [roleName],
36
+ },
37
+ [roleName]: {
38
+ Type: 'AWS::IAM::Role',
39
+ Properties: {
40
+ RoleName: stackName + '-' + generation + '-' + roleName,
41
+ AssumeRolePolicyDocument: {
42
+ Statement: [{ Action: 'sts:AssumeRole', Effect: 'Allow', Principal: { Service: 'lambda.amazonaws.com' } }],
43
+ Version: '2012-10-17',
44
+ },
45
+ ManagedPolicyArns: ['arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'],
46
+ Policies: [
47
+ {
48
+ PolicyName: 'computed-policy',
49
+ PolicyDocument: {
50
+ Version: '2012-10-17',
51
+ Statement: [{ Effect: 'Allow', Action: 's3:GetObject', Resource: 'arn:aws:s3:::prod-moojo-dev-infra' }],
52
+ },
53
+ },
54
+ ],
55
+ },
56
+ },
57
+ }
58
+ }
59
+
60
+ let template = resources => ({
61
+ Resources: {
62
+ ...Object.fromEntries(resources.flatMap(r => Object.entries(r))),
63
+ },
64
+ })
65
+
66
+ template([lambda('foo', '1b393be42ae91bf07cb367466bf1c61b171aa95555f2377955648ae4', {})])
package/src/parser.ts CHANGED
@@ -22,14 +22,18 @@ export class Parser {
22
22
  const ident = this.identifier()
23
23
  this.scanner.consume('=')
24
24
  const value = this.lambda()
25
- this.scanner.consume(';')
26
-
27
25
  ret.push({ start, ident, value })
26
+
27
+ this.scanner.consumeIf(';')
28
+ if (!this.scanner.headMatches('let ')) {
29
+ return ret
30
+ }
28
31
  }
29
32
  }
30
33
 
31
34
  expression(): AstNode {
32
35
  const definitions = this.definitions()
36
+ this.scanner.consumeIf('return')
33
37
  const computation = this.lambda()
34
38
 
35
39
  if (definitions.length === 0) {
@@ -42,7 +46,7 @@ export class Parser {
42
46
  lambda(): AstNode {
43
47
  const start = this.scanner.consumeIf('fun')
44
48
  if (!start) {
45
- return this.ifExpression()
49
+ return this.arrowFunction()
46
50
  }
47
51
 
48
52
  this.scanner.consume('(')
@@ -66,6 +70,60 @@ export class Parser {
66
70
  return { tag: 'lambda', start, formalArgs: args, body }
67
71
  }
68
72
 
73
+ arrowFunction(): AstNode {
74
+ if (this.scanner.headMatches('(', ')', '=>')) {
75
+ const start = this.scanner.consume('(')
76
+ this.scanner.consume(')')
77
+ this.scanner.consume('=>')
78
+ const body = this.lambdaBody()
79
+ return { tag: 'lambda', start, formalArgs: [], body }
80
+ }
81
+ if (this.scanner.headMatches(IDENT_PATTERN, '=>')) {
82
+ const ident = this.identifier()
83
+ this.scanner.consume('=>')
84
+ const body = this.lambdaBody()
85
+ return { tag: 'lambda', start: ident.t, formalArgs: [ident], body }
86
+ }
87
+ if (this.scanner.headMatches('(', IDENT_PATTERN, ')', '=>')) {
88
+ const start = this.scanner.consume('(')
89
+ const ident = this.identifier()
90
+ this.scanner.consume(')')
91
+ this.scanner.consume('=>')
92
+ const body = this.lambdaBody()
93
+ return { tag: 'lambda', start, formalArgs: [ident], body }
94
+ }
95
+ if (this.scanner.headMatches('(', IDENT_PATTERN, ',')) {
96
+ const start = this.scanner.consume('(')
97
+ const formalArgs: Ident[] = []
98
+ while (true) {
99
+ const ident = this.identifier()
100
+ formalArgs.push(ident)
101
+
102
+ if (this.scanner.consumeIf(')')) {
103
+ break
104
+ }
105
+
106
+ this.scanner.consume(',')
107
+ }
108
+
109
+ this.scanner.consume('=>')
110
+ const body = this.lambdaBody()
111
+ return { tag: 'lambda', start, formalArgs, body }
112
+ }
113
+
114
+ return this.ifExpression()
115
+ }
116
+
117
+ private lambdaBody() {
118
+ if (this.scanner.consumeIf('{')) {
119
+ const ret = this.expression()
120
+ this.scanner.consume('}')
121
+ return ret
122
+ }
123
+
124
+ return this.expression()
125
+ }
126
+
69
127
  ifExpression(): AstNode {
70
128
  if (!this.scanner.consumeIf('if')) {
71
129
  return this.unsink()
@@ -370,12 +428,16 @@ export class Parser {
370
428
  parts.push({ tag: 'hardName', k, v })
371
429
  }
372
430
 
373
- const end = this.scanner.consumeIf('}')
431
+ let end = this.scanner.consumeIf('}')
374
432
  if (end) {
375
433
  return { tag: 'objectLiteral', start, parts, end }
376
434
  }
377
435
 
378
436
  this.scanner.consume(',')
437
+ end = this.scanner.consumeIf('}')
438
+ if (end) {
439
+ return { tag: 'objectLiteral', start, parts, end }
440
+ }
379
441
  }
380
442
  }
381
443
 
@@ -389,7 +451,7 @@ export class Parser {
389
451
  }
390
452
 
391
453
  private maybeIdentifier(): Ident | undefined {
392
- const t = this.scanner.consumeIf(/[a-zA-Z][0-9A-Za-z_]*/)
454
+ const t = this.scanner.consumeIf(IDENT_PATTERN)
393
455
  if (t) {
394
456
  return { tag: 'ident', t }
395
457
  }
@@ -397,3 +459,5 @@ export class Parser {
397
459
  return undefined
398
460
  }
399
461
  }
462
+
463
+ const IDENT_PATTERN = /[a-zA-Z][0-9A-Za-z_]*/
package/src/runtime.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import { AstNode, show, span } from './ast-node'
2
2
  import { extractMessage } from './extract-message'
3
3
  import { failMe } from './fail-me'
4
- import { Parser } from './parser'
5
4
  import { shouldNeverHappen } from './should-never-happen'
6
5
  import * as Stack from './stack'
7
6
  import { switchOn } from './switch-on'
@@ -51,7 +50,7 @@ export class Runtime {
51
50
  constructor(
52
51
  private readonly root: AstNode,
53
52
  private readonly verbosity: Verbosity = 'quiet',
54
- private readonly parser: Parser,
53
+ private readonly preimports: Record<string, Value> = {},
55
54
  ) {}
56
55
 
57
56
  compute() {
@@ -60,7 +59,12 @@ export class Runtime {
60
59
  const keys = Value.foreign(o => o.keys())
61
60
  const entries = Value.foreign(o => o.entries())
62
61
  const fromEntries = Value.foreign(o => o.fromEntries())
63
- const lib = new SymbolFrame('Object', { destination: Value.obj({ keys, entries, fromEntries }) }, empty)
62
+ let lib = new SymbolFrame('Object', { destination: Value.obj({ keys, entries, fromEntries }) }, empty)
63
+
64
+ for (const [importName, importValue] of Object.entries(this.preimports)) {
65
+ lib = new SymbolFrame(importName, { destination: importValue }, lib)
66
+ }
67
+
64
68
  try {
65
69
  const value = this.evalNode(this.root, lib)
66
70
  return { value }
package/src/scanner.ts CHANGED
@@ -7,10 +7,10 @@ export interface Token {
7
7
  }
8
8
 
9
9
  export class Scanner {
10
- private offset = 0
11
-
12
- constructor(private readonly sourceCode: SourceCode) {
13
- this.eatWhitespace()
10
+ constructor(private readonly sourceCode: SourceCode, private offset = 0) {
11
+ if (this.offset === 0) {
12
+ this.eatWhitespace()
13
+ }
14
14
  }
15
15
 
16
16
  get sourceRef() {
@@ -52,6 +52,18 @@ export class Scanner {
52
52
  }
53
53
  }
54
54
 
55
+ headMatches(...patterns: (RegExp | string)[]): boolean {
56
+ const alt = new Scanner(this.sourceCode, this.offset)
57
+ for (const p of patterns) {
58
+ const t = alt.consumeIf(p, true)
59
+ if (t === undefined) {
60
+ return false
61
+ }
62
+ }
63
+
64
+ return true
65
+ }
66
+
55
67
  consume(r: RegExp | string, eatWhitespace = true): Token {
56
68
  const text = this.match(r)
57
69
  if (text === undefined) {