package jetbrains.mps.testbench.junit.suites; /*Generated by MPS */ import org.jetbrains.mps.openapi.module.SModule; import org.junit.Test; import jetbrains.mps.testbench.junit.Order; import java.util.List; import java.util.ArrayList; import jetbrains.mps.internal.collections.runtime.ListSequence; import jetbrains.mps.smodel.Language; import jetbrains.mps.internal.collections.runtime.CollectionSequence; import jetbrains.mps.project.validation.MessageCollectProcessor; import jetbrains.mps.project.validation.ValidationProblem; import jetbrains.mps.project.validation.ValidationUtil; import org.junit.Assert; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.internal.collections.runtime.IVisitor; import jetbrains.mps.project.validation.NodeValidationProblem; import jetbrains.mps.project.validation.SuppressingAwareProcessorDecorator; import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.mps.openapi.model.SNodeUtil; import org.jetbrains.mps.openapi.model.SReference; import jetbrains.mps.util.SNodeOperations; import org.junit.Assume; import jetbrains.mps.generator.ModelGenerationStatusManager; import jetbrains.mps.extapi.model.GeneratableSModel; import java.util.Collection; public class CheckProjectStructure extends BaseCheckModulesTest { public CheckProjectStructure(SModule module) { super(module); } @Test @Order(value = 1) public void checkModuleProperties() { final List<String> errors = new ArrayList<String>(); BaseCheckModulesTest.getContextProject().getModelAccess().runReadAction(new Runnable() { public void run() { List<SModule> modules = ListSequence.fromListAndArray(new ArrayList<SModule>(), myModule); if (myModule instanceof Language) { ListSequence.fromList(modules).addSequence(CollectionSequence.fromCollection(((Language) myModule).getGenerators())); } for (SModule sm : modules) { MessageCollectProcessor<ValidationProblem> processor = new MessageCollectProcessor<ValidationProblem>(false); ValidationUtil.validateModule(sm, processor); if (processor.getErrors().isEmpty()) { continue; } StringBuilder errorMessages = new StringBuilder(); for (String item : processor.getErrors()) { errorMessages.append("\t").append(item).append("\n"); } errors.add("Error in module " + sm.getModuleName() + ": " + errorMessages.toString()); } } }); Assert.assertTrue("Module property or dependency errors:\n" + CheckingTestsUtil.formatErrors(errors), errors.isEmpty()); } @Test @Order(value = 2) public void checkModels() { final List<String> errors = new ArrayList<String>(); BaseCheckModulesTest.getContextProject().getModelAccess().runReadAction(new Runnable() { public void run() { for (SModel sm : extractModels(true)) { MessageCollectProcessor<ValidationProblem> collector = new MessageCollectProcessor<ValidationProblem>(false); ValidationUtil.validateModel(sm, collector); if (collector.getErrors().isEmpty()) { continue; } final StringBuilder errorMessages = new StringBuilder(); errorMessages.append("errors in model: ").append(sm.getReference().toString()).append("\n"); ListSequence.fromList(((List<String>) collector.getErrors())).visitAll(new IVisitor<String>() { public void visit(String it) { errorMessages.append("\t").append(it).append("\n"); } }); errors.add(errorMessages.toString()); } } }); Assert.assertTrue("Model errors:\n" + CheckingTestsUtil.formatErrors(errors), errors.isEmpty()); } @Test @Order(value = 3) public void checkStructure() { final List<String> errors = new ArrayList<String>(); BaseCheckModulesTest.getContextProject().getModelAccess().runReadAction(new Runnable() { public void run() { for (SModel sm : extractModels(true)) { MessageCollectProcessor<NodeValidationProblem> collector = new MessageCollectProcessor<NodeValidationProblem>(false) { @Override protected String formatMessage(NodeValidationProblem problem) { String err = super.formatMessage(problem); return err + " in node " + problem.getNode().getNodeId(); } }; ValidationUtil.validateModelContent(sm.getRootNodes(), new SuppressingAwareProcessorDecorator(collector)); if (collector.getErrors().isEmpty()) { continue; } final StringBuilder errorMessages = new StringBuilder(); errorMessages.append("errors in model: ").append(sm.getReference().toString()).append("\n"); ListSequence.fromList(((List<String>) collector.getErrors())).visitAll(new IVisitor<String>() { public void visit(String it) { errorMessages.append("\t").append(it).append("\n"); } }); errors.add(errorMessages.toString()); } } }); Assert.assertTrue("Structure errors:\n" + CheckingTestsUtil.formatErrors(errors), errors.isEmpty()); } @Test @Order(value = 4) public void checkReferences() { final List<String> errors = new ArrayList<String>(); BaseCheckModulesTest.getContextProject().getModelAccess().runReadAction(new Runnable() { public void run() { for (SModel sm : extractModels(true)) { StringBuilder errorMessages = new StringBuilder(); errorMessages.append("errors in model: ").append(sm.getReference().toString()).append("\n"); boolean withErrors = false; for (SNode node : SNodeUtil.getDescendants(sm)) { for (SReference ref : node.getReferences()) { if (jetbrains.mps.smodel.SNodeUtil.hasReferenceMacro(node, ref.getLink())) { continue; } if (SNodeOperations.getTargetNodeSilently(ref) != null) { continue; } withErrors = true; errorMessages.append("Broken reference in model {").append(node.getModel().getName().getLongName()).append("}").append(" node ").append(node.getNodeId().toString()).append("(").append(node).append(")\n"); } } if (withErrors) { errors.add("Broken References: " + errorMessages.toString()); } } } }); Assert.assertTrue("Reference errors:\n" + CheckingTestsUtil.formatErrors(errors), errors.isEmpty()); } @Test @Order(value = 5) public void checkGenerationStatus() { Assume.assumeFalse("Generation status is meaningless for packaged modules", myModule.isPackaged()); final List<String> errors = new ArrayList<String>(); BaseCheckModulesTest.getContextProject().getModelAccess().runReadAction(new Runnable() { public void run() { for (SModel sm : extractModels(false)) { SModule module = sm.getModule(); if (module == null) { errors.add("Model without a module: " + sm.getReference().toString()); continue; } String genHash = ModelGenerationStatusManager.getLastGenerationHash(((GeneratableSModel) sm)); if (genHash == null) { errors.add("No generated hash for " + sm.getReference().toString()); continue; } String realHash = ((GeneratableSModel) sm).getModelHash(); if (realHash == null) { errors.add("cannot gen cache for " + sm.getReference().toString()); continue; } if (!(realHash.equals(genHash))) { errors.add("model requires generation: " + sm.getReference().toString() + " last genHash:" + genHash + " modelHash:" + realHash); } } } }); Assert.assertTrue("Try to regenerate models:\n" + CheckingTestsUtil.formatErrors(errors), errors.isEmpty()); } private Collection<SModel> extractModels(boolean includeDontGenerate) { return new ModelsExtractor(myModule, includeDontGenerate).includingGenerators().getModels(); } }