/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.ui.tests.nls;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

import org.eclipse.jdt.internal.ui.refactoring.nls.OrderedMap;

public class OrderedMapTester extends TestCase {

	/**
	 * Constructor for OrderedMapTester
	 */
	public OrderedMapTester(String name) {
		super(name);
	}

	public static void main (String[] args) {
		junit.textui.TestRunner.run (suite());
	}
	
	public static Test suite() {
		return new TestSuite(OrderedMapTester.class);
	}
	
	private OrderedMap m;
	
	public void setUp(){
		m= new OrderedMap();
	}
	
	public void test0(){
		assertTrue(m.peek() == null);
	}
	
	public void test1(){
		String key= "key";
		m.push(key, this);
		assertTrue(m.peek() != null);
	}
	
	public void test2(){
		String key= "key";
		m.push(key, this);
		m.remove(key);
		assertTrue(m.peek() == null);
	}
	
	public void test3(){
		String key= "key";
		m.push(key, this);
		m.push(key, key);
		assertTrue("A", m.peek() != null);
		m.remove(key);
		assertTrue("B", m.peek() == null);
	}
	
	public void test4(){
		m.remove(this);
	}
	
	public void test5(){
		String key1= "key1";
		String key2= "key2";
		String v1= "v1";
		String v2= "v2";
		m.push(key1, v1);
		m.push(key2, v2);
		assertTrue("A", m.peek().equals(v2));
		m.remove(key2);
		assertTrue("B", m.peek().equals(v1));
	}

	public void test6(){
		String key1= "key1";
		String key2= "key2";
		String v1= "v1";
		String v2= "v2";
		m.push(key1, v1);
		m.push(key2, v2);
		assertEquals("A", v2, m.peek());
		m.remove(key1);
		assertEquals("B", v2, m.peek());
		m.remove(key2);
		assertEquals("B", null, m.peek());
	}
	
	public void test7(){
		String key1= "key1";
		String key2= "key2";
		String v1= "v1";
		String v2= "v2";
		m.push(key1, v1);
		m.push(key2, v2);
		assertEquals("A", v2, m.peek());
		m.remove(key2);
		assertEquals("B", v1, m.peek());
		m.remove(key1);
		assertEquals("B", null, m.peek());
	}
	
}

