blob: b55d6377853332e3d52c0b9043323264aa44f008 [file] [log] [blame]
/**
* Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-v2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Thales Corporate Services S.A.S - initial API and implementation
*/
package org.eclipse.egf.core.test;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.StringReader;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.egf.core.producer.InvocationException;
import org.eclipse.egf.model.fcore.Activity;
import org.eclipse.egf.producer.EGFProducerPlugin;
import org.eclipse.egf.producer.manager.ActivityManagerProducer;
import org.eclipse.egf.producer.manager.IActivityManager;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.ecore.util.Diagnostician;
import test.ConsoleOutputTestResult;
import test.EGFTestCase;
import test.ExceptionTestResult;
import test.FileOutputTestResult;
import test.TestResult;
import test.ValidationErrorTestResult;
/**
* @author Matthieu Helleboid
*
*/
public class ModelTestCase extends junit.framework.TestCase {
private EGFTestCase testCase;
public ModelTestCase(EGFTestCase testCase) {
super(testCase.getName());
this.testCase = testCase;
}
@Override
protected void setUp() throws Exception {
super.setUp();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
@Override
protected void runTest() throws Throwable {
PrintStream out = System.out;
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
System.setOut(new PrintStream(byteArrayOutputStream));
Activity activity = testCase.getActivity();
TestResult result = testCase.getResult();
try {
runActivity(activity, result);
handleConsoleOutputTestResult(byteArrayOutputStream, result);
handleFileOutputTestResult(result);
} catch (Exception e) {
handleExceptionTestResult(result, e);
} finally {
System.setOut(out);
}
}
private void handleFileOutputTestResult(TestResult result) {
if (result instanceof FileOutputTestResult) {
FileOutputTestResult fileOutputTestResult = (FileOutputTestResult) result;
String expectedString = fileOutputTestResult.getText();
String iFilePath = fileOutputTestResult.getIFilePath();
IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(iFilePath));
if (!file.exists())
fail("The expected file " + iFilePath + " should exist"); //$NON-NLS-1$ //$NON-NLS-2$
long fileLength = new File(file.getRawLocationURI()).length();
// If both are null, it's ok
if (expectedString == null && fileLength == 0)
return;
// If one is not null, it's not ok
assertNotSame("The file " + iFilePath + " should not be empty.", fileLength, 0); //$NON-NLS-1$ //$NON-NLS-2$
assertNotNull("The file " + iFilePath + " should be empty.", expectedString); //$NON-NLS-1$ //$NON-NLS-2$
try {
BufferedReader expectedReader = new BufferedReader(new StringReader(expectedString));
BufferedReader resultReader = new BufferedReader(new InputStreamReader(file.getContents()));
compareContent(expectedReader, resultReader);
} catch (CoreException e) {
fail("The expected file " + iFilePath + " cannot be read : " + e.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
private void handleConsoleOutputTestResult(ByteArrayOutputStream byteArrayOutputStream, TestResult result) {
if (result instanceof ConsoleOutputTestResult) {
ConsoleOutputTestResult consoleOutputTestResult = (ConsoleOutputTestResult) result;
String expectedString = consoleOutputTestResult.getText();
String resultString = byteArrayOutputStream.toString();
// If both are null, it's ok
if (expectedString == null && resultString == null)
return;
// If one is not null, it's not ok
assertNotNull("There is no output but a result was expected <[" + expectedString + "]>", resultString); //$NON-NLS-1$ //$NON-NLS-2$
assertNotNull("There is a output but no result was expected <[" + resultString + "]>", expectedString); //$NON-NLS-1$ //$NON-NLS-2$
BufferedReader expectedReader = new BufferedReader(new StringReader(expectedString));
BufferedReader resultReader = new BufferedReader(new StringReader(resultString));
compareContent(expectedReader, resultReader);
}
}
private void compareContent(BufferedReader expectedReader, BufferedReader resultReader) {
// will compare line by line
BufferedReader expectedStringReader = expectedReader;
BufferedReader resultStringReader = resultReader;
int line = 1;
try {
while (true) {
String expectedStringLine = expectedStringReader.readLine();
String resultStringLine = resultStringReader.readLine();
// If both are null, it's ok
if (expectedStringLine == null && resultStringLine == null)
return;
assertEquals("at line " + line++, expectedStringLine, resultStringLine); //$NON-NLS-1$
}
} catch (Exception e) {
fail(e.getMessage());
} finally {
try {
expectedStringReader.close();
} catch (IOException e) {
fail(e.getMessage());
}
try {
resultStringReader.close();
} catch (IOException e) {
fail(e.getMessage());
}
}
}
private void handleExceptionTestResult(TestResult result, Exception e) {
if (result instanceof ExceptionTestResult) {
ExceptionTestResult exceptionTestResult = (ExceptionTestResult) result;
assertEquals(exceptionTestResult.getExceptionClass(), e.getClass());
if (exceptionTestResult.getExceptionMessage() != null)
assertEquals(exceptionTestResult.getExceptionMessage(), e.getMessage());
} else if (result != null) {
fail("No exceptionTestResult was attended : <[" + e.getClass().getName() + " " + e.getMessage() + "]>"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}
private void handleValidationErrorTestResult(TestResult result, Diagnostic diagnostic) {
if (result instanceof ValidationErrorTestResult) {
ValidationErrorTestResult validationErrorTestResult = (ValidationErrorTestResult) result;
assertEquals(validationErrorTestResult.getSeverity().getValue(), diagnostic.getSeverity());
} else if (result != null) {
fail("No validationErrorTestResult was attended : <[" + diagnostic.toString() + "]>"); //$NON-NLS-1$ //$NON-NLS-2$
}
}
private void runActivity(Activity activity, TestResult result) throws CoreException, InvocationException {
Diagnostician diagnostician = new Diagnostician();
if (activity == null)
fail("Cannot execute a test if the activity is null."); //$NON-NLS-1$
Diagnostic diagnostic = diagnostician.validate(activity);
if (diagnostic.getSeverity() != Diagnostic.OK)
handleValidationErrorTestResult(result, diagnostic);
ActivityManagerProducer<Activity> producer = EGFProducerPlugin.getActivityManagerProducer(activity);
IActivityManager<Activity> manager = producer.createActivityManager(activity);
try {
manager.initializeContext();
manager.invoke(new NullProgressMonitor());
} finally {
manager.dispose();
}
}
}