<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">

<!--

   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

-->
<!-- ========================================================================= -->
<!-- This test checks that the various RGB values read from the SVGColor       -->
<!-- interface return accurate values.                                         -->
<!--                                                                           -->
<!-- @author shillion@ilog.fr                                                  -->
<!-- @version $Id$            -->
<!-- ========================================================================= -->

<svg xmlns="http://www.w3.org/2000/svg" 
     xmlns:xlink="http://www.w3.org/1999/xlink" 
     xmlns:test="http://xml.apache.org/batik/test"
     width="450" height="500" viewBox="0 0 450 500"
     onload="runTest(evt)">

  <test:testResult id="testResult" />

  <script type="text/ecmascript"><![CDATA[
     var testNS = "http://xml.apache.org/batik/test";

     function runTest() {
         var result = document.getElementById("testResult");
         result.setAttributeNS(null, "result", "failed");
        
         var r1 = document.getElementById("r1")
         if (r1 == null){
          result.setAttributeNS(null, "errorCode", "cannot.find.test.element");
          var entry = document.createElementNS(testNS, "errorDescriptionEntry");
          entry.setAttributeNS(null, "id", "missing.element.id");
          entry.setAttributeNS(null, "value", "r1");
          result.appendChild(entry);
          return;
         }

         var compStyle = document.documentElement.getComputedStyle(r1, null);         
         if (compStyle.getPropertyValue("fill") != "rgb(0, 255, 0)") {
           result.setAttributeNS(null, "errorCode", "wrong.computed.style");
           var entry = document.createElementNS(testNS, "errorDescriptionEntry");
           entry.setAttributeNS(null, "value", "invalid.value");
           entry.setAttributeNS(null, "value", compStyle.getPropertyValue("fill"));
           result.appendChild(entry);
           return;
         }

         r1.removeAttributeNS(null, "fill");

         if (compStyle.getPropertyValue("fill") != "rgb(255, 0, 0)") {
           result.setAttributeNS(null, "errorCode", "wrong.computed.style");
           var entry = document.createElementNS(testNS, "errorDescriptionEntry");
           entry.setAttributeNS(null, "value", "invalid.value");
           entry.setAttributeNS(null, "value", compStyle.getPropertyValue("fill"));
           result.appendChild(entry);
           return;
         }

         result.setAttributeNS(null, "result", "passed");
     }
  ]]></script>

  <g fill="rgb(255, 0, 0)">
     <rect id="r1" x="0" y="0" width="100" height="100" fill="rgb(0, 255, 0)"/>
     <rect id="r2" x="20" y="20" width="100" height="100"/>
  </g>
</svg>
