/*
 * 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: List Literal Test</title>
</head>
<body>

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

<p>Hello, world!</p>

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


The list contains 5 items.

<p>test1</p>
<p>test23</p>
<p>test45</p>
<p>Hello, world!</p>
<p>hello</p>

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


<p>test1</p>
<p>test23</p>
<p>test45</p>
<p>Hello, world!</p>
<p>hello</p>

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


<p>bar</p>
<p>Temporary</p>
<p>test1</p>
<p>test23</p>

<p>Silly, but necessary tests, for one and zero element lists:</p>


<p>Hello, world</p>

<p>Zero item test:</p>



<p>Dumb test for number literals -- these weren't working as expected:</p>


<p>1</p>
<p>2</p>
<p>3</p>
<p>5</p>

</body>
</html>
