use of org.metaborg.util.observable.TestableObserver 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);
}
Aggregations