<#--
  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.
-->
<html>
<head>
<title>FreeMarker: Hash Literal Test</title>
</head>
<body>

<p>A simple test follows:</p>

<p>${message}</p>

<p>Now perform a hash assignment:</p>

<#assign mymessage = "hello", foo="bar", one="1">
<#assign test = { "test1": "test23", 
                 "test45" : message, 
                  mymessage : "hello all", 
                  foo: one}>

${test.test1}
${test.test45}
${test.hello}
${test.bar}

<p>Now update the assignment and repeat:</p>

<#assign mymessage = "world">

${test.test1}
${test.test45}
${test.hello}

${test.bar}

<p>Now reassign the list and repeat:</p>

<#assign hash= {"temp" : "Temporary"}>
<#assign test = { "test1" : "test23", 
                        "test45" : message, 
                        mymessage : "hello all", 
                        foo : one, 
                        "hash" : hash[ "temp" ], 
                        "true" : hash.temp, 
                        "newhash" : hash}>

${test.test1}
${test.test45}
${test.hello?if_exists}

${test.bar}
${test.hash}
${test.true}
${test.newhash.temp}

<p>Pathological case: zero item hash:</p>

<#assign test = {}>
${test.test1?if_exists}

<p>Hash of number literals:</p>
<#assign test = {"1" : 2}>
${test["1"]}

<p>Hash concatenation:</p>
<#assign cc = { "a" : 1, "b" : 2 } + { "b" : 3, "c" : 4 }>
<#list cc?keys?sort as key>
${key} => ${cc[key]}
</#list>

<p>Empty hash concatenation:</p>
${({} + { "a" : "foo" }).a}, ${({ "a" : "bar" } + {}).a}

</body>
</html>
<@noOutput>

<#assign m = { 'a': 1, 'b', 2, 'a': 3 }>
<#if iciIntValue gte 2003021>
	<@assertEquals expected="a, b" actual=m?keys?join(', ') />
	<@assertEquals expected="3, 2" actual=m?values?join(', ') />
	<@assertEquals expected=3 actual=m['a'] />
	<@assertEquals expected=2 actual=m['b'] />
<#else>
	<@assertEquals expected="a, b, a" actual=m?keys?join(', ') />
	<@assertEquals expected="1, 2, 3" actual=m?values?join(', ') />
	<@assertEquals expected=3 actual=m['a'] />
	<@assertEquals expected=2 actual=m['b'] />
</#if>

</@noOutput>