jBehave should be more intelligent/flexible with regards to prioritisation of steps

Description

BDD's strength relies on being able to write fluent scenarios. jBehave's support for this is very good, but there is still room for improvement. For example a typical scenario might read...

Scenario: Schedule Patient Discharge

Given a medical patient called Bob Holness who is not medically fit
When I change Bob's state to medically fit
And select a discharge time of tomorrow morning
And select a discharge complexity of 3
Then Bob's discharge schedule should be displayed on the ward board

Now in a related scenario let's say I want to cancel while rescheduling a discharge...

Scenario: Cancel Rescheduling Patient Discharge

Given a medical patient called Bob Holness who already has a discharge schedule
When I reiterate that Bob's state is medically fit
And select a discharge time of tomorrow morning
And cancel the discharge schedule
Then Bob's old discharge schedule should be displayed on the ward board

The underlying implementation of assserting Bob's actual discharge schedule is the same, but I want to emphasise the expression of intent through use of words such as old, new, still, etc.

jBehave partially supports this through aliases

MySteps.java

The trouble is that the above fails because of the way in which jBehave matches and prioritises steps. Both "Then" and "Alias" steps will match the sentence
"Bob's old discharge schedule should be displayed on the ward board", but "Then" will be prioritised based on it's declaration order, causing the value "Bob's old" to be passed to the PatientParameterConverter. Since no patient exists with the name "Bob's old", the parameter converter will return null and the test fails.

Currently the workaround is to reword the steps slightly to prevent both of them matching...

Then "Bob's" discharge schedule should be displayed on the ward board
Then "Bob's" old discharge schedule should be displayed on the ward board

or

Then Bob's discharge schedule should be displayed on the ward board
Then Bob's old discharge schedule should now be displayed on the ward board

but both are inferior to the original. A nicer (and fairly easy) solution would be to base this priortisation on similarity with the string step, using something like the Levenshtein distance. Harder, but better yet would be to make the prioritsation configurable.

I've attached the first solution (with lots of printlns so you can see how well the prioriisation works).

Assignee

Unassigned

Reporter

Stephen Cresswell

Labels

None

Components

Fix versions

Priority

Minor
Configure