/* Copyright (C) 2004 - 2008 Versant Inc. http://www.db4o.com
This file is part of the sharpen open source java to c# translator.
sharpen is free software; you can redistribute it and/or modify it under
the terms of version 2 of the GNU General Public License as published
by the Free Software Foundation and as clarified by db4objects' GPL
interpretation policy, available at
http://www.db4o.com/about/company/legalpolicies/gplinterpretation/
Alternatively you can write to db4objects, Inc., 1900 S Norfolk Street,
Suite 350, San Mateo, CA 94403, USA.
sharpen is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
package sharpen.ui.tests;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.eclipse.core.runtime.CoreException;
import org.junit.After;
import org.junit.Before;
import sharpen.core.*;
public abstract class AbstractConversionTestCase {
protected JavaProjectCmd _project;
private String projectName="DPrj";
//To Run from MAVEN
protected String projecttempLocation = System.getProperty("user.dir") + "/sharpen.core/target/testcases";
//To Run From Eclipse GUI
//protected String projecttempLocation = System.getProperty("user.dir") + "/sharpen.ui.tests/testcases";
@Before
public void setUp() throws Exception {
Sharpen.getDefault().configuration(configuration());
_project = new JavaProjectCmd();
}
@After
public void tearDown() throws Exception {
_project.deleteProject();
}
protected Configuration configuration() {
return ConfigurationFactory.defaultConfiguration();
}
/**
* @param resource
* @return
* @throws CoreException
* @throws IOException
*/
protected String createCompilationUnit(TestCaseResource resource) throws IOException {
String sourcePackage= projecttempLocation +"/temp/" + projectName + "/src/" + resource.packageName().replace(".", "/");
sourcePackage =sourcePackage.replace("\\", "/");
File sourcePackagePath = new File(sourcePackage);
if (!sourcePackagePath.exists())
{
sourcePackagePath.mkdirs();
}
return _project.createCompilationUnit(sourcePackage, resource.javaFileName(), resource.actualStringContents());
}
protected String createCompilationUnit(TestCaseResource resource, String targetProject) throws IOException {
String sourcePackage= projecttempLocation +"/temp/" + targetProject + "/src/" + resource.packageName().replace(".", "/");
sourcePackage =sourcePackage.replace("\\", "/");
File sourcePackagePath = new File(sourcePackage);
if (!sourcePackagePath.exists())
{
sourcePackagePath.mkdirs();
}
return _project.createCompilationUnit(sourcePackage, resource.javaFileName(), resource.actualStringContents());
}
protected void runResourceTestCase(String resourceName) throws IOException, CoreException {
runResourceTestCase(getConfiguration(), resourceName);
}
protected void runResourceTestCaseCMD(String resourceName) throws IOException {
runResourceTestCaseCMD(resourceName,resourceName);
}
protected void runResourceTestCase(final Configuration configuration, String resourceName) throws IOException, CoreException {
runResourceTestCase(configuration, resourceName, resourceName);
}
protected void runResourceTestCase(final Configuration configuration, String originalResourceName, String expectedResourceName) throws IOException, CoreException {
TestCaseResource resource = new TestCaseResource(originalResourceName, expectedResourceName);
resource.assertExpectedContent(sharpenResource(configuration, resource));
}
protected void runResourceTestCaseCMD(String originalResourceName, String expectedResourceName) throws IOException {
TestCaseResource resource = new TestCaseResource(originalResourceName, expectedResourceName);
resource.assertExpectedContent(sharpenResourceCMD(resource));
}
protected String sharpenResource(final Configuration configuration,
TestCaseResource resource) throws IOException, CoreException {
String cu = createCompilationUnit(resource);
File cufile = new File(cu);
String sourceFilePath =projecttempLocation +"/temp/" +projectName + "/src";
String targetProject = projecttempLocation +"/temp/" +projectName + "/" +getConvertedProject();
configuration.setSharpenNamespace("nonamespace");
final SharpenConversionBatch converter = new SharpenConversionBatch(configuration);
converter.setsourceFiles(new String[] { cu });
converter.setsourcePathEntries(sourceFilePath);
converter.setTargetProject(targetProject);
converter.setclassPathEntries(_project.getclassPath());
converter.run();
String targetDir = resource.getTargetDir();
if(targetDir.isEmpty()){
targetDir ="src";
}
Path filePath = Paths.get(projecttempLocation, "temp", projectName, getConvertedProject(), targetDir, resource.targetSimpleName()+ ".cs");
// to reproduce old behaviour we will return empty string if file not exists
if(!Files.exists(filePath)){
return "";
}
byte[] encoded = Files.readAllBytes(filePath);
return new String(encoded);
}
protected String sharpenResourceCMD(TestCaseResource resource) {
String result ="Success";
try {
String cu = createCompilationUnit(resource);
File cufile = new File(cu);
result = result + cufile;
String sourceFilePath =projecttempLocation +"/temp/" +projectName + "/src";
SharpenApplication AppCmd = new SharpenApplication();
String[] args = new String[3];
args[0] =sourceFilePath;
args[1] = "-sharpenNamespace";
args[2] = "nonamespace";
AppCmd.start(args);
String packageName = resource.packageName();
if(resource.packageName().isEmpty()){
packageName ="src";
}
result= projecttempLocation +"/temp/" +
projectName + "/" +
getConvertedProject() + "/" +
packageName.replace(".", "/") + "/" +
cufile.getName().substring(0,cufile.getName().lastIndexOf("."))
+ ".cs";
byte[] encoded = Files.readAllBytes(Paths.get(result));
return new String(encoded);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
result = result + e.toString();
}
return result;
}
protected Configuration getConfiguration() {
return newConfiguration();
}
private Configuration newConfiguration() {
return ConfigurationFactory.defaultConfiguration();
}
protected Configuration newPascalCaseIdentifiersConfiguration() {
Configuration configuration = newConfiguration();
configuration.setNamingStrategy(new PascalCaseIdentifiersNamingStrategy());
return configuration;
}
protected Configuration newPascalCasePlusConfiguration() {
Configuration configuration = newConfiguration();
configuration.setNamingStrategy(new PascalCaseNamingStrategy());
return configuration;
}
protected void runBatchConverterTestCase(Configuration configuration, String... resourceNames) throws IOException, Throwable {
runBatchConverterTestCase(configuration, toTestCaseResources(resourceNames));
}
private TestCaseResource[] toTestCaseResources(String... resourceNames) {
final TestCaseResource[] resources = new TestCaseResource[resourceNames.length];
for (int i=0; i<resourceNames.length; ++i) {
resources[i] = new TestCaseResource(resourceNames[i]);
}
return resources;
}
protected void runBatchConverterTestCase(Configuration configuration,
TestCaseResource... resources) throws
IOException, Throwable {
try {
runBatchConverterTestCaseWithTargetProject(configuration, resources);
} finally {
tearDown();
}
}
private void runBatchConverterTestCaseWithTargetProject(
Configuration configuration, TestCaseResource... resources) throws IOException, Throwable {
String projectName="MultipleSource";
String[] units;
if(resources.length> 0){
units = createCompilationUnits(projectName,resources);
}
else {
projectName = resources[0].targetSimpleName();
units = createCompilationUnits(resources);
}
final String targetProject = Paths.get(projecttempLocation, "temp", projectName,projectName + ".net").toString();
configuration.setSharpenNamespace("nonamespace");
final SharpenConversionBatch converter = new SharpenConversionBatch(configuration);
converter.setsourceFiles(units);
converter.setTargetProject(targetProject);
converter.run();
for (int i=0; i<resources.length; ++i) {
final TestCaseResource resource = resources[i];
if (resource.isSupportingLibrary()) {
continue;
}
checkConversionResult(configuration, targetProject, resource);
}
}
private String[] createCompilationUnits(
TestCaseResource... resources) throws IOException {
final String[] units = new String[resources.length];
for (int i=0; i<resources.length; ++i) {
units[i] = createCompilationUnit(resources[i]);
}
return units;
}
private String[] createCompilationUnits(String projectName,
TestCaseResource... resources) throws IOException {
final String[] units = new String[resources.length];
for (int i=0; i<resources.length; ++i) {
if(resources.length >1)
units[i] = createCompilationUnit(resources[i],projectName);
else
units[i] = createCompilationUnit(resources[i],projectName);
}
return units;
}
/**
* @param configuration
* @param targetFolder
* @param cu
* @param resource
* @throws JavaModelException
* @throws IOException
* @throws Throwable
*/
private void checkConversionResult(Configuration configuration, String targetFolder, TestCaseResource resource) throws Throwable {
String targetDir = resource.getTargetDir();
if(targetDir.isEmpty()){
targetDir ="src";
}
String file = Paths.get(targetFolder, targetDir, resource.targetSimpleName()+ ".cs").toString();
assertFile(resource, file);
}
protected void assertFile(TestCaseResource expectedResource, String actualFile) throws IOException {
expectedResource.assertFile(actualFile);
}
protected String getConvertedProject() {
return _project.getProjectName() + SharpenConstants.SHARPENED_PROJECT_SUFFIX;
}
}