Search in sources :

Example 1 with LanguageComponentChange

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

Aggregations

FileObject (org.apache.commons.vfs2.FileObject)1 Test (org.junit.Test)1 ILanguageComponent (org.metaborg.core.language.ILanguageComponent)1 ILanguageImpl (org.metaborg.core.language.ILanguageImpl)1 LanguageComponentChange (org.metaborg.core.language.LanguageComponentChange)1 LanguageContributionIdentifier (org.metaborg.core.language.LanguageContributionIdentifier)1 LanguageIdentifier (org.metaborg.core.language.LanguageIdentifier)1 LanguageImplChange (org.metaborg.core.language.LanguageImplChange)1 LanguageVersion (org.metaborg.core.language.LanguageVersion)1 MetaborgTest (org.metaborg.core.test.MetaborgTest)1 ITestableObserver (org.metaborg.util.observable.ITestableObserver)1 TestableObserver (org.metaborg.util.observable.TestableObserver)1