package com.levelup.java.guava;

import static org.junit.Assert.assertNotNull;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.log4j.Logger;
import org.junit.Test;

import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;

/**
 * BiMap allows you have a set of entries that you can easily inverse the keys/values
 * 
 * @author Justin Musgrove
 * @see <a href='http://www.leveluplunch.com/java/examples/guava-bimap-example/'>Guava BiMap Example</a>
 */
public class BiMapExample {

	private static final Logger logger = Logger.getLogger(BiMapExample.class);
	
	@Test
	public void bidirectional_map_with_guava () {
		
		BiMap<String, String> dialectConverterForWisconsinites = 
				HashBiMap.create();
		
		dialectConverterForWisconsinites.put("bratwurst", "brat");
		dialectConverterForWisconsinites.put("drinking fountain", "bubbler");
		dialectConverterForWisconsinites.put("that", "dat");
		dialectConverterForWisconsinites.put("alright", "iet");
		dialectConverterForWisconsinites.put("soda", "pop");

		BiMap<String, String> dialectConverterForEveryoneElse = dialectConverterForWisconsinites.inverse();

		logger.info(dialectConverterForEveryoneElse);
		
		assertNotNull(dialectConverterForEveryoneElse.get("brat"));
	}

	@Test
	public void bidirectional_map_with_java () {
		
		Map<String,String> dialectConverterForWisconsinites = new HashMap<String,String>();
		dialectConverterForWisconsinites.put("bratwurst", "brat");
		dialectConverterForWisconsinites.put("drinking fountain", "bubbler");
		dialectConverterForWisconsinites.put("that", "dat");
		dialectConverterForWisconsinites.put("alright", "iet");
		dialectConverterForWisconsinites.put("soda", "pop");
		
		Map<String,String> dialectConverterForEveryoneElse = new HashMap<String,String>();
		for (Entry<String,String> entry: dialectConverterForWisconsinites.entrySet()) {
			dialectConverterForEveryoneElse.put(entry.getValue(), entry.getKey());
		}

		logger.info(dialectConverterForEveryoneElse);

		assertNotNull(dialectConverterForEveryoneElse.get("brat"));
	}

}