<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="../custom/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>
