Search in sources :

Example 6 with LanguageVersion

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

the class LanguageServiceTest method languageChanges.

/**
 * Add/reload/remove components, assert change events correctness.
 */
@Test
public void languageChanges() 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 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 implId1 = "org.metaborg.lang.entity.impl1";
    final String implId2 = "org.metaborg.lang.entity.impl2";
    final String implId3 = "org.metaborg.lang.entity.impl3";
    final String name = "Entity";
    final LanguageIdentifier implIdentifier1 = new LanguageIdentifier(groupId, implId1, version);
    final LanguageIdentifier implIdentifier2 = new LanguageIdentifier(groupId, implId2, version);
    final LanguageIdentifier implIdentifier3 = new LanguageIdentifier(groupId, implId3, version);
    final LanguageContributionIdentifier requestIdentifier1 = new LanguageContributionIdentifier(implIdentifier1, name);
    final LanguageContributionIdentifier requestIdentifier2 = new LanguageContributionIdentifier(implIdentifier2, name);
    final LanguageContributionIdentifier requestIdentifier3 = new LanguageContributionIdentifier(implIdentifier3, name);
    final ITestableObserver<LanguageComponentChange> compObs = new TestableObserver<LanguageComponentChange>();
    languageService.componentChanges().subscribe(compObs);
    final ITestableObserver<LanguageImplChange> implObs = new TestableObserver<LanguageImplChange>();
    languageService.implChanges().subscribe(implObs);
    // Add component1 to impl1, expect component add, impl add
    final ILanguageComponent component1 = language(identifier1, location1, requestIdentifier1);
    final ILanguageImpl impl1 = languageService.getImpl(implIdentifier1);
    assertOnNext(new LanguageComponentChange(LanguageComponentChange.Kind.Add, null, component1), compObs);
    assertOnNext(new LanguageImplChange(LanguageImplChange.Kind.Add, impl1), implObs);
    // Add component2 to impl1, expect component2 add, impl1 reload
    final ILanguageComponent component2 = language(identifier2, location2, requestIdentifier1);
    assertOnNext(new LanguageComponentChange(LanguageComponentChange.Kind.Add, null, component2), compObs);
    assertOnNext(new LanguageImplChange(LanguageImplChange.Kind.Reload, impl1), implObs);
    // Add component3 to impl1, impl2, impl3, expect component add, [impl1 reload, impl2 add, impl3 add] (order
    // unknown)
    final ILanguageComponent component3 = language(identifier3, location3, requestIdentifier1, requestIdentifier2, requestIdentifier3);
    final ILanguageImpl impl2 = languageService.getImpl(implIdentifier2);
    final ILanguageImpl impl3 = languageService.getImpl(implIdentifier3);
    assertOnNext(new LanguageComponentChange(LanguageComponentChange.Kind.Add, null, component3), compObs);
    {
        final Iterable<LanguageImplChange> changes = Iterables2.from(new LanguageImplChange(LanguageImplChange.Kind.Reload, impl1), new LanguageImplChange(LanguageImplChange.Kind.Add, impl2), new LanguageImplChange(LanguageImplChange.Kind.Add, impl3));
        assertOnNext(changes, implObs);
        assertOnNext(changes, implObs);
        assertOnNext(changes, implObs);
    }
    // Remove component1, expect component1 remove, impl1 reload
    languageService.remove(component1);
    assertOnNext(new LanguageComponentChange(LanguageComponentChange.Kind.Remove, component1, null), compObs);
    assertOnNext(new LanguageImplChange(LanguageImplChange.Kind.Reload, impl1), implObs);
    // Reload component2, contribute to impl2 now, expect component2 reload, [impl1 reload, impl2 reload] (order
    // unknown)
    final ILanguageComponent component2Reload = language(identifier2, location2, requestIdentifier2);
    assertOnNext(new LanguageComponentChange(LanguageComponentChange.Kind.Reload, component2, component2Reload), compObs);
    {
        final Iterable<LanguageImplChange> changes = Iterables2.from(new LanguageImplChange(LanguageImplChange.Kind.Reload, impl1), new LanguageImplChange(LanguageImplChange.Kind.Reload, impl2));
        assertOnNext(changes, implObs);
        assertOnNext(changes, implObs);
    }
    // Remove component3, expect component3 remove, [impl1 remove, impl2 reload, impl3 remove] (order unknown)
    languageService.remove(component3);
    assertOnNext(new LanguageComponentChange(LanguageComponentChange.Kind.Remove, component3, null), compObs);
    {
        final Iterable<LanguageImplChange> changes = Iterables2.from(new LanguageImplChange(LanguageImplChange.Kind.Remove, impl3), new LanguageImplChange(LanguageImplChange.Kind.Reload, impl2), new LanguageImplChange(LanguageImplChange.Kind.Remove, impl1));
        assertOnNext(changes, implObs);
        assertOnNext(changes, implObs);
        assertOnNext(changes, implObs);
    }
    // Remove component2, expect component2 remove, impl2 remove
    languageService.remove(component2);
    assertOnNext(new LanguageComponentChange(LanguageComponentChange.Kind.Remove, component2, null), compObs);
    assertOnNext(new LanguageImplChange(LanguageImplChange.Kind.Remove, impl2), implObs);
    assertEmpty(compObs);
    assertEmpty(implObs);
}
Also used : ITestableObserver(org.metaborg.util.observable.ITestableObserver) TestableObserver(org.metaborg.util.observable.TestableObserver) LanguageImplChange(org.metaborg.core.language.LanguageImplChange) LanguageContributionIdentifier(org.metaborg.core.language.LanguageContributionIdentifier) LanguageComponentChange(org.metaborg.core.language.LanguageComponentChange) 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 7 with LanguageVersion

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

the class LanguageServiceTest method nonExistentLocation.

/**
 * Try to add component with non-existent location. Assert that exception is thrown.
 */
@Test(expected = IllegalStateException.class)
public void nonExistentLocation() throws Exception {
    final LanguageVersion version = version(0, 0, 1);
    final FileObject location = resourceService.resolve("ram:///doesnotexist");
    language(groupId, "org.metaborg.lang.entity", version, location, "Entity");
}
Also used : LanguageVersion(org.metaborg.core.language.LanguageVersion) FileObject(org.apache.commons.vfs2.FileObject) Test(org.junit.Test) MetaborgTest(org.metaborg.core.test.MetaborgTest)

Example 8 with LanguageVersion

use of org.metaborg.core.language.LanguageVersion 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 9 with LanguageVersion

use of org.metaborg.core.language.LanguageVersion 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 10 with LanguageVersion

use of org.metaborg.core.language.LanguageVersion 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)

Aggregations

FileObject (org.apache.commons.vfs2.FileObject)15 LanguageVersion (org.metaborg.core.language.LanguageVersion)15 Test (org.junit.Test)14 MetaborgTest (org.metaborg.core.test.MetaborgTest)14 ILanguageComponent (org.metaborg.core.language.ILanguageComponent)11 ILanguageImpl (org.metaborg.core.language.ILanguageImpl)10 LanguageIdentifier (org.metaborg.core.language.LanguageIdentifier)9 ILanguage (org.metaborg.core.language.ILanguage)7 LanguageContributionIdentifier (org.metaborg.core.language.LanguageContributionIdentifier)4 DescriptionFacet (org.metaborg.core.language.DescriptionFacet)2 Nullable (javax.annotation.Nullable)1 MetaborgException (org.metaborg.core.MetaborgException)1 MetaborgRuntimeException (org.metaborg.core.MetaborgRuntimeException)1 IContext (org.metaborg.core.context.IContext)1 IFacet (org.metaborg.core.language.IFacet)1 LanguageComponentChange (org.metaborg.core.language.LanguageComponentChange)1 LanguageImplChange (org.metaborg.core.language.LanguageImplChange)1 ResourceExtensionFacet (org.metaborg.core.language.ResourceExtensionFacet)1 IdentifiedDialect (org.metaborg.core.language.dialect.IdentifiedDialect)1 ISpoofaxInputUnit (org.metaborg.spoofax.core.unit.ISpoofaxInputUnit)1