/**
* 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.
*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*/
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.thingml.testjar;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.thingml.testjar.lang.TargetedLanguage;
/**
*
* @author sintef
*/
public class TestHelper {
public static TargetedLanguage getLang(List<TargetedLanguage> langs, String lname) {
for(TargetedLanguage lang : langs) {
if(lang.compilerID.compareToIgnoreCase(lname) == 0)
return lang;
}
return null;
}
/*public static Set<File> listTestFiles(final File folder, String pattern) {
Set<File> res = new HashSet<>();
Pattern p = Pattern.compile(pattern);
//System.out.println(" -- " + folder.getName());
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
res.addAll(listTestFiles(fileEntry, pattern));
} else {
Matcher m = p.matcher(fileEntry.getName());
if (m.matches()) {
res.add(fileEntry);
}
}
}
return res;
}*/
public static Set<File> listTestFiles(final File folder, String pattern, Set<String> dirList, boolean blackDir, Set<String> testList, boolean blackTest) {
//System.out.println("search " + folder.getName() + " dirList null:" + (dirList == null));
Set<File> res = new HashSet<>();
Pattern p = Pattern.compile(pattern);
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
//System.out.println(" search? " + fileEntry.getName());
if(dirList == null) {
res.addAll(listTestFiles(fileEntry, pattern, null, false, testList, blackTest));
} else if (blackDir) {
if(!containsString(dirList, fileEntry.getName())) {
res.addAll(listTestFiles(fileEntry, pattern, dirList, true, testList, blackTest));
}
} else {
if(containsString(dirList, fileEntry.getName())) {
res.addAll(listTestFiles(fileEntry, pattern, null, false, testList, blackTest));
} else {
res.addAll(listTestFiles(fileEntry, pattern, dirList, false, testList, blackTest));
}
}
} else {
//System.out.print(" f? " + fileEntry.getName() + ":");
boolean go = true;
if((dirList != null) && !blackDir) go = false; //White dir list: not yet in a white dir
//System.out.print(go + ":");
//Test filter
if(testList != null) {
//System.out.print("(blackTest:" + blackTest + ")");
if(blackTest && containsString(testList, fileEntry.getName().split("\\.thingml")[0])) go = false;
else if (!blackTest && !containsString(testList, fileEntry.getName().split("\\.thingml")[0])) go = false;
}
//System.out.println(go);
Matcher m = p.matcher(fileEntry.getName());
if (go && m.matches()) res.add(fileEntry);
}
}
return res;
}
/*public static Set<File> whiteListFiles(final File folder, Set<String> whiteList) {
String testPattern = "test(.+)\\.thingml";
Set<File> res = new HashSet<>();
for (final File fileEntry : listTestFiles(folder, testPattern)) {
if (fileEntry.isDirectory()) {
res.addAll(whiteListFiles(fileEntry, whiteList));
} else {
String fileName = fileEntry.getName().split("\\.thingml")[0];
boolean found = false;
for(String s : whiteList) {
if (fileName.compareTo(s) == 0) {
found = true;
}
}
if(found)
res.add(fileEntry);
}
}
return res;
}
public static Set<File> blackListFiles(final File folder, Set<String> blackList) {
String testPattern = "test(.+)\\.thingml";
Set<File> res = new HashSet<>();
for (final File fileEntry : listTestFiles(folder, testPattern)) {
if (fileEntry.isDirectory()) {
res.addAll(blackListFiles(fileEntry, blackList));
} else {
String fileName = fileEntry.getName().split("\\.thingml")[0];
boolean found = false;
for(String s : blackList) {
if (fileName.compareTo(s) == 0) {
found = true;
}
}
if(!found)
res.add(fileEntry);
}
}
return res;
}*/
public static Set<File> listTestDir(final File folder, String pattern) {
Set<File> res = new HashSet<>();
Pattern p = Pattern.compile(pattern);
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
//res.addAll(listTestFiles(fileEntry, pattern));
Matcher m = p.matcher(fileEntry.getName());
if (m.matches()) {
res.add(fileEntry);
}
}
}
return res;
}
public static List<TestCase> listSamples(File srcDir, List<TargetedLanguage> langs, File compilerJar, File pluginJar, File genCodeDir, File logDir) {
String pattern = "(.+)\\.thingml";
Pattern p = Pattern.compile(pattern);
List<TestCase> res = new LinkedList<>();
System.out.println("List samples:");
//Explorer de manière récursive les dossiers
for (final File fileEntry : srcDir.listFiles()) {
if (!fileEntry.isDirectory()) {
//res.addAll(listTestFiles(fileEntry, pattern));
Matcher m = p.matcher(fileEntry.getName());
if (m.matches()) {
boolean specificLang = false;
for(TargetedLanguage lang : langs) {
if(lang.compilerID.compareToIgnoreCase("_" + fileEntry.getParent()) == 0) {
specificLang = true;
System.out.println(" -" + fileEntry.getName() + "(" + lang.compilerID + ")");
res.add(new SimpleGeneratedTest(fileEntry, compilerJar, lang, genCodeDir, fileEntry.getParentFile().getParentFile(), logDir, true, pluginJar));
}
}
if(!specificLang) {
}
}
}
}
return res;
}
public static String getTemplateByID(String template_id) {
InputStream input = TestHelper.class.getClassLoader().getResourceAsStream(template_id);
String result = null;
try {
if (input != null) {
result = org.apache.commons.io.IOUtils.toString(input, java.nio.charset.Charset.forName("UTF-8"));
input.close();
} else {
System.out.println("[Error] Template not found: " + template_id);
}
} catch (Exception e) {
//e.printStackTrace();
return null; // the template was not found
}
return result;
}
public static String writeCSSResultsFile() {
String css = " table\n" +
" {\n" +
" border-collapse: collapse;\n" +
" }\n" +
" td, th \n" +
" {\n" +
" border: 1px solid black;\n" +
" }\n" +
" .green\n" +
" {\n" +
" background: lightgreen\n" +
" }\n" +
" .red\n" +
" {\n" +
" background: red\n" +
/* " }\n" +
" table.sortable thead {\n" +
" background-color:#eee;\n" +
" color:#666666;\n" +
" font-weight: bold;\n" +
" cursor: default;\n" +*/
" }\n";
return css;
}
public static String writeHeaderResultsFile(List<TargetedLanguage> langs) {
StringBuilder res = new StringBuilder();
res.append("<!DOCTYPE html>\n" +
"<html>\n" +
" <head>\n" +
" <meta charset=\"utf-8\" />\n" +
" <title>ThingML tests results</title>\n" +
" <style>\n" +
writeCSSResultsFile() +
" </style>\n" +
// " <script src=\"../src/main/resources/sorttable.js\"></script>\n" +
" </head>\n" +
" <body>\n" +
" <div id=\"test-results-tab\">\n" +
" <input class=\"search\" placeholder=\"Search\" />\n" +
" <button class=\"sort\" data-sort=\"category\">\n" +
" Sort by category\n" +
" </button>\n" +
" <button class=\"sort\" data-sort=\"testcase\">\n" +
" Sort by test name\n" +
" </button>\n" +
" <table class=\"sortable\"><thead>\n" +
" <tr>\n");
res.append(" <th>Category</th>\n");
res.append(" <th>Test</th>\n");
for(TargetedLanguage lang : langs) {
res.append(" <th>" + lang.compilerID + "</th>\n");
}
res.append(" </tr></thead>\n");
res.append(" <tbody class=\"list\">\n");
return res.toString();
}
public static String writeFooterResultsFile(List<TargetedLanguage> langs) {
StringBuilder res = new StringBuilder();
res.append(" </tbody>\n");
res.append(" </table>\n" +
" </div>\n" +
" <script src=\"../src/main/resources/listjs.js\"></script>\n" +
" <script>\n" +
" var options = {\n" +
" valueNames: [ 'category', 'testcase'");
for(TargetedLanguage l : langs) {
res.append(", '" + l.compilerID + "'");
}
res.append("]\n");
res.append(" };\n" +
" \n" +
" var userList = new List('test-results-tab', options);\n" +
" </script>\n" +
" </body>\n");
res.append("</html>");
return res.toString();
}
public static String stripFirstDirFromPath(String path, String dir) {
return path.replaceFirst(dir, "");
}
public static String writeHeaderCustomResultsFile() {
StringBuilder res = new StringBuilder();
res.append("<!DOCTYPE html>\n" +
"<html>\n" +
" <head>\n" +
" <meta charset=\"utf-8\" />\n" +
" <title>ThingML tests results</title>\n" +
" <style>\n" +
writeCSSResultsFile() +
" </style>\n" +
// " <script src=\"../src/main/resources/sorttable.js\"></script>\n" +
" </head>\n" +
" <body>\n" +
" <div id=\"test-results-tab\">\n" +
" <input class=\"search\" placeholder=\"Search\" />\n" +
" <button class=\"sort\" data-sort=\"category\">\n" +
" Sort by category\n" +
" </button>\n" +
" <button class=\"sort\" data-sort=\"testcase\">\n" +
" Sort by test name\n" +
" </button>\n" +
" <button class=\"sort\" data-sort=\"results\">\n" +
" Sort by test results\n" +
" </button>\n" +
" <table class=\"sortable\"><thead>\n" +
" <tr>\n");
res.append(" <th>Category</th>\n");
res.append(" <th>Test</th>\n");
res.append(" <th>Results</th>\n");
res.append(" </tr></thead>\n");
res.append(" <tbody class=\"list\">\n");
return res.toString();
}
public static String writeFooterCustomResultsFile() {
StringBuilder res = new StringBuilder();
res.append(" </tbody>\n");
res.append(" </table>\n" +
" </div>\n" +
// " <script src=\"http://listjs.com/no-cdn/list.js\"></script>\n" +
" <script src=\"../src/main/resources/listjs.js\"></script>\n" +
" <script>\n" +
" var options = {\n" +
" valueNames: [ 'category', 'testcase', 'results'");
res.append("]\n");
res.append(" };\n" +
" \n" +
" var userList = new List('test-results-tab', options);\n" +
" </script>\n" +
" </body>\n");
res.append("</html>");
return res.toString();
}
public static boolean containsString(Set<String> set, String s) {
for(String ss : set) {
if(ss.compareTo(s) == 0) return true;
}
return false;
}
}