/*
 *
 * 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.
 *
 */
using System;
using System.Collections;
using System.Text;
using NUnit.Framework;

namespace Qpid.Collections
{
    [TestFixture]
    public class TestLinkedHashtable
    {
        [Test]
        public void Test1()
        {
            LinkedHashtable table = new LinkedHashtable();
            table["Super"] = "Ayr";
            table["Ayr"] = "United";
            table["Fred"] = "Wilma";
            table["Dumbarton"] = "Gubbed";
            dumpDictionary(table);

            Console.WriteLine("\nRemoving XXX (non-existant)");
            table.Remove("XXX");
            dumpDictionary(table);

            Console.WriteLine("\nRemoving Fred");
            table.Remove("Fred");
            dumpDictionary(table);

            Console.WriteLine("\nMoving Dumbarton to head");
            table.MoveToHead("Dumbarton");
            dumpDictionary(table);
        }

        private static void dumpDictionary(LinkedHashtable table)
        {
            foreach (DictionaryEntry o in table)
            {
                Console.WriteLine(string.Format("Item: key={0} value={1}", o.Key, o.Value));
            }
            
            Console.WriteLine("keys are " + InspectCollection(table.Keys));
            Console.WriteLine("values are " + InspectCollection(table.Values));
        }

        static string InspectCollection(ICollection collection)
        {
            StringBuilder sb = null;
            foreach (object o in collection)
            {
                if (sb == null)
                {
                    sb = new StringBuilder(o.ToString());
                }
                else
                {
                    sb.Append(", ");
                    sb.Append(o.ToString());
                }
            }
            return sb.ToString();
        }
    }
}
