<#--
  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.
-->
<#assign suppress>
<@assertFails message="true,false">${true}</@>
<@assertFails message="true,false">${false}</@>
<@assertFails message="true,false">${"" + true}</@>
<@assertFails message="true,false">${"" + false}</@>
<@assertFails message="true,false">${true?upper_case}</@>
<@assertFails message="true,false">${false?upper_case}</@>
<@assertEquals expected="true" actual=true?string />
<@assertEquals expected="false" actual=false?string />
<@assertEquals expected="true" actual=true?c />
<@assertEquals expected="false" actual=false?c />
<@assertEquals expected="t" actual=true?string('t', 'f') />
<@assertEquals expected="f" actual=false?string('t', 'f') />
<#setting boolean_format = 'true,false'>
<@assertFails message="true,false">${true}</@>

<#setting boolean_format = 'ja,nein'>
<@assertEquals expected="ja" actual="" + true />
<@assertEquals expected="nein" actual="" + false />
<@assertEquals expected="JA" actual=true?upper_case />
<@assertEquals expected="NEIN" actual=false?upper_case />
<@assertEquals expected="ja" actual=true?string />
<@assertEquals expected="nein" actual=false?string />
<@assertEquals expected="true" actual=true?c />
<@assertEquals expected="false" actual=false?c />
<@assertEquals expected="t" actual=true?string('t', 'f') />
<@assertEquals expected="f" actual=false?string('t', 'f') />

<#setting boolean_format = 'y,n'>
<#assign x = false>
<#assign n = 123><#assign m = { x: 'foo', n: 'bar' }><@assertEquals actual=m['n'] + m['123'] expected='foobar' />
<@assertFails exception="UnexpectedTypeException">${m[false]}</@>
<@assertFails message="can't compare">${x == 'false'}</@>
<@assertFails message="can't compare">${x != 'false'}</@>
<@assertFails message="can't convert">${booleanVsStringMethods.expectsString(x)}</@>
<@assertEquals actual=booleanVsStringMethods.expectsString(booleanAndString) expected="theStringValue" />
<@assertEquals actual=booleanVsStringMethods.expectsBoolean(x) expected=false />
<@assertEquals actual=booleanVsStringMethods.expectsBoolean(booleanAndString) expected=true />
<@assertEquals actual=booleanVsStringMethods.overloaded(x) expected="boolean false" />
<@assertEquals actual=123?upper_case expected="123" />
<@assertEquals actual=true?upper_case expected="Y" />

</#assign>
<#escape x as x?upper_case>
<#assign x = true>${x} ${true} ${true?string}
<#assign x = false>${x} ${false} ${false?string}
<#noescape><#assign x = true>${x} ${true} ${true?string}</#noescape>
</#escape>
<#assign x = false>${x} ${false} ${false?string}
<#assign x = true>${x} ${true} ${true?string}
<#assign x = false>${x} ${false} ${false?string}
${'str:' + x} ${'str:' + false}
${x?string('ja', 'nein')} ${true?string('ja', 'nein')}
${beansBoolean} ${beansBoolean?string}
${booleanAndString} ${booleanAndString?string}

<#setting boolean_format = 'y,n'>
<@assertEquals actual='true'?boolean expected=true />
<@assertEquals actual='false'?boolean expected=false />
<@assertEquals actual='y'?boolean expected=true />
<@assertEquals actual='n'?boolean expected=false />
<@assertFails message="can't convert">${'N'?boolean}</@>
<@assertFails message="can't convert">${'True'?boolean}</@>
<@assertFails message="can't convert">${0?boolean}</@>
<@assertFails message="sequence">${[]?boolean}</@>