1 | "use strict";
|
2 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
3 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
4 | };
|
5 | Object.defineProperty(exports, "__esModule", { value: true });
|
6 | var assert_1 = __importDefault(require("assert"));
|
7 | var CucumberExpressionGenerator_1 = __importDefault(require("../src/CucumberExpressionGenerator"));
|
8 | var CucumberExpression_1 = __importDefault(require("../src/CucumberExpression"));
|
9 | var ParameterType_1 = __importDefault(require("../src/ParameterType"));
|
10 | var ParameterTypeRegistry_1 = __importDefault(require("../src/ParameterTypeRegistry"));
|
11 | var Currency = (function () {
|
12 | function Currency(s) {
|
13 | this.s = s;
|
14 | }
|
15 | return Currency;
|
16 | }());
|
17 | describe('CucumberExpressionGenerator', function () {
|
18 | var parameterTypeRegistry;
|
19 | var generator;
|
20 | function assertExpression(expectedExpression, expectedArgumentNames, text) {
|
21 | var generatedExpression = generator.generateExpressions(text)[0];
|
22 | assert_1.default.deepStrictEqual(generatedExpression.parameterNames, expectedArgumentNames);
|
23 | assert_1.default.strictEqual(generatedExpression.source, expectedExpression);
|
24 | var cucumberExpression = new CucumberExpression_1.default(generatedExpression.source, parameterTypeRegistry);
|
25 | var match = cucumberExpression.match(text);
|
26 | if (match === null) {
|
27 | assert_1.default.fail("Expected text '" + text + "' to match generated expression '" + generatedExpression.source + "'");
|
28 | }
|
29 | assert_1.default.strictEqual(match.length, expectedArgumentNames.length);
|
30 | }
|
31 | beforeEach(function () {
|
32 | parameterTypeRegistry = new ParameterTypeRegistry_1.default();
|
33 | generator = new CucumberExpressionGenerator_1.default(parameterTypeRegistry);
|
34 | });
|
35 | it('documents expression generation', function () {
|
36 | parameterTypeRegistry = new ParameterTypeRegistry_1.default();
|
37 | generator = new CucumberExpressionGenerator_1.default(parameterTypeRegistry);
|
38 | var undefinedStepText = 'I have 2 cucumbers and 1.5 tomato';
|
39 | var generatedExpression = generator.generateExpressions(undefinedStepText)[0];
|
40 | assert_1.default.strictEqual(generatedExpression.source, 'I have {int} cucumbers and {float} tomato');
|
41 | assert_1.default.strictEqual(generatedExpression.parameterNames[0], 'int');
|
42 | assert_1.default.strictEqual(generatedExpression.parameterTypes[1].name, 'float');
|
43 | });
|
44 | it('generates expression for no args', function () {
|
45 | assertExpression('hello', [], 'hello');
|
46 | });
|
47 | it('generates expression with escaped left parenthesis', function () {
|
48 | assertExpression('\\(iii)', [], '(iii)');
|
49 | });
|
50 | it('generates expression with escaped left curly brace', function () {
|
51 | assertExpression('\\{iii}', [], '{iii}');
|
52 | });
|
53 | it('generates expression with escaped slashes', function () {
|
54 | assertExpression('The {int}\\/{int}\\/{int} hey', ['int', 'int2', 'int3'], 'The 1814/05/17 hey');
|
55 | });
|
56 | it('generates expression for int float arg', function () {
|
57 | assertExpression('I have {int} cukes and {float} euro', ['int', 'float'], 'I have 2 cukes and 1.5 euro');
|
58 | });
|
59 | it('generates expression for strings', function () {
|
60 | assertExpression('I like {string} and {string}', ['string', 'string2'], 'I like "bangers" and \'mash\'');
|
61 | });
|
62 | it('generates expression with % sign', function () {
|
63 | assertExpression('I am {int}%% foobar', ['int'], 'I am 20%% foobar');
|
64 | });
|
65 | it('generates expression for just int', function () {
|
66 | assertExpression('{int}', ['int'], '99999');
|
67 | });
|
68 | it('numbers only second argument when builtin type is not reserved keyword', function () {
|
69 | assertExpression('I have {float} cukes and {float} euro', ['float', 'float2'], 'I have 2.5 cukes and 1.5 euro');
|
70 | });
|
71 | it('generates expression for custom type', function () {
|
72 | parameterTypeRegistry.defineParameterType(new ParameterType_1.default('currency', /[A-Z]{3}/, Currency, function (s) { return new Currency(s); }, true, false));
|
73 | assertExpression('I have a {currency} account', ['currency'], 'I have a EUR account');
|
74 | });
|
75 | it('prefers leftmost match when there is overlap', function () {
|
76 | parameterTypeRegistry.defineParameterType(new ParameterType_1.default('currency', /c d/, Currency, function (s) { return new Currency(s); }, true, false));
|
77 | parameterTypeRegistry.defineParameterType(new ParameterType_1.default('date', /b c/, Date, function (s) { return new Date(s); }, true, false));
|
78 | assertExpression('a {date} d e f g', ['date'], 'a b c d e f g');
|
79 | });
|
80 |
|
81 | it('generates all combinations of expressions when several parameter types match', function () {
|
82 | parameterTypeRegistry.defineParameterType(new ParameterType_1.default('currency', /x/, null, function (s) { return new Currency(s); }, true, false));
|
83 | parameterTypeRegistry.defineParameterType(new ParameterType_1.default('date', /x/, null, function (s) { return new Date(s); }, true, false));
|
84 | var generatedExpressions = generator.generateExpressions('I have x and x and another x');
|
85 | var expressions = generatedExpressions.map(function (e) { return e.source; });
|
86 | assert_1.default.deepStrictEqual(expressions, [
|
87 | 'I have {currency} and {currency} and another {currency}',
|
88 | 'I have {currency} and {currency} and another {date}',
|
89 | 'I have {currency} and {date} and another {currency}',
|
90 | 'I have {currency} and {date} and another {date}',
|
91 | 'I have {date} and {currency} and another {currency}',
|
92 | 'I have {date} and {currency} and another {date}',
|
93 | 'I have {date} and {date} and another {currency}',
|
94 | 'I have {date} and {date} and another {date}',
|
95 | ]);
|
96 | });
|
97 | it('exposes parameter type names in generated expression', function () {
|
98 | var expression = generator.generateExpressions('I have 2 cukes and 1.5 euro')[0];
|
99 | var typeNames = expression.parameterTypes.map(function (parameter) { return parameter.name; });
|
100 | assert_1.default.deepStrictEqual(typeNames, ['int', 'float']);
|
101 | });
|
102 | it('matches parameter types with optional capture groups', function () {
|
103 | parameterTypeRegistry.defineParameterType(new ParameterType_1.default('optional-flight', /(1st flight)?/, null, function (s) { return s; }, true, false));
|
104 | parameterTypeRegistry.defineParameterType(new ParameterType_1.default('optional-hotel', /(1 hotel)?/, null, function (s) { return s; }, true, false));
|
105 | var expression = generator.generateExpressions('I reach Stage 4: 1st flight -1 hotel')[0];
|
106 |
|
107 |
|
108 | assert_1.default.strictEqual(expression.source, 'I reach Stage {int}: {optional-flight} {int} hotel');
|
109 | });
|
110 | it('generates at most 256 expressions', function () {
|
111 | for (var i = 0; i < 4; i++) {
|
112 | parameterTypeRegistry.defineParameterType(new ParameterType_1.default('my-type-' + i, /([a-z] )*?[a-z]/, null, function (s) { return s; }, true, false));
|
113 | }
|
114 |
|
115 | var expressions = generator.generateExpressions('a s i m p l e s t e p');
|
116 | assert_1.default.strictEqual(expressions.length, 256);
|
117 | });
|
118 | it('prefers expression with longest non empty match', function () {
|
119 | parameterTypeRegistry.defineParameterType(new ParameterType_1.default('zero-or-more', /[a-z]*/, null, function (s) { return s; }, true, false));
|
120 | parameterTypeRegistry.defineParameterType(new ParameterType_1.default('exactly-one', /[a-z]/, null, function (s) { return s; }, true, false));
|
121 | var expressions = generator.generateExpressions('a simple step');
|
122 | assert_1.default.strictEqual(expressions.length, 2);
|
123 | assert_1.default.strictEqual(expressions[0].source, '{exactly-one} {zero-or-more} {zero-or-more}');
|
124 | assert_1.default.strictEqual(expressions[1].source, '{zero-or-more} {zero-or-more} {zero-or-more}');
|
125 | });
|
126 | it('does not suggest parameter included at the beginning of a word', function () {
|
127 | parameterTypeRegistry.defineParameterType(new ParameterType_1.default('direction', /(up|down)/, null, function (s) { return s; }, true, false));
|
128 | var expressions = generator.generateExpressions('I download a picture');
|
129 | assert_1.default.strictEqual(expressions.length, 1);
|
130 | assert_1.default.notEqual(expressions[0].source, 'I {direction}load a picture');
|
131 | assert_1.default.strictEqual(expressions[0].source, 'I download a picture');
|
132 | });
|
133 | it('does not suggest parameter included inside a word', function () {
|
134 | parameterTypeRegistry.defineParameterType(new ParameterType_1.default('direction', /(up|down)/, null, function (s) { return s; }, true, false));
|
135 | var expressions = generator.generateExpressions('I watch the muppet show');
|
136 | assert_1.default.strictEqual(expressions.length, 1);
|
137 | assert_1.default.notEqual(expressions[0].source, 'I watch the m{direction}pet show');
|
138 | assert_1.default.strictEqual(expressions[0].source, 'I watch the muppet show');
|
139 | });
|
140 | it('does not suggest parameter at the end of a word', function () {
|
141 | parameterTypeRegistry.defineParameterType(new ParameterType_1.default('direction', /(up|down)/, null, function (s) { return s; }, true, false));
|
142 | var expressions = generator.generateExpressions('I create a group');
|
143 | assert_1.default.strictEqual(expressions.length, 1);
|
144 | assert_1.default.notEqual(expressions[0].source, 'I create a gro{direction}');
|
145 | assert_1.default.strictEqual(expressions[0].source, 'I create a group');
|
146 | });
|
147 | it('does suggest parameter that are a full word', function () {
|
148 | parameterTypeRegistry.defineParameterType(new ParameterType_1.default('direction', /(up|down)/, null, function (s) { return s; }, true, false));
|
149 | assert_1.default.strictEqual(generator.generateExpressions("When I go down the road")[0].source, "When I go {direction} the road");
|
150 | assert_1.default.strictEqual(generator.generateExpressions("When I walk up the hill")[0].source, "When I walk {direction} the hill");
|
151 | assert_1.default.strictEqual(generator.generateExpressions("up the hill, the road goes down")[0].source, "{direction} the hill, the road goes {direction}");
|
152 | });
|
153 | it('does not consider punctuation as being part of a word', function () {
|
154 | parameterTypeRegistry.defineParameterType(new ParameterType_1.default('direction', /(up|down)/, null, function (s) { return s; }, true, false));
|
155 | assert_1.default.strictEqual(generator.generateExpressions("direction is:down")[0].source, "direction is:{direction}");
|
156 | assert_1.default.strictEqual(generator.generateExpressions("direction is down.")[0].source, "direction is {direction}.");
|
157 | });
|
158 | });
|
159 |
|
\ | No newline at end of file |