/*
* Copyright 2003-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jetbrains.mps.testbench;
import jetbrains.mps.CoreMpsTest;
import jetbrains.mps.extapi.module.SRepositoryExt;
import jetbrains.mps.project.AbstractModule;
import jetbrains.mps.project.DevKit;
import jetbrains.mps.project.Solution;
import jetbrains.mps.project.structure.modules.LanguageDescriptor;
import jetbrains.mps.smodel.Generator;
import jetbrains.mps.smodel.Language;
import jetbrains.mps.smodel.MPSModuleRepository;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.module.ModelAccess;
import org.jetbrains.mps.openapi.module.SModule;
import org.jetbrains.mps.openapi.module.SModuleId;
import org.jetbrains.mps.openapi.module.SModuleReference;
import org.junit.After;
/**
* Currently represents CoreMpsTest, which creates some platform to operate with modules
* Suggests methods to create Solution, Language, DevKit.
* Extend it to gain its toolkit to check module-related functional.
*
* for example look at
* @see jetbrains.mps.ide.depanalyzer.ModuleDependenciesTest
*/
public class ModuleMpsTest extends CoreMpsTest {
private final static Logger LOG = LogManager.getLogger(ModuleMpsTest.class);
private final TestModuleFactory myTestModuleFactory;
public ModuleMpsTest() {
myTestModuleFactory = new TestModuleFactoryBase(getTestRepository());
}
public ModuleMpsTest(@NotNull TestModuleFactory testModuleFactory) {
myTestModuleFactory = testModuleFactory;
}
@After
public void afterTest() {
LOG.info("Cleaning up after the test");
myTestModuleFactory.removeRegisteredModules();
}
/**
* This is the repository test modules get created/registered in.
* At the moment, bound to be instance of MPSModuleRepository (the only way to register/unregister module)
*/
@NotNull
protected final SRepositoryExt getTestRepository() {
return ENV.getPlatform().findComponent(MPSModuleRepository.class);
}
protected final ModelAccess getModelAccess() {
return getTestRepository().getModelAccess();
}
/**
* methods create modules and register it in the repository (assuming it is the only one)
*/
public Solution createSolution() {
return myTestModuleFactory.createSolution(null);
}
public Language createLanguageWithGenerator() {
return myTestModuleFactory.createLanguageWithGenerator();
}
@NotNull
public LanguageDescriptor createLanguageDescriptor(final SModuleId id, final String name, SModuleReference... runtimes) {
return myTestModuleFactory.createLanguageDescriptor(id, name, runtimes);
}
@NotNull
public LanguageDescriptor createLanguageDescriptor(SModuleReference... runtimes) {
return myTestModuleFactory.createLanguageDescriptor(runtimes);
}
public Language createLanguage() {
return myTestModuleFactory.createLanguage();
}
public Language createLanguage(SModuleReference... runtimes) {
return myTestModuleFactory.createLanguage(runtimes);
}
public Language createLanguage(final SModuleId id, final String name, SModuleReference... runtimes) {
return myTestModuleFactory.createLanguage(id, name, runtimes);
}
public DevKit createDevKit() {
return myTestModuleFactory.createDevKit();
}
@NotNull
public Generator createGenerator() {
return myTestModuleFactory.createGenerator();
}
public void removeModule(final SModule module) {
myTestModuleFactory.removeModule(module);
}
public void addUsedLanguage(AbstractModule client, Language toUse) {
myTestModuleFactory.addUsedLanguage(client, toUse);
}
public void addUsedDevKit(AbstractModule client, DevKit toUse) {
myTestModuleFactory.addUsedDevKit(client, toUse);
}
}