<?xml version="1.0"?>
<!--
  Copyright 2002,2004 The Apache Software Foundation.
  
  Licensed 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.
-->
<test:suite 
  xmlns:html="jelly:html" 
  xmlns:j="jelly:core"
  xmlns:x="jelly:xml"
  xmlns:test="jelly:junit">

  <test:case name="testSimpleParse">
    <html:parse var="doc" html="index.html"/>
  
    <test:assert xpath="$doc/html/head/title"/>
    <test:assert xpath="$doc/html/body/IMG[@URI='foo']"/>
  </test:case>

  <test:case name="testUpperCase">
    <html:parse var="doc" html="index.html" element="upper" attribute="upper"/>
  
    <test:assert xpath="$doc/HTML/HEAD/TITLE"/>    
    <test:assert xpath="$doc/HTML/BODY/IMG[@URI='foo']"/>
  </test:case>
  
  <test:case name="testLowerCase">
    <html:parse var="doc" html="index.html" element="lower" attribute="lower"/>
  
    <test:assert xpath="$doc/html/head/title"/>
    <test:assert xpath="$doc/html/body/img[@uri='foo']"/>
  </test:case>
  
  <test:case name="testMixedCase">
    <html:parse var="doc" html="index.html" element="upper" attribute="lower"/>
  
    <test:assert xpath="$doc/HTML/HEAD/TITLE"/>
    <test:assert xpath="$doc/HTML/BODY/IMG[@uri='foo']"/>
  </test:case>

  <test:case name="testInlineHtml">
    <html:parse var="doc">
      <html>
        <head>
          <title>Jelly - Jelly : Java and XML based processing engine</title>
          <meta name="author" value="James Strachan"/>
          <meta name="email" value="jstrachan@apache.org" />
        </head>
        <body>
        </body>
      </html>
    </html:parse>
    
    <test:assert xpath="$doc/html/head/title"/>
    
    <j:set var="title"><x:expr select="$doc/html/head/title" /></j:set>
    <test:assertEquals expected="Jelly - Jelly : Java and XML based processing engine"
      actual="${title}" />
  </test:case>

  <test:case name="testInlineFromVar">
      
      <!-- this will turn the HTML markup from XML events into text -->
    <j:set var="html" encode="false">
      <html>
        <head>
          <title>Jelly - Jelly : Java and XML based processing engine</title>
                  <meta name="author" value="James Strachan"/>
          <meta name="email" value="jstrachan@apache.org" />
        </head>
        <body>
        </body>
      </html>
    </j:set>

        <!-- parse the text as markup -->
    <html:parse var="doc" text="${html}"/>

    <test:assert xpath="$doc/html/head/title"/>
    
    <j:set var="title"><x:expr select="$doc/html/head/title" /></j:set>
    
    <test:assertEquals 
        expected="Jelly - Jelly : Java and XML based processing engine"
      actual="${title}" />
  </test:case>

</test:suite>
