
/*
Copyright Â© 2001-2004 World Wide Web Consortium, 
(Massachusetts Institute of Technology, European Research Consortium 
for Informatics and Mathematics, Keio University). All 
Rights Reserved. This work is distributed under the W3CÂ® Software License [1] in the 
hope that it will be useful, but WITHOUT ANY WARRANTY; without even 
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

[1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
*/



   /**
    *  Gets URI that identifies the test.
    *  @return uri identifier of test
    */
function getTargetURI() {
      return "http://www.w3.org/2001/DOM-Test-Suite/level3/core/canonicalform06";
   }

var docsLoaded = -1000000;
var builder = null;

//
//   This function is called by the testing framework before
//      running the test suite.
//
//   If there are no configuration exceptions, asynchronous
//        document loading is started.  Otherwise, the status
//        is set to complete and the exception is immediately
//        raised when entering the body of the test.
//
function setUpPage() {
   setUpPageStatus = 'running';
   try {
     //
     //   creates test document builder, may throw exception
     //
     builder = createConfiguredBuilder();

      docsLoaded = 0;
      
       if (docsLoaded == 0) {
          setUpPageStatus = 'complete';
       }
    } catch(ex) {
    	catchInitializationError(builder, ex);
        setUpPageStatus = 'complete';
    }
}



//
//   This method is called on the completion of 
//      each asychronous load started in setUpTests.
//
//   When every synchronous loaded document has completed,
//      the page status is changed which allows the
//      body of the test to be executed.
function loadComplete() {
    if (++docsLoaded == 0) {
        setUpPageStatus = 'complete';
    }
}

//DOMErrorMonitor's require a document level variable named errorMonitor
var errorMonitor;
	 
/**
* 
Create a document with an XML 1.1 valid but XML 1.0 invalid element and
normalize document with canonical-form set to true.

* @author Curt Arnold
* @see http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core#Document3-normalizeDocument
* @see http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core#parameter-canonical-form
*/
function canonicalform06() {
   var success;
    if(checkInitialization(builder, "canonicalform06") != null) return;
    var domImpl;
      var nullString = null;

      var nullDoctype = null;

      var doc;
      var elem;
      var retval;
      var domConfig;
      errorMonitor = new DOMErrorMonitor();
      
      var errors = new Array();

      var error;
      var severity;
      var type;
      var locator;
      var relatedNode;
      var canSet;
      domImpl = getImplementation();
doc = domImpl.createDocument(nullString,nullString,nullDoctype);
      
	{
		success = false;
		try {
            elem = doc.createElementNS("http://www.example.org/domts/wellformed01","LegalNameࢎ");
        }
		catch(ex) {
      success = (typeof(ex.code) != 'undefined' && ex.code == 5);
		}
		assertTrue("xml10InvalidName",success);
	}

      try {
      doc.xmlVersion = "1.1";

      
      } catch (ex) {
		  if (typeof(ex.code) != 'undefined') {      
       switch(ex.code) {
       case /* NOT_SUPPORTED_ERR */ 9 :
               return ;
    default:
          throw ex;
          }
       } else { 
       throw ex;
        }
         }
        elem = doc.createElementNS("http://www.example.org/domts/wellformed01","LegalNameࢎ");
      retval = doc.appendChild(elem);
      doc.xmlVersion = "1.0";

      domConfig = doc.domConfig;

      canSet = domConfig.canSetParameter("canonical-form",true);
      
	if(
	canSet
	) {
	domConfig.setParameter("canonical-form", true);
	 domConfig.setParameter("error-handler", errorMonitor.handleError);
	 doc.normalizeDocument();
      errors = errorMonitor.allErrors;
for(var indexN100B7 = 0;indexN100B7 < errors.length; indexN100B7++) {
      error = errors[indexN100B7];
      severity = error.severity;

      assertEquals("severity",2,severity);
       type = error.type;

      assertEquals("type","wf-invalid-character-in-node-name",type);
       locator = error.location;

      relatedNode = locator.relatedNode;

      assertSame("relatedNode",elem,relatedNode);

	}
   assertSize("oneError",1,errors);

	}
	
}




function runTest() {
   canonicalform06();
}
