<svg id="svg-root" width="100%" height="100%"
  viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
  xmlns:xlink="http://www.w3.org/1999/xlink" onload="test()">
  <!--======================================================================-->
  <!--=  Copyright 2008 World Wide Web Consortium, (Massachusetts          =-->
  <!--=  Institute of Technology, European Research Consortium for         =-->
  <!--=  Informatics and Mathematics (ERCIM), Keio University).            =-->
  <!--=  All Rights Reserved.                                              =-->
  <!--=  See http://www.w3.org/Consortium/Legal/.                          =-->
  <!--======================================================================-->
  <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
    template-version="1.4" reviewer="CL" author="ED" status="accepted"
    version="$Revision: 1.5 $" testname="$RCSfile: coords-dom-04-f.svg,v $">
    <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/coords.html#InterfaceSVGTransformList">
      <p>
	  	The test checks the SVGTransformList.consolidate method.
      </p>
    </d:testDescription>
    <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
      <p>
        Run the test. No interaction required.
      </p>
    </d:operatorScript>
    <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
      <p>
		There must be 13 green rectangles visible. 
		The text next to the first rectangle must say "Scripting enabled".
		The other 12 lines must each say "Passed subtest #n" where n is the subtest number 1..12.
		If anything red shows, the test has failed.
      </p>
    </d:passCriteria>
  </d:SVGTestCase>
  <title id="test-title">$RCSfile: coords-dom-04-f.svg,v $</title>
  <defs>
    <font-face
      font-family="SVGFreeSansASCII"
      unicode-range="U+0-7F">
      <font-face-src>
        <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
      </font-face-src>
    </font-face>
  </defs>
  <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
	<defs>
		<style>
			#test-body-content rect { stroke: black; }
		</style>
		<script type="text/ecmascript"><![CDATA[
		var pos = { "x": 20, "y": 40 };
		var subtestCounter = 1;
		var passed = true;
		
		function toString(m)
		{	
			var decimals = 0;
			return m.a.toFixed(decimals) + "," + 
				   m.b.toFixed(decimals) + "," + 
				   m.c.toFixed(decimals) + "," + 
				   m.d.toFixed(decimals) + "," + 
				   m.e.toFixed(decimals) + "," + 
				   m.f.toFixed(decimals);
		}

		function referenceEqual(m1,ref,eps)
		{
			return (Math.abs(m1.a-ref[0]) < eps &&
					Math.abs(m1.b-ref[1]) < eps &&
					Math.abs(m1.c-ref[2]) < eps &&
					Math.abs(m1.d-ref[3]) < eps &&
					Math.abs(m1.e-ref[4]) < eps &&
					Math.abs(m1.f-ref[5]) < eps);
		}

		function assertEquals(m, ref, eps)
		{
			var result = document.createElementNS("http://www.w3.org/2000/svg", "text");
			var resultrect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
			result.setAttribute("x", pos.x);
			result.setAttribute("y", pos.y);
			resultrect.setAttribute("fill", "lime");
			resultrect.setAttribute("width", 15);
			resultrect.setAttribute("height", 15);
			resultrect.setAttribute("y", pos.y-15);
			
			if(referenceEqual(m, ref, eps))
			{	
				result.textContent = "Passed subtest #" + subtestCounter;
			}
			else
			{
				passed = false;
				result.textContent = "Failed subtest #" + subtestCounter + ". Expected " + ref + " but got " + toString(m);
			}
			pos.y += 20;
			subtestCounter++;
			var results = document.getElementById("subteststatus");
			results.appendChild(resultrect)
			results.appendChild(result);
		}
		
		function test()
		{
			eps = 0.005; // "close enough"
			r = document.getElementById("r");

			t1 = r.transform.baseVal.getItem(0);
			t2 = r.transform.baseVal.getItem(1);
			
			// check that matrices are as specified in the markup
			assertEquals(t1.matrix, [1, 0, 0, 1, 10, 10], eps);
			assertEquals(t2.matrix, [0, 1, -1, 0, 0, 0], eps);

			// consolidate
			tfm = r.transform.baseVal.consolidate();
			
			// check that the consolidation is ok
			assertEquals(tfm.matrix, [0, 1, -1, 0, 10, 10], eps);
			
			// check that t1 and t2 were not affected by the consolidation
			assertEquals(t1.matrix, [1, 0, 0, 1, 10, 10], eps);
			assertEquals(t2.matrix, [0, 1, -1, 0, 0, 0], eps);
			
			// check that modifying t1 has no effect on the consolidated transform
			t1.setTranslate(10,200);
			assertEquals(t1.matrix, [1, 0, 0, 1, 10, 200], eps);
			assertEquals(tfm.matrix, [0, 1, -1, 0, 10, 10], eps);
			
			// check that modifying t2 has no effect on the consolidated transform
			t2.setRotate(-90, 0, 0);
			assertEquals(t2.matrix, [0, -1, 1, 0, 0, 0], eps);
			assertEquals(tfm.matrix, [0, 1, -1, 0, 10, 10], eps);
			
			// check that modifying the consolidated transform has no effect on the t1 and t2 transforms
			tfm.matrix.f = 400;
			assertEquals(tfm.matrix, [0, 1, -1, 0, 10, 400], eps);
			assertEquals(t1.matrix, [1, 0, 0, 1, 10, 200], eps);
			assertEquals(t2.matrix, [0, -1, 1, 0, 0, 0], eps);
		
			document.getElementById("status").setAttributeNS(null, "fill", passed ? "lime" : "red");
			document.getElementById("scriptstatus").textContent = "Scripting enabled";
		}
	
	]]></script>
	</defs>

	<g transform="translate(20 -10)">
		<g id="subteststatus" transform="translate(0,40)">
			<rect id="status" y="5" width="15" height="15" fill="red"/>
			<text id="scriptstatus" y="20" x="20" >Scripting disabled</text>
		</g>
	
		<polyline id="r" fill="none" stroke="green" display="none" transform="translate(10 10) rotate(90)" points="0 0 30 40 80 -20" stroke-width="10"/>
	</g>
  </g>
  <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
    <text id="revision" x="10" y="340" stroke="none"
      fill="black">$Revision: 1.5 $</text>
  </g>
  <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
  <!-- comment out this watermark once the test is approved --><!--
  <g id="draft-watermark">
    <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
    <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
      text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
  </g>-->
</svg>
