/*******************************************************************************
 * <copyright>
 *
 * Copyright (c) 2005, 2010 SAP AG.
 * 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:
 *    Kiril Mitov - initial API, implementation and documentation
 *
 * </copyright>
 *
 *******************************************************************************/
package org.eclipse.jpt.jpadiagrameditor.ui.tests.internal.util;

import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.isA;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;

import java.net.URI;

import org.easymock.EasyMock;
import org.easymock.IArgumentMatcher;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarkerDelta;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.BasicInternalEList;
import org.eclipse.graphiti.dt.IDiagramTypeProvider;
import org.eclipse.graphiti.mm.Property;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.mm.pictograms.PictogramsPackage;
import org.eclipse.graphiti.platform.IDiagramEditor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jpt.jpa.core.JpaProject;
import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType;
import org.eclipse.jpt.jpa.core.context.java.JavaTypeMapping;
import org.eclipse.jpt.jpadiagrameditor.ui.internal.provider.IJPAEditorFeatureProvider;
import org.eclipse.jpt.jpadiagrameditor.ui.internal.util.IEclipseFacade;
import org.eclipse.jpt.jpadiagrameditor.ui.internal.util.IJPAEditorUtil;
import org.eclipse.jpt.jpadiagrameditor.ui.internal.util.JPASolver;
import org.junit.Before;
import org.junit.Test;

@SuppressWarnings("unused")
public class JPASolverTest {

	private IEclipseFacade eclipseFacade;

	/**
	 * @throws java.lang.Exception
	 */
	@Before
	public void setUp() throws Exception {
		eclipseFacade = createEclipseFacade();
	}

	@Test
	public void testResourceListenerRegistered() {
		IWorkspace workspace = EasyMock.createMock(IWorkspace.class);
		workspace.addResourceChangeListener(isA(IResourceChangeListener.class), eq(IResourceChangeEvent.POST_BUILD));
		replay(workspace);
		IEclipseFacade facade = EasyMock.createMock(IEclipseFacade.class);
		expect(facade.getWorkspace()).andStubReturn(workspace);
		replay(facade);
		new JPASolver(facade, null);
		verify(workspace, facade);
	}

	private IFile replayFile() {
		IFile file = EasyMock.createMock(IFile.class);
		URI uri = URI.create("file://project//aaa");
		expect(file.getLocationURI()).andStubReturn(uri);
		expect(file.exists()).andStubReturn(true);
		IProject proj = EasyMock.createMock(IProject.class);
		expect(proj.getType()).andStubReturn(IResource.PROJECT);
		expect(file.getType()).andStubReturn(IResource.FILE);
		expect(file.getFullPath()).andStubReturn(new Path("C:\\project\\aaa"));
		IFile clsPath = EasyMock.createMock(IFile.class); 
		expect(proj.getFile(".classpath")).andStubReturn(clsPath);
		try {
			expect(proj.hasNature("org.eclipse.jdt.core.javanature")).andStubReturn(true);
		} catch (CoreException e) {}
		expect(file.getProject()).andStubReturn(proj);
		replay(file, proj);
		return file;
	}

	private JavaPersistentType createJptForResource(IFile file, String name) {
		JavaPersistentType jpt = EasyMock.createNiceMock(JavaPersistentType.class);
		JpaProject jpaProject = EasyMock.createNiceMock(JpaProject.class);
		JavaTypeMapping m = EasyMock.createNiceMock(JavaTypeMapping.class);
		expect(jpt.getResource()).andStubReturn(file);
		expect(jpt.getJpaProject()).andStubReturn(jpaProject);
		expect(jpt.getMapping()).andStubReturn(m);
		if (name != null)
			expect(jpt.getName()).andStubReturn(name);
		replay(jpt, jpaProject);
		return jpt;
	}

	private IEclipseFacade createEclipseFacade() {
		IEclipseFacade facade = EasyMock.createMock(IEclipseFacade.class);
		return facade;
	}

	private void configureForWorkspace(IEclipseFacade facade) {
		IWorkspace workspace = EasyMock.createMock(IWorkspace.class);
		workspace.addResourceChangeListener(isA(IResourceChangeListener.class), eq(IResourceChangeEvent.POST_BUILD));
		replay(workspace);
		expect(facade.getWorkspace()).andStubReturn(workspace);
	}

	private IJPAEditorFeatureProvider configureRefreshEditorProvider() {
		IDiagramEditor editor = EasyMock.createMock(IDiagramEditor.class);
		editor.refresh();
		replay(editor);
		IDiagramTypeProvider diagramProvider = EasyMock.createMock(IDiagramTypeProvider.class);
		expect(diagramProvider.getDiagramEditor()).andStubReturn(editor);
		replay(diagramProvider);
		IJPAEditorFeatureProvider provider = EasyMock.createMock(IJPAEditorFeatureProvider.class);
		expect(provider.getDiagramTypeProvider()).andStubReturn(diagramProvider);
		return provider;
	}

	private IMarkerDelta replayDelta(IResource resource) {
		IMarkerDelta delta = EasyMock.createMock(IMarkerDelta.class);
		expect(delta.getResource()).andStubReturn(resource);
		replay(delta);
		return delta;
	}

	private JPASolver createSolver(IEclipseFacade facade, IJPAEditorUtil util) {
		return new JPASolver(facade, util);
	}

	public static IResourceChangeListener eqResourceListener(IArgumentMatcher matcher) {
		EasyMock.reportMatcher(matcher);
		return null;
	}

	private IResourceChangeEvent replayEvent(IResource resource) {
		IResourceChangeEvent event = EasyMock.createMock(IResourceChangeEvent.class);
		expect(event.findMarkerDeltas(null, true)).andStubReturn(new IMarkerDelta[] { replayDelta(resource) });
		replay(event);
		return event;
	}

	private IResourceChangeEvent replayEmptyEvent() {
		IResourceChangeEvent event = EasyMock.createMock(IResourceChangeEvent.class);
		expect(event.findMarkerDeltas(null, true)).andStubReturn(new IMarkerDelta[] {});
		replay(event);
		return event;
	}

}
