/*******************************************************************************
 * 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.pagedirective;

import java.io.IOException;

import junit.framework.TestCase;

import org.eclipse.jst.jsp.core.internal.document.PageDirectiveAdapter;
import org.eclipse.jst.jsp.core.internal.provisional.contenttype.ContentTypeIdForJSP;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.ltk.modelhandler.EmbeddedTypeHandler;
import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.xml.core.internal.modelhandler.EmbeddedXML;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter;
import org.w3c.dom.Node;

/**
 * @author davidw
 */
public class TestPageDirective extends TestCase {

	class MyEmbeddedFactory implements INodeAdapterFactory {

		public INodeAdapter adapt(INodeNotifier object) {
			return null;
		}

		public INodeAdapterFactory copy() {
			return null;
		}

		public boolean isFactoryForType(Object type) {
			return type instanceof MyAdaptedClass;
		}

		public void release() {
			// noop
		}
	}
	
	class MyAdaptedClass {
		// dummy class is key
	}
	
	/**
	 * Constructor for TestPageDirective.
	 * @param name
	 */
	public TestPageDirective(String name) {
		super(name);
	}

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

		// Now, assigning use a page directive, but leaving embedded type the same as default
		model.getStructuredDocument().setText(this, "<%@ page contentType=\"text/html\" language=\"java\" %>");
		PageDirectiveAdapter pageDirectiveAdapter = (PageDirectiveAdapter) ((IDOMModel) model).getDocument().getAdapterFor(PageDirectiveAdapter.class);

		String contentType = pageDirectiveAdapter.getContentType();
		String language = pageDirectiveAdapter.getLanguage();

		assertTrue("contentType should be html", "text/html".equals(contentType));
		assertTrue("language should be java", "java".equals(language));

	}

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

		// Now, assigning use a page directive, but leaving embedded type the same as default
		model.getStructuredDocument().setText(this, "<%@ page contentType=\"text/html\" language=\"java\" %>");
		PageDirectiveAdapter pageDirectiveAdapter = (PageDirectiveAdapter) ((IDOMModel) model).getDocument().getAdapterFor(PageDirectiveAdapter.class);

		String contentType = pageDirectiveAdapter.getContentType();
		String language = pageDirectiveAdapter.getLanguage();

		assertTrue("contentType should be html", "text/html".equals(contentType));
		assertTrue("language should be java", "java".equals(language));

		// change to javascript
		model.getStructuredDocument().replaceText(this, 43, 4, "javascript");

		contentType = pageDirectiveAdapter.getContentType();
		language = pageDirectiveAdapter.getLanguage();

		assertTrue("contentType should be html", "text/html".equals(contentType));
		assertTrue("language should be javascript", "javascript".equals(language));

	}

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

		// Now, assigning use a page directive, but leaving embedded type the same as default
		model.getStructuredDocument().setText(this, "<%@ page contentType=\"text/html\" language=\"java\" %>");
		PageDirectiveAdapter pageDirectiveAdapter = (PageDirectiveAdapter) ((IDOMModel) model).getDocument().getAdapterFor(PageDirectiveAdapter.class);

		String contentType = pageDirectiveAdapter.getContentType();
		String language = pageDirectiveAdapter.getLanguage();

		assertTrue("contentType should be html", "text/html".equals(contentType));
		assertTrue("language should be java", "java".equals(language));

		// change to javascript
		model.getStructuredDocument().replaceText(this, 43, 4, "javascript");

		contentType = pageDirectiveAdapter.getContentType();
		language = pageDirectiveAdapter.getLanguage();

		assertTrue("contentType should be html", "text/html".equals(contentType));
		assertTrue("language should be javascript", "javascript".equals(language));

		// change back to java
		model.getStructuredDocument().replaceText(this, 43, 10, "java");

		contentType = pageDirectiveAdapter.getContentType();
		language = pageDirectiveAdapter.getLanguage();

		assertTrue("contentType should be html", "text/html".equals(contentType));
		assertEquals("java", language);
	}
	
	public void testSetEmbeddedType(){
		IStructuredModel model = createUnmanagedHTMLModel();
		PageDirectiveAdapter pageDirectiveAdapter = (PageDirectiveAdapter) ((IDOMModel) model).getDocument().getAdapterFor(PageDirectiveAdapter.class);
		EmbeddedTypeHandler embeddedXMLHandler = new EmbeddedXML();
		pageDirectiveAdapter.setEmbeddedType(embeddedXMLHandler);
		
		EmbeddedTypeHandler handler = pageDirectiveAdapter.getEmbeddedType();
		assertTrue("incorrect embedded handler", handler == embeddedXMLHandler);
	}
	
	public void testAdapt() {
		IDOMModel model = createUnmanagedHTMLModel();
		PageDirectiveAdapter pageDirectiveAdapter = (PageDirectiveAdapter) model.getDocument().getAdapterFor(PageDirectiveAdapter.class);
		Node ownerNode = model.getDocument();
		
		ModelQueryAdapter embeddedAdapter = (ModelQueryAdapter) pageDirectiveAdapter.adapt((INodeNotifier) ownerNode, ModelQueryAdapter.class);
		assertNotNull("could not adapt embedded adapter", embeddedAdapter);
	}
	
	public void testAddEmbeddedFactory() {
		IDOMModel model = createUnmanagedHTMLModel();
		PageDirectiveAdapter pageDirectiveAdapter = (PageDirectiveAdapter) model.getDocument().getAdapterFor(PageDirectiveAdapter.class);
		pageDirectiveAdapter.addEmbeddedFactory(new MyEmbeddedFactory());
	}
	
	public void testSetLanguage() {
		IDOMModel model = createUnmanagedHTMLModel();
		PageDirectiveAdapter pageDirectiveAdapter = (PageDirectiveAdapter) model.getDocument().getAdapterFor(PageDirectiveAdapter.class);
		pageDirectiveAdapter.setLanguage("text/xml");
		assertTrue("set language failed", pageDirectiveAdapter.getLanguage().equals("text/xml"));
	}
	
	public void testGetTarget() {
		IDOMModel model = createUnmanagedHTMLModel();
		PageDirectiveAdapter pageDirectiveAdapter = (PageDirectiveAdapter) model.getDocument().getAdapterFor(PageDirectiveAdapter.class);
		INodeNotifier notifier = pageDirectiveAdapter.getTarget();
		assertNotNull("target is null", notifier);
	}
	
	public void testRelease() {
		IDOMModel model = createUnmanagedHTMLModel();
		PageDirectiveAdapter pageDirectiveAdapter = (PageDirectiveAdapter) model.getDocument().getAdapterFor(PageDirectiveAdapter.class);
		pageDirectiveAdapter.release();
		// considered "success" if doesn't through exception
		assertTrue(true);
	}
	
	private IDOMModel createUnmanagedHTMLModel() {
		// First make (empty) structuredDocument
		IModelManager modelManager = StructuredModelManager.getModelManager();
		IStructuredModel model = modelManager.createUnManagedStructuredModelFor(ContentTypeIdForJSP.ContentTypeID_JSP);
		assertTrue("model could not be created!", model != null);

		// Now, assigning use a page directive, but leaving embedded type the same as default
		model.getStructuredDocument().setText(this, "<%@ page contentType=\"text/html\" language=\"java\" %>");
		return (IDOMModel)model;
	}
}