/*******************************************************************************
 * Copyright (c) 2001, 2009 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.wsdl.validation.internal.wsdl11.xsd;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

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

import org.apache.xerces.dom.DocumentImpl;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import com.ibm.wsdl.Constants;
import com.ibm.wsdl.extensions.schema.SchemaConstants;

/**
 * Tests for org.eclipse.wst.wsdl.validation.internal.wsdl11.xsd.InlineSchemaGenerator.
 *
 */
public class InlineSchemaGeneratorTest extends TestCase 
{
  private InlineSchemaGeneratorWrapper generator;
  
  /**
   * Create a tests suite from this test class.
   * 
   * @return A test suite containing this test class.
   */
  public static Test suite()
  {
	return new TestSuite(InlineSchemaGeneratorTest.class);
  }
  
  /**
   * JUnit setup method.
   */
  public void setUp()
  {
	generator = new InlineSchemaGeneratorWrapper();
  }
  
  /**
   * Test that checkSOAPEncodingRequired method.
   */
  public void testCheckSOAPEncodingRequired()
  {
	// Test empty list.
	assertFalse("The method does not return false when given an empty list.", generator.checkSOAPEncodingRequired(new ArrayList()));
	
	// Test that checkSOAPEncodingRequired returns false
	// when given a list without the SOAP encoding namespace.
	List list = new ArrayList();
	list.add("http://notsoapencodingnamespace");
	assertFalse("The method does not return false when given a list without the SOAP envelope namespace.", generator.checkSOAPEncodingRequired(list));
	
	// Test that checkSOAPEncodingRequired returns true
	// when given a list with the SOAP encoding namespace.
	List list2 = new ArrayList();
	list2.add(InlineSchemaGeneratorWrapper.SOAP_ENCODING_URI);
	assertTrue("The method does not return true when given a list with the SOAP encoding namespace.", generator.checkSOAPEncodingRequired(list2));
  }
  
  /**
   * TODO: Implement tests for the CreateXSDStringRecursively method.
   */
  public void todoCreateXSDStringRecursively() 
  {
  }

  /**
   * TODO: Implement tests for the GetImportNamespace method.
   */
  public void todoGetImportNamespaces() 
  {
  }

  /**
   	* Test that this method returns the correct namespace
   	* resolver.
   	*/
  public void testGetNSResolver() 
  {
    Document doc = new DocumentImpl();
	Element rootElem = doc.createElementNS(SchemaConstants.NS_URI_XSD_2001, "schema");

	// Check that the resolver is empty.
	Hashtable resolver = generator.getNSResolver(rootElem);
	assertTrue("The resolver is not empty.", resolver.isEmpty());
	
	// Check the resolver contains one value.
	rootElem.setAttribute("xmlns", SchemaConstants.NS_URI_XSD_2001);
	resolver = generator.getNSResolver(rootElem);
	assertTrue("The resolver does not contain the empty namespace.", resolver.containsKey(""));
	assertEquals("The resolver does not contain the correct value for the empty namespace.", SchemaConstants.NS_URI_XSD_2001, resolver.get(""));
	
	// Check the resolver contains two values.
	rootElem.setAttribute("xmlns:other", "http://othernamespace");
	resolver = generator.getNSResolver(rootElem);
	assertTrue("The resolver does not contain the other namespace.", resolver.containsKey("other"));
	assertEquals("The resolver does not contain the correct value for the other namespace.", "http://othernamespace", resolver.get("other"));
	
	// Check the resolver still contains the empty namespace.
	assertTrue("The resolver does not contain the empty namespace after adding a second namespace.", resolver.containsKey(""));
	assertEquals("The resolver does not contain the correct value for the empty namespace after adding a second namespace.", SchemaConstants.NS_URI_XSD_2001, resolver.get(""));
	
	// Check the resolver doesn't contain non-xmlns attribute value.
	rootElem.setAttribute("type:other2", "other2:type");
	resolver = generator.getNSResolver(rootElem);
	assertFalse("The resolver contains the other2 namespace.", resolver.containsKey("other2"));
  }

  /**
   * Test that this method returns the required prefixes.
   */
  public void testGetPrefixes() 
  {
	// Check document that contains no required namespaces and no prefix.
	Document doc = new DocumentImpl();
	Element rootElem = doc.createElementNS(SchemaConstants.NS_URI_XSD_2001, "schema");
	rootElem.setAttribute("xmlns",SchemaConstants.NS_URI_XSD_2001);
	//doc.appendChild(rootElem);
	
	List reqNSs = generator.getNamespacePrefixes(rootElem);
	assertEquals("The required namespace list does not contain one empty string.", 1, reqNSs.size());
	assertEquals("The required namespace list does not contain one empty string.", "", reqNSs.get(0));
	
	// Check document that contains no required namespaces and the xsd prefix.
	Element rootElem2 = doc.createElementNS(SchemaConstants.NS_URI_XSD_2001, "xsd:schema");
	rootElem2.setAttribute("xmlns:xsd",SchemaConstants.NS_URI_XSD_2001);
	List reqNSs2 = generator.getNamespacePrefixes(rootElem2);
	assertEquals("The required namespace list does not contain the one string 'xsd'.", 1, reqNSs2.size());
	assertEquals("The required namespace list does not contain the one string 'xsd'.", "xsd", reqNSs2.get(0));
	
	// Check document that contains an element with a required namespace.
	Element rootElem4 = doc.createElementNS(SchemaConstants.NS_URI_XSD_2001, "xsd:schema");
	rootElem2.setAttribute("xmlns:xsd",SchemaConstants.NS_URI_XSD_2001);
	Element diffNSElem = doc.createElementNS("http://othernamespace", "other:element");
	rootElem4.appendChild(diffNSElem);
	List reqNSs4 = generator.getNamespacePrefixes(rootElem4);
	assertTrue("The required namespace list does not contain the prefix 'other' when the namespace is specified for an element.", reqNSs4.contains("other"));
	
	// Check document that contains a type with a required namespace.
	Element rootElem5 = doc.createElementNS(SchemaConstants.NS_URI_XSD_2001, "xsd:schema");
	rootElem5.setAttribute("xmlns:xsd",SchemaConstants.NS_URI_XSD_2001);
	Element otherElem = doc.createElementNS(SchemaConstants.NS_URI_XSD_2001, "xsd:element");
	otherElem.setAttribute("type", "other:type");
	rootElem5.appendChild(otherElem);
	List reqNSs5 = generator.getNamespacePrefixes(rootElem5);
	assertTrue("The required namespace list does not contain 'other' when the namespace is specified for a type.", reqNSs5.contains("other"));
	
	// Check document that contains an import. Import elements should be ignored.
	// This is a contrived example as it contains a type attribute for the import element.
	Element rootElem6 = doc.createElementNS(SchemaConstants.NS_URI_XSD_2001, "xsd:schema");
	rootElem6.setAttribute("xmlns:xsd",SchemaConstants.NS_URI_XSD_2001);
	Element importElem = doc.createElementNS(SchemaConstants.NS_URI_XSD_2001, "xsd:import");
	importElem.setAttribute("type", "other:type");
	rootElem6.appendChild(importElem);
	List reqNSs6 = generator.getNamespacePrefixes(rootElem6);
	assertEquals("The required namespace list does not contain the one string 'xsd' when an import element is used.", 1, reqNSs6.size());
	assertEquals("The required namespace list does not contain the one string 'xsd' when an import element is used.", "xsd", reqNSs6.get(0));
	
    // Check document that contains an include. Include elements should be ignored.
    // This is a contrived example as it contains a type attribute for the include element.
	Element rootElem7 = doc.createElementNS(SchemaConstants.NS_URI_XSD_2001, "xsd:schema");
	rootElem7.setAttribute("xmlns:xsd",SchemaConstants.NS_URI_XSD_2001);
	Element includeElem = doc.createElementNS(SchemaConstants.NS_URI_XSD_2001, "xsd:include");
	includeElem.setAttribute("type", "other:type");
	rootElem7.appendChild(includeElem);
	List reqNSs7 = generator.getNamespacePrefixes(rootElem6);
	assertEquals("The required namespace list does not contain the one string 'xsd' when an import element is used.", 1, reqNSs7.size());
	assertEquals("The required namespace list does not contain the one string 'xsd' when an import element is used.", "xsd", reqNSs7.get(0));
	
	// Check document that contains attribute with a required namespace.
	Element rootElem3 = doc.createElementNS(SchemaConstants.NS_URI_XSD_2001, "xsd:schema");
	rootElem3.setAttribute("xmlns:xsd",SchemaConstants.NS_URI_XSD_2001);
	Element wsdlAttElem = doc.createElementNS(SchemaConstants.NS_URI_XSD_2001, "xsd:element");
	wsdlAttElem.setAttributeNS(Constants.NS_URI_WSDL, "wsdl:arrayType", "sometype[]");
	rootElem3.appendChild(wsdlAttElem);
	List reqNSs3 = generator.getNamespacePrefixes(rootElem3);
	assertTrue("The required namespace list does not contain 'wsdl' when the namespace is specified for an attribute.", reqNSs3.contains("wsdl"));
	
  }

  /**
   * TODO: Implement tests for the RemoveImports method.
   */
  public void todoRemoveImports() 
  {
  }

  /**
   * TODO: Implement tests for the RemoveLocalNamespace method.
   */
  public void todoRemoveLocalNamespaces() 
  {
  }

  /**
   * TODO: Implement tests for the ResolveNamespace method.
   */
  public void todoResolveNamespaces() 
  {
  }

  /**
   * 
   */
  public void testRestrictImports() 
  {
  }
}
