blob: af21521c13a83773a67312750520ea68935777ce [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2017 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package org.eclipse.dltk.core.tests.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.dltk.core.IField;
import org.eclipse.dltk.core.IMethod;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.IModule;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.core.IType;
import org.eclipse.dltk.core.ModelException;
import junit.framework.TestCase;
public class ModelTestUtils {
public static void assertParameterNames(IMethod method, String[] names)
throws Exception {
String[] params = method.getParameterNames();
TestCase.assertNotNull(params);
int index = 0;
for (int i = 0; i < params.length; ++i) {
TestCase.assertNotNull(params[i]);
TestCase.assertEquals(params[i], names[index]);
index++;
}
}
/**
* Used to count classes, field and methods in collection. throws assert
* expression if not equal to specified counts.
*
* @param moduleChildren
* @param classCountNeed
* @param fieldCountNeed
* @param methodCountNeed
* @throws Exception
*/
public static void counterAssert(IModelElement[] children,
int classCountNeed, int fieldCountNeed, int methodCountNeed)
throws Exception {
int classCount = 0;
int fieldCount = 0;
int methodCount = 0;
IModelElement parent = getElementsParent(children);
if (parent == null) {
TestCase.assertTrue("Can't get children's parent", false);
}
Collection<IModelElement> classes = new ArrayList<>(1);
Collection<IModelElement> methods = new ArrayList<>(1);
Collection<IModelElement> fields = new ArrayList<>(1);
getElementChildren(parent, classes, methods, fields);
classCount = classes.size();
methodCount = methods.size();
fieldCount = fields.size();
TestCase.assertEquals(classCountNeed, classCount);
TestCase.assertEquals(fieldCountNeed, fieldCount);
TestCase.assertEquals(methodCountNeed, methodCount);
}
/**
* Assert check and return filed by name.
*
* @param elements
* @param name
* @return
*/
public static IField getAssertField(IModelElement[] elements, String name)
throws Exception {
IModelElement parent = getElementsParent(elements);
if (parent == null) {
TestCase.assertTrue("Can't get children's parent", false);
}
Collection<IModelElement> classes = new ArrayList<>(1);
Collection<IModelElement> methods = new ArrayList<>(1);
Collection<IModelElement> fields = new ArrayList<>(1);
getElementChildren(parent, classes, methods, fields);
Iterator<IModelElement> i = fields.iterator();
while (i.hasNext()) {
IModelElement element = i.next();
IField field = (IField) element;
TestCase.assertNotNull(field);
if (field.getElementName().equals(name)) {
return field;
}
}
TestCase.assertEquals("Field not exist", "", name);
return null;
}
/**
* Assert check and return method by name. Also checks for arguments count
* to determine method.
*/
public static IMethod getAssertMethod(IModelElement[] elements, String name,
int argCount) throws Exception {
IModelElement parent = getElementsParent(elements);
if (parent == null) {
TestCase.assertTrue("Can't get children's parent", false);
}
Collection<IModelElement> classes = new ArrayList<>(1);
Collection<IModelElement> methods = new ArrayList<>(1);
Collection<IModelElement> fields = new ArrayList<>(1);
getElementChildren(parent, classes, methods, fields);
Iterator<IModelElement> i = methods.iterator();
while (i.hasNext()) {
IModelElement element = i.next();
IMethod method = (IMethod) element;
TestCase.assertNotNull(method);
if (method.getElementName().equals(name)) {
String[] params = method.getParameterNames();
TestCase.assertNotNull(params);
TestCase.assertEquals(argCount, params.length);
return method;
}
}
TestCase.assertEquals("Method not exist", name, "");
return null;
}
/**
* Assert check and return method by name. Also checks for arguments count
* to determine method.
*
* Multiple declarations of one class in one module is ignored.
*/
public static IType getAssertClass(IModelElement[] elements, String name)
throws Exception {
IModelElement parent = getElementsParent(elements);
if (parent == null) {
TestCase.assertTrue("Can't get children's parent", false);
}
Collection<IModelElement> classes = new ArrayList<>(1);
Collection<IModelElement> methods = new ArrayList<>(1);
Collection<IModelElement> fields = new ArrayList<>(1);
getElementChildren(parent, classes, methods, fields);
Iterator<IModelElement> i = classes.iterator();
while (i.hasNext()) {
IModelElement element = i.next();
IType classElement = (IType) element;
TestCase.assertNotNull(classElement);
if (classElement.getElementName().equals(name)) {
return classElement;
}
}
TestCase.assertEquals("Class not exist", "", name);
return null;
}
private static void getElementChildren(IModelElement element,
Collection<IModelElement> classes,
Collection<IModelElement> methods, Collection<IModelElement> fields)
throws ModelException {
classes.clear();
fields.clear();
methods.clear();
// we don't use IModelElement children getting here cause we want to
// test each model element
// descendant's getters.
// checking parent element type
if (element.getElementType() == IModelElement.SOURCE_MODULE) {
IModule parentModule = (IModule) element;
IModelElement[] childs = parentModule.getChildren();
for (int i = 0; i < childs.length; ++i) {
IModelElement c = childs[i];
if (c.getElementType() == IModelElement.FIELD) {
fields.add(c);
} else if (c.getElementType() == IModelElement.METHOD) {
methods.add(c);
} else if (c.getElementType() == IModelElement.TYPE) {
classes.add(c);
}
}
} else if (element.getElementType() == IModelElement.TYPE) {
IType parentClass = (IType) element;
IModelElement[] childs = parentClass.getChildren();
for (int i = 0; i < childs.length; ++i) {
IModelElement c = childs[i];
if (c.getElementType() == IModelElement.FIELD) {
fields.add(c);
} else if (c.getElementType() == IModelElement.METHOD) {
methods.add(c);
} else if (c.getElementType() == IModelElement.TYPE) {
classes.add(c);
}
}
} else if (element.getElementType() == IModelElement.METHOD) {
IMethod parentMethod = (IMethod) element;
IModelElement[] childs = parentMethod.getChildren();
for (int i = 0; i < childs.length; ++i) {
IModelElement c = childs[i];
if (c.getElementType() == IModelElement.FIELD) {
fields.add(c);
}
if (c.getElementType() == IModelElement.METHOD) {
methods.add(c);
} else if (c.getElementType() == IModelElement.TYPE) {
classes.add(c);
}
}
// classes.addAll(parentMethod.getClasses());
// methods.addAll(parentMethod.getMethods());
} else {
return;
}
}
private static IModelElement getElementsParent(IModelElement[] elements) {
if (elements.length == 0) {
return null;
}
if (elements[0] != null) {
return elements[0].getParent();
}
return null;
}
public static void exractZipInto(IScriptProject scriptProject, URL entry)
throws IOException, CoreException {
IProject prj = scriptProject.getProject();
NullProgressMonitor monitor = new NullProgressMonitor();
InputStream openStream = entry.openStream();
ZipInputStream zis = new ZipInputStream(openStream);
while (true) {
ZipEntry nextEntry = zis.getNextEntry();
if (nextEntry != null) {
String name = nextEntry.getName();
// System.out.println(name);
if (!nextEntry.isDirectory()) {
byte[] buf = new byte[1024];
int len;
ByteArrayOutputStream arrayOut = new ByteArrayOutputStream();
while ((len = zis.read(buf)) > 0) {
arrayOut.write(buf, 0, len);
}
ByteArrayInputStream bis = new ByteArrayInputStream(
arrayOut.toByteArray());
IFile file = prj.getFile(new Path(name));
file.create(bis, true, monitor);
} else {
IFolder f = prj.getFolder(new Path(name));
f.create(true, true, monitor);
}
zis.closeEntry();
} else {
break;
}
}
}
}