diff --git a/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/parameterized/OffsetHelper.java b/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/parameterized/OffsetHelper.java new file mode 100644 index 000000000..b23503bc1 --- /dev/null +++ b/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/parameterized/OffsetHelper.java @@ -0,0 +1,100 @@ +/******************************************************************************* + * Copyright (c) 2011 itemis AG (http://www.itemis.eu) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.xtext.junit4.parameterized; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.xtext.Assignment; +import org.eclipse.xtext.GrammarUtil; +import org.eclipse.xtext.nodemodel.ILeafNode; +import org.eclipse.xtext.nodemodel.INode; +import org.eclipse.xtext.nodemodel.util.NodeModelUtils; +import org.eclipse.xtext.parsetree.reconstr.impl.NodeIterator; +import org.eclipse.xtext.resource.XtextResource; +import org.eclipse.xtext.util.Pair; +import org.eclipse.xtext.util.Tuples; +import org.junit.Assert; + +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; + +/** + * @author Moritz Eysholdt - Initial contribution and API + */ +public class OffsetHelper { + + public Offset at(XtextResource resource, int offset) { + return new Offset(resource, offset); + } + + public Offset at(XtextResource resource, String offset) { + return at(resource, Integer.valueOf(offset)); + } + + public static class Offset { + protected int offset; + protected XtextResource resource; + + public Offset(XtextResource resource, int offset) { + super(); + this.resource = resource; + this.offset = offset; + } + + public EObject getEObject() { + EObject object = NodeModelUtils.findActualSemanticObjectFor(getLeafNodeAtOffset()); + Assert.assertNotNull("No EObject found at offset " + offset, object); + return object; + } + + public Pair getEStructuralFeatureByParent() { + INode leaf = getLeafNodeAtOffset(); + EObject object = NodeModelUtils.findActualSemanticObjectFor(leaf); + Assert.assertNotNull("No EObject found at offset " + offset, object); + Assignment ass = GrammarUtil.containingAssignment(leaf.getGrammarElement()); + while (ass == null && leaf.getParent() != null) { + leaf = leaf.getParent(); + ass = GrammarUtil.containingAssignment(leaf.getGrammarElement()); + } + Assert.assertNotNull("No Assignment found at offset " + offset, ass); + @SuppressWarnings("null") + EStructuralFeature feature = object.eClass().getEStructuralFeature(ass.getFeature()); + return Tuples.create(object, feature); + } + + public Pair getEStructuralFeatureByOffset() { + return getEStructuralFeatureByOffset(Predicates. alwaysTrue()); + } + + public Pair getEStructuralFeatureByOffset(Predicate matches) { + INode leaf = getLeafNodeAtOffset(); + NodeIterator ni = null; + while (ni == null || ni.hasNext()) { + INode next = ni == null ? leaf : ni.next(); + if (ni == null) + ni = new NodeIterator(leaf); + Assignment ass = GrammarUtil.containingAssignment(next.getGrammarElement()); + if (ass != null) { + EObject object = NodeModelUtils.findActualSemanticObjectFor(next); + EStructuralFeature feat = object.eClass().getEStructuralFeature(ass.getFeature()); + if (feat != null && matches.apply(feat)) + return Tuples.create(object, feat); + } + } + Assert.fail("No EStructuralFeature found at offset " + offset); + return null; + } + + public ILeafNode getLeafNodeAtOffset() { + ILeafNode node = NodeModelUtils.findLeafNodeAtOffset(resource.getParseResult().getRootNode(), offset); + Assert.assertNotNull("No Leaf Node found at offset " + offset, node); + return node; + } + } + +} diff --git a/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/parameterized/XpectCommaSeparatedValues.java b/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/parameterized/XpectCommaSeparatedValues.java index a0d86930a..e18469c77 100644 --- a/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/parameterized/XpectCommaSeparatedValues.java +++ b/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/parameterized/XpectCommaSeparatedValues.java @@ -22,6 +22,7 @@ import org.eclipse.xtext.junit4.parameterized.TestExpectationValidator.TestResul import org.eclipse.xtext.junit4.parameterized.XpectCommaSeparatedValues.CSVResultValidator; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.util.Pair; +import org.junit.Assert; import org.junit.ComparisonFailure; import com.google.common.base.Function; @@ -49,6 +50,11 @@ public @interface XpectCommaSeparatedValues { } public void validate(XtextResource res, IExpectation expectation, @TestResult Iterable actual) { + Assert.assertNotNull(res); + Assert.assertNotNull(expectation); + Assert.assertNotNull(expectation.getExpectation()); + Assert.assertNotNull(actual); + ExpectationCollection exp = new ExpectationCollection(); exp.setCaseSensitive(cfg.caseSensitive()); exp.setOrdered(cfg.ordered()); diff --git a/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/parameterized/XpectLines.java b/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/parameterized/XpectLines.java index d083b0298..34aeccd17 100644 --- a/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/parameterized/XpectLines.java +++ b/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/parameterized/XpectLines.java @@ -23,6 +23,7 @@ import org.eclipse.xtext.junit4.parameterized.TestExpectationValidator.TestResul import org.eclipse.xtext.junit4.parameterized.XpectLines.LinesResultValidator; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.util.Pair; +import org.junit.Assert; import org.junit.ComparisonFailure; import com.google.common.base.Function; @@ -46,6 +47,11 @@ public @interface XpectLines { } public void validate(XtextResource res, IExpectation expectation, @TestResult Iterable actual) { + Assert.assertNotNull(res); + Assert.assertNotNull(expectation); + Assert.assertNotNull(expectation.getExpectation()); + Assert.assertNotNull(actual); + ExpectationCollection exp = new ExpectationCollection(); exp.setCaseSensitive(cfg.caseSensitive()); exp.setOrdered(cfg.ordered()); diff --git a/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/parameterized/XpectParameterProvider.java b/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/parameterized/XpectParameterProvider.java index 69f56e7d0..0d5b027a2 100644 --- a/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/parameterized/XpectParameterProvider.java +++ b/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/parameterized/XpectParameterProvider.java @@ -379,8 +379,10 @@ public class XpectParameterProvider implements IParameterProvider { protected int parseXpectParams(Class testClass, INode node, String methodName, final String text, int offset, Map params) { + int semanticOffset = getOffsetOfNextSemanticNode(node); + params.put(OFFSET, String.valueOf(semanticOffset)); String paramSyntax = getParameterSyntax(testClass, methodName); - if (org.eclipse.xtext.util.Strings.isEmpty(paramSyntax)) + if (Strings.isEmpty(paramSyntax)) return -1; Nfa nfa = getParameterNfa(paramSyntax); List trace = new NfaUtil().backtrack(nfa, new BacktrackItem(offset), @@ -417,8 +419,6 @@ public class XpectParameterProvider implements IParameterProvider { return followers; } }); - int semanticOffset = getOffsetOfNextSemanticNode(node); - params.put(OFFSET, String.valueOf(semanticOffset)); if (trace != null && !trace.isEmpty()) { for (BacktrackItem item : trace) if (item.token != null && item.token.getName() != null) diff --git a/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/parameterized/XpectString.java b/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/parameterized/XpectString.java index c934a0197..096cbfa18 100644 --- a/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/parameterized/XpectString.java +++ b/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/parameterized/XpectString.java @@ -18,6 +18,7 @@ import org.eclipse.xtext.junit4.parameterized.TestExpectationValidator.TestResul import org.eclipse.xtext.junit4.parameterized.XpectString.StringResultValidator; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.util.internal.FormattingMigrator; +import org.junit.Assert; import org.junit.ComparisonFailure; /** @@ -37,6 +38,10 @@ public @interface XpectString { } public void validate(XtextResource resource, IExpectation expectation, @TestResult String actual) { + Assert.assertNotNull(resource); + Assert.assertNotNull(expectation); + Assert.assertNotNull(expectation.getExpectation()); + Assert.assertNotNull(actual); String exp; if (!config.whitespaceSensitive()) { FormattingMigrator migrator = new FormattingMigrator(); diff --git a/tests/org.eclipse.xtext.junit4.tests/src/org/eclipse/xtext/junit4/parameterized/XpectParameterProviderTest.java b/tests/org.eclipse.xtext.junit4.tests/src/org/eclipse/xtext/junit4/parameterized/XpectParameterProviderTest.java index 5b7537e65..7a28b5597 100644 --- a/tests/org.eclipse.xtext.junit4.tests/src/org/eclipse/xtext/junit4/parameterized/XpectParameterProviderTest.java +++ b/tests/org.eclipse.xtext.junit4.tests/src/org/eclipse/xtext/junit4/parameterized/XpectParameterProviderTest.java @@ -449,6 +449,13 @@ public class XpectParameterProviderTest params(model)); } + @Test + public void xpectSLParameterDefault() + { + String model = "// XPECT meth"; + Assert.assertEquals("meth(offset at 'h\\n !foo')", params(model)); + } + @Test public void xpectSLParameterWithExp() {