SnareChops/SQiggL

View on GitHub
docs/tests.md

Summary

Maintainability
Test Coverage
key:'one', 'two', 'three'
# TOC
   - [Expressions](#expressions)
     - [Equal](#expressions-equal)
     - [GreaterThan](#expressions-greaterthan)
     - [LessThan](#expressions-lessthan)
     - [IsNull](#expressions-isnull)
     - [LexicalGreaterThan](#expressions-lexicalgreaterthan)
     - [LexicalLessThan](#expressions-lexicallessthan)
     - [LengthGreaterThan](#expressions-lengthgreaterthan)
     - [LengthLessThan](#expressions-lengthlessthan)
     - [IsNaN](#expressions-isnan)
     - [Between](#expressions-between)
     - [Coalesce](#expressions-coalesce)
     - [IterableOf](#expressions-iterableof)
   - [Modifiers](#modifiers)
     - [Not](#modifiers-not)
     - [OrEqual](#modifiers-orequal)
     - [LengthOrEqual](#modifiers-lengthorequal)
     - [BetweenOrEqual](#modifiers-betweenorequal)
   - [Actions](#actions)
     - [If](#actions-if)
     - [Unless](#actions-unless)
     - [Else](#actions-else)
     - [For](#actions-for)
   - [Conjunctions](#conjunctions)
     - [AndConjunction](#conjunctions-andconjunction)
     - [OrConjunction](#conjunctions-orconjunction)
   - [ExpressionLexer](#expressionlexer)
   - [ExpressionTreeLexer](#expressiontreelexer)
   - [VariableLexer](#variablelexer)
   - [CommandLexer](#commandlexer)
   - [Lexer](#lexer)
     - [options](#lexer-options)
     - [text](#lexer-text)
     - [replacement](#lexer-replacement)
     - [command](#lexer-command)
     - [comment](#lexer-comment)
     - [variable](#lexer-variable)
     - [scope](#lexer-scope)
     - [expressions](#lexer-expressions)
   - [ExpressionParser](#expressionparser)
     - [parse](#expressionparser-parse)
   - [ExpressionTreeParser](#expressiontreeparser)
   - [CommandParser](#commandparser)
   - [ReplacementParser](#replacementparser)
     - [parse](#replacementparser-parse)
   - [Parser](#parser)
     - [comments](#parser-comments)
     - [text](#parser-text)
     - [variable](#parser-variable)
     - [resolveValue](#parser-resolvevalue)
   - [Scenarios](#scenarios)
     - [generic 'end'](#scenarios-generic-end)
   - [Full feature sweep: ](#full-feature-sweep-)
     - [if](#full-feature-sweep-if)
       - [is null](#full-feature-sweep-if-is-null)
       - [is not null](#full-feature-sweep-if-is-not-null)
       - [is !null](#full-feature-sweep-if-is-null)
       - [=](#full-feature-sweep-if-)
       - [==](#full-feature-sweep-if-)
       - [!=](#full-feature-sweep-if-)
       - [!==](#full-feature-sweep-if-)
       - [>](#full-feature-sweep-if-)
       - [>=](#full-feature-sweep-if-)
       - [!>](#full-feature-sweep-if-)
       - [!>=](#full-feature-sweep-if-)
       - [<](#full-feature-sweep-if-)
       - [<=](#full-feature-sweep-if-)
       - [!<](#full-feature-sweep-if-)
       - [!<=](#full-feature-sweep-if-)
       - [abc>](#full-feature-sweep-if-abc)
       - [abc>=](#full-feature-sweep-if-abc)
       - [!abc>](#full-feature-sweep-if-abc)
       - [!abc>=](#full-feature-sweep-if-abc)
       - [abc<](#full-feature-sweep-if-abc)
       - [abc<=](#full-feature-sweep-if-abc)
       - [!abc<](#full-feature-sweep-if-abc)
       - [!abc<=](#full-feature-sweep-if-abc)
       - [len>](#full-feature-sweep-if-len)
       - [len>=](#full-feature-sweep-if-len)
       - [!len>](#full-feature-sweep-if-len)
       - [!len>=](#full-feature-sweep-if-len)
       - [len<](#full-feature-sweep-if-len)
       - [len<=](#full-feature-sweep-if-len)
       - [!len<](#full-feature-sweep-if-len)
       - [!len<=](#full-feature-sweep-if-len)
       - [is NaN](#full-feature-sweep-if-is-nan)
       - [is not NaN](#full-feature-sweep-if-is-not-nan)
       - [is !NaN](#full-feature-sweep-if-is-nan)
       - [><](#full-feature-sweep-if-)
       - [>!<](#full-feature-sweep-if-)
       - [>=<](#full-feature-sweep-if-)
     - [unless](#full-feature-sweep-unless)
       - [is null](#full-feature-sweep-unless-is-null)
       - [is not null](#full-feature-sweep-unless-is-not-null)
       - [is !null](#full-feature-sweep-unless-is-null)
       - [=](#full-feature-sweep-unless-)
       - [==](#full-feature-sweep-unless-)
       - [!=](#full-feature-sweep-unless-)
       - [!==](#full-feature-sweep-unless-)
       - [>](#full-feature-sweep-unless-)
       - [>=](#full-feature-sweep-unless-)
       - [!>](#full-feature-sweep-unless-)
       - [!>=](#full-feature-sweep-unless-)
       - [<](#full-feature-sweep-unless-)
       - [<=](#full-feature-sweep-unless-)
       - [!<](#full-feature-sweep-unless-)
       - [!<=](#full-feature-sweep-unless-)
       - [abc>](#full-feature-sweep-unless-abc)
       - [abc>=](#full-feature-sweep-unless-abc)
       - [!abc>](#full-feature-sweep-unless-abc)
       - [!abc>=](#full-feature-sweep-unless-abc)
       - [abc<](#full-feature-sweep-unless-abc)
       - [abc<=](#full-feature-sweep-unless-abc)
       - [!abc<](#full-feature-sweep-unless-abc)
       - [!abc<=](#full-feature-sweep-unless-abc)
       - [len>](#full-feature-sweep-unless-len)
       - [len>=](#full-feature-sweep-unless-len)
       - [!len>](#full-feature-sweep-unless-len)
       - [!len>=](#full-feature-sweep-unless-len)
       - [len<](#full-feature-sweep-unless-len)
       - [len<=](#full-feature-sweep-unless-len)
       - [!len<](#full-feature-sweep-unless-len)
       - [!len<=](#full-feature-sweep-unless-len)
       - [is NaN](#full-feature-sweep-unless-is-nan)
       - [is not NaN](#full-feature-sweep-unless-is-not-nan)
       - [is !NaN](#full-feature-sweep-unless-is-nan)
       - [><](#full-feature-sweep-unless-)
       - [>!<](#full-feature-sweep-unless-)
       - [>=<](#full-feature-sweep-unless-)
     - ["query with newlines"](#full-feature-sweep-query-with-newlines)
<a name=""></a>
 
<a name="expressions"></a>
# Expressions
<a name="expressions-equal"></a>
## Equal
should return true if expression is true.

```js
var result = expressions_1.Equal.rule(['13', '13']);
result.should.equal(true);
```

should return false if expression if false.

```js
var result = expressions_1.Equal.rule(['12', '13']);
result.should.equal(false);
```

<a name="expressions-greaterthan"></a>
## GreaterThan
should return true if expression is true.

```js
var result = expressions_1.GreaterThan.rule(['13', '12']);
result.should.equal(true);
```

should return false if expression is false.

```js
var result = expressions_1.GreaterThan.rule(['12', '13']);
result.should.equal(false);
```

<a name="expressions-lessthan"></a>
## LessThan
should return true if expression is true.

```js
var result = expressions_1.LessThan.rule(['12', '13']);
result.should.equal(true);
```

should return false if expression is false.

```js
var result = expressions_1.LessThan.rule(['13', '12']);
result.should.equal(false);
```

<a name="expressions-isnull"></a>
## IsNull
should return true if expression is true.

```js
var result = expressions_1.IsNull.rule([]);
result.should.equal(true);
```

should return false if expression is false.

```js
var result = expressions_1.IsNull.rule(['Hello']);
result.should.equal(false);
```

<a name="expressions-lexicalgreaterthan"></a>
## LexicalGreaterThan
should return true if expression is true.

```js
var result = expressions_1.LexicalGreaterThan.rule(['World', 'Hello']);
result.should.equal(true);
```

should return false if expression is false.

```js
var result = expressions_1.LexicalGreaterThan.rule(['Hello', 'World']);
result.should.equal(false);
```

<a name="expressions-lexicallessthan"></a>
## LexicalLessThan
should return true if expression is true.

```js
var result = expressions_1.LexicalLessThan.rule(['Hello', 'World']);
result.should.equal(true);
```

should return false if expression is false.

```js
var result = expressions_1.LexicalLessThan.rule(['World', 'Hello']);
result.should.equal(false);
```

<a name="expressions-lengthgreaterthan"></a>
## LengthGreaterThan
should return true if expression is true.

```js
var result = expressions_1.LengthGreaterThan.rule(['Dragon', 3]);
result.should.equal(true);
```

should return false if expression is false.

```js
var result = expressions_1.LengthGreaterThan.rule(['Cat', 6]);
result.should.equal(false);
```

<a name="expressions-lengthlessthan"></a>
## LengthLessThan
should return true if expression is true.

```js
var result = expressions_1.LengthLessThan.rule(['Cat', 6]);
result.should.equal(true);
```

should return false if expression is false.

```js
var result = expressions_1.LengthLessThan.rule(['Dragon', 3]);
result.should.equal(false);
```

<a name="expressions-isnan"></a>
## IsNaN
should return true if expression is true.

```js
var result = expressions_1.IsNaN.rule(['Hello']);
result.should.equal(true);
```

should return false if expression is false.

```js
var result = expressions_1.IsNaN.rule(['12']);
result.should.equal(false);
```

<a name="expressions-between"></a>
## Between
should return true if expression is true.

```js
var result = expressions_1.Between.rule(['12', '10', '15']);
result.should.equal(true);
```

should return false if expression is false.

```js
var result = expressions_1.Between.rule(['10', '12', '15']);
result.should.equal(false);
```

<a name="expressions-coalesce"></a>
## Coalesce
should return the first value if it is not null.

```js
var result = expressions_1.Coalesce.rule(['Hello', 'World']);
result.should.equal('Hello');
```

should return the second value if the first is null.

```js
var result = expressions_1.Coalesce.rule([null, 'World']);
result.should.equal('World');
```

<a name="expressions-iterableof"></a>
## IterableOf
should return an iterable result.

```js
var result = expressions_1.IterableOfUsing.rule([['hairy', 'furry', 'fuzzy']]);
result[0].should.equal('hairy');
result[1].should.equal('furry');
result[2].should.equal('fuzzy');
```

<a name="modifiers"></a>
# Modifiers
<a name="modifiers-not"></a>
## Not
should negate a true value.

```js
modifiers_1.Not.rule(true).should.equal(false);
```

should negate a false value.

```js
modifiers_1.Not.rule(false).should.equal(true);
```

<a name="modifiers-orequal"></a>
## OrEqual
should return true if the prevResult is true.

```js
modifiers_1.OrEqual.rule(true, ['12', '13']).should.equal(true);
```

should return true if the prevResult is false and the values are equal.

```js
modifiers_1.OrEqual.rule(false, ['12', '12']).should.equal(true);
```

should return false if the prevResult is false and the values are not equal.

```js
modifiers_1.OrEqual.rule(false, ['12', '13']).should.equal(false);
```

<a name="modifiers-lengthorequal"></a>
## LengthOrEqual
should return true if the prevResult is true.

```js
modifiers_1.LengthOrEqual.rule(true, ['Cat', '6']).should.equal(true);
```

should return true if the prevResult is false and the values are of equal length.

```js
modifiers_1.LengthOrEqual.rule(false, ['Cat', '3']).should.equal(true);
```

should return false if the prevResult is false and the values are not of equal length.

```js
modifiers_1.LengthOrEqual.rule(false, ['Cat', '6']).should.equal(false);
```

<a name="modifiers-betweenorequal"></a>
## BetweenOrEqual
should return true if the prevResult is true.

```js
modifiers_1.BetweenOrEqual.rule(true, ['10', '12', '15']).should.equal(true);
```

should return true if the prevResult is false and the first value is equal to the second value.

```js
modifiers_1.BetweenOrEqual.rule(false, ['10', '10', '15']).should.equal(true);
```

should return true if the prevResult is false and the first values is equal to the third value.

```js
modifiers_1.BetweenOrEqual.rule(false, ['10', '5', '10']).should.equal(true);
```

should return false if the prevResult is false the the first value is not equal to either of the other values.

```js
modifiers_1.BetweenOrEqual.rule(false, ['10', '12', '15']).should.equal(false);
```

<a name="actions"></a>
# Actions
<a name="actions-if"></a>
## If
should return the inner scope if the expression is true.

```js
var dsl = [{ text: 'Hello World' }];
var result = actions_1.If.rule({ value: true }, null, dsl, new parser_1.Parser(parser_1.DEFAULT_PARSER_OPTIONS));
result.should.equal('Hello World');
```

should return null if the expression is false.

```js
var dsl = [{ text: 'Hello World' }];
var result = actions_1.If.rule({ value: false }, null, dsl, new parser_1.Parser(parser_1.DEFAULT_PARSER_OPTIONS));
should(result).equal(null);
```

<a name="actions-unless"></a>
## Unless
should return null if the expression is true.

```js
var dsl = [{ text: 'Hello World' }];
var result = actions_1.Unless.rule({ value: true }, null, dsl, new parser_1.Parser(parser_1.DEFAULT_PARSER_OPTIONS));
should(result).equal(null);
```

should return the inner scope if the expression is false.

```js
var dsl = [{ text: 'Hello World' }];
var result = actions_1.Unless.rule({ value: false }, null, dsl, new parser_1.Parser(parser_1.DEFAULT_PARSER_OPTIONS));
result.should.equal('Hello World');
```

<a name="actions-else"></a>
## Else
should return the inner scope if the expression is true.

```js
var dsl = [{ text: 'Hello World' }];
var result = actions_1.Else.rule({ value: true }, null, dsl, new parser_1.Parser(parser_1.DEFAULT_PARSER_OPTIONS));
result.should.equal('Hello World');
```

should return the inner scope if the expression is false.

```js
var dsl = [{ text: 'Hello World' }];
var result = actions_1.Else.rule({ value: false }, null, dsl, new parser_1.Parser(parser_1.DEFAULT_PARSER_OPTIONS));
result.should.equal('Hello World');
```

<a name="actions-for"></a>
## For
should return the inner scope as many times as there are values and combining them with the joiner.

```js
var dsl = [{ text: 'Hello World' }];
var result = actions_1.For.rule({ value: ['1', '2', '3'], iterable: { local: 'var', joiner: '\',\'' } }, void 0, dsl, new parser_1.Parser(parser_1.DEFAULT_PARSER_OPTIONS));
result.should.equal('Hello World, Hello World, Hello World');
```

should iterate the inner scope and correctly replace the inner values using the expressionResult.

```js
var dsl = [{ text: 'Iteration ' }, { replacement: { literal: 'var' } }];
var result = actions_1.For.rule({ value: ['1', '2', '3'], iterable: { local: 'var', joiner: '\',\'' } }, void 0, dsl, new parser_1.Parser(parser_1.DEFAULT_PARSER_OPTIONS));
result.should.equal('Iteration 1, Iteration 2, Iteration 3');
```

<a name="conjunctions"></a>
# Conjunctions
<a name="conjunctions-andconjunction"></a>
## AndConjunction
should return false if the first expressionResult is false.

```js
var result = conjunctions_1.AndConjunction.rule([false, true]);
result.should.equal(false);
```

should return false if the second expressionResult is false (and the first is true).

```js
var result = conjunctions_1.AndConjunction.rule([true, false]);
result.should.equal(false);
```

should return true if both expressionResults are true.

```js
var result = conjunctions_1.AndConjunction.rule([true, true]);
result.should.equal(true);
```

<a name="conjunctions-orconjunction"></a>
## OrConjunction
should return false if both expressionResults are false.

```js
var result = conjunctions_1.OrConjunction.rule([false, false]);
result.should.equal(false);
```

should return true if the first expressionResult is true.

```js
var result = conjunctions_1.OrConjunction.rule([true, false]);
result.should.equal(true);
```

should return true if the first expressionResult is false and the second is true.

```js
var result = conjunctions_1.OrConjunction.rule([false, true]);
result.should.equal(true);
```

<a name="expressionlexer"></a>
# ExpressionLexer
should return a DSLExpression with a local if an expression contains a local variable.

```js
var parts = ['cat', ' ', 'of', ' ', 'catType', ' ', 'using', ' ', '\',\''];
var result = instance.invoke(parts);
result.local.should.equal('cat');
```

should return a DSLExpression with a joiner if an expression contains a joiner value.

```js
var parts = ['cat', ' ', 'of', ' ', 'catType', ' ', 'using', ' ', '\',\''];
var result = instance.invoke(parts);
result.joiner.should.equal('\',\'');
```

should throw an error if an expression cannot be found.

```js
var parts = ['blah', ' ', 'blah', ' ', 'blah'];
(function () { return instance.invoke(parts); }).should.throw("SQiggLError - LE2000: Unable to determine expression type of 'blah blah blah'");
```

<a name="expressiontreelexer"></a>
# ExpressionTreeLexer
should split expressions by conjunctions and save the conjunctions in order in the DSL.

```js
var parts = ['12', ' ', '>', ' ', '13', ' ', 'and', ' ', '15', ' ', '<', ' ', '100', ' ', 'or', ' ', 'var', ' ', 'is', ' ', 'null'];
var result = instance.invoke(parts);
result.conjunctions[0].should.equal(conjunctions_1.AndConjunction);
result.conjunctions[1].should.equal(conjunctions_1.OrConjunction);
```

should split expressions by conjunctions and save the expressions in order in the DSL.

```js
var parts = ['12', ' ', '>', ' ', '13', ' ', 'and', ' ', '15', ' ', '<', ' ', '100', ' ', 'or', ' ', 'var', ' ', 'is', ' ', 'null'];
var result = instance.invoke(parts);
result.branches[0].expression.should.equal(expressions_1.GreaterThan);
result.branches[1].expression.should.equal(expressions_1.LessThan);
result.branches[2].expression.should.equal(expressions_1.IsNull);
```

<a name="variablelexer"></a>
# VariableLexer
should throw an error if a variable key is wrapped in double quotes.

```js
var input = '"key":"value"';
(function () { return lexer.invoke(input); }).should.throw('SQiggLError - LV2000: Variable keys should not be wrapped in quotes.');
```

should throw an error if a variable key is wrapped in single quotes.

```js
var input = "'key':'value'";
(function () { return lexer.invoke(input); }).should.throw('SQiggLError - LV2000: Variable keys should not be wrapped in quotes.');
```

should throw an error if a variable key contains a '['.

```js
var input = 'ke[y:\'value\'';
(function () { return lexer.invoke(input); }).should.throw("SQiggLError - LV2001: Invalid character '[' found in variable key: 'ke[y:'value''.");
```

should throw an error if a variable key contains a ']'.

```js
var input = 'ke]y:\'value\'';
(function () { return lexer.invoke(input); }).should.throw("SQiggLError - LV2001: Invalid character ']' found in variable key: 'ke]y:'value''.");
```

should throw an error if a variable value contains a multi-dimensional array.

```js
var input = 'key: [[\'hello\']]';
(function () { return lexer.invoke(input); }).should.throw("SQiggLError - LV2002: Arrays in variables cannot be nested. At 'key: [['hello']]'.");
```

should throw an error if a variable value that contains an array contains other values.

```js
var input = 'key: [\'hello\'], \'test\'';
(function () { return lexer.invoke(input); }).should.throw("SQiggLError - LV2002: Arrays in variables cannot be nested. At 'key: ['hello'], 'test''.");
```

should correctly handle a variable value that has an escaped single quote in the string.

```js
var input = "key:'Dragon\\'s breath'";
var result = lexer.invoke(input);
result.value.should.equal("'Dragon's breath'");
```

should correctly handle a variable value that has an escaped double quote in the string.

```js
var input = "key:\"Dragon\\\"s breath\"";
var result = lexer.invoke(input);
result.value.should.equal("\"Dragon\"s breath\"");
```

should correctly handle a variable value of an array of strings.

```js
var input = "key:['one', 'two', 'three']";
var result = lexer.invoke(input);
result.value[0].should.equal("'one'");
result.value[1].should.equal("'two'");
result.value[2].should.equal("'three'");
```

<a name="commandlexer"></a>
# CommandLexer
should throw an error if the first word of a command is not a known action.

```js
var lexer = new command_lexer_1.CommandLexer(lexer_1.DEFAULT_LEXER_OPTIONS, actions_1.CORE_ACTIONS, expressions_1.CORE_EXPRESSIONS, conjunctions_1.CORE_CONJUNCTIONS);
var input = 'not a command';
var parts = ['not', ' ', 'a', ' ', 'command'];
(function () { return lexer.invoke(input, parts); }).should.throw('SQiggLError - LC1000: Commands require the first word to be a known action. not is not a recognized action.');
```

<a name="lexer"></a>
# Lexer
should throw an error if a query contains an incomplete statement.

```js
var lexer = new lexer_1.Lexer();
(function () { return lexer.parse('SELECT * FROM {Table'); }).should.throw('SQiggLError - L1002: Expected statement to complete before end of file.');
```

should throw an throw an error if a query does not close a statement before declaring another.

```js
var lexer = new lexer_1.Lexer();
(function () { return lexer.parse('SELECT * FROM {Table WHERE id = {12}'); }).should.throw('SQiggLError - L1001: Unexpected \'{\' found in statement. Expected \'}\'.');
```

should throw an error if a query is incorrectly nested.

```js
var lexer = new lexer_1.Lexer();
var query = 'SELECT * FROM {% if 12 > 13} Test {% endif } {% endif }';
(function () { return lexer.parse(query); }).should.throw('SQiggLError - L1003: Your SQiggL is incorrectly nested.');
```

should throw an error if a query is incompletely nested.

```js
var lexer = new lexer_1.Lexer();
var query = 'SELECT * FROM {% if 12 > 13 } Test';
(function () { return lexer.parse(query); }).should.throw('SQiggLError - L1004: Your SQiggL query is nested but does not return to the top level before completing. Please check your nesting.');
```

should throw an error if an invalid string is found in a part.

```js
var query = 'SELECT * FROM {\'Table}';
(function () { return instance.parse(query); }).should.throw('SQiggLError - L1006: Invalid string found in \'Table');
```

should correctly handle a custom action.

```js
var replaceAction = {
    key: 'replace',
    rule: function (expressionResult, variables, scope, parser) {
        return parser.parse([{ text: expressionResult.value }]);
    }
};
var endAction = { key: 'endreplace', dependents: [replaceAction] };
var lexer = new lexer_1.Lexer({ customActions: [replaceAction, endAction] });
var query = '{% replace \'Hello World\'} SELECT * FROM Table {%endreplace}';
var result = lexer.parse(query);
result[0].command.action.should.equal(replaceAction);
result[1].command.action.should.equal(endAction);
```

should correctly handle a custom expression.

```js
var testExpression = {
    template: [expressions_1.VALUE, expressions_2.SPACE, 'blah', expressions_2.SPACE, expressions_1.VALUE],
    rule: function (values) { return (+values[0]) > (+values[1]); }
};
var lexer = new lexer_1.Lexer({ customExpressions: [testExpression] });
var query = '{12 blah 13}';
var result = lexer.parse(query);
result[0].replacement.expressions.branches[0].expression.should.equal(testExpression);
```

should correctly handle a custom modifier.

```js
var testModifier = {
    identifiers: ['!'],
    rule: function (prevResult, values) { return !prevResult; }
};
var testExpression = {
    template: [expressions_1.VALUE, expressions_2.SPACE, [{ 0: testModifier }], 'blah', expressions_2.SPACE, expressions_1.VALUE],
    rule: function (values) { return (+values[0]) > (+values[1]); }
};
var lexer = new lexer_1.Lexer({ customExpressions: [testExpression], customModifiers: [testModifier] });
var query = '{12 !blah 13}';
var result = lexer.parse(query);
result[0].replacement.expressions.branches[0].modifiers[0].should.equal(testModifier);
```

should correctly handle a custom conjunction.

```js
var testConjunction = {
    keys: ['blah'],
    rule: function (expressionResults) { return expressionResults[0] && expressionResults[1]; }
};
var lexer = new lexer_1.Lexer({ customConjunctions: [testConjunction] });
var query = '{12 > 13 blah 13 < 12}';
var result = lexer.parse(query);
result[0].replacement.expressions.conjunctions[0].should.equal(testConjunction);
```

should correctly handle escaped single quotes in strings.

```js
var lexer = new lexer_1.Lexer();
var query = "SELECT * FROM {'Dragon\\'s run'}";
var result = lexer.parse(query);
result[1].replacement.literal.should.equal("'Dragon's run'");
```

should correctly handle escaped double quotes in strings.

```js
var lexer = new lexer_1.Lexer();
var query = "SELECT * FROM {\"Dragon\\\"s run\"}";
var result = lexer.parse(query);
result[1].replacement.literal.should.equal('"Dragon"s run"');
```

should correctly handle an escaped escape character in strings.

```js
var lexer = new lexer_1.Lexer();
var query = "SELECT * FROM {'Me\\\\You'}";
var result = lexer.parse(query);
result[1].replacement.literal.should.equal("'Me\\You'");
```

should throw an error if an illegal escape character exists in a string.

```js
var lexer = new lexer_1.Lexer();
var query = "SELECT * FROM {'\\Something'}";
(function () { return lexer.parse(query); }).should.throw('SQiggLError - L1005: Illegal escape character found in string \'\\Something\' at index 1');
```

<a name="lexer-options"></a>
## options
should throw an error if any options use the same character.

```js
(function () { return new lexer_1.Lexer({ leftWrapperChar: '*', rightWrapperChar: '*' }); }).should.throwError();
```

should be ok to change the left and right wrappers.

```js
var lexer = new lexer_1.Lexer({ leftWrapperChar: '(', rightWrapperChar: ')' });
var result = lexer.parse('SELECT * FROM (table)');
result[0].should.have.property('text');
result[1].should.have.property('replacement');
```

<a name="lexer-text"></a>
## text
should return a non-special query unaltered.

```js
var lexer = new lexer_1.Lexer();
var query = 'SELECT * FROM Table';
var result = lexer.parse(query);
result[0].should.have.property('text', query);
```

should retain whitespace on text.

```js
var lexer = new lexer_1.Lexer();
var query = ' SELECT * FROM Table   ';
var result = lexer.parse(query);
result[0].should.have.property('text', query);
```

should respect newlines in non-special areas.

```js
var lexer = new lexer_1.Lexer();
var query = 'SELECT * \nFROM Table';
var result = lexer.parse(query);
result[0].should.have.property('text', query);
```

<a name="lexer-replacement"></a>
## replacement
should find a replacement in a given string.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('SELECT * FROM {table}');
result[1].should.have.property('replacement');
```

should return a literal for a replacement in a given string.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('SELECT * FROM {table}');
result[1].should.have.property('replacement', { literal: 'table' });
```

should trim whitespace on replacements.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('{ table }');
result[0].should.have.property('replacement', { literal: 'table' });
```

should remove newlines from replacements.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('{\n something }');
result[0].should.have.property('replacement', { literal: 'something' });
```

<a name="lexer-command"></a>
## command
should find a command in a given string.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('{% if command } {% endif}');
result[0].should.have.property('command');
```

should return a literal for a command in a given string.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('{%if command} {%endif}');
result[0].command.should.have.property('literal', 'if command');
```

should trim whitespace on commands.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('{% if command } {%endif}');
result[0].command.should.have.property('literal', 'if command');
```

should remove newlines from commands.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('{% if\ncommand} {%endif}');
result[0].command.should.have.property('literal', 'if command');
```

should reduce multiple whitespace characters to a single space.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('{% if      command} {%endif}');
result[0].command.should.have.property('literal', 'if command');
```

should find multiple commands in a given string.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('SELECT * FROM {% if table = \'Test\' } TestTable {% else } ProdTable {% endif }');
result[1].command.should.have.property('literal', 'if table = \'Test\'');
result[2].command.should.have.property('literal', 'else');
result[3].command.should.have.property('literal', 'endif');
```

should correctly identify the action of a command in a given string.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('SELECT * FROM {% if } {%endif}');
var dsl = result[1];
var command = dsl.command;
command.action.should.have.property('key', 'if');
```

should correct identify the action of a command despite casing.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('SELECT * FROM {% iF } {%endif}');
var dsl = result[1];
var command = dsl.command;
command.action.should.have.property('key', 'if');
```

<a name="lexer-comment"></a>
## comment
should find a comment in a given string.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('SELECT * FROM {# something }');
result[1].should.have.property('comment', 'something');
```

should trim whitespace on comments.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('{# test comment }');
result[0].should.have.property('comment', 'test comment');
```

<a name="lexer-variable"></a>
## variable
should find variable declarations in a given string.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('{+ key:value }');
result[0].should.have.property('variable');
```

should remove all whitespace from variable declarations.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('{+ key : value }');
result[0].variable.should.have.property('literal', 'key:value');
```

should also remove newlines from variable declarations.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('{+ key : \n value }');
result[0].variable.should.have.property('literal', 'key:value');
```

should correctly set a key and value.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse("{+ dragon:'cat' }");
result[0].variable.should.have.property('key');
result[0].variable.should.have.property('value');
```

should correctly set the value of key and value.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse("{+ dragon:'cat' }");
result[0].variable.should.have.property('key', 'dragon');
result[0].variable.should.have.property('value', "'cat'");
```

should correctly handle a variable with an opposite quote inside a string value.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse("{+ dragon: \"Felix's pet\" }");
result[0].variable.should.have.property('key', 'dragon');
result[0].variable.should.have.property('value', "\"Felix's pet\"");
```

<a name="lexer-scope"></a>
## scope
should determine the correct level of items nested in actions.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('SELECT * FROM {% if table = \'Test\' } TestTable {% else } ProdTable {% endif }');
result[0].should.have.property('text');
result[1].should.have.property('command');
result[1].should.have.property('scope');
result[1].scope[0].should.have.property('text');
result[2].should.have.property('command');
result[2].should.have.property('scope');
result[2].scope[0].should.have.property('text');
result[3].should.have.property('command');
```

<a name="lexer-expressions"></a>
## expressions
should detect an expression in a replacement.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('{12 > 13}');
result[0].replacement.should.have.property('expressions');
```

should detect an expression in a replacement with a modifier.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('{12 !< 13}');
result[0].replacement.should.have.property('expressions');
```

should correctly identify a modifier in an expression.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('{12 !> 13}');
result[0].replacement.expressions.branches[0].should.have.property('modifiers');
result[0].replacement.expressions.branches[0].modifiers[0].should.equal(modifiers_1.Not);
```

should correctly identify the values in an expression.

```js
var lexer = new lexer_1.Lexer();
var result = lexer.parse('{12 > 13}');
result[0].replacement.expressions.branches[0].values[0].should.equal('12');
result[0].replacement.expressions.branches[0].values[1].should.equal('13');
```

<a name="expressionparser"></a>
# ExpressionParser
<a name="expressionparser-parse"></a>
## parse
should correctly return false if an expression should be false.

```js
var dsl = { expression: expressions_1.GreaterThan, values: ['12', '13'], literal: '12 > 13' };
var result = new expression_parser_1.ExpressionParser(parser_1.DEFAULT_PARSER_OPTIONS).parse(dsl, {});
result.value.should.equal(false);
```

should correctly return true if an expression should be true.

```js
var dsl = { literal: '13 > 12', expression: expressions_1.GreaterThan, values: ['13', '12'] };
var result = new expression_parser_1.ExpressionParser(parser_1.DEFAULT_PARSER_OPTIONS).parse(dsl, {});
result.value.should.eql(true);
```

should output the result of a boolean expression with variables.

```js
var dsl = { literal: 'high > low', expression: expressions_1.GreaterThan, values: ['high', 'low'] };
var result = new expression_parser_1.ExpressionParser(parser_1.DEFAULT_PARSER_OPTIONS).parse(dsl, { high: 13, low: 12 });
result.value.should.eql(true);
```

should correctly return true if an expression is false but then negated with a modifier.

```js
var dsl = { literal: '12 > 13', expression: expressions_1.GreaterThan, values: ['12', '13'], modifiers: [modifiers_1.Not] };
var result = new expression_parser_1.ExpressionParser(parser_1.DEFAULT_PARSER_OPTIONS).parse(dsl, {});
result.value.should.eql(true);
```

<a name="expressiontreeparser"></a>
# ExpressionTreeParser
should return an ExpressionResult.

```js
var expression = { literal: '13 > 12', expression: expressions_1.GreaterThan, values: ['13', '12'] };
var dsl = { branches: [expression] };
var result = instance.parse(dsl, {});
result.value.should.equal(true);
```

should return a correct result of an expression with a conjunction.

```js
var expression1 = { literal: '13 > 12', expression: expressions_1.GreaterThan, values: ['13', '12'] };
var expression2 = { literal: '13 < 12', expression: expressions_1.LessThan, values: ['13', '12'] };
var dsl = { branches: [expression1, expression2], conjunctions: [conjunctions_1.AndConjunction] };
var result = instance.parse(dsl, {});
result.value.should.equal(false);
```

<a name="commandparser"></a>
# CommandParser
should correctly return a string in a StartingAction that is false.

```js
var booleanExpression = { literal: '12 > 13', expression: expressions_1.GreaterThan, values: ['12', '13'] };
var expressionTree = { branches: [booleanExpression] };
var dsl = { literal: 'if 12 > 13', action: actions_1.If, expressions: expressionTree };
var scope = [{ text: 'Hello World' }];
var result = new command_parser_1.CommandParser(parser_1.DEFAULT_PARSER_OPTIONS).parse(dsl, scope, {});
result.should.equal('');
```

should correctly return a string in a StartingAction that is true.

```js
var booleanExpression = { literal: '13 > 12', expression: expressions_1.GreaterThan, values: ['13', '12'] };
var expressionTree = { branches: [booleanExpression] };
var dsl = { literal: 'if 13 > 12', action: actions_1.If, expressions: expressionTree };
var scope = [{ text: 'Hello World' }];
var result = new command_parser_1.CommandParser(parser_1.DEFAULT_PARSER_OPTIONS).parse(dsl, scope, {});
result.should.equal('Hello World');
```

should correctly return a string in a DependentAction.

```js
var dsl = { literal: 'else', action: actions_1.Else };
var scope = [{ text: 'Merry Christmas' }];
var result = new command_parser_1.CommandParser(parser_1.DEFAULT_PARSER_OPTIONS).parse(dsl, scope, {});
result.should.equal('Merry Christmas');
```

should correctly return a string for an IterableCommand.

```js
var iterableExpression = { literal: 'cat of catTypes using \',\'', expression: expressions_1.IterableOfUsing, local: 'cat', values: [['hairy', 'furry', 'fuzzy']], joiner: '\',\'' };
var expressionTreeDSL = { branches: [iterableExpression] };
var commandDSL = { literal: 'for cat of catTypes using \', \'', action: actions_1.For, expressions: expressionTreeDSL };
var textDSL = { text: 'Hello ' };
var replacementDSL = { literal: 'cat', expressions: null };
var scope = [textDSL, { replacement: replacementDSL }];
var result = new command_parser_1.CommandParser(parser_1.DEFAULT_PARSER_OPTIONS).parse(commandDSL, scope, {});
result.should.equal('Hello hairy, Hello furry, Hello fuzzy');
```

<a name="replacementparser"></a>
# ReplacementParser
<a name="replacementparser-parse"></a>
## parse
should output a literal string.

```js
var dsl = { literal: '\'Test string\'' };
var result = new replacement_parser_1.ReplacementParser(parser_1.DEFAULT_PARSER_OPTIONS).parse(dsl);
result.should.eql('Test string');
```

should output a literal number.

```js
var dsl = { literal: '12' };
var result = new replacement_parser_1.ReplacementParser(parser_1.DEFAULT_PARSER_OPTIONS).parse(dsl);
result.should.eql('12');
```

should output a variable value.

```js
var dsl = { literal: 'dragon' };
var result = new replacement_parser_1.ReplacementParser(parser_1.DEFAULT_PARSER_OPTIONS).parse(dsl, { dragon: 'Pet' });
result.should.eql('Pet');
```

should output the result of a boolean expression.

```js
var booleanExpression = { literal: '12 > 13', expression: expressions_1.GreaterThan, values: ['12', '13'] };
var expressionTree = { branches: [booleanExpression] };
var dsl = { literal: '12 > 13', expressions: expressionTree };
var result = new replacement_parser_1.ReplacementParser(parser_1.DEFAULT_PARSER_OPTIONS).parse(dsl);
result.should.eql('0');
```

should output the result of a boolean expression with variables.

```js
var booleanExpression = { literal: 'high > low', expression: expressions_1.GreaterThan, values: ['high', 'low'] };
var expressionTree = { branches: [booleanExpression] };
var dsl = { literal: 'high > low', expressions: expressionTree };
var result = new replacement_parser_1.ReplacementParser(parser_1.DEFAULT_PARSER_OPTIONS).parse(dsl, { high: 13, low: 12 });
result.should.eql('1');
```

should output the result of an IterableExpression correctly.

```js
var iterableExpression = { literal: 'cat of catTypes using \',\'', expression: expressions_2.IterableOfUsing, local: 'cat', values: [['hairy', 'furry', 'fuzzy']], joiner: '\',\'' };
var expressionTree = { branches: [iterableExpression] };
var dsl = { literal: 'cat of catTypes using \',\'', expressions: expressionTree };
var result = new replacement_parser_1.ReplacementParser(parser_1.DEFAULT_PARSER_OPTIONS).parse(dsl);
result.should.equal('hairy, furry, fuzzy');
```

should output the result of an IterableExpression correctly using variables.

```js
var iterableExpression = { literal: 'cat of catTypes using \',\'', expression: expressions_2.IterableOfUsing, local: 'cat', values: ['array'], joiner: 'joiner' };
var expressionTree = { branches: [iterableExpression] };
var dsl = { literal: 'cat of catTypes using \',\'', expressions: expressionTree };
var result = new replacement_parser_1.ReplacementParser(parser_1.DEFAULT_PARSER_OPTIONS).parse(dsl, { array: ['hairy', 'furry', 'fuzzy'], joiner: ',' });
result.should.equal('hairy, furry, fuzzy');
```

<a name="parser"></a>
# Parser
<a name="parser-comments"></a>
## comments
should not output comments by default.

```js
var parser = new parser_1.Parser();
var dsl = [
    { text: 'This is some text' },
    { comment: 'This is a comment' },
];
var result = parser.parse(dsl);
result.should.equal('This is some text');
```

should output comments if exportComments option is true.

```js
var parser = new parser_1.Parser({ exportComments: true });
var dsl = [
    { text: 'This is some text' },
    { comment: 'This is a comment' }
];
var result = parser.parse(dsl);
result.should.equal('This is some text/* This is a comment */');
```

<a name="parser-text"></a>
## text
should output text untouched.

```js
var parser = new parser_1.Parser();
var result = parser.parse([{ text: 'this is a test string' }]);
result.should.equal('this is a test string');
```

<a name="parser-variable"></a>
## variable
should resolve a variable in SQiggL query without an error.

```js
var parser = new parser_1.Parser();
parser.parse([{ variable: { literal: 'cat:"meow"', key: 'cat', value: '"meow"' } }]);
```

should resolve a variable alias in a SQiggL query without an error.

```js
var parser = new parser_1.Parser();
parser.parse([{ variable: { literal: 'cat:sound', key: 'cat', value: 'sound' } }], { sound: 'meow' });
```

<a name="parser-resolvevalue"></a>
## resolveValue
should correctly output a string literal using single quotes.

```js
var result = parser_1.Parser.resolveValue('\'Hello\'', null);
result.should.equal('Hello');
```

should correctly output a string literal using double quotes.

```js
var result = parser_1.Parser.resolveValue('"Hello"', null);
result.should.equal('Hello');
```

should correctly output a number literal.

```js
var result = parser_1.Parser.resolveValue('12', null);
result.should.equal('12');
```

should correctly output a found variable value.

```js
var result = parser_1.Parser.resolveValue('cat', { cat: 'Dragon' });
result.should.equal('Dragon');
```

should throw an error if a variable value is undefined.

```js
(function () { return parser_1.Parser.resolveValue('cat', { dragon: 'Fish' }); }).should.throw('SQiggLError - P1000: cat is not a defined variable in this scope');
```

<a name="scenarios"></a>
# Scenarios
should correctly output a completely non-special query untouched.

```js
var result = SQiggL.parse('SELECT * FROM Table');
result.should.equal('SELECT * FROM Table');
```

should correctly output a SQiggL query containing a comment (default).

```js
var result = SQiggL.parse('SELECT * FROM Table {# this is the client\'s table}');
result.should.equal('SELECT * FROM Table ');
```

should correctly output a SQiggL query containing a comment (export true).

```js
var result = SQiggL.parse('SELECT * FROM Table {# this is the client\'s table}', null, { exportComments: true });
result.should.equal('SELECT * FROM Table /* this is the client\'s table */');
```

should correctly output a SQiggL query containing a string literal replacement.

```js
var result = SQiggL.parse('SELECT * FROM {\'Table\'}');
result.should.equal('SELECT * FROM Table');
```

should correctly output a SQiggL query containing a number literal replacement.

```js
var result = SQiggL.parse('SELECT * FROM Table WHERE ID = {12}');
result.should.equal('SELECT * FROM Table WHERE ID = 12');
```

should correctly output a SQiggL query containing a variable replacement.

```js
var result = SQiggL.parse('SELECT * FROM Table WHERE ID = {id}', { id: 12 });
result.should.equal('SELECT * FROM Table WHERE ID = 12');
```

should correctly output a SQiggL query containing a boolean expression with numbers.

```js
var result = SQiggL.parse('SELECT * FROM Table WHERE status = {12 > 13}');
result.should.equal('SELECT * FROM Table WHERE status = 0');
```

should correctly output a SQiggL query containing a boolean expression with strings.

```js
var result = SQiggL.parse('SELECT * FROM Table WHERE status = {\'yes\' abc> \'no\'}');
result.should.equal('SELECT * FROM Table WHERE status = 1');
```

should correctly output a SQiggL query containing a value expression.

```js
var result = SQiggL.parse('SELECT * FROM {dev ?? prod}', { dev: 'DevTable' });
result.should.equal('SELECT * FROM DevTable');
```

should correctly output a SQiggL query containing a coalesce.

```js
var result = SQiggL.parse('SELECT * FROM {dev ?? prod}', { prod: 'ProdTable' });
result.should.equal('SELECT * FROM ProdTable');
```

should correctly output a SQiggL query containing a StartingAction/TerminatingAction pair.

```js
var result = SQiggL.parse('SELECT * FROM Table {% if 13 > 12 } WHERE status = 1 {% endif }');
result.should.equal('SELECT * FROM Table  WHERE status = 1 ');
```

should correctly output a SQiggL query containing a StartingAction, DependentAction, and TerminatingAction chain.

```js
var result = SQiggL.parse('SELECT * FROM Table {% if 12 > 13 } WHERE status = 1 {% else } WHERE status = 0 {% endif }');
result.should.equal('SELECT * FROM Table  WHERE status = 0 ');
```

should correctly output a SQiggL query containing a conjunction in an expression.

```js
var result = SQiggL.parse('SELECT * FROM Table {% if 13 > 12 and 15 < 100 } WHERE Status = 1 {% endif }');
result.should.equal('SELECT * FROM Table  WHERE Status = 1 ');
```

<a name="scenarios-generic-end"></a>
## generic 'end'
should work with 'if'.

```js
var result = SQiggL.parse('SELECT * FROM Table {% if 13 > 12} WHERE status = 0 {% end }');
result.should.equal('SELECT * FROM Table  WHERE status = 0 ');
```

should work with 'unless'.

```js
var result = SQiggL.parse('SELECT * FROM Table {% unless 13 < 12} WHERE status = 0 {% end }');
result.should.equal('SELECT * FROM Table  WHERE status = 0 ');
```

should work with 'for'.

```js
var result = SQiggL.parse('SELECT * FROM Table WHERE {% for var of array using \'AND\'} id = {var} {% end }', { array: ['1', '2', '3'] });
result.should.equal('SELECT * FROM Table WHERE  id = 1 AND  id = 2 AND  id = 3 ');
```

<a name="full-feature-sweep-"></a>
# Full feature sweep: 
<a name="full-feature-sweep-if"></a>
## if
<a name="full-feature-sweep-if-is-null"></a>
### is null
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { penny: '12' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-is-not-null"></a>
### is not null
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { penny: '14' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-is-null"></a>
### is !null
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { penny: '14' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-"></a>
### =
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-"></a>
### ==
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-"></a>
### !=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = '14'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-"></a>
### !==
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = '14'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-"></a>
### >
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = '14'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '9' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-"></a>
### >=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = '14'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '9' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-"></a>
### !>
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '9' });
result.should.equal("UPDATE Names  SET Name = '9'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-"></a>
### !>=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '9' });
result.should.equal("UPDATE Names  SET Name = '9'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-"></a>
### <
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '9' });
result.should.equal("UPDATE Names  SET Name = '9'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-"></a>
### <=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '9' });
result.should.equal("UPDATE Names  SET Name = '9'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-"></a>
### !<
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '9' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = '14'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-"></a>
### !<=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '9' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = '14'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-abc"></a>
### abc>
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'hello' });
result.should.equal("UPDATE Names  SET Name = 'hello'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'awkward' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-abc"></a>
### abc>=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'hello' });
result.should.equal("UPDATE Names  SET Name = 'hello'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'dragon'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'awkward' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-abc"></a>
### !abc>
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'hello' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'dragon'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'awkward' });
result.should.equal("UPDATE Names  SET Name = 'awkward'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-abc"></a>
### !abc>=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'hello' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'awkward' });
result.should.equal("UPDATE Names  SET Name = 'awkward'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-abc"></a>
### abc<
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'awkward' });
result.should.equal("UPDATE Names  SET Name = 'awkward'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'hello' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-abc"></a>
### abc<=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'awkward' });
result.should.equal("UPDATE Names  SET Name = 'awkward'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'dragon'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'hello' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-abc"></a>
### !abc<
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'awkward' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'dragon'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'hello' });
result.should.equal("UPDATE Names  SET Name = 'hello'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-abc"></a>
### !abc<=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'awkward' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'hello' });
result.should.equal("UPDATE Names  SET Name = 'hello'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-len"></a>
### len>
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'palooza' });
result.should.equal("UPDATE Names  SET Name = 'palooza'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'sqiggl' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'fun' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-len"></a>
### len>=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'palooza' });
result.should.equal("UPDATE Names  SET Name = 'palooza'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'sqiggl' });
result.should.equal("UPDATE Names  SET Name = 'sqiggl'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'fun' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-len"></a>
### !len>
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'palooza' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'sqiggl' });
result.should.equal("UPDATE Names  SET Name = 'sqiggl'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'fun' });
result.should.equal("UPDATE Names  SET Name = 'fun'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-len"></a>
### !len>=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'palooza' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'sqiggl' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'fun' });
result.should.equal("UPDATE Names  SET Name = 'fun'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-len"></a>
### len<
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'fun' });
result.should.equal("UPDATE Names  SET Name = 'fun'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'sqiggl' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'palooza' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-len"></a>
### len<=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'fun' });
result.should.equal("UPDATE Names  SET Name = 'fun'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'sqiggl' });
result.should.equal("UPDATE Names  SET Name = 'sqiggl'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'palooza' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-len"></a>
### !len<
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'fun' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'sqiggl' });
result.should.equal("UPDATE Names  SET Name = 'sqiggl'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'palooza' });
result.should.equal("UPDATE Names  SET Name = 'palooza'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-len"></a>
### !len<=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'fun' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'sqiggl' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'palooza' });
result.should.equal("UPDATE Names  SET Name = 'palooza'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-is-nan"></a>
### is NaN
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-is-not-nan"></a>
### is not NaN
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-is-nan"></a>
### is !NaN
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-"></a>
### ><
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 15 });
result.should.equal("UPDATE Names  SET Name = '15'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal to the low number.

```js
var result = SQiggL.parse(query, { example: 10 });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal to the high number.

```js
var result = SQiggL.parse(query, { example: 20 });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if below the low number.

```js
var result = SQiggL.parse(query, { example: 5 });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if above the high number.

```js
var result = SQiggL.parse(query, { example: 25 });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-"></a>
### >!<
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 15 });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal to the low number.

```js
var result = SQiggL.parse(query, { example: 10 });
result.should.equal("UPDATE Names  SET Name = '10'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal to the high number.

```js
var result = SQiggL.parse(query, { example: 20 });
result.should.equal("UPDATE Names  SET Name = '20'  WHERE Name = 'Awesome'");
```

should provide a correct result if below the low number.

```js
var result = SQiggL.parse(query, { example: 5 });
result.should.equal("UPDATE Names  SET Name = '5'  WHERE Name = 'Awesome'");
```

should provide a correct result if above the high number.

```js
var result = SQiggL.parse(query, { example: 25 });
result.should.equal("UPDATE Names  SET Name = '25'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-if-"></a>
### >=<
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 15 });
result.should.equal("UPDATE Names  SET Name = '15'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal to the low number.

```js
var result = SQiggL.parse(query, { example: 10 });
result.should.equal("UPDATE Names  SET Name = '10'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal to the high number.

```js
var result = SQiggL.parse(query, { example: 20 });
result.should.equal("UPDATE Names  SET Name = '20'  WHERE Name = 'Awesome'");
```

should provide a correct result if below the low number.

```js
var result = SQiggL.parse(query, { example: 5 });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if above the high number.

```js
var result = SQiggL.parse(query, { example: 25 });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless"></a>
## unless
<a name="full-feature-sweep-unless-is-null"></a>
### is null
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { penny: '12' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-is-not-null"></a>
### is not null
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { penny: '14' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-is-null"></a>
### is !null
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { penny: '14' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-"></a>
### =
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-"></a>
### ==
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-"></a>
### !=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = '14'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-"></a>
### !==
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = '14'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-"></a>
### >
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = '14'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '9' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-"></a>
### >=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = '14'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '9' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-"></a>
### !>
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '9' });
result.should.equal("UPDATE Names  SET Name = '9'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-"></a>
### !>=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '9' });
result.should.equal("UPDATE Names  SET Name = '9'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-"></a>
### <
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '9' });
result.should.equal("UPDATE Names  SET Name = '9'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-"></a>
### <=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '9' });
result.should.equal("UPDATE Names  SET Name = '9'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-"></a>
### !<
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '9' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = '14'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-"></a>
### !<=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '9' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '14' });
result.should.equal("UPDATE Names  SET Name = '14'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-abc"></a>
### abc>
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'hello' });
result.should.equal("UPDATE Names  SET Name = 'hello'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'awkward' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-abc"></a>
### abc>=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'hello' });
result.should.equal("UPDATE Names  SET Name = 'hello'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'dragon'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'awkward' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-abc"></a>
### !abc>
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'hello' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'dragon'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'awkward' });
result.should.equal("UPDATE Names  SET Name = 'awkward'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-abc"></a>
### !abc>=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'hello' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'awkward' });
result.should.equal("UPDATE Names  SET Name = 'awkward'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-abc"></a>
### abc<
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'awkward' });
result.should.equal("UPDATE Names  SET Name = 'awkward'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'hello' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-abc"></a>
### abc<=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'awkward' });
result.should.equal("UPDATE Names  SET Name = 'awkward'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'dragon'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'hello' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-abc"></a>
### !abc<
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'awkward' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'dragon'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'hello' });
result.should.equal("UPDATE Names  SET Name = 'hello'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-abc"></a>
### !abc<=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'awkward' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'hello' });
result.should.equal("UPDATE Names  SET Name = 'hello'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-len"></a>
### len>
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'palooza' });
result.should.equal("UPDATE Names  SET Name = 'palooza'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'sqiggl' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'fun' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-len"></a>
### len>=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'palooza' });
result.should.equal("UPDATE Names  SET Name = 'palooza'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'sqiggl' });
result.should.equal("UPDATE Names  SET Name = 'sqiggl'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'fun' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-len"></a>
### !len>
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'palooza' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'sqiggl' });
result.should.equal("UPDATE Names  SET Name = 'sqiggl'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'fun' });
result.should.equal("UPDATE Names  SET Name = 'fun'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-len"></a>
### !len>=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'palooza' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'sqiggl' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'fun' });
result.should.equal("UPDATE Names  SET Name = 'fun'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-len"></a>
### len<
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'fun' });
result.should.equal("UPDATE Names  SET Name = 'fun'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'sqiggl' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'palooza' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-len"></a>
### len<=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'fun' });
result.should.equal("UPDATE Names  SET Name = 'fun'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'sqiggl' });
result.should.equal("UPDATE Names  SET Name = 'sqiggl'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'palooza' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-len"></a>
### !len<
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'fun' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'sqiggl' });
result.should.equal("UPDATE Names  SET Name = 'sqiggl'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'palooza' });
result.should.equal("UPDATE Names  SET Name = 'palooza'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-len"></a>
### !len<=
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'fun' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal.

```js
var result = SQiggL.parse(query, { example: 'sqiggl' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'palooza' });
result.should.equal("UPDATE Names  SET Name = 'palooza'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-is-nan"></a>
### is NaN
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-is-not-nan"></a>
### is not NaN
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-is-nan"></a>
### is !NaN
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: '12' });
result.should.equal("UPDATE Names  SET Name = '12'  WHERE Name = 'Awesome'");
```

should provide a correct result if false.

```js
var result = SQiggL.parse(query, { example: 'dragon' });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-"></a>
### ><
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 15 });
result.should.equal("UPDATE Names  SET Name = '15'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal to the low number.

```js
var result = SQiggL.parse(query, { example: 10 });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal to the high number.

```js
var result = SQiggL.parse(query, { example: 20 });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if below the low number.

```js
var result = SQiggL.parse(query, { example: 5 });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if above the high number.

```js
var result = SQiggL.parse(query, { example: 25 });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-"></a>
### >!<
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 15 });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal to the low number.

```js
var result = SQiggL.parse(query, { example: 10 });
result.should.equal("UPDATE Names  SET Name = '10'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal to the high number.

```js
var result = SQiggL.parse(query, { example: 20 });
result.should.equal("UPDATE Names  SET Name = '20'  WHERE Name = 'Awesome'");
```

should provide a correct result if below the low number.

```js
var result = SQiggL.parse(query, { example: 5 });
result.should.equal("UPDATE Names  SET Name = '5'  WHERE Name = 'Awesome'");
```

should provide a correct result if above the high number.

```js
var result = SQiggL.parse(query, { example: 25 });
result.should.equal("UPDATE Names  SET Name = '25'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-unless-"></a>
### >=<
should provide a correct result if true.

```js
var result = SQiggL.parse(query, { example: 15 });
result.should.equal("UPDATE Names  SET Name = '15'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal to the low number.

```js
var result = SQiggL.parse(query, { example: 10 });
result.should.equal("UPDATE Names  SET Name = '10'  WHERE Name = 'Awesome'");
```

should provide a correct result if equal to the high number.

```js
var result = SQiggL.parse(query, { example: 20 });
result.should.equal("UPDATE Names  SET Name = '20'  WHERE Name = 'Awesome'");
```

should provide a correct result if below the low number.

```js
var result = SQiggL.parse(query, { example: 5 });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

should provide a correct result if above the high number.

```js
var result = SQiggL.parse(query, { example: 25 });
result.should.equal("UPDATE Names  SET Name = 'Cow'  WHERE Name = 'Awesome'");
```

<a name="full-feature-sweep-query-with-newlines"></a>
## "query with newlines"
should accept newlines in queries.

```js
var sql = "UPDATE Names\n{% if example is not null }\nSET Name = '{example}'\n{% else } SET Name = 'Cow'\n{% endif }\nWHERE Name = 'Awesome'";
var result = "UPDATE Names\n\nSET Name = 'Dragon'\n\nWHERE Name = 'Awesome'";
var actual = SQiggL.parse(sql, { example: 'Dragon' });
actual.should.equal(result);
```