UNPKG

11.2 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6var assert_1 = __importDefault(require("assert"));
7var CucumberExpressionGenerator_1 = __importDefault(require("../src/CucumberExpressionGenerator"));
8var CucumberExpression_1 = __importDefault(require("../src/CucumberExpression"));
9var ParameterType_1 = __importDefault(require("../src/ParameterType"));
10var ParameterTypeRegistry_1 = __importDefault(require("../src/ParameterTypeRegistry"));
11var Currency = /** @class */ (function () {
12 function Currency(s) {
13 this.s = s;
14 }
15 return Currency;
16}());
17describe('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 // TODO: prefers widest match
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 // While you would expect this to be `I reach Stage {int}: {optional-flight} -{optional-hotel}` the `-1` causes
107 // {int} to match just before {optional-hotel}.
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 // This would otherwise generate 4^11=419430 expressions and consume just shy of 1.5GB.
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//# sourceMappingURL=CucumberExpressionGeneratorTest.js.map
\No newline at end of file