<?xml version="1.0"?>
<!--
  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

      https://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.
-->
<project default="antunit" xmlns:au="antlib:org.apache.ant.antunit">
  <import file="../antunit-base.xml" />

  <target name="setUp">
    <mkdir dir="${output}"/>
    <property name="legacy.dir"
              location="../../../etc/testcases/taskdefs/style/"/>
  </target>

  <target name="testParameterPropagation" depends="setUp">
    <xslt in="${legacy.dir}/data.xml"
          out="${output}/out.xml"
          style="${legacy.dir}/printParams.xsl">
      <param name="set" expression="myvalue"/>
    </xslt>
    <au:assertResourceContains
       resource="${output}/out.xml"
       value="set='myvalue'"/>
  </target>
  
  <target name="testParameterTypes" depends="setUp" description="parameters of various data types and XPath expressions">

    <property name="antProperty1" value="ANT_PROPERTY_1"/>
    <property name="antProperty2" value="ANT_PROPERTY_2"/>
    <property name="antProperty3" value="3"/>
    <property name="antProperty4" value="substring-before"/>
    
    <xslt in="${legacy.dir}/data.xml"
          out="${output}/out.xml">
      <param name="p1" expression="123" type="INT"/>
      <param name="p2" expression="64 * 64 div 128 + 10" type="XPATH_NUMBER"/>
      <param name="p3" expression="${antProperty4}($antProperty2, '_')" type="XPATH_STRING"/>
      
      <style>
        <string><![CDATA[<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fo="http://www.w3.org/1999/XSL/Format">

<!-- get the xsl-parameter -->
<xsl:param name="p1"/>
<xsl:param name="p2"/>
<xsl:param name="p3"/>

<!-- use the xsl-parameter -->
<xsl:template match="/">
p1_result='<xsl:value-of select="$p1 + 321"/>'
p2_result='<xsl:value-of select="$p2"/>'
p3_result='<xsl:value-of select="$p3"/>'
</xsl:template>

</xsl:stylesheet>
]]></string>
      </style>
    </xslt>
    <au:assertResourceContains resource="${output}/out.xml" value="p1_result='444'"/>
    <au:assertResourceContains resource="${output}/out.xml" value="p2_result='42'"/>
    <au:assertResourceContains resource="${output}/out.xml" value="p3_result='ANT'"/>
  </target>

  <target name="testInlineStyleSheet" depends="setUp">
    <xslt in="${legacy.dir}/data.xml"
          out="${output}/out.xml">
      <param name="set" expression="somevalue"/>
      <style>
        <string><![CDATA[<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fo="http://www.w3.org/1999/XSL/Format">

<!-- get the xsl-parameter -->
<xsl:param name="set">set default value</xsl:param>
<xsl:param name="empty">empty default value</xsl:param>
<xsl:param name="undefined">undefined default value</xsl:param>

<!-- use the xsl-parameter -->
<xsl:template match="/">
set='<xsl:value-of select="$set"/>'
empty='<xsl:value-of select="$empty"/>'
undefined='<xsl:value-of select="$undefined"/>'
</xsl:template>

</xsl:stylesheet>
]]></string>
      </style>
    </xslt>
    <au:assertResourceContains
       resource="${output}/out.xml"
       value="set='somevalue'"/>
  </target>

  <target name="testStyleDoesntExist" depends="setUp">
    <au:expectfailure expectedmessage="i-m-not-there.xslt doesn't exist.">
      <xslt in="${legacy.dir}/data.xml"
            out="${output}/out.xml"
            style="i-m-not-there.xslt"/>
    </au:expectfailure>
  </target>

  <target name="testStyleDoesntExistNoError" depends="setUp">
    <xslt in="${legacy.dir}/data.xml"
          out="${output}/out.xml"
          style="i-m-not-there.xslt"
          failOnError="false"/>
    <au:assertFileDoesntExist file="${output}/out.xml"/>
  </target>

  <target name="testStyleDoesntExistNoTransformationError" depends="setUp">
    <au:expectfailure expectedmessage="i-m-not-there.xslt doesn't exist.">
      <xslt in="${legacy.dir}/data.xml"
            out="${output}/out.xml"
            style="i-m-not-there.xslt"
            failOnTransformationError="false"/>
    </au:expectfailure>
  </target>

  <target name="testTransformationError" depends="setUp">
    <au:expectfailure expectedmessage="Fatal error during transformation">
      <xslt in="${legacy.dir}/data.xml"
            out="${output}/out.xml"
            style="xslt/printParams-invalid.xsl"
            />
    </au:expectfailure>
  </target>

  <target name="testTransformationErrorNoFail" depends="setUp">
    <xslt in="${legacy.dir}/data.xml"
          out="${output}/out.xml"
          style="xslt/printParams-invalid.xsl"
          failOnError="false"/>
    <au:assertFileDoesntExist file="${output}/out.xml"/>
  </target>

  <target name="testTransformationErrorNoFailOnTransformation" depends="setUp">
    <xslt in="${legacy.dir}/../input.stdin"
          out="${output}/out.xml"
          style="${legacy.dir}/printParams.xsl"
          failOnTransformationError="false"/>
    <au:assertFileDoesntExist file="${output}/out.xml"/>
  </target>

  <target name="testNoResources" depends="setUp">
    <au:expectfailure expectedmessage="no resources specified">
      <xslt destdir="${output}" style="${legacy.dir}/printParams.xsl"
            useImplicitFileset="false">
        <fileset dir=".">
          <include name="I don't exist"/>
        </fileset>
      </xslt>
    </au:expectfailure>
  </target>

  <target name="testNoResourcesNoFail" depends="setUp">
    <xslt destdir="${output}" style="${legacy.dir}/printParams.xsl"
          useImplicitFileset="false"
          failOnNoResources="false">
      <fileset dir=".">
        <include name="I don't exist"/>
      </fileset>
    </xslt>
  </target>

  <target name="testNoResourcesNoError" depends="setUp">
    <xslt destdir="${output}" style="${legacy.dir}/printParams.xsl"
          useImplicitFileset="false"
          failOnError="false">
      <fileset dir=".">
        <include name="I don't exist"/>
      </fileset>
    </xslt>
  </target>

  <target name="testTrace" depends="setUp">
    <xslt in="${legacy.dir}/data.xml"
          out="${output}/out.xml"
          style="${legacy.dir}/printParams.xsl">
      <param name="set" expression="myvalue"/>
      <trace templates="true" elements="true" generation="true"
             selection="true" extension="true"/>
    </xslt>
    <au:assertLogDoesntContain text="Failed to enable tracing"/>
  </target>

  <target name="setUpIfUnlessTests" depends="setUp">
    <macrodef name="xs">
      <sequential>
        <xslt in="${legacy.dir}/data.xml" out="${output}/out.xml"
              style="${legacy.dir}/printParams.xsl">
          <param name="set" expression="if-value" if="${if}"/>
          <param name="set" expression="unless-value" unless="${if}"/>
          <param name="empty" expression="if-value" if="if"/>
          <param name="empty" expression="unless-value" unless="if"/>
        </xslt>
      </sequential>
    </macrodef>
  </target>

  <target name="testPropertiesNotSet" depends="setUpIfUnlessTests">
    <xs/>
    <au:assertResourceContains resource="${output}/out.xml"
                               value="set='unless-value'"/>
    <au:assertResourceContains resource="${output}/out.xml"
                               value="empty='unless-value'"/>
  </target>

  <target name="testPropertiesSet" depends="setUpIfUnlessTests">
    <property name="if" value="whatever"/>
    <xs/>
    <au:assertResourceContains resource="${output}/out.xml"
                               value="set='unless-value'"/>
    <au:assertResourceContains resource="${output}/out.xml"
                               value="empty='if-value'"/>
  </target>

  <target name="testIfTrue" depends="setUpIfUnlessTests">
    <property name="if" value="true"/>
    <xs/>
    <au:assertResourceContains resource="${output}/out.xml"
                               value="set='if-value'"/>
    <au:assertResourceContains resource="${output}/out.xml"
                               value="empty='if-value'"/>
  </target>

  <target name="testIfFalse" depends="setUpIfUnlessTests">
    <property name="if" value="false"/>
    <xs/>
    <au:assertResourceContains resource="${output}/out.xml"
                               value="set='unless-value'"/>
    <au:assertResourceContains resource="${output}/out.xml"
                               value="empty='if-value'"/>
  </target>
</project>
