/** * Copyright (c) 2009-2011, The HATS Consortium. All rights reserved. * This file is licensed under the terms of the Modified BSD License. */ package abs.frontend.typesystem; import static abs.ABSTest.Config.TYPE_CHECK; import static abs.ABSTest.Config.WITH_STD_LIB; import static org.junit.Assert.*; import static org.junit.Assume.*; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Collection; import java.util.List; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import abs.common.WrongProgramArgumentException; import abs.frontend.FrontendTest; import abs.frontend.analyser.SemanticCondition; import abs.frontend.analyser.SemanticConditionList; import abs.frontend.ast.Model; import abs.frontend.parser.Main; @RunWith(Parameterized.class) public class CaseStudyTypeChecking extends FrontendTest { /** * Use a property to be able to point JUnit in the right direction and override the default */ private static String EXAMPLES_DIR = System.getProperty("abs.junit.examples", "../examples/"); private static String ENVISAGE_DIR = System.getProperty("abs.junit.envisage", "~/envisage/"); @Parameters(name="{0}") public static Collection<?> data() { final Object[][] data = new Object[][] { { EXAMPLES_DIR + "T4.3/D4.3.1/FredhopperCloudServices.abs" } , { EXAMPLES_DIR + "T4.2/D4.2.1/Indexing.abs" } , { EXAMPLES_DIR + "T4.2/D4.2.1/Crawling.abs" } , { EXAMPLES_DIR + "T4.2/D4.2.1/MapReduce.abs" } , { EXAMPLES_DIR + "T4.2/D4.2.1/Downloading.abs" } , { EXAMPLES_DIR + "T4.4/D4.4.1/" } , { ENVISAGE_DIR + "WP4/T4.2/integrated/Atbrox.abs" } , { ENVISAGE_DIR + "WP4/T4.2/integrated/AtbroxMultiHandset.abs" } , { ENVISAGE_DIR + "WP4/T4.3/model/FredhopperCloudServices_NoDeltas.abs" } , { ENVISAGE_DIR + "WP4/T4.3/model/FredhopperCloudServices_NoDeltas_v2.abs" } , { ENVISAGE_DIR + "WP4/T4.3/model/FredhopperCloudServices_NoDeltas_v2_CloudProvider.abs" } }; return Arrays.asList(data); } final private String input; protected Model m; public CaseStudyTypeChecking(String input) { this.input = input; } @Test public void test() throws Exception { File srcFolderF = new File(input); assumeTrue(srcFolderF.exists()); m = assertParseFilesOk(input, TYPE_CHECK, WITH_STD_LIB); } protected Model assertParseFilesOk(String srcFolder, Config... config) throws IOException, WrongProgramArgumentException { File srcFolderF = new File(srcFolder); assertTrue(srcFolder,srcFolderF.exists()); Main main = new Main(); main.setWithStdLib(isSet(WITH_STD_LIB,config)); Model m = main.parseFiles(findAbsFiles(srcFolderF).toArray(new String[0])); if (m != null) { m.evaluateAllProductDeclarations(); if (m.hasParserErrors()) Assert.fail(m.getParserErrors().get(0).getMessage()); int numSemErrs = m.getErrors().getErrorCount(); StringBuffer errs = new StringBuffer("Semantic errors: " + numSemErrs + "\n"); if (numSemErrs > 0) { for (SemanticCondition error : m.getErrors()) errs = errs.append(error.getHelpMessage() + "\n"); fail("Failed to parse: " + srcFolder + "\n" + errs.toString()); } else if (isSet(TYPE_CHECK, config)) { SemanticConditionList l = m.typeCheck(); if (l.containsErrors()) { for (SemanticCondition error : l) errs = errs.append(error.getHelpMessage() + "\n"); fail("Failed to typecheck: " + srcFolder + "\n" + errs.toString()); } } } return m; } private List<String> findAbsFiles(File srcFolder) { List<String> result = new java.util.LinkedList<String>(); if (srcFolder.exists() && !srcFolder.isDirectory()) { assertTrue(srcFolder.getName().endsWith(".abs")); result.add(srcFolder.getAbsolutePath()); } else { for (File f : srcFolder.listFiles()) { if (f.isDirectory()) { result.addAll(findAbsFiles(f)); } else if (f.getName().endsWith(".abs")) { result.add(f.getAbsolutePath()); } } } return result; } }