<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">
  <!--======================================================================-->
  <!--=  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="CM" author="ED" status="reviewed"
    version="$Revision: 1.9 $" testname="$RCSfile: svgdom-over-01-f.svg,v $">
    <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/svgdom.html#SVGDOMOverview">
      <p>
      	This tests how unspecified attributes affect the return values from the
      	SVG DOM methods related to attributes.
      </p>
      <p>
      	After loading the test, you should see a list of red or green rectangles followed by some text describing each subtest.
      </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>
      	The test has passed if there is a line of text saying "Test status: PASSED", and there is a green rectangle to the left of that text.
      </p>
    </d:passCriteria>
  </d:SVGTestCase>
  <title id="test-title">$RCSfile: svgdom-over-01-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>
      <rect id="r" width="1" height="1"/>
      <stop id="s"/>
      <feConvolveMatrix id="c"/>
      <image id="i" xlink:href="http://example.org/image.jpg" width="1" height="1"/>
      <radialGradient id="g"/>
      <text id="t"/>
      <text id="tt">sometext</text>
      <marker id="m"/>
      <svg id="v"/>
      <filter id="f"/>
      <polygon id="p"/>
    </defs>
    
    <script><![CDATA[
      var ypos = 50;
      var r = document.getElementById("r");
      var s = document.getElementById("s");
      var c = document.getElementById("c");
      var i = document.getElementById("i");
      var g = document.getElementById("g");
      var t = document.getElementById("t");
      var tt = document.getElementById("tt");
      var m = document.getElementById("m");
      var v = document.getElementById("v");
      var f = document.getElementById("f");
      var p = document.getElementById("p");

      i.removeAttributeNS("http://www.w3.org/1999/xlink", "href");

      function Subtest(str, code)
      {
        this.str = str;
        this.code = code ? code : str;
      }
      
      Subtest.prototype.getStr = function()
      {
        return this.str;
      }

      Subtest.prototype.getCode = function()
      {
        return this.code;
      }
      
      function verify(str, result)
      {
        var g = document.createElementNS("http://www.w3.org/2000/svg", "g");
        var r = document.createElementNS("http://www.w3.org/2000/svg", "rect");
        var t = document.createElementNS("http://www.w3.org/2000/svg", "text");
        t.appendChild(document.createTextNode(str + ": " + (result ? "PASSED" : "FAILED")));
        t.setAttribute("class", "result");
        t.setAttribute("font-size", "9px");
        t.setAttribute("fill", "black");
        t.setAttribute("x", "10");
        t.setAttribute("y", "7");
        r.setAttribute("y", "1");
        r.setAttribute("width", "5");
        r.setAttribute("height", "5");
        g.setAttribute("fill", result ? "lime" : "red");
        g.appendChild(r);
        g.appendChild(t);
        g.setAttribute("transform", "translate(10 " + ypos + ")");
        ypos += 10;
        document.getElementById("test-body-content").appendChild(g);
        if(result)
        	passes++;	
      }
      
      var passes = 0;
      var tests = [ 
        // test SVGLength
        new Subtest("r.x.baseVal.value == 0"),
        new Subtest("r.x.baseVal.unitType == 1 (SVG_LENGTHTYPE_NUMBER)", "r.x.baseVal.unitType == 1"),
        new Subtest("v.width.baseVal.valueInSpecifiedUnits == 100"),
        new Subtest("v.width.baseVal.unitType == 2 (SVG_LENGTHTYPE_PERCENTAGE)", "v.width.baseVal.unitType == 2"),
        new Subtest("tt.textLength.baseVal.value == tt.getComputedTextLength()"),
        
        // test SVGAnimatedNumber
        new Subtest("s.offset.baseVal == 0"),
        
        // test SVGAnimatedBoolean
        new Subtest("c.preserveAlpha.baseVal == false"),
        
        // test SVGAnimatedString / DOMString
        new Subtest("c.className.baseVal == \"\""),
        new Subtest("i.href.baseVal == \"\""),
        
        // test SVGStringList
        new Subtest("i.requiredFeatures.numberOfItems == 0"),
      
        // SVGAnimatedNumberList
        new Subtest("c.kernelMatrix.baseVal.numberOfItems == 0"),

        // SVGAnimatedLengthList
        new Subtest("t.x.baseVal.numberOfItems == 0"),
        
        // SVGAnimatedPointsList / SVGPointList
        new Subtest("p.points.numberOfItems == 0"),
      
        // SVGAnimatedEnumeration
        new Subtest("g.gradientUnits.baseVal == 2 (SVG_UNIT_TYPE_OBJECTBOUNDINGBOX)", "g.gradientUnits.baseVal == 2"),

        // SVGAnimatedInteger
        new Subtest("c.orderX.baseVal == 0"),
        
        // SVGAnimatedAngle
        new Subtest("m.orientAngle.baseVal.value == 0"),
        new Subtest("m.orientAngle.baseVal.unitType == 1 (SVG_ANGLETYPE_UNSPECIFIED)", "m.orientAngle.baseVal.unitType == 1"),
        
        // SVGAnimatedRect / SVGRect
        new Subtest("v.viewBox.baseVal.[x,y,width,height] == 0", 
                "v.viewBox.baseVal.x == 0 && v.viewBox.baseVal.y == 0 && v.viewBox.baseVal.width == 0 && v.viewBox.baseVal.height == 0"),
        
        // SVGAnimatedTransformList
        new Subtest("t.transform.baseVal.numberOfItems == 0"),

        // SVGAnimatedPreserveAspectRatio / SVGPreserveAspectRatio
        new Subtest("v.preserveAspectRatio.baseVal.align == 6 (SVG_PRESERVEASPECTRATIO_XMIDYMID)", "v.preserveAspectRatio.baseVal.align == 6"),
        new Subtest("v.preserveAspectRatio.baseVal.meetOrSlice == 1 (SVG_MEETORSLICE_MEET)", "v.preserveAspectRatio.baseVal.meetOrSlice == 1"),
      
        // SVGZoomAndPan
        new Subtest("v.zoomAndPan == 2 (SVG_ZOOMANDPAN_MAGNIFY)", "v.zoomAndPan == 2")
      ];
            
      try {
	      for (var k = 0; k < tests.length; k++)
	      {
	        try 
	        {
	          verify(tests[k].getStr(), eval(tests[k].getCode()));
	        }
	        catch(e)
	        {
	          verify(tests[k].getStr(), false);
	        }
	      }
      }
      finally
      {
      	verify("Test status", tests.length == passes);
      }      
    ]]></script>

  </g>
  <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
    <text id="revision" x="10" y="340" stroke="none"
      fill="black">$Revision: 1.9 $</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>
