blob: 04f1aae07c3150b939d0b2a19f4f0b4c2fe2c8aa [file] [log] [blame]
package edu.uci.ics.asterix.test.aql;
import static org.junit.Assert.fail;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.NoSuchElementException;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import edu.uci.ics.hyracks.algebricks.common.exceptions.NotImplementedException;
public class TestsUtils {
private static final String EXTENSION_AQL_RESULT = "adm";
/**
* Probably does not work well with symlinks.
*/
public static boolean deleteRec(File path) {
if (path.isDirectory()) {
for (File f : path.listFiles()) {
if (!deleteRec(f)) {
return false;
}
}
}
return path.delete();
}
public static void runScriptAndCompareWithResult(File scriptFile, PrintWriter print, File expectedFile,
File actualFile) throws Exception {
BufferedReader readerExpected = new BufferedReader(new InputStreamReader(new FileInputStream(expectedFile),
"UTF-8"));
BufferedReader readerActual = new BufferedReader(
new InputStreamReader(new FileInputStream(actualFile), "UTF-8"));
String lineExpected, lineActual;
int num = 1;
try {
while ((lineExpected = readerExpected.readLine()) != null) {
lineActual = readerActual.readLine();
// Assert.assertEquals(lineExpected, lineActual);
if (lineActual == null) {
if (lineExpected.isEmpty()) {
continue;
}
throw new Exception("Result for " + scriptFile + " changed at line " + num + ":\n< " + lineExpected
+ "\n> ");
}
if (!equalStrings(lineExpected.split("Timestamp")[0], lineActual.split("Timestamp")[0])) {
fail("Result for " + scriptFile + " changed at line " + num + ":\n< " + lineExpected + "\n> "
+ lineActual);
}
++num;
}
lineActual = readerActual.readLine();
// Assert.assertEquals(null, lineActual);
if (lineActual != null) {
throw new Exception("Result for " + scriptFile + " changed at line " + num + ":\n< \n> " + lineActual);
}
// actualFile.delete();
} finally {
readerExpected.close();
readerActual.close();
}
}
private static boolean equalStrings(String s1, String s2) {
String[] rowsOne = s1.split("\n");
String[] rowsTwo = s2.split("\n");
for (int i = 0; i < rowsOne.length; i++) {
String row1 = rowsOne[i];
String row2 = rowsTwo[i];
if (row1.equals(row2))
continue;
String[] fields1 = row1.split(" ");
String[] fields2 = row2.split(" ");
for (int j = 0; j < fields1.length; j++) {
if (fields1[j].equals(fields2[j])) {
continue;
} else if (fields1[j].indexOf('.') < 0) {
return false;
} else {
fields1[j] = fields1[j].split(",")[0];
fields2[j] = fields2[j].split(",")[0];
Double double1 = Double.parseDouble(fields1[j]);
Double double2 = Double.parseDouble(fields2[j]);
float float1 = (float) double1.doubleValue();
float float2 = (float) double2.doubleValue();
if (Math.abs(float1 - float2) == 0)
continue;
else {
return false;
}
}
}
}
return true;
}
public static String aqlExtToResExt(String fname) {
int dot = fname.lastIndexOf('.');
return fname.substring(0, dot + 1) + EXTENSION_AQL_RESULT;
}
public static void writeResultsToFile(File actualFile, JSONObject result) throws IOException, JSONException {
BufferedWriter writer = new BufferedWriter(new FileWriter(actualFile));
Results res = new Results(result);
for (String line : res) {
writer.write(line);
writer.newLine();
}
writer.close();
}
public static class Results implements Iterable<String> {
private final JSONArray chunks;
public Results(JSONObject result) throws JSONException {
chunks = result.getJSONArray("results");
}
public Iterator<String> iterator() {
return new ResultIterator(chunks);
}
}
public static class ResultIterator implements Iterator<String> {
private final JSONArray chunks;
private int chunkCounter = 0;
private int recordCounter = 0;
public ResultIterator(JSONArray chunks) {
this.chunks = chunks;
}
@Override
public boolean hasNext() {
JSONArray resultArray;
try {
resultArray = chunks.getJSONArray(chunkCounter);
if (resultArray.getString(recordCounter) != null) {
return true;
}
} catch (JSONException e) {
return false;
}
return false;
}
@Override
public String next() throws NoSuchElementException {
JSONArray resultArray;
String item = "";
try {
resultArray = chunks.getJSONArray(chunkCounter);
item = resultArray.getString(recordCounter);
if (item == null) {
throw new NoSuchElementException();
}
item = item.trim();
recordCounter++;
if (recordCounter >= resultArray.length()) {
chunkCounter++;
recordCounter = 0;
}
} catch (JSONException e) {
throw new NoSuchElementException(e.getMessage());
}
return item;
}
@Override
public void remove() {
throw new NotImplementedException();
}
}
}