package me.magnet.consultant;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;

import java.util.Properties;

import org.junit.Test;

public class PropertiesUtilTest {

	@Test(expected = NullPointerException.class)
	public void verifyThatSyncMethodWithNullSourcePropertiesThrowsException() {
		PropertiesUtil.sync(null, new Properties());
	}

	@Test(expected = NullPointerException.class)
	public void verifyThatSyncMethodWithNullTargetPropertiesThrowsException() {
		PropertiesUtil.sync(new Properties(), null);
	}

	@Test
	public void verifyThatAllPropertiesInSourceAreTransferredToTarget() {
		Properties source = new Properties();
		Properties target = new Properties();

		source.setProperty("key-1", "some-value");
		PropertiesUtil.sync(source, target);

		assertEquals("some-value", target.getProperty("key-1"));
	}

	@Test
	public void verifyThatAllPropertiesNotInSourceAreRemovedFromTarget() {
		Properties source = new Properties();
		Properties target = new Properties();

		target.setProperty("key-1", "some-value");
		PropertiesUtil.sync(source, target);

		assertFalse(target.containsKey("key-1"));
	}

	@Test
	public void verifyThatAllPropertiesInSourceOverrideTargetProperties() {
		Properties source = new Properties();
		Properties target = new Properties();

		source.setProperty("key-1", "some-value");
		target.setProperty("key-1", "some-other-value");
		PropertiesUtil.sync(source, target);

		assertEquals("some-value", target.getProperty("key-1"));
	}

	@Test
	public void verifyMerge() {
		Properties source = new Properties();
		Properties target = new Properties();

		source.setProperty("key-1", "some-value");
		source.setProperty("key-2", "other-value");

		target.setProperty("key-1", "some-other-value");
		target.setProperty("key-3", "new-value");

		PropertiesUtil.sync(source, target);

		assertEquals("some-value", target.getProperty("key-1"));
		assertEquals("other-value", target.getProperty("key-2"));
		assertNull(target.getProperty("key-3"));
	}

}