Search in sources :

Example 26 with ILanguageComponent

use of org.metaborg.core.language.ILanguageComponent in project spoofax by metaborg.

the class LanguageServiceTest method activeLowerVersion.

/**
 * Add an implementation with a lower version number, assert that the other implementation stays active.
 */
@Test
public void activeLowerVersion() throws Exception {
    final String id = "org.metaborg.lang.entity";
    final LanguageVersion version1 = version(0, 1, 0);
    final LanguageVersion version2 = version(0, 0, 1);
    final LanguageIdentifier identifier1 = new LanguageIdentifier(groupId, id, version1);
    final LanguageIdentifier identifier2 = new LanguageIdentifier(groupId, id, version2);
    final FileObject location1 = createDir("ram:///Entity1/");
    final FileObject location2 = createDir("ram:///Entity2/");
    final String name = "Entity";
    final ILanguageComponent component1 = language(identifier1, location1, name);
    final ILanguageImpl impl1 = Iterables.get(component1.contributesTo(), 0);
    final ILanguage lang = impl1.belongsTo();
    assertSame(component1, languageService.getComponent(location1.getName()));
    assertSame(impl1, languageService.getImpl(identifier1));
    assertSame(impl1, lang.activeImpl());
    assertSame(lang, languageService.getLanguage(name));
    final ILanguageComponent component2 = language(identifier2, location2, name);
    final ILanguageImpl impl2 = Iterables.get(component2.contributesTo(), 0);
    // Language 1 with higher version number stays active.
    assertSame(component1, languageService.getComponent(location1.getName()));
    assertSame(component2, languageService.getComponent(location2.getName()));
    assertSame(impl1, languageService.getImpl(identifier1));
    assertSame(impl2, languageService.getImpl(identifier2));
    assertSame(impl1, lang.activeImpl());
    assertSame(lang, languageService.getLanguage(name));
    assertSize(1, impl1.components());
    assertSize(1, impl2.components());
    assertSize(2, lang.impls());
    assertSize(2, languageService.getAllComponents());
    assertSize(2, languageService.getAllImpls());
    assertSize(1, languageService.getAllLanguages());
}
Also used : ILanguage(org.metaborg.core.language.ILanguage) LanguageIdentifier(org.metaborg.core.language.LanguageIdentifier) ILanguageImpl(org.metaborg.core.language.ILanguageImpl) LanguageVersion(org.metaborg.core.language.LanguageVersion) FileObject(org.apache.commons.vfs2.FileObject) ILanguageComponent(org.metaborg.core.language.ILanguageComponent) Test(org.junit.Test) MetaborgTest(org.metaborg.core.test.MetaborgTest)

Example 27 with ILanguageComponent

use of org.metaborg.core.language.ILanguageComponent in project spoofax by metaborg.

the class LanguageServiceTest method activeMostRecent.

/**
 * Add multiple implementations, assert that the active language is correct.
 */
@Test
public void activeMostRecent() throws Exception {
    final String id1 = "org.metaborg.lang.entity1";
    final String id2 = "org.metaborg.lang.entity2";
    final String id3 = "org.metaborg.lang.entity3";
    final String id4 = "org.metaborg.lang.entity4";
    final LanguageVersion version = version(0, 0, 1);
    final LanguageIdentifier identifier1 = new LanguageIdentifier(groupId, id1, version);
    final LanguageIdentifier identifier2 = new LanguageIdentifier(groupId, id2, version);
    final LanguageIdentifier identifier3 = new LanguageIdentifier(groupId, id3, version);
    final LanguageIdentifier identifier4 = new LanguageIdentifier(groupId, id4, version);
    final FileObject location1 = createDir("ram:///Entity1");
    final FileObject location2 = createDir("ram:///Entity2");
    final FileObject location3 = createDir("ram:///Entity3");
    final FileObject location4 = createDir("ram:///Entity3");
    final String name = "Entity";
    final ILanguageComponent component1 = language(identifier1, location1, name);
    final ILanguageImpl impl1 = Iterables.get(component1.contributesTo(), 0);
    final ILanguage lang = impl1.belongsTo();
    assertSame(impl1, lang.activeImpl());
    final ILanguageComponent component2 = language(identifier2, location2, name);
    final ILanguageImpl impl2 = Iterables.get(component2.contributesTo(), 0);
    assertSame(impl2, lang.activeImpl());
    final ILanguageComponent component3 = language(identifier3, location3, name);
    final ILanguageImpl impl3 = Iterables.get(component3.contributesTo(), 0);
    assertSame(impl3, lang.activeImpl());
    languageService.remove(component3);
    assertSame(impl2, lang.activeImpl());
    languageService.remove(component1);
    assertSame(impl2, lang.activeImpl());
    final ILanguageComponent component4 = language(identifier4, location4, name);
    final ILanguageImpl impl4 = Iterables.get(component4.contributesTo(), 0);
    assertSame(impl4, lang.activeImpl());
    languageService.remove(component4);
    assertSame(impl2, lang.activeImpl());
    languageService.remove(component2);
    assertNull(lang.activeImpl());
    assertSize(0, lang.impls());
    assertNull(languageService.getLanguage(name));
}
Also used : ILanguage(org.metaborg.core.language.ILanguage) LanguageIdentifier(org.metaborg.core.language.LanguageIdentifier) ILanguageImpl(org.metaborg.core.language.ILanguageImpl) LanguageVersion(org.metaborg.core.language.LanguageVersion) FileObject(org.apache.commons.vfs2.FileObject) ILanguageComponent(org.metaborg.core.language.ILanguageComponent) Test(org.junit.Test) MetaborgTest(org.metaborg.core.test.MetaborgTest)

Example 28 with ILanguageComponent

use of org.metaborg.core.language.ILanguageComponent in project spoofax by metaborg.

the class LanguageServiceTest method implementationFacets.

/**
 * Add multiple components with facets to a single implementation, assert correctness of returned facets.
 */
@Test
public void implementationFacets() throws Exception {
    final String id1 = "org.metaborg.lang.entity.component1";
    final String id2 = "org.metaborg.lang.entity.component2";
    final LanguageVersion version = version(0, 0, 1);
    final LanguageIdentifier identifier1 = new LanguageIdentifier(groupId, id1, version);
    final LanguageIdentifier identifier2 = new LanguageIdentifier(groupId, id2, version);
    final FileObject location1 = createDir("ram:///Entity1");
    final FileObject location2 = createDir("ram:///Entity2");
    final String implId = "org.metaborg.lang.entity.impl1";
    final String name = "Entity";
    final LanguageIdentifier implIdentifier = new LanguageIdentifier(groupId, implId, version);
    final LanguageContributionIdentifier requestIdentifier = new LanguageContributionIdentifier(implIdentifier, name);
    final DescriptionFacet facet1 = new DescriptionFacet("Component1", null);
    final ResourceExtensionFacet facet2 = new ResourceExtensionFacet(Iterables2.singleton("com"));
    final DescriptionFacet facet3 = new DescriptionFacet("Component2", null);
    final ILanguageComponent component1 = language(identifier1, location1, requestIdentifier, facet1, facet2);
    final ILanguageComponent component2 = language(identifier2, location2, requestIdentifier, facet3);
    final ILanguageImpl impl = languageService.getImpl(implIdentifier);
    assertContains(facet1, component1.facets());
    assertContains(facet2, component1.facets());
    assertContains(facet3, component2.facets());
    assertSize(2, component1.facets());
    assertSize(1, component2.facets());
    assertContains(facet1, component1.facets(DescriptionFacet.class));
    assertSame(facet1, component1.facet(DescriptionFacet.class));
    assertSize(1, component1.facets(DescriptionFacet.class));
    assertContains(facet2, component1.facets(ResourceExtensionFacet.class));
    assertSame(facet2, component1.facet(ResourceExtensionFacet.class));
    assertSize(1, component1.facets(ResourceExtensionFacet.class));
    assertContains(facet3, component2.facets(DescriptionFacet.class));
    assertSame(facet3, component2.facet(DescriptionFacet.class));
    assertSize(1, component2.facets(DescriptionFacet.class));
    assertContains(facet1, impl.facets());
    assertContains(facet2, impl.facets());
    assertContains(facet3, impl.facets());
    assertSize(3, impl.facets());
    assertContains(facet1, impl.facets(DescriptionFacet.class));
    assertContains(facet2, impl.facets(ResourceExtensionFacet.class));
    assertContains(facet3, impl.facets(DescriptionFacet.class));
    assertSize(2, impl.facets(DescriptionFacet.class));
    assertSize(1, impl.facets(ResourceExtensionFacet.class));
    for (FacetContribution<IFacet> facetContribution : component1.facetContributions()) {
        assertSame(facetContribution.contributor, component1);
    }
    assertSame(component1, component1.facetContribution(DescriptionFacet.class).contributor);
    assertSame(facet1, component1.facetContribution(DescriptionFacet.class).facet);
    assertSize(1, component1.facetContributions(DescriptionFacet.class));
    assertSame(component1, component1.facetContribution(ResourceExtensionFacet.class).contributor);
    assertSame(facet2, component1.facetContribution(ResourceExtensionFacet.class).facet);
    assertSize(1, component1.facetContributions(ResourceExtensionFacet.class));
    for (FacetContribution<IFacet> facetContribution : component2.facetContributions()) {
        assertSame(facetContribution.contributor, component2);
    }
    assertSame(component2, component2.facetContribution(DescriptionFacet.class).contributor);
    assertSame(facet3, component2.facetContribution(DescriptionFacet.class).facet);
    assertSize(1, component2.facetContributions(DescriptionFacet.class));
    for (FacetContribution<IFacet> facetContribution : impl.facetContributions()) {
        final ILanguageComponent contributor = facetContribution.contributor;
        final IFacet facet = facetContribution.facet;
        if (facet.equals(facet1)) {
            assertSame(component1, contributor);
        } else if (facet.equals(facet2)) {
            assertSame(component1, contributor);
        } else if (facet.equals(facet3)) {
            assertSame(component2, contributor);
        } else {
            fail("Facet does not equals any created facet");
        }
    }
}
Also used : LanguageIdentifier(org.metaborg.core.language.LanguageIdentifier) ILanguageImpl(org.metaborg.core.language.ILanguageImpl) ResourceExtensionFacet(org.metaborg.core.language.ResourceExtensionFacet) IFacet(org.metaborg.core.language.IFacet) LanguageVersion(org.metaborg.core.language.LanguageVersion) FileObject(org.apache.commons.vfs2.FileObject) ILanguageComponent(org.metaborg.core.language.ILanguageComponent) DescriptionFacet(org.metaborg.core.language.DescriptionFacet) LanguageContributionIdentifier(org.metaborg.core.language.LanguageContributionIdentifier) Test(org.junit.Test) MetaborgTest(org.metaborg.core.test.MetaborgTest)

Example 29 with ILanguageComponent

use of org.metaborg.core.language.ILanguageComponent in project spoofax by metaborg.

the class LanguageServiceTest method languageServiceCorrectness.

/**
 * Add multiple different language implementations, assert correctness of the language service.
 */
@Test
public void languageServiceCorrectness() throws Exception {
    final String id1 = "org.metaborg.lang.entity1";
    final String id2 = "org.metaborg.lang.entity2";
    final String id3 = "org.metaborg.lang.entity3";
    final LanguageVersion version = version(0, 0, 1);
    final LanguageIdentifier identifier1 = new LanguageIdentifier(groupId, id1, version);
    final LanguageIdentifier identifier2 = new LanguageIdentifier(groupId, id2, version);
    final LanguageIdentifier identifier3 = new LanguageIdentifier(groupId, id3, version);
    final FileObject location1 = createDir("ram:///Entity1");
    final FileObject location2 = createDir("ram:///Entity2");
    final FileObject location3 = createDir("ram:///Entity3");
    final String name1 = "Entity1";
    final String name2 = "Entity2";
    final String name3 = "Entity3";
    final ILanguageComponent component1 = language(identifier1, location1, name1);
    final ILanguageImpl impl1 = Iterables.get(component1.contributesTo(), 0);
    final ILanguage lang1 = impl1.belongsTo();
    final ILanguageComponent component2 = language(identifier2, location2, name2);
    final ILanguageImpl impl2 = Iterables.get(component2.contributesTo(), 0);
    final ILanguage lang2 = impl2.belongsTo();
    final ILanguageComponent component3 = language(identifier3, location3, name3);
    final ILanguageImpl impl3 = Iterables.get(component3.contributesTo(), 0);
    final ILanguage lang3 = impl3.belongsTo();
    assertEquals(component1, languageService.getComponent(location1.getName()));
    assertSame(component1, languageService.getComponent(location1.getName()));
    assertEquals(component2, languageService.getComponent(location2.getName()));
    assertSame(component2, languageService.getComponent(location2.getName()));
    assertEquals(component3, languageService.getComponent(location3.getName()));
    assertSame(component3, languageService.getComponent(location3.getName()));
    assertEquals(impl1, languageService.getImpl(identifier1));
    assertSame(impl1, languageService.getImpl(identifier1));
    assertEquals(impl2, languageService.getImpl(identifier2));
    assertSame(impl2, languageService.getImpl(identifier2));
    assertEquals(impl3, languageService.getImpl(identifier3));
    assertSame(impl3, languageService.getImpl(identifier3));
    assertEquals(impl1, lang1.activeImpl());
    assertSame(impl1, lang1.activeImpl());
    assertEquals(impl2, lang2.activeImpl());
    assertSame(impl2, lang2.activeImpl());
    assertEquals(impl3, lang3.activeImpl());
    assertSame(impl3, lang3.activeImpl());
    assertEquals(lang1, languageService.getLanguage(name1));
    assertSame(lang1, languageService.getLanguage(name1));
    assertEquals(lang2, languageService.getLanguage(name2));
    assertSame(lang2, languageService.getLanguage(name2));
    assertEquals(lang3, languageService.getLanguage(name3));
    assertSame(lang3, languageService.getLanguage(name3));
    assertSize(1, impl1.components());
    assertSize(1, impl2.components());
    assertSize(1, impl3.components());
    assertSize(1, lang1.impls());
    assertSize(1, lang2.impls());
    assertSize(1, lang3.impls());
    assertSize(3, languageService.getAllComponents());
    assertSize(3, languageService.getAllImpls());
    assertSize(3, languageService.getAllLanguages());
}
Also used : ILanguage(org.metaborg.core.language.ILanguage) LanguageIdentifier(org.metaborg.core.language.LanguageIdentifier) ILanguageImpl(org.metaborg.core.language.ILanguageImpl) LanguageVersion(org.metaborg.core.language.LanguageVersion) FileObject(org.apache.commons.vfs2.FileObject) ILanguageComponent(org.metaborg.core.language.ILanguageComponent) Test(org.junit.Test) MetaborgTest(org.metaborg.core.test.MetaborgTest)

Example 30 with ILanguageComponent

use of org.metaborg.core.language.ILanguageComponent in project spoofax by metaborg.

the class LanguageServiceTest method componentContributions.

/**
 * Add multiple components that contribute to multiple implementations, assert correctness of language service and
 * objects. Delete some components and assert correctness again.
 */
@Test
public void componentContributions() throws Exception {
    final String id1 = "org.metaborg.lang.entity.component1";
    final String id2 = "org.metaborg.lang.entity.component2";
    final String id3 = "org.metaborg.lang.entity.component3";
    final String id4 = "org.metaborg.lang.entity.component4";
    final String id5 = "org.metaborg.lang.entity.component5";
    final LanguageVersion version = version(0, 0, 1);
    final LanguageIdentifier identifier1 = new LanguageIdentifier(groupId, id1, version);
    final LanguageIdentifier identifier2 = new LanguageIdentifier(groupId, id2, version);
    final LanguageIdentifier identifier3 = new LanguageIdentifier(groupId, id3, version);
    final LanguageIdentifier identifier4 = new LanguageIdentifier(groupId, id4, version);
    final LanguageIdentifier identifier5 = new LanguageIdentifier(groupId, id5, version);
    final FileObject location1 = createDir("ram:///Entity1");
    final FileObject location2 = createDir("ram:///Entity2");
    final FileObject location3 = createDir("ram:///Entity3");
    final FileObject location4 = createDir("ram:///Entity4");
    final FileObject location5 = createDir("ram:///Entity5");
    final String implId1 = "org.metaborg.lang.entity.impl1";
    final String implId2 = "org.metaborg.lang.entity.impl2";
    final String name = "Entity";
    final LanguageIdentifier implIdentifier1 = new LanguageIdentifier(groupId, implId1, version);
    final LanguageIdentifier implIdentifier2 = new LanguageIdentifier(groupId, implId2, version);
    final LanguageContributionIdentifier requestIdentifier1 = new LanguageContributionIdentifier(implIdentifier1, name);
    final LanguageContributionIdentifier requestIdentifier2 = new LanguageContributionIdentifier(implIdentifier2, name);
    final ILanguageComponent component1 = language(identifier1, location1, requestIdentifier1);
    final ILanguageComponent component2 = language(identifier2, location2, requestIdentifier1);
    final ILanguageComponent component3 = language(identifier3, location3, requestIdentifier2);
    final ILanguageComponent component4 = language(identifier4, location4, requestIdentifier1, requestIdentifier2);
    final ILanguageComponent component5 = language(identifier5, location5, requestIdentifier1, requestIdentifier2);
    final ILanguageImpl impl1 = languageService.getImpl(implIdentifier1);
    final ILanguageImpl impl2 = languageService.getImpl(implIdentifier2);
    final ILanguage lang = languageService.getLanguage(name);
    assertSame(component1, languageService.getComponent(location1.getName()));
    assertSame(component2, languageService.getComponent(location2.getName()));
    assertSame(component3, languageService.getComponent(location3.getName()));
    assertSame(component4, languageService.getComponent(location4.getName()));
    assertSame(component5, languageService.getComponent(location5.getName()));
    assertSame(impl1, languageService.getImpl(implIdentifier1));
    assertSame(impl2, languageService.getImpl(implIdentifier2));
    assertSame(lang, languageService.getLanguage(name));
    assertSize(5, languageService.getAllComponents());
    assertSize(2, languageService.getAllImpls());
    assertSize(1, languageService.getAllLanguages());
    assertContains(impl1, component1.contributesTo());
    assertNotContains(impl2, component1.contributesTo());
    assertContains(impl1, component2.contributesTo());
    assertNotContains(impl2, component2.contributesTo());
    assertNotContains(impl1, component3.contributesTo());
    assertContains(impl2, component3.contributesTo());
    assertContains(impl1, component4.contributesTo());
    assertContains(impl2, component4.contributesTo());
    assertContains(impl1, component5.contributesTo());
    assertContains(impl2, component5.contributesTo());
    assertContains(component1, impl1.components());
    assertContains(component2, impl1.components());
    assertNotContains(component3, impl1.components());
    assertContains(component4, impl1.components());
    assertContains(component5, impl1.components());
    assertNotContains(component1, impl2.components());
    assertNotContains(component2, impl2.components());
    assertContains(component3, impl2.components());
    assertContains(component4, impl2.components());
    assertContains(component5, impl2.components());
    assertSame(lang, impl1.belongsTo());
    assertSame(lang, impl2.belongsTo());
    assertContains(impl1, lang.impls());
    assertContains(impl2, lang.impls());
    languageService.remove(component3);
    assertNull(languageService.getComponent(location3.getName()));
    assertSize(4, languageService.getAllComponents());
    assertSize(2, languageService.getAllImpls());
    assertSize(1, languageService.getAllLanguages());
    assertEmpty(component3.contributesTo());
    assertNotContains(component3, impl1.components());
    languageService.remove(component4);
    languageService.remove(component5);
    // Also removes implementation 2, since all its components have been removed.
    assertNull(languageService.getImpl(implIdentifier2));
    assertSize(2, languageService.getAllComponents());
    assertSize(1, languageService.getAllImpls());
    assertSize(1, languageService.getAllLanguages());
    assertEmpty(component4.contributesTo());
    assertEmpty(component5.contributesTo());
    assertNotContains(component4, impl1.components());
    assertNotContains(component5, impl1.components());
    assertEmpty(impl2.components());
    assertNotContains(impl2, lang.impls());
}
Also used : ILanguage(org.metaborg.core.language.ILanguage) LanguageIdentifier(org.metaborg.core.language.LanguageIdentifier) ILanguageImpl(org.metaborg.core.language.ILanguageImpl) LanguageVersion(org.metaborg.core.language.LanguageVersion) FileObject(org.apache.commons.vfs2.FileObject) ILanguageComponent(org.metaborg.core.language.ILanguageComponent) LanguageContributionIdentifier(org.metaborg.core.language.LanguageContributionIdentifier) Test(org.junit.Test) MetaborgTest(org.metaborg.core.test.MetaborgTest)

Aggregations

ILanguageComponent (org.metaborg.core.language.ILanguageComponent)40 FileObject (org.apache.commons.vfs2.FileObject)26 ILanguageImpl (org.metaborg.core.language.ILanguageImpl)24 Test (org.junit.Test)12 LanguageIdentifier (org.metaborg.core.language.LanguageIdentifier)11 LanguageVersion (org.metaborg.core.language.LanguageVersion)11 MetaborgTest (org.metaborg.core.test.MetaborgTest)11 IStrategoTerm (org.spoofax.interpreter.terms.IStrategoTerm)9 ITermFactory (org.spoofax.interpreter.terms.ITermFactory)9 HybridInterpreter (org.strategoxt.HybridInterpreter)9 IStrategoString (org.spoofax.interpreter.terms.IStrategoString)8 ILanguage (org.metaborg.core.language.ILanguage)7 MetaborgException (org.metaborg.core.MetaborgException)6 IContext (org.metaborg.core.context.IContext)5 Nullable (javax.annotation.Nullable)4 MetaborgRuntimeException (org.metaborg.core.MetaborgRuntimeException)4 ICompletion (org.metaborg.core.completion.ICompletion)4 IStrategoList (org.spoofax.interpreter.terms.IStrategoList)4 IOException (java.io.IOException)3 FileSystemException (org.apache.commons.vfs2.FileSystemException)3