<#--
  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.
-->
<@isIRE>${v}</@>
<@isIRE>${w}</@>
<@isNonFastIRE>${v}</@> <#-- To check that it isn't an IRE.FAST_INSTANCE -->

<@assertEquals actual=v!'-' expected='-' />
<@assertEquals actual=(v)!'-' expected='-' />
<@assertEquals actual=(v!) expected='' />
<@assertEquals actual=((v)!) expected='' />
<@isNonFastIRE>${v}</@> <#-- To check that it isn't an IRE.FAST_INSTANCE -->
<@assertEquals actual=v?? expected=false />
<@assertEquals actual=(v)?? expected=false />
<@assertEquals actual=v?default('-') expected='-' />
<@assertEquals actual=(v)?default('-') expected='-' />
<@isNonFastIRE>${v}</@> <#-- To check that it isn't an IRE.FAST_INSTANCE -->
<@assertEquals actual=v?exists expected=false />
<@assertEquals actual=(v)?exists expected=false />
<@assertEquals actual=v?if_exists expected='' />
<@assertEquals actual=(v)?if_exists expected='' />
<@assertEquals actual=v?has_content expected=false />
<@assertEquals actual=(v)?has_content expected=false />

<@assertEquals actual=v?default(w, '-') expected='-' />
<@assertEquals actual=v!w!'-' expected='-' />
<#assign w = 'W'>
<@assertEquals actual=v?default(w, '-') expected='W' />
<@assertEquals actual=v!w!'-' expected='W' />

<#list ['V', 1.5] as v>
	<@assertEquals actual=v!'-' expected=v />
	<@assertEquals actual=(v)!'-' expected=v />
	<@assert test=v?? />
	<@assert test=(v)?? />
	<@assertEquals actual=v?default('-') expected=v />
	<@assertEquals actual=(v)?default('-') expected=v />
	<@assert test=v?exists />
	<@assert test=(v)?exists />
	<@assertEquals actual=v?if_exists expected=v />
	<@assertEquals actual=(v)?if_exists expected=v />
	<@assert test=v?has_content />
	<@assert test=(v)?has_content />
</#list>
<@assert test=!v?? />
<@assert test=!v?exists />
<@isNonFastIRE>${v}</@> <#-- To check that it isn't an IRE.FAST_INSTANCE -->

<@isIRE>${u.v!'-'}</@>
<@assertEquals actual=(u.v)!'-' expected='-' />
<@isIRE>${u.v??}</@>
<@assertEquals actual=(u.v)?? expected=false />
<@isIRE>${u.v?default('-')}</@>
<@assertEquals actual=(u.v)?default('-') expected='-' />
<@isIRE>${u.v?exists}</@>
<@assertEquals actual=(u.v)?exists expected=false />
<@isIRE>${u.v?if_exists}</@>
<@assertEquals actual=(u.v)?if_exists expected='' />
<@isIRE>${u.v?has_content}</@>
<@assertEquals actual=(u.v)?has_content expected=false />

<#assign u = { 'x': 'X' } >
<@assertEquals actual=u.v!'-' expected='-' />
<@assertEquals actual=(u.v)!'-' expected='-' />
<@assertEquals actual=u.v?? expected=false />
<@assertEquals actual=(u.v)?? expected=false />
<@assertEquals actual=u.v?default('-') expected='-' />
<@assertEquals actual=(u.v)?default('-') expected='-' />
<@assertEquals actual=u.v?exists expected=false />
<@assertEquals actual=(u.v)?exists expected=false />
<@assertEquals actual=u.v?if_exists expected='' />
<@assertEquals actual=(u.v)?if_exists expected='' />
<@assertEquals actual=u.v?has_content expected=false />
<@assertEquals actual=(u.v)?has_content expected=false />

<#assign u = { 'v': 'V' } >
<@assertEquals actual=u.v!'-' expected='V' />
<@assertEquals actual=(u.v)!'-' expected='V' />
<@assert test=u.v?? />
<@assert test=(u.v)?? />
<@assertEquals actual=u.v?default('-') expected='V' />
<@assertEquals actual=(u.v)?default('-') expected='V' />
<@assert test=u.v?exists />
<@assert test=(u.v)?exists />
<@assertEquals actual=u.v?if_exists expected='V' />
<@assertEquals actual=(u.v)?if_exists expected='V' />
<@assert test=u.v?has_content />
<@assert test=(u.v)?has_content />

<#list 1..4 as i>
  <#if i == 3><#assign x = 'X'></#if>
  <@assertEquals actual=((x!'-') == '-') expected=(i < 3) />
</#list>

<#macro attemptTest>
  <#attempt>
    ${fails}
  <#recover>
    <@assert test=isNonFastIREMessage(.error) />
  </#attempt>
</#macro>
<@attemptTest />
${(callMacroFromExpression(attemptTest))!}

<#macro interpretTest><@'$\{fails}'?interpret /></#macro>
<#attempt>
  <@interpretTest />
<#recover>
  <@assert test=isNonFastIREMessage(.error) />
</#attempt>
<#attempt>
  ${(callMacroFromExpression(interpretTest))!}
<#recover>
  <@assert test=isNonFastIREMessage(.error) />
</#attempt>

<@assertEquals actual='fails'?eval!'-' expected='-' />
<@assertEquals actual=('fails')?eval!'-' expected='-' />

<#macro isIRE><@assertFails exception="InvalidReferenceException"><#nested></@></#macro>
<#macro isNonFastIRE><@assertFails exception="InvalidReferenceException" message="Tip:"><#nested></@></#macro>
<#function isNonFastIREMessage msg><#return msg?contains('Tip:') && msg?contains('null or missing')></#function>
<#function callMacroFromExpression m>
  <#local captured><@m /></#local>
  <#return captured>
</#function>
