[ 
https://jira.codehaus.org/browse/JBEHAVE-748?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=295002#comment-295002
 ] 

Arjan van Bentem edited comment on JBEHAVE-748 at 3/23/12 5:12 PM:
-------------------------------------------------------------------

For 3.6-SNAPSHOT, things seem to be worse. Even when fully surrounded with 
whitespace, it seems the values from any {{Examples:}} table are always 
preferred, if a parameter name happens to match a name from such {{Examples:}} 
table.

For 3.6-SNAPSHOT:

{code}
@Test
public void shouldNotCreateStepFromTableValuesViaAnnotations() throws Exception 
{
    StoryReporter reporter = mock(StoryReporter.class);
    AnnotationNamedParameterSteps steps = new AnnotationNamedParameterSteps();
    // Parameter values from an Examples table should NOT be used in this test
    // (but: they are).
    // When removing the next two lines, or when using a different name for 
    // BOTH "ith" and "nth", then all is fine. (In 3.5.4, only "ith" needs to
    // be removed or renamed; in 3.6-SNAPSHOT both.)
    namedParameters.put("ith", "first");
    namedParameters.put("nth", "ground");
    // In 3.5.4, even with the above namedParameters as provided, the following
    // pattern only failed when some non-whitespace followed the parameter, like
    // when adding a comma after "$ith":
    //   String patternAsString = "I live on the $ith, but some call it the 
$nth";
    // In 3.6-SNAPSHOT, this fails without that comma too.
    String patternAsString = "I live on the $ith but some call it the $nth";
    Method method = stepMethodFor("methodWithNamedParametersInNaturalOrder", 
AnnotationNamedParameterSteps.class);
    StepCandidate candidate = candidateWith(patternAsString, WHEN, method, 
steps);
    StepResult result =candidate.createMatchedStep("When I live on the top but 
some call it the penthouse", namedParameters)
            .perform(null);
    // Will fail in both 3.5.4 and in 3.6-SNAPSHOT:
    // java.lang.AssertionError: Expected: "top" got: "first"
    assertThat(steps.ith, equalTo("top"));
    // Will fail in 3.6-SNAPSHOT:
    // java.lang.AssertionError: Expected: "penthouse" got: "ground"
    assertThat(steps.nth, equalTo("penthouse"));
    result.describeTo(reporter);
    verify(reporter).successful(
            "When I live on the " + PARAMETER_VALUE_START + "top" + 
PARAMETER_VALUE_END + ", but some call it the " + PARAMETER_VALUE_START + 
"penthouse" + PARAMETER_VALUE_END );
}
{code}
                
      was (Author: avbentem):
    For 3.6-SNAPSHOT, things seem to be worse. Even when fully surrounded with 
whitespace, it seems the values from any {{Examples:}} table are always 
preferred, if a parameter name happens to match a name from such {{Examples:}} 
table.

For 3.6-SNAPSHOT:

{code}
@Test
public void shouldNotCreateStepFromTableValuesViaAnnotations() throws Exception 
{
    StoryReporter reporter = mock(StoryReporter.class);
    AnnotationNamedParameterSteps steps = new AnnotationNamedParameterSteps();
    // Parameter values from an Examples table should NOT be used in this test
    // (but: they are).
    // When removing the next two lines, or when using a different name for 
    // BOTH "ith" and "nth", then all is fine. (In 3.5.4, only "ith" needs to
    // be removed or renamed; in 3.6-SNAPSHOT both.)
    namedParameters.put("ith", "first");
    namedParameters.put("nth", "ground");
    // In 3.5.4, even with the above namedParameters as provided, the following
    // pattern worked fine if $ith was fully surrounded with whitespace, like:
    //   String patternAsString = "I live on the $ith but some call it the 
$nth";
    // (but not when a comma follows the parameter name). In 3.6-SNAPSHOT, this
    // fails with full whitespace too. In 3.6, the values from an Examples table
    // are always preferred over the values specified in the step?
    String patternAsString = "I live on the $ith but some call it the $nth";
    Method method = stepMethodFor("methodWithNamedParametersInNaturalOrder", 
AnnotationNamedParameterSteps.class);
    StepCandidate candidate = candidateWith(patternAsString, WHEN, method, 
steps);
    StepResult result =candidate.createMatchedStep("When I live on the top but 
some call it the penthouse", namedParameters)
            .perform(null);
    // Will fail in both 3.5.4 and in 3.6-SNAPSHOT:
    // java.lang.AssertionError: Expected: "top" got: "first"
    assertThat(steps.ith, equalTo("top"));
    // Will fail in 3.6-SNAPSHOT:
    // java.lang.AssertionError: Expected: "penthouse" got: "ground"
    assertThat(steps.nth, equalTo("penthouse"));
    result.describeTo(reporter);
    verify(reporter).successful(
            "When I live on the " + PARAMETER_VALUE_START + "top" + 
PARAMETER_VALUE_END + ", but some call it the " + PARAMETER_VALUE_START + 
"penthouse" + PARAMETER_VALUE_END );
}
{code}
                  
> When @Named parameter matches name in Example table, it might be injected for 
> steps that do not reference it
> ------------------------------------------------------------------------------------------------------------
>
>                 Key: JBEHAVE-748
>                 URL: https://jira.codehaus.org/browse/JBEHAVE-748
>             Project: JBehave
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 3.5.4
>         Environment: Windows 7, Java 6
>            Reporter: Arjan van Bentem
>
> When a step with @Named parameters is used in a scenario that uses an Example 
> table for SOME of its steps, but for this specific step is given some 
> explicit value, then IF the parameter name is not fully surrounded with 
> whitespace AND it matches a name from the Examples table, then the given 
> value is ignored. Instead, the value from the Examples table is injected.
> If the parameter name is unrelated to anything in the Examples table, then 
> all is fine, even when the parameter is not fully surrounded with whitespace.
> (This is slightly related to http://jira.codehaus.org/browse/JBEHAVE-646)
> For example, all fine:
> {code}
> @Given("I have <a> and <b>")
> public void givenAAndB(@Named("a") String myA, @Named("b") String myB) {
>     assertThat(myA).isEqualTo("this");
>     assertThat(myB).isEqualTo("that");
> }
> @When("I do <a>")
> public void whenIDoA(@Named("a") String myA) {
>     assertThat(myA).isEqualTo("this");
> }
> @Then("I see <b>")
> public void thenISeeB(@Named("b") String myB) {
>     assertThat(myB).isEqualTo("that");
> }
> // $x not surrounded by all whitespace, but "x" NOT known in Examples table: 
> all fine
> @When("I did '$x'")
> public void whenIDidX(@Named("x") String myX) {
>     assertThat(myX).isEqualTo("foo");
> }
> {code}
> ...but wrong:
> {code}
> // $b not surrounded by all whitespace, and "b" also known in Examples table
> @Then("I saw '$b'")
> public void thenISawB(@Named("b") String myB) {
>     // Will fail: is assigned "that" from Examples table instead
>     assertThat(myB).isEqualTo("bar");
> }
> {code}
> ...when used with:
> {code}
> Given I have <a> and <b>
> When I did 'foo'
> And I do <a>
> Then I see <b>
> And I saw 'bar'
> Examples:
> |   a|   b|
> |this|that|
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://jira.codehaus.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to