package org.jbehave.eclipse.editor.story.scanner; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.Locale; import org.eclipse.jdt.core.IAnnotation; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.Token; import org.jbehave.core.steps.StepType; import org.jbehave.eclipse.JBehaveProject; import org.jbehave.eclipse.editor.step.LocalizedStepSupport; import org.jbehave.eclipse.editor.step.StepCandidate; import org.jbehave.eclipse.editor.step.StepLocator; import org.jbehave.eclipse.editor.story.scanner.StepScanner; import org.jbehave.eclipse.editor.text.TextAttributeProvider; import org.jbehave.eclipse.preferences.ProjectPreferences; import org.jbehave.eclipse.util.Visitor; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; public class StepScannerStyledTest { private static final String NL = "\n"; private static final String STEP1 = "an account named '$name' with the following properties:$properties"; private static final String GIVEN1 = "Given an account named 'Travis' with the following properties:" + NL + "|key|value|" + NL + "!-- Some comment" + NL + "|Login|Travis|" + NL + "|Password|p4cm4n|" + NL; private TextAttributeProvider textAttributeProvider; private StepScanner scanner; private Document document; private StepLocator stepLocator; private StepCandidate candidate; private LocalizedStepSupport localizedStepSupport; private JBehaveProject jbehaveProject; @SuppressWarnings("rawtypes") @Before public void prepare() throws JavaModelException { stepLocator = mock(StepLocator.class); textAttributeProvider = mock(TextAttributeProvider.class); localizedStepSupport = new LocalizedStepSupport(); localizedStepSupport.setStoryLocale(Locale.ENGLISH); jbehaveProject = mock(JBehaveProject.class); when(jbehaveProject.getLocalizedStepSupport()).thenReturn(localizedStepSupport); when(jbehaveProject.getStepLocator()).thenReturn(new StepLocator(jbehaveProject)); when(jbehaveProject.getProjectPreferences()).thenReturn(new ProjectPreferences()); doAnswer(new Answer() { @SuppressWarnings("unchecked") public Object answer(InvocationOnMock invocation) throws Throwable { Visitor<StepCandidate, ?> visitor = (Visitor<StepCandidate, ?>)invocation.getArguments()[0]; visitor.visit(candidate); return null; } }).when(jbehaveProject).traverseSteps(Mockito.<Visitor<StepCandidate, ?>>any()); scanner = new StepScanner(jbehaveProject, textAttributeProvider) { protected Token newToken(String styleId) { return new Token(styleId); } }; document = new Document(GIVEN1); IMethod method = null; candidate = new StepCandidate(localizedStepSupport, "$", method, StepType.GIVEN, STEP1, 0); } @Test public void useCase_ex1() { when(stepLocator.findFirstMatchingCandidate(Mockito.anyString())).thenAnswer(new Answer<StepCandidate>() { public StepCandidate answer(InvocationOnMock invocation) throws Throwable { System.out.println("StepScannerStyledTest.useCase_ex1(" + invocation + ")"); return candidate; } }); String[] expected = { // "step_keyword ~ offset: 0, length: 6", // "step_default ~ offset: 6, length: 18", // "step_parameter_value ~ offset: 24, length: 6", // "step_default ~ offset: 30, length: 33", // "step_example_table_separator ~ offset: 63, length: 1", // "step_example_table_cell ~ offset: 64, length: 3", // "step_example_table_separator ~ offset: 67, length: 1", // "step_example_table_cell ~ offset: 68, length: 5", // "step_example_table_separator ~ offset: 73, length: 1", // "step_default ~ offset: 74, length: 1", // "comment ~ offset: 75, length: 17", // "step_example_table_separator ~ offset: 92, length: 1", // "step_example_table_cell ~ offset: 93, length: 5", // "step_example_table_separator ~ offset: 98, length: 1", // "step_example_table_cell ~ offset: 99, length: 6", // "step_example_table_separator ~ offset: 105, length: 1", // "step_default ~ offset: 106, length: 1", // "step_example_table_separator ~ offset: 107, length: 1", // "step_example_table_cell ~ offset: 108, length: 8", // "step_example_table_separator ~ offset: 116, length: 1", // "step_example_table_cell ~ offset: 117, length: 6", // "step_example_table_separator ~ offset: 123, length: 1", // "step_default ~ offset: 124, length: 1" // }; int index = 0; scanner.setRange(document, 0, document.getLength()); IToken token = scanner.nextToken(); while(!token.isEOF()) { String actual = (token.getData() + " ~ offset: " + scanner.getTokenOffset() + ", length: " + scanner.getTokenLength()); assertThat(actual, equalTo(expected[index++])); token = scanner.nextToken(); } assertThat(index, equalTo(expected.length)); } }