<html>
<head>
<STYLE>
pre { border:1px solid blue }
span { font-weight: bold }
.success { color: green; }
.failure { color: red; }
</STYLE>
</head>
<body id="body">

<script>
if (window.testRunner)
	testRunner.dumpAsText();

var requester = new XMLHttpRequest();
var processor = new XSLTProcessor();
var serializer = new XMLSerializer();

var sectionId = 0;
var testId = 0;

function addSectionHeader(name) {
	sectionId++;
	document.writeln("<br><span>" + sectionId + ".0 " + name + ":</span><br><br>");
	testId = 0;
}

function addResultExpectException(name, func) {
	try {
		var result = func();
		addStringResult(testname, "****Failure**** (expected exception, instead got result: \"" + result + "\")", "failure");
	} catch (e) {
		// FIXME: probably should check exception type
		addSuccessResult(testname);
	}
}

function addResultExpectValueWhenSerialized(name, value, expectedValue) {
	var serializedValue;
	if (value)
		serializedValue = serializer.serializeToString(value);
	if (serializedValue == expectedValue)
		addSuccessResult(name);
	else
		addFailureResult(name, expectedValue, serializedValue);
}

function addResultExpectValue(name, value, expectedValue) {
	if (value == expectedValue)
		addSuccessResult(name);
	else
		addFailureResult(name, expectedValue, value);
}

function getXMLDocument(name)
{
	requester.open("GET", name, false);
	requester.send(null);
	return requester.responseXML;
}

function addStringResult(name, result, cssClass)
{
	testId++;
	var testNumberString = "" + sectionId + "." + testId
	var testIdString = "id" + testNumberString;
	document.writeln("<span>" + testNumberString + " " + name + ":</span>");
	document.writeln("<pre id=\"" + testIdString + "\" class=\"" + cssClass + "\">@@NO VALUE@@</pre>");
	document.getElementById(testIdString).firstChild.nodeValue = result;
}

function addFailureResult(name, expectedValue, actual)
{
	addStringResult(name, "****Failure**** (expected: \"" + expectedValue + "\" actual: \"" + actual + "\")", "failure");
}

function addSuccessResult(name)
{
	addStringResult(name, "Success", "success");
}

function addXMLResult(name, result)
{
	var str;
	if (result)
		str = serializer.serializeToString(result);
	addStringResult(name, str);
}

var xml = getXMLDocument("resources/xslt-text.xml");
addXMLResult("original xml", xml);
var xsl1 = getXMLDocument("resources/xslt-text.xsl");
addXMLResult("xsl1", xsl1);
var xsl2 = getXMLDocument("resources/xslt-enc.xsl");
addXMLResult("xsl2", xsl2);



// 1.0 void importStylesheet(in DOMNode style);
addSectionHeader("void importStylesheet(in DOMNode style)");
// 1.1 Import two different stylesheets (last one wins)

processor.importStylesheet(xsl1);
processor.importStylesheet(xsl2);
var newXML = processor.transformToDocument(xml);
addXMLResult("Import two different stylesheets", newXML);

// 1.2 Import same stylesheet twice

processor.reset();
processor.importStylesheet(xsl1);
processor.importStylesheet(xsl1);

var newXML = processor.transformToDocument(xml);
addXMLResult("Import same stylesheet twice", newXML);

// 1.3 Import undefined stylesheet

processor.reset();
var testname = "Import undefined stylesheet";
addResultExpectException(testname, function () { return processor.importStylesheet(undefined); } );

// 1.4 Import invalid stylesheet (not wellformed xlst)

processor.reset();
var testName = "Import invalid stylesheet";
addResultExpectException(testname, function () { return processor.importStylesheet(xml); } );

// 1.5 Don't import stylesheet

processor.reset();
var newXML = processor.transformToDocument(xml);
addResultExpectValueWhenSerialized("Don't import stylesheet", newXML, undefined);



// 2.0 DOMDocumentFragment transformToFragment(in DOMNode source, in DOMDocument output);
addSectionHeader("DOMDocumentFragment transformToFragment(in DOMNode source, in DOMDocument output)");
// 2.1 fragment with undefined source

processor.reset();
processor.importStylesheet(xsl1);
var ownerDocument = document.implementation.createDocument("", "test", null);
var testname = "fragment with undefined source";
addResultExpectException(testname, function () { return processor.transformToFragment(undefined, ownerDocument); } );

// 2.2 fragment with undefined output document

ownerDocument = document.implementation.createDocument("", "test", null);
newFragment = processor.transformToFragment(xml, undefined);
addResultExpectValueWhenSerialized("fragment with undefined output document", newFragment, undefined);

// 2.3 use non-DOMDocument output parameter

var testname = "use non-DOMDocument output parameter";
addResultExpectException(testname, function () { return processor.transformToFragment(xml, "error"); } );

// 2.4 transform to same fragment twice

ownerDocument = document.implementation.createDocument("", "test", null);
var secondDocument = document.implementation.createDocument("", "test", null);
newFragment = processor.transformToFragment(xml, ownerDocument);
var secondFragment = processor.transformToFragment(xml, secondDocument);
addResultExpectValueWhenSerialized("transform to same fragment twice", secondFragment, serializer.serializeToString(newFragment));


// 2.5 transform to text
// 2.6 fragment using passed parameters
var paramXSL = getXMLDocument("resources/xslt-param.xsl");
var paramXML = getXMLDocument("resources/xslt-param.xml");

var paramProcessor = new XSLTProcessor;
paramProcessor.importStylesheet(paramXSL);
paramProcessor.setParameter(null, "param", "SUCCESS");

var ownerDocument = document.implementation.createDocument("", "test", null);
var fragment = paramProcessor.transformToFragment(paramXML, ownerDocument);
addResultExpectValueWhenSerialized("transformed fragment containing only text", fragment, "SUCCESS");
addResultExpectValue("fragment using passed parameters", fragment.firstChild.nodeValue, "SUCCESS");



// 3.0 DOMDocument transformToDocument(in DOMNode source);
addSectionHeader("DOMDocument transformToDocument(in DOMNode source)");

// 3.1 document from undefined source

processor.reset();
processor.importStylesheet(xsl1);
addResultExpectException("document from undefined source", function () { return processor.transformToDocument(undefined); } );

// 3.2 transform twice

processor.reset();
processor.importStylesheet(xsl1);
var newXML = processor.transformToDocument(xml);
var newerXML = processor.transformToDocument(xml);
addResultExpectValueWhenSerialized("transform twice", newXML, serializer.serializeToString(newerXML));




// 4.0 void setParameter(in DOMString namespaceURI, in DOMString localName, in Value value);
addSectionHeader("void setParameter(in DOMString namespaceURI, in DOMString localName, in Value value)");
processor.reset();

// 4.1 pass setParameter same localname, different namespaces
processor.setParameter("foo", "foo", "Success");
processor.setParameter("bar", "foo", "Failure");
var testname = "pass setParameter same localname, different namespaces";
addResultExpectValue(testname, processor.getParameter("foo", "foo"), "Success");

// 4.2 pass undefined namespace

processor.setParameter(undefined, "foo", "Success");
addResultExpectValue("pass undefined namespace", processor.getParameter(undefined, "foo"), "Success");

// 4.3 pass setParameter an undefined name

var testname = "pass setParameter an undefined name";
addResultExpectException(testname, function () { return processor.setParameter(undefined, undefined , "Success"); } );

// 4.4 pass undefined value

processor.setParameter(undefined, "foo", undefined);
var testname = "pass undefined value";


// 4.5 pass unsupported value to setParameter (object, for instance?)

var testname = "pass unsupported value to setParameter";
addResultExpectException(testname, function () { return processor.setParameter(undefined, "invalid" , new Array()); } );


// 5.0 Value getParameter(in DOMString namespaceURI, in DOMString localName);
addSectionHeader("Value getParameter(in DOMString namespaceURI, in DOMString localName)");

// 5.1 pass undefined name

var testname = "pass getParameter an undefined name";
addResultExpectException(testname, function () { return processor.getParameter(undefined, undefined); } );

// 5.2 pass getParameter a name which has not been set

var testname = "pass getParameter a name which has not been set";
addResultExpectValue(testname, processor.getParameter(undefined, "hasnotbeenset"), null);

// 5.3 verify getParameter actually gets (and set sets)
processor.setParameter(null, "test", "testValue");
var testname = "verify getParameter actually gets (and set sets)";
addResultExpectValue(testname, processor.getParameter(null, "test"), "testValue");



// 6.0 void removeParameter(in DOMString namespaceURI, in DOMString localName);
addSectionHeader("void removeParameter(in DOMString namespaceURI, in DOMString localName)");
// 6.1 pass removeParameter same localname, different namespaces

processor.setParameter("foo", "foo", "Success");
processor.setParameter("bar", "foo", "Failure");
var testname = "pass removeParameter same localname, different namespaces";
addResultExpectValue(testname, processor.getParameter("foo", "foo"), "Success");

// 6.2 pass undefined namespace

processor.setParameter(undefined, "test", "testValue");
processor.removeParameter(undefined, "test");
var testname = "verify removeParameter actually removes using undefined namespace";	
addResultExpectValue(testname, processor.getParameter(null, "test"), null);

// 6.3 pass removeParameter undefined name

processor.setParameter(undefined, "undefined", "Success");
processor.removeParameter(undefined, undefined);
var testname = "pass removeParameter undefined name";
addResultExpectValue(testname, processor.getParameter(undefined, "undefined"), "Success");

// 6.4 pass removeParameter a name which has not been set

processor.removeParameter(undefined, "neverbeensetforremove");
addResultExpectValue("pass removeParameter a name which has not been set", "Success", "Success");

// 6.5 verify removeParameter actually removes
processor.setParameter(null, "test", "testValue");
processor.removeParameter(null, "test");
var testname = "verify removeParameter actually removes";
addResultExpectValue(testname, processor.getParameter(null, "test"), null);



// 7.0 void clearParameters();
addSectionHeader("void clearParameters()");

// 7.1 call, verify that parameters have been cleared
processor.setParameter(null, "test", "testValue");
processor.clearParameters();
var testname = "verify that clearParameters does";
addResultExpectValue(testname, processor.getParameter(null, "test"), null);


// 8.0 void reset();
addSectionHeader("void reset()");
processor = new XSLTProcessor();
processor.importStylesheet(xsl1);
processor.setParameter(null, "test", "testValue");
processor.reset();

// 8.1 call, verify that parameters are cleared after reset()
var testname = "verify that parameters have been cleared";
addResultExpectValue(testname, processor.getParameter(null, "test"), null);

// 8.2 call, verify that stylesheet has been cleared after reset()
var testname = "verify that stylesheet has been cleared";
var resultDocument = processor.transformToDocument(xml);
addResultExpectValueWhenSerialized(testname, resultDocument, undefined);

</script>

</body>
</html>