package tests.testPersistence.test; /*Generated by MPS */ import jetbrains.mps.extapi.model.SModelBase; import org.jetbrains.mps.openapi.module.SRepository; import jetbrains.mps.smodel.ModelAccessHelper; import jetbrains.mps.util.Computable; import jetbrains.mps.smodel.TrivialModelDescriptor; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.smodel.ModuleRepositoryFacade; import jetbrains.mps.smodel.SnapshotModelData; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations; import jetbrains.mps.smodel.CopyUtil; import jetbrains.mps.smodel.ModelImports; import jetbrains.mps.persistence.PersistenceUtil; import jetbrains.mps.smodel.persistence.def.ModelPersistence; import java.io.IOException; import junit.framework.Assert; import jetbrains.mps.persistence.PersistenceRegistry; import java.util.List; import java.util.Comparator; import java.util.ArrayList; import java.util.Arrays; /** * This is test class for _supported_ persistences. * Note the difference between supported persistence and vcs persistence. * For info, read doc comments in ModelPersistence/VCSPersistenceSupport classes */ public class TestPersistenceHelper { /** * should be changed to ModelPersistence.firstSupportedVersion */ public static final int START_PERSISTENCE_TEST_VERSION = 9; public TestOutputFilter filter = new TestOutputFilter() { @Override protected boolean isLineOK(String line) { return line != null && !((line.contains("attribute") && line.contains("undeclared child role:"))); } }; private final SModelBase myTestModel; /*package*/ TestPersistenceHelper(final SRepository repo) { // myTestModel is a copy of a sample model, detached to avoid model read access. myTestModel = new ModelAccessHelper(repo).runReadAction(new Computable<TrivialModelDescriptor>() { public TrivialModelDescriptor compute() { SModel testModel = new ModuleRepositoryFacade(repo).getModelByName("tests.testPersistence.testModel"); SnapshotModelData mdClone = new SnapshotModelData(testModel.getReference()); // XXX in fact, duplicates CloneUtil.cloneModelWithImports. Don't want dependency from generator, though. // Perhaps, need a high-level mechanism to clone a model? for (SNode r : SModelOperations.roots(testModel, null)) { // TrivialModelDescriptor doesn't support addRootNode(), that's why update SModelData directly mdClone.addRootNode(CopyUtil.copyAndPreserveId(r, true)); } TrivialModelDescriptor rv = new TrivialModelDescriptor(mdClone); ModelImports mi = new ModelImports(rv); mi.copyImportedModelsFrom(testModel); mi.copyUsedLanguagesFrom(testModel); mi.copyEmployedDevKitsFrom(testModel); return rv; } }); } /*package*/ void saveTestModelInPersistence(PersistenceUtil.InMemoryStreamDataSource dataSource, int persistence) { try { filter.start(); ModelPersistence.saveModel(myTestModel.getSModel(), dataSource, persistence); } catch (IOException e) { Assert.fail("Exception during test. See log for details"); e.printStackTrace(); } finally { filter.stop(); } } /*package*/ SModelBase getTestModel() { return myTestModel; } /*package*/ String getDefaultExt() { return PersistenceRegistry.getInstance().getDefaultModelFactory().getFileExtension(); } /*package*/ static <C> String assertListsEqual(List<C> expectedList, List<C> actualList, String name) { return assertListsEqual(expectedList, actualList, new Comparator<C>() { @Override public int compare(C o1, C o2) { return (o1.equals(o2) ? 0 : 1); } }, name); } /*package*/ static <C> String assertListsEqual(List<C> expectedList, List<C> actualList, Comparator<C> comparator, String name) { List<C> notFoundExpected = new ArrayList<C>(); List<C> notFoundActual = new ArrayList<C>(); for (C expected : expectedList) { boolean found = false; for (C actual : actualList) { if (comparator.compare(actual, expected) == 0) { found = true; break; } } if (!(found)) { notFoundExpected.add(expected); } } for (C actual : actualList) { boolean found = false; for (C expected : expectedList) { if (comparator.compare(actual, expected) == 0) { found = true; break; } } if (!(found)) { notFoundActual.add(actual); } } if (!(notFoundExpected.isEmpty())) { return "Not found expected " + name + " " + Arrays.toString(notFoundExpected.toArray()); } if (!(notFoundActual.isEmpty())) { return "Not expected " + name + " " + Arrays.toString(notFoundActual.toArray()); } return null; } }