/* * Copyright 2003-2016 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.generator.impl.plan; import jetbrains.mps.project.Project; import jetbrains.mps.tool.environment.Environment; import jetbrains.mps.tool.environment.EnvironmentConfig; import jetbrains.mps.tool.environment.MpsEnvironment; import org.jetbrains.mps.openapi.model.SModel; import org.jetbrains.mps.openapi.model.SModelReference; import org.jetbrains.mps.openapi.persistence.PersistenceFacade; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ErrorCollector; import java.io.File; import static org.hamcrest.CoreMatchers.equalTo; /** * @author Artem Tikhomirov */ public class TemplateModelScanTest { private static Environment ourEnvironment; @Rule public final ErrorCollector myErrors = new ErrorCollector(); @BeforeClass public static void setup() { ourEnvironment = MpsEnvironment.getOrCreate(EnvironmentConfig.defaultConfig()); } @AfterClass public static void tearDown() { ourEnvironment.release(); } /** * The test used to compare old and new template model scanner implementation. * With removal of the legacy scanner, there's nothing to match against, hence the test basically * is a rudimentary check there's any result at all from the new scanner. * I don't want to remove it altogether as there's some stats about performance and as well there might be need * to make more thorough check (e.g. hardcode expected target/query language for each model to check against). */ @Test public void newScannerYieldsAnyResults() { final Project mpsProject = ourEnvironment.openProject(new File(System.getProperty("user.dir"))); final String[] templateModels2Test = { "r:00000000-0000-4000-0000-011c8959029f(jetbrains.mps.lang.editor.generator.baseLanguage.template.main@generator)", "r:00000000-0000-4000-0000-011c895902e9(jetbrains.mps.lang.generator.generator.baseLanguage.template.main@generator)", "r:00000000-0000-4000-0000-011c895902cd(jetbrains.mps.baseLanguage.generator.java.main@generator)", "r:00000000-0000-4000-0000-011c89590303(jetbrains.mps.lang.smodel.generator.baseLanguage.template.main@generator)", "r:00000000-0000-4000-0000-011c8959032f(jetbrains.mps.baseLanguage.collections.generator.baseLanguage.template.main@generator)", "r:d1558b8f-fc9e-4ca7-bb90-70ac789f336e(jetbrains.mps.baseLanguage.collections.generator.baseLanguage.template.post@generator)", "r:d64ba0fe-173d-44e2-ab7b-bde40d7e9b7e(jetbrains.mps.baseLanguage.collections.generator.baseLanguage.template.pre@generator)", "r:00000000-0000-4000-0000-011c8959034c(jetbrains.mps.lang.quotation.generator.baseLanguage.template.main@generator)", "r:00000000-0000-4000-0000-011c8959033a(jetbrains.mps.baseLanguage.closures.generator.baseLanguage.template.main@generator)", "r:00000000-0000-4000-0000-011c895902b7(jetbrains.mps.lang.typesystem.generator.baseLanguage.template.main@generator)", }; /* final String[] templateModels2Test = new ModelAccessHelper(mpsProject.getModelAccess()).runReadAction(new Computable<String[]>() { @Override public String[] compute() { ArrayList<String> rv = new ArrayList<String>(); for (SModule m : mpsProject.getModulesWithGenerators()) { if (m instanceof Generator) { for (SModel tm : ((Generator) m).getOwnTemplateModels()) { rv.add(tm.getReference().toString()); } } } return rv.toArray(new String[rv.size()]); } }); System.out.println("Total template models:" + templateModels2Test.length); */ try { final ModelScanner[] s2 = new ModelScanner[templateModels2Test.length]; final long[] s2Dur = new long[s2.length]; Runnable cmd = new Runnable() { @Override public void run() { for (int i = 0; i < templateModels2Test.length; i++) { final SModelReference mr = PersistenceFacade.getInstance().createModelReference(templateModels2Test[i]); SModel m = mr.resolve(mpsProject.getRepository()); final long start = System.nanoTime(); s2[i] = new ModelScanner(); s2[i].scan(m); // s2[i].scanInLegacyMode(m); final long end = System.nanoTime(); s2Dur[i] = end - start; } } }; mpsProject.getModelAccess().runReadAction(cmd); for (int i = 0; i < templateModels2Test.length; i++) { myErrors.checkThat("Query languages for model " + templateModels2Test[i], s2[i].getQueryLanguages().isEmpty(), equalTo(false)); myErrors.checkThat("Template languages for model " + templateModels2Test[i], s2[i].getTargetLanguages().isEmpty(), equalTo(false)); } /* Performance dump (old code - TemplateModelScanner, new code - ModelScanner, backed with FNF) Arrays.fill(s1Dur, 0); Arrays.fill(s2Dur, 0); mpsProject.getModelAccess().runReadAction(cmd); System.out.println("Old\t\t\tNew (microseconds)"); for (int i = 0; i < s1.length; i++) { System.out.printf("%6d\t\t%6d\n", s1Dur[i] / 1000, s2Dur[i] / 1000); } Old New (microseconds) 11026 7343 13725 7607 756 361 4908 2595 5018 2479 275 274 123 169 1386 872 6537 6031 7823 3139 */ } finally { mpsProject.dispose(); } } }