package org.xtext.example.mydsl.tests; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import javax.inject.Inject; import org.eclipse.xtext.junit4.InjectWith; import org.eclipse.xtext.junit4.XtextRunner; import org.eclipse.xtext.junit4.util.ParseHelper; import org.eclipse.xtext.serializer.ISerializer; import org.junit.Test; import org.junit.runner.RunWith; import org.xtext.example.mydsl.MyDslInjectorProvider; import org.xtext.example.mydsl.myDsl.Model; /** * Test case illustrating problem with serializing a resource with * unresolved proxies changed programatically (so it has no node model). * * Running this test causes the following error on the Console log - but it actually works anyway: 8 [main] ERROR xt.linking.lazy.LazyLinkingResource - resolution of uriFragment 'xtextLink_::0.0.2::1::/8' failed. org.eclipse.emf.common.util.BasicEList$BasicIndexOutOfBoundsException: index=2, size=2 at org.eclipse.emf.common.util.BasicEList.get(BasicEList.java:346) at org.eclipse.xtext.linking.lazy.LazyURIEncoder.resolveShortFragment(LazyURIEncoder.java:109) at org.eclipse.xtext.linking.lazy.LazyURIEncoder.decode(LazyURIEncoder.java:89) at org.eclipse.xtext.linking.lazy.LazyLinkingResource.getEObject(LazyLinkingResource.java:204) at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.getEObject(ResourceSetImpl.java:223) at org.eclipse.emf.ecore.util.EcoreUtil.resolve(EcoreUtil.java:202) at org.eclipse.emf.ecore.util.EcoreUtil.resolve(EcoreUtil.java:258) at org.eclipse.emf.ecore.impl.BasicEObjectImpl.eResolveProxy(BasicEObjectImpl.java:1473) at org.xtext.example.mydsl.myDsl.impl.GreetingImpl.getRef(GreetingImpl.java:116) at org.xtext.example.mydsl.myDsl.impl.GreetingImpl.eGet(GreetingImpl.java:162) at org.eclipse.emf.ecore.impl.BasicEObjectImpl.eGet(BasicEObjectImpl.java:1011) at org.eclipse.emf.ecore.impl.BasicEObjectImpl.eGet(BasicEObjectImpl.java:1003) at org.eclipse.emf.ecore.impl.BasicEObjectImpl.eGet(BasicEObjectImpl.java:998) at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer$SerializableObject.<init>(BacktrackingSemanticSequencer.java:146) at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:414) at org.xtext.example.mydsl.serializer.MyDslSemanticSequencer.sequence_Greeting(MyDslSemanticSequencer.java:47) at org.xtext.example.mydsl.serializer.MyDslSemanticSequencer.createSequence(MyDslSemanticSequencer.java:28) at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:299) at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:325) at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:239) at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:396) at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:441) at org.xtext.example.mydsl.serializer.MyDslSemanticSequencer.sequence_Model(MyDslSemanticSequencer.java:56) at org.xtext.example.mydsl.serializer.MyDslSemanticSequencer.createSequence(MyDslSemanticSequencer.java:34) at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:85) at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:108) at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:122) at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:51) at org.xtext.example.mydsl.tests.SerializingChangedResourceProblemIllustratingTest.test(SerializingChangedResourceProblemIllustratingTest.java:48) * * @see TODO bugs.eclipse.org URL ? Or.. actually nothing to report?! * * @author Michael Vorburger */ @RunWith(XtextRunner.class) @InjectWith(MyDslInjectorProvider.class) public class SerializingChangedResourceProblemIllustratingTest { private static final String DSL = "Hello a! Hello b! REF a Hello c! REF x"; @Inject ParseHelper<Model> parseHelper; @Inject ISerializer serializer; @Test public void test() throws Exception { Model model = parseHelper.parse(DSL); assertEquals("a", model.getGreetings().get(0).getName()); assertNull(model.getGreetings().get(0).getRef()); assertEquals("b", model.getGreetings().get(1).getName()); assertEquals(model.getGreetings().get(0), model.getGreetings().get(1).getRef()); assertEquals("c", model.getGreetings().get(2).getName()); assertTrue(model.getGreetings().get(2).getRef().eIsProxy()); assertEquals(DSL, serializer.serialize(model)); model.getGreetings().remove(1); assertEquals("Hello a! Hello c! REF x", serializer.serialize(model)); } }