Skip to content

Commit 6118aba

Browse files
authored
Affordances for suggestions/snippets (#13)
1 parent 2b260bf commit 6118aba

File tree

9 files changed

+47
-6
lines changed

9 files changed

+47
-6
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

88
## [Unreleased]
9+
### Added
10+
- Add `pickleStep` to `UndefinedError` ([#13](https://github.com/cucumber/javascript-core/pull/13))
11+
- Add `getExpressionGenerator()` to `SupportCodeLibrary` ([#13](https://github.com/cucumber/javascript-core/pull/13))
912

1013
## [0.4.1] - 2025-09-05
1114
### Fixed

cucumber-core.api.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@
66

77
import { Argument } from '@cucumber/cucumber-expressions';
88
import { CucumberExpression } from '@cucumber/cucumber-expressions';
9+
import { CucumberExpressionGenerator } from '@cucumber/cucumber-expressions';
910
import { Envelope } from '@cucumber/messages';
1011
import { GherkinDocument } from '@cucumber/messages';
1112
import { Hook } from '@cucumber/messages';
1213
import { IdGenerator } from '@cucumber/messages';
1314
import { NamingStrategy } from '@cucumber/query';
1415
import parse from '@cucumber/tag-expressions';
1516
import { Pickle } from '@cucumber/messages';
17+
import { PickleStep } from '@cucumber/messages';
1618
import { RegularExpression } from '@cucumber/cucumber-expressions';
1719
import { SourceReference } from '@cucumber/messages';
1820
import { StepDefinition } from '@cucumber/messages';
@@ -179,6 +181,7 @@ export interface SupportCodeLibrary {
179181
findAllStepsBy(text: string): ReadonlyArray<MatchedStep>;
180182
getAllAfterAllHooks(): ReadonlyArray<DefinedTestRunHook>;
181183
getAllBeforeAllHooks(): ReadonlyArray<DefinedTestRunHook>;
184+
getExpressionGenerator(): CucumberExpressionGenerator;
182185
toEnvelopes(): ReadonlyArray<Envelope>;
183186
}
184187

@@ -203,7 +206,9 @@ export interface TestPlanOptions {
203206

204207
// @public
205208
export class UndefinedError extends Error {
206-
constructor(text: string);
209+
constructor(pickleStep: PickleStep);
210+
// (undocumented)
211+
readonly pickleStep: PickleStep;
207212
}
208213

209214
// @public

src/SupportCodeBuilderImpl.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ export class SupportCodeBuilderImpl implements SupportCodeBuilder {
275275

276276
build() {
277277
return new SupportCodeLibraryImpl(
278+
this.parameterTypeRegistry,
278279
this.buildParameterTypes(),
279280
this.buildSteps(),
280281
this.buildUndefinedParameterTypes(),

src/SupportCodeLibraryImpl.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { CucumberExpressionGenerator, ParameterTypeRegistry } from '@cucumber/cucumber-expressions'
2+
13
import {
24
DefinedParameterType,
35
DefinedStep,
@@ -13,6 +15,7 @@ import {
1315
*/
1416
export class SupportCodeLibraryImpl implements SupportCodeLibrary {
1517
constructor(
18+
private readonly parameterTypeRegistry: ParameterTypeRegistry,
1619
private readonly parameterTypes: ReadonlyArray<DefinedParameterType> = [],
1720
private readonly steps: ReadonlyArray<DefinedStep> = [],
1821
private readonly undefinedParameterTypes: ReadonlyArray<UndefinedParameterType> = [],
@@ -36,6 +39,10 @@ export class SupportCodeLibraryImpl implements SupportCodeLibrary {
3639
return results
3740
}
3841

42+
getExpressionGenerator(): CucumberExpressionGenerator {
43+
return new CucumberExpressionGenerator(() => this.parameterTypeRegistry.parameterTypes)
44+
}
45+
3946
findAllBeforeHooksBy(tags: ReadonlyArray<string>) {
4047
return this.beforeHooks.filter((def) => {
4148
if (def.tags) {

src/UndefinedError.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import { PickleStep } from '@cucumber/messages'
2+
13
/**
24
* Represents an error that occurs when no step definitions are found matching the text of a step
35
* @public
46
*/
57
export class UndefinedError extends Error {
6-
constructor(text: string) {
7-
super(`No matching step definitions found for text "${text}"`)
8+
constructor(public readonly pickleStep: PickleStep) {
9+
super(`No matching step definitions found for text "${pickleStep.text}"`)
810
}
911
}

src/buildSupportCode.spec.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,15 @@ describe('buildSupportCode', () => {
336336
})
337337
})
338338

339+
describe('expression generator', () => {
340+
it('returns a cucumber expression generator primed with the parameter type registry', () => {
341+
const library = buildSupportCode({ newId }).build()
342+
const expressionGenerator = library.getExpressionGenerator()
343+
const expressions = expressionGenerator.generateExpressions('I have 17 cukes in my belly')
344+
expect(expressions.length).to.eq(2)
345+
})
346+
})
347+
339348
describe('test run hooks', () => {
340349
let library: SupportCodeLibrary
341350
beforeEach(() => {

src/makeTestPlan.spec.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,12 @@ describe('makeTestPlan', () => {
168168
}
169169
)
170170

171-
expect(() => result.testCases[0].testSteps[0].prepare(undefined)).to.throw(UndefinedError)
171+
try {
172+
result.testCases[0].testSteps[0].prepare(undefined)
173+
} catch (err: any) {
174+
expect(err).to.be.instanceOf(UndefinedError)
175+
expect(err.pickleStep).to.eq(pickles[0].steps[0])
176+
}
172177
})
173178

174179
it('matches and prepares a step without parameters', () => {

src/makeTestPlan.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ function fromPickleSteps(
178178
always: false,
179179
prepare(thisArg) {
180180
if (matched.length < 1) {
181-
throw new UndefinedError(pickleStep.text)
181+
throw new UndefinedError(pickleStep)
182182
} else if (matched.length > 1) {
183183
throw new AmbiguousError(
184184
pickleStep.text,

src/types.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { Argument, CucumberExpression, RegularExpression } from '@cucumber/cucumber-expressions'
1+
import {
2+
Argument,
3+
CucumberExpression,
4+
CucumberExpressionGenerator,
5+
RegularExpression,
6+
} from '@cucumber/cucumber-expressions'
27
import {
38
Envelope,
49
GherkinDocument,
@@ -329,6 +334,10 @@ export interface SupportCodeLibrary {
329334
* Find all step definitions whose expression is a match for the given text
330335
*/
331336
findAllStepsBy(text: string): ReadonlyArray<MatchedStep>
337+
/**
338+
* Get a generator for Cucumber Expressions based on the currently defined parameter types
339+
*/
340+
getExpressionGenerator(): CucumberExpressionGenerator
332341
/**
333342
* Get all BeforeAll hooks
334343
*/

0 commit comments

Comments
 (0)