Allows optionally rendering content if an argument is given. The expression is designed to be used with `optional` parameters. Goal is to allow using `RunPowerShell` function on every function that consists of PowerShell code. Before this commit, they were all required to provide revertCode, or none of them could be able to have it. It would not work because some scripts can be reverted, meanwhile some are one-way scripts that cannot be reverted (such as cleaning scripts). In this case a way to optionally render revertCode was required. `with` expression give each callee script ability to turn off `revertCode` if not needed, therefore enables using `RunPowerShell` everywhere. This commit also improves error message for script code for better debugging and refactors parser tests for more code reuse. It also adds more tests to parameter substitution, and renames some tests of both expressions for consistency.
142 lines
5.7 KiB
TypeScript
142 lines
5.7 KiB
TypeScript
import 'mocha';
|
|
import { ExpressionPosition } from '@/application/Parser/Script/Compiler/Expressions/Expression/ExpressionPosition';
|
|
import { WithParser } from '@/application/Parser/Script/Compiler/Expressions/SyntaxParsers/WithParser';
|
|
import { SyntaxParserTestsRunner } from './SyntaxParserTestsRunner';
|
|
|
|
describe('WithParser', () => {
|
|
const sut = new WithParser();
|
|
const runner = new SyntaxParserTestsRunner(sut);
|
|
describe('finds as expected', () => {
|
|
runner.expectPosition(
|
|
|
|
{
|
|
name: 'when no scope is not used',
|
|
code: 'hello {{ with $parameter }}no usage{{ end }} here',
|
|
expected: [ new ExpressionPosition(6, 44) ],
|
|
},
|
|
{
|
|
name: 'when scope is used',
|
|
code: 'used here ({{ with $parameter }}value: {{ . }}{{ end }})',
|
|
expected: [ new ExpressionPosition(11, 55) ],
|
|
},
|
|
{
|
|
name: 'when used twice',
|
|
code: 'first: {{ with $parameter }}value: {{ . }}{{ end }}, second: {{ with $parameter }}no usage{{ end }}',
|
|
expected: [ new ExpressionPosition(7, 51), new ExpressionPosition(61, 99) ],
|
|
},
|
|
{
|
|
name: 'tolerates lack of spaces around brackets',
|
|
code: 'no whitespaces {{with $parameter}}value: {{.}}{{end}}',
|
|
expected: [ new ExpressionPosition(15, 53) ],
|
|
},
|
|
{
|
|
name: 'does not tolerate space after dollar sign',
|
|
code: 'used here ({{ with $ parameter }}value: {{ . }}{{ end }})',
|
|
expected: [ ],
|
|
},
|
|
);
|
|
});
|
|
describe('ignores when syntax is unexpected', () => {
|
|
runner.expectPosition(
|
|
{
|
|
name: 'does not tolerate whitespace after with',
|
|
code: '{{with $ parameter}}value: {{ . }}{{ end }}',
|
|
expected: [ ],
|
|
},
|
|
{
|
|
name: 'does not tolerate whitespace before dollar',
|
|
code: '{{ with$parameter}}value: {{ . }}{{ end }}',
|
|
expected: [ ],
|
|
},
|
|
);
|
|
});
|
|
describe('ignores trailing and leading whitespaces and newlines inside scope', () => {
|
|
runner.expectResults(
|
|
{
|
|
name: 'does not render trailing whitespace after value',
|
|
code: '{{ with $parameter }}{{ . }}! {{ end }}',
|
|
args: (args) => args
|
|
.withArgument('parameter', 'Hello world'),
|
|
expected: [ 'Hello world!' ],
|
|
},
|
|
{
|
|
name: 'does not render trailing newline after value',
|
|
code: '{{ with $parameter }}{{ . }}!\r\n{{ end }}',
|
|
args: (args) => args
|
|
.withArgument('parameter', 'Hello world'),
|
|
expected: [ 'Hello world!' ],
|
|
},
|
|
{
|
|
name: 'does not render leading newline before value',
|
|
code: '{{ with $parameter }}\r\n{{ . }}!{{ end }}',
|
|
args: (args) => args
|
|
.withArgument('parameter', 'Hello world'),
|
|
expected: [ 'Hello world!' ],
|
|
},
|
|
{
|
|
name: 'does not render leading whitespace before value',
|
|
code: '{{ with $parameter }} {{ . }}!{{ end }}',
|
|
args: (args) => args
|
|
.withArgument('parameter', 'Hello world'),
|
|
expected: [ 'Hello world!' ],
|
|
},
|
|
);
|
|
});
|
|
describe('does not render scope if argument is undefined', () => {
|
|
runner.expectResults(
|
|
{
|
|
name: 'does not render when value is undefined',
|
|
code: '{{ with $parameter }}dark{{ end }} ',
|
|
args: (args) => args
|
|
.withArgument('parameter', undefined),
|
|
expected: [ '' ],
|
|
},
|
|
{
|
|
name: 'does not render when value is empty',
|
|
code: '{{ with $parameter }}dark {{.}}{{ end }}',
|
|
args: (args) => args
|
|
.withArgument('parameter', ''),
|
|
expected: [ '' ],
|
|
},
|
|
{
|
|
name: 'does not render when argument is not provided',
|
|
code: '{{ with $parameter }}dark{{ end }}',
|
|
args: (args) => args,
|
|
expected: [ '' ],
|
|
},
|
|
);
|
|
});
|
|
describe('renders scope as expected', () => {
|
|
runner.expectResults(
|
|
{
|
|
name: 'renders scope even if value is not used',
|
|
code: '{{ with $parameter }}Hello world!{{ end }}',
|
|
args: (args) => args
|
|
.withArgument('parameter', 'Hello'),
|
|
expected: [ 'Hello world!' ],
|
|
},
|
|
{
|
|
name: 'renders value when it has value',
|
|
code: '{{ with $parameter }}{{ . }} world!{{ end }}',
|
|
args: (args) => args
|
|
.withArgument('parameter', 'Hello'),
|
|
expected: [ 'Hello world!' ],
|
|
},
|
|
{
|
|
name: 'renders value when whitespaces around brackets are missing',
|
|
code: '{{ with $parameter }}{{.}} world!{{ end }}',
|
|
args: (args) => args
|
|
.withArgument('parameter', 'Hello'),
|
|
expected: [ 'Hello world!' ],
|
|
},
|
|
{
|
|
name: 'renders value multiple times when it\'s used multiple times',
|
|
code: '{{ with $letterL }}He{{ . }}{{ . }}o wor{{ . }}d!{{ end }}',
|
|
args: (args) => args
|
|
.withArgument('letterL', 'l'),
|
|
expected: [ 'Hello world!' ],
|
|
},
|
|
);
|
|
});
|
|
});
|