/*******************************************************************************
 * Copyright (c) 2000, 2008 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
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.jsdt.core.tests.model;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

import org.eclipse.wst.jsdt.core.*;
import org.eclipse.wst.jsdt.internal.core.hierarchy.RegionBasedTypeHierarchy;
import org.eclipse.wst.jsdt.internal.core.hierarchy.TypeHierarchy;

import junit.framework.Test;

public class TypeHierarchySerializationTests extends AbstractJavaModelTests {
	private static final String PROJECTNAME = "TypeHierarchySerialization";
	
	IJavaScriptProject project;

public TypeHierarchySerializationTests(String name) {
	super(name);
}
public static Test suite() {
	return buildModelTestSuite(TypeHierarchySerializationTests.class);
}
private static void compare(String focus, ITypeHierarchy stored, ITypeHierarchy loaded){
	if(stored instanceof RegionBasedTypeHierarchy) {
		assertTrue("["+focus+"] hierarchies are not the same", loaded instanceof RegionBasedTypeHierarchy);
		compareRegionBasedTypeHierarchy(focus, (RegionBasedTypeHierarchy)stored,(RegionBasedTypeHierarchy)loaded);
	} else if(stored instanceof TypeHierarchy) {
		assertTrue("["+focus+"] hierarchies are not the same", loaded instanceof TypeHierarchy);
		compareTypeHierarchy(focus, (TypeHierarchy)stored,(TypeHierarchy)loaded);
	}
}
private static void compareRegionBasedTypeHierarchy(String focus, RegionBasedTypeHierarchy stored, RegionBasedTypeHierarchy loaded){
	compareTypeHierarchy(focus, stored, loaded);
}
private static void compareTypeHierarchy(String focus, TypeHierarchy stored, TypeHierarchy loaded){
	//System.out.println(stored.toString());
	
	IType type1 = stored.getType();
	IType type2 = loaded.getType();
	assertEquals("["+focus+"] focus are not the same", type1, type2);
	
	IType[] allTypes1 = stored.getAllTypes();
	IType[] allTypes2 = loaded.getAllTypes();
	compare("["+focus+"] all types are not the same", allTypes1, allTypes2);
	
	IType[] allClasses1 = stored.getAllClasses();
	IType[] allClasses2 = loaded.getAllClasses();
	compare("["+focus+"] all classes are not the same", allClasses1, allClasses2);
	
	IType[] allInterfaces1 = stored.getAllInterfaces();
	IType[] allInterfaces2 = loaded.getAllInterfaces();
	compare("["+focus+"] all interfaces are not the same", allInterfaces1, allInterfaces2);
	
	IType[] rootClasses1 = stored.getRootClasses();
	IType[] rootClasses2 = loaded.getRootClasses();
	compare("["+focus+"] all roots are not the same", rootClasses1, rootClasses2);
	
	IType[] rootInterfaces1 = stored.getRootInterfaces();
	IType[] rootInterfaces2 = loaded.getRootInterfaces();
	compare("["+focus+"] all roots are not the same", rootInterfaces1, rootInterfaces2);
	
	Object[] missingTypes1 = stored.missingTypes.toArray();
	Object[] missingTypes2 = loaded.missingTypes.toArray();
	compare("["+focus+"] all missing types are not the same", missingTypes1, missingTypes2);
	
	for (int i = 0; i < allTypes1.length; i++) {
		IType aType = allTypes1[i];
		
		int cachedFlags1 = stored.getCachedFlags(aType);
		int cachedFlags2 = loaded.getCachedFlags(aType);
		assertEquals("["+focus+"] flags are not the same for "+aType.getFullyQualifiedName(), cachedFlags1, cachedFlags2);
		
		IType superclass1 = stored.getSuperclass(aType);
		IType superclass2 = loaded.getSuperclass(aType);
		assertEquals("["+focus+"] superclass are not the same for "+aType.getFullyQualifiedName(), superclass1, superclass2);
		
		IType[] superInterfaces1 = stored.getSuperInterfaces(aType);
		IType[] superInterfaces2 = loaded.getSuperInterfaces(aType);
		compare("["+focus+"] all super interfaces are not the same for "+aType.getFullyQualifiedName(), superInterfaces1, superInterfaces2);
		
		IType[] superTypes1 = stored.getSupertypes(aType);
		IType[] superTypes2 = loaded.getSupertypes(aType);
		compare("["+focus+"] all super types are not the same for "+aType.getFullyQualifiedName(), superTypes1, superTypes2);
		
		IType[] subclasses1 = stored.getSubclasses(aType);
		IType[] subclasses2 = loaded.getSubclasses(aType);
		compare("["+focus+"] all subclasses are not the same for "+aType.getFullyQualifiedName(), subclasses1, subclasses2);
		
		IType[] subtypes1 = stored.getSubtypes(aType);
		IType[] subtypes2 = loaded.getSubtypes(aType);
		compare("["+focus+"] all subtypes are not the same for "+aType.getFullyQualifiedName(), subtypes1, subtypes2);
		
		IType[] extendingInterfaces1 = stored.getExtendingInterfaces(aType);
		IType[] extendingInterfaces2 = loaded.getExtendingInterfaces(aType);
		compare("["+focus+"] all extending interfaces are not the same for "+aType.getFullyQualifiedName(), extendingInterfaces1, extendingInterfaces2);
		
		IType[] implementingClasses1 = stored.getImplementingClasses(aType);
		IType[] implementingClasses2 = loaded.getImplementingClasses(aType);
		compare("["+focus+"] all implemeting classes are not the same for "+aType.getFullyQualifiedName(), implementingClasses1, implementingClasses2);
		
	}
}
private static void compare(String msg, Object[] types1, Object[] types2) {
	if(types1 == null) {
		assertTrue(msg, types2 == null);
	} else {
		assertTrue(msg, types2 != null);
		assertTrue(msg, types1.length == types2.length);
		for (int i = 0; i < types1.length; i++) {
			boolean found = false;
			for (int j = 0; j < types2.length; j++) {
				if(types1[i] == null && types1[j] == null) {
					found = true;
				} else if(types1[i] != null && types1[i].equals(types2[j])) {
					found = true;
				}
			}
			assertTrue(msg, found);
		}
	}
}
public void setUpSuite() throws Exception {
	super.setUpSuite();

	project = setUpJavaProject(PROJECTNAME);
}

/* (non-Javadoc)
 * @see org.eclipse.wst.jsdt.core.tests.model.SuiteOfTestCases#tearDownSuite()
 */
public void tearDownSuite() throws Exception {
	deleteProject(PROJECTNAME);
	
	super.tearDownSuite();
}
private static void testFocusHierarchy(IType type, IJavaScriptProject project) throws JavaScriptModelException{
	ITypeHierarchy h1 = type.newTypeHierarchy(project, null);

	ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
	h1.store(outputStream, null);

	byte[] bytes = outputStream.toByteArray();
	ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
	ITypeHierarchy h2 = type.loadTypeHierachy(inputStream, null);
	
	compare(type.getFullyQualifiedName(), h1, h2);
	
	h2.refresh(null);
	compare(type.getFullyQualifiedName(), h1, h2);
}
public void test001() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit(PROJECTNAME, "src", "p1", "X.js");
	IType type = cu.getType("X");
	testFocusHierarchy(type, project);
}
public void test002() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit(PROJECTNAME, "src", "p1", "Y.js");
	IType type = cu.getType("Y");
	testFocusHierarchy(type, project);
}
public void test003() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit(PROJECTNAME, "src", "p1", "Z.js");
	IType type = cu.getType("Z");
	testFocusHierarchy(type, project);
}
public void test004() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit(PROJECTNAME, "src", "p1", "I1.js");
	IType type = cu.getType("I1");
	testFocusHierarchy(type, project);
}
public void test005() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit(PROJECTNAME, "src", "p1", "I2.js");
	IType type = cu.getType("I2");
	testFocusHierarchy(type, project);
}
public void test006() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit(PROJECTNAME, "src", "p1", "I3.js");
	IType type = cu.getType("I3");
	testFocusHierarchy(type, project);
}
public void test007() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit(PROJECTNAME, "src", "p1", "I4.js");
	IType type = cu.getType("I4");
	testFocusHierarchy(type, project);
}
public void test008() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit(PROJECTNAME, "src", "p1", "I5.js");
	IType type = cu.getType("I5");
	testFocusHierarchy(type, project);
}
public void test009() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit(PROJECTNAME, "src", "p1", "I6.js");
	IType type = cu.getType("I6");
	testFocusHierarchy(type, project);
}
}
