package de.lynorics.eclipse.jangaroo.tests.scoping; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.xtext.diagnostics.Diagnostic; import org.eclipse.xtext.junit4.InjectWith; import org.eclipse.xtext.junit4.XtextRunner; import org.eclipse.xtext.junit4.util.ParseHelper; import org.eclipse.xtext.junit4.validation.ValidationTestHelper; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import com.google.inject.Inject; import com.google.inject.Provider; import de.lynorics.eclipse.jangaroo.AS3InjectorProvider; import de.lynorics.eclipse.jangaroo.aS3.AS3Package; import de.lynorics.eclipse.jangaroo.aS3.Model; @RunWith(XtextRunner.class) @InjectWith(AS3InjectorProvider.class) public class ClassScopingTest { @Inject Provider<ResourceSet> resourceSetProvider; @Inject ParseHelper<AS3Package> parseHelper; ValidationTestHelper validationTestHelper = new ValidationTestHelper(); @Test public void testTwoFiles() throws Exception { ResourceSet resourceSet = resourceSetProvider.get(); Model first = (Model) parseHelper.parse("class B extends A {}", resourceSet); Model second = (Model) parseHelper.parse("class A { var b: B; }", resourceSet); validationTestHelper.assertNoErrors(first); validationTestHelper.assertNoErrors(second); Assert.assertSame("Scoping must reference the same class instance!", second.getClasses().get(0), ((de.lynorics.eclipse.jangaroo.aS3.Class)first.getClasses().get(0)).getSuperclass()); } @Test public void testPackagesAndClassQualifiedNames() throws Exception { ResourceSet resourceSet = resourceSetProvider.get(); Model first = (Model) parseHelper.parse("package my.first.pack { class B extends my.second.pack.A {} }", resourceSet); Model second = (Model) parseHelper.parse("package my.second.pack { class A { var b: my.first.pack.B; } }", resourceSet); validationTestHelper.assertNoErrors(first); validationTestHelper.assertNoErrors(second); Assert.assertSame("Scoping must reference the same class instance!", second.getPackage().getClasses().get(0), ((de.lynorics.eclipse.jangaroo.aS3.Class)first.getPackage().getClasses().get(0)).getSuperclass()); } @Test public void testSamePackage() throws Exception { ResourceSet resourceSet = resourceSetProvider.get(); Model first = (Model) parseHelper.parse("package my.first.pack { class B extends A {} }", resourceSet); Model second = (Model) parseHelper.parse("package my.first.pack { class A { var b: B; } }", resourceSet); validationTestHelper.assertNoErrors(first); validationTestHelper.assertNoErrors(second); Assert.assertSame("Classes within the same package must be available in the scope!", second.getPackage().getClasses().get(0), ((de.lynorics.eclipse.jangaroo.aS3.Class)first.getPackage().getClasses().get(0)).getSuperclass()); } @Test public void testImports() throws Exception { ResourceSet resourceSet = resourceSetProvider.get(); Model first = (Model) parseHelper.parse("package my.first.pack { class C1 {} class C2 {} }", resourceSet); Model second = (Model) parseHelper.parse("package my.second.pack { class D1 {} class D2 {} }", resourceSet); Model third = (Model) parseHelper.parse("package my.third.pack { import my.first.pack.C1; class E extends C1 { var c: my.first.pack.C2; } }", resourceSet); Model fourth = (Model) parseHelper.parse("package my.fourth.pack { import my.second.pack.*; class F { var d1: D1; var d2: D2; } }", resourceSet); validationTestHelper.assertNoErrors(first); validationTestHelper.assertNoErrors(second); validationTestHelper.assertNoErrors(third); validationTestHelper.assertNoErrors(fourth); } @Test public void testImportMissing() throws Exception { ResourceSet resourceSet = resourceSetProvider.get(); Model first = (Model) parseHelper.parse("package my.first.pack { class C1 {} class C2 {} }", resourceSet); Model second = (Model) parseHelper.parse("package my.third.pack { import my.first.pack.C1; class D extends C2 {} }", resourceSet); validationTestHelper.assertNoErrors(first); validationTestHelper.assertError(second, AS3Package.eINSTANCE.getClass_(), Diagnostic.LINKING_DIAGNOSTIC, "Couldn't resolve reference to Class 'C2'."); } @Test public void testConfigImport() throws Exception { ResourceSet resourceSet = resourceSetProvider.get(); Model first = (Model) parseHelper.parse("package my.pack { class C extends D {}}", resourceSet); Model second = (Model) parseHelper.parse("package my.pack.config { class D {} }", resourceSet); validationTestHelper.assertNoErrors(first); validationTestHelper.assertNoErrors(second); } }