<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.5 $" testname="$RCSfile: struct-svg-02-f.svg,v $">
    <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/struct.html#SVGElement">
      <p>
        Testing various interactions on the width attribute on an svg element.
        The width attribute defaults to "100%" if it's not specified.
      </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 is passed if the testframe is filled with green, and there's no red.
      </p>
    </d:passCriteria>
  </d:SVGTestCase>
  <title id="test-title">$RCSfile: struct-svg-02-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">
    <script type="text/ecmascript" xlink:href="../resources/testharness.js"/>
    
    <!-- The testroot is here only to get a predictable 480x360 viewport -->
    <svg id="testroot" width="480" height="360">
	    <svg id="testSVG1" />
	    <svg id="testSVG2" />
	    <svg id="subSVG" width="300" height="175"/>
		</svg>

    <g id="testoutput"/>
    
    <!-- Cover the whole testframe with a simple visual result -->
    <rect id="status" width="100%" height="100%" fill="none"/>
    
    <script type="text/javascript"><![CDATA[
      var passes = 0;
      var ypos = 50;

      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");
        var tc = document.createTextNode(str); 
        t.appendChild(tc);
        t.setAttribute("class", "result");
        t.setAttribute("font-family", "monospace");
        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("class", result ? "passed" : "failed");
        g.setAttribute("fill", result ? "lime" : "red");
        g.appendChild(r);
        g.appendChild(t);
        g.setAttribute("transform", "translate(10 " + ypos + ")");
        ypos += 10;
        document.getElementById("testoutput").appendChild(g);
        
        if (result)
          passes++;
      }

      try
      {
          var testSVG = document.getElementById("testSVG1");
          var subSVG = document.getElementById("subSVG");
          var status = document.getElementById("status");
          
          var base = testSVG.width.baseVal;
          
          verify("value: " + base.value, base.value == 480);
          test(function() {assert_equals(base.value, 480)}, "Assert that the width baseVal is 100% computed to user units.");

          verify("valueInSpecifiedUnits: " + base.valueInSpecifiedUnits, base.valueInSpecifiedUnits == 100);
          test(function() {assert_equals(base.value, 100)}, "Assert that the default width baseVal is 100.");
          
          // set the value in user units and then read it back
          base.value = 240;
          verify("value: " + base.value, base.value == 240);
          test(function() {assert_equals(base.value, 240)}, "Assert that the width baseVal is 240 after setting it.");
          verify("valueInSpecifiedUnits: " + base.valueInSpecifiedUnits, base.valueInSpecifiedUnits == 50);
          test(function() {assert_equals(base.valueInSpecifiedUnits, 50)}, "Assert that the value in specified units is now 50.");
          
          // move the svg to be child of another viewport and read values again
          subSVG.appendChild(testSVG);
          verify("value: " + base.value, base.value == 150);
          test(function() {assert_equals(base.value, 150)}, "Assert that the value changes to 150 after being moved to a new viewport.");
          verify("valueInSpecifiedUnits: " + base.valueInSpecifiedUnits, base.valueInSpecifiedUnits == 50);
          test(function() {assert_equals(base.valueInSpecifiedUnits, 50)}, "Assert that the value in specified units is still 50 after being moved to a new viewport.");
          
          // move an svg that hasn't been modified to another viewport and read values
          testSVG = document.getElementById("testSVG2");
          subSVG.appendChild(testSVG);
          base = testSVG.width.baseVal;
          verify("value: " + base.value, base.value == 300);
          test(function() {assert_equals(base.value, 300)}, "Assert that the width baseVal is 300 user units after being moved to a new viewport.");
      }
      catch(ex)
      {
      }
      
      status.setAttribute("fill", passes == 7 ? "lime" : "red");
      test(function() {assert_equals(passes,7)}, "Assert that all subtests passed.");
  ]]></script>

  </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>
