/*
 * 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.
 */
properties only, shadow (6):
  age              : 27
  class            : class freemarker.test.templatesuite.TemplateTestCase$TestMapBean
  empty            : false
  location         : San Francisco
  luckyNumber      : 7
  name             : Christopher

properties only (6):
  age              : 27
  class            : class freemarker.test.templatesuite.TemplateTestCase$TestMapBean
  empty            : false
  location         : San Francisco
  luckyNumber      : 7
  name             : Chris

nothing, shadow (3):
  age              : 27
  location         : San Francisco
  name             : Chris

nothing (3):
  age              : 27
  location         : San Francisco
  name             : Chris

all, shadow (28):
  age              : 27
  class            : class freemarker.test.templatesuite.TemplateTestCase$TestMapBean
  clear            : UNKNOWN
  clone            : UNKNOWN
  containsKey      : UNKNOWN
  containsValue    : UNKNOWN
  empty            : false
  entrySet         : UNKNOWN
  equals           : UNKNOWN
  get              : UNKNOWN
  getClass         : UNKNOWN
  getLuckyNumber   : UNKNOWN
  getName          : UNKNOWN
  hashCode         : UNKNOWN
  isEmpty          : UNKNOWN
  keySet           : UNKNOWN
  location         : San Francisco
  luckyNumber      : 7
  name             : Christopher
  notify           : UNKNOWN
  notifyAll        : UNKNOWN
  put              : UNKNOWN
  putAll           : UNKNOWN
  remove           : UNKNOWN
  size             : UNKNOWN
  toString         : UNKNOWN
  values           : UNKNOWN
  wait             : UNKNOWN

all (28):
  age              : 27
  class            : class freemarker.test.templatesuite.TemplateTestCase$TestMapBean
  clear            : UNKNOWN
  clone            : UNKNOWN
  containsKey      : UNKNOWN
  containsValue    : UNKNOWN
  empty            : false
  entrySet         : UNKNOWN
  equals           : UNKNOWN
  get              : UNKNOWN
  getClass         : UNKNOWN
  getLuckyNumber   : UNKNOWN
  getName          : UNKNOWN
  hashCode         : UNKNOWN
  isEmpty          : UNKNOWN
  keySet           : UNKNOWN
  location         : San Francisco
  luckyNumber      : 7
  name             : Chris
  notify           : UNKNOWN
  notifyAll        : UNKNOWN
  put              : UNKNOWN
  putAll           : UNKNOWN
  remove           : UNKNOWN
  size             : UNKNOWN
  toString         : UNKNOWN
  values           : UNKNOWN
  wait             : UNKNOWN

simple map mode (3):
  age              : 27
  location         : San Francisco
  name             : Chris


String concatenation:
  helloworld
  helloworld
  hellohello
  worldworld
