/*******************************************************************************
 * Copyright (c) 2004 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.jst.jsp.ui.tests;

import java.io.IOException;

import junit.framework.Test;
import junit.framework.TestCase;

import org.eclipse.jst.jsp.core.PageDirectiveAdapter;
import org.eclipse.wst.common.encoding.content.IContentTypeIdentifier;
import org.eclipse.wst.sse.core.IModelManager;
import org.eclipse.wst.sse.core.INodeNotifier;
import org.eclipse.wst.sse.core.IStructuredModel;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.modelhandler.ModelHandlerUtility;
import org.eclipse.wst.sse.core.modelhandler.EmbeddedTypeHandler;
import org.eclipse.wst.xml.core.document.XMLModel;
import org.w3c.dom.Document;

/**
 * @author davidw
 *
 * To change this generated comment edit the template variable "typecomment":
 * Window>Preferences>Java>Templates.
 * To enable and disable the creation of type comments go to
 * Window>Preferences>Java>Code Generation.
 */
public class TestModelEmbeddedContentType extends TestCase {

	/**
	 * Constructor for TestModelClone.
	 */
	public TestModelEmbeddedContentType(String name) {
		super(name);
	}

	public static void main(String[] args) {
	}

	public static Test getTest() {
		return new TestModelEmbeddedContentType("testStructuredModelEmbeddedJSPChange");
	}

	protected void checkEmbeddedType(IStructuredModel clonedModel, Object expectedType) {
		Document doc = ((XMLModel) clonedModel).getDocument();
		PageDirectiveAdapter embeddedTypeAdapter = (PageDirectiveAdapter) ((INodeNotifier) doc).getAdapterFor(PageDirectiveAdapter.class);
		assertNotNull("cloned model did not have embedded adapter", embeddedTypeAdapter);

		EmbeddedTypeHandler embeddedHandler = embeddedTypeAdapter.getEmbeddedType();
		assertNotNull("cloned model did not have embedded handler", embeddedHandler);

		assertTrue("cloned model embeddedHandler is wrong type", embeddedHandler.equals(expectedType));
	}

	public void testStructuredModelEmbeddedXML() throws IOException {
		// First make (empty) structuredDocument
		IModelManager modelManager = StructuredModelManager.getInstance().getModelManager();
		IStructuredModel model = modelManager.createUnManagedStructuredModelFor(IContentTypeIdentifier.ContentTypeID_SSEXML);
		assertTrue("model could not be created!", model != null);

		// XML should NOT have an embedded type
		Document doc = ((XMLModel) model).getDocument();
		EmbeddedTypeHandler embeddedHandler = (EmbeddedTypeHandler) ((INodeNotifier) doc).getAdapterFor(EmbeddedTypeHandler.class);
		assertTrue("embededHanlder should be null for XML", embeddedHandler == null);

	}

	public void testStructuredModelEmbeddedHTML() throws IOException {
		// First make (empty) structuredDocument
		IModelManager modelManager = StructuredModelManager.getInstance().getModelManager();
		IStructuredModel model = modelManager.createUnManagedStructuredModelFor(IContentTypeIdentifier.ContentTypeID_HTML);
		assertTrue("model could not be created!", model != null);

		// should NOT have an embedded type
		Document doc = ((XMLModel) model).getDocument();
		EmbeddedTypeHandler embeddedHandler = (EmbeddedTypeHandler) ((INodeNotifier) doc).getAdapterFor(EmbeddedTypeHandler.class);
		assertTrue("embededHanlder should be null for HTML", embeddedHandler == null);

	}

	protected IStructuredModel doStructuredModelEmbeddedJSP() throws IOException {
		// First make (empty) structuredDocument
		IModelManager modelManager = StructuredModelManager.getInstance().getModelManager();
		IStructuredModel model = modelManager.createUnManagedStructuredModelFor(IContentTypeIdentifier.ContentTypeID_JSP);
		assertTrue("model could not be created!", model != null);

		// should have an embedded type
		Document doc = ((XMLModel) model).getDocument();
		PageDirectiveAdapter embeddedHandler = (PageDirectiveAdapter) ((INodeNotifier) doc).getAdapterFor(PageDirectiveAdapter.class);
		assertTrue("embededHanlder should NOT be null for JSP", embeddedHandler != null);

		// embedded type should be HTML since no content
		checkEmbeddedType(model, ModelHandlerUtility.getDefaultEmbeddedType());

		String testContent = "<%@ page contentType=\"text/html\" %>";
		model.getStructuredDocument().replaceText(this, 0, 0, testContent);
		assertTrue("reinit should NOT be needed in this case", !model.isReinitializationNeeded());

		// embedded type should STILL be HTML since no contentType was text/html
		checkEmbeddedType(model, ModelHandlerUtility.getDefaultEmbeddedType());

		return model;
		//
	}

	public void testStructuredModelEmbeddedJSP() throws IOException {
		doStructuredModelEmbeddedJSP();
	}

	public void testStructuredModelEmbeddedJSPChange() throws IOException {

		// start with the full test case
		IStructuredModel model = doStructuredModelEmbeddedJSP();
		// change "html" to "xml"
		model.getStructuredDocument().replaceText(this, 27, 4, "xml");
		// with reinit in XML model ... its already been re-initialized
		//		assertTrue("reinit SHOULD be needed in this case", model.isReiniitializationNeeded());

		if (model.isReinitializationNeeded()) {
			model.reinit();
		}

		// embedded type should now be XML
		checkEmbeddedType(model, ModelHandlerUtility.getEmbeddedContentTypeFor("text/xml"));

	}
}