@Test
public void testRemoveProperty() {

  Configuration configuration = createConfigurationWithParents_PropsOnly();
  // property only exists in root level config
  assertEquals("val3.1", configuration.removeProperty("type1", "prop3"));
  assertNull(configuration.getPropertyValue("type1", "prop3"));
  // property only exists in configuration instance
  assertEquals("val9.3", configuration.removeProperty("type1", "prop9"));
  assertNull(configuration.getPropertyValue("type1", "prop9"));
  // property at multiple levels
  assertEquals("val1.3", configuration.removeProperty("type1", "prop1"));
  assertNull(configuration.getPropertyValue("type1", "prop1"));
  assertEquals("val4.3", configuration.removeProperty("type2", "prop4"));
  assertNull(configuration.getPropertyValue("type2", "prop4"));
  assertEquals("val2.2", configuration.removeProperty("type1", "prop2"));
  assertNull(configuration.getPropertyValue("type1", "prop2"));
  // type and property don't exist
  assertNull(configuration.getPropertyValue("typeXXX", "XXXXX"));
  // type exists but property doesn't
  assertNull(configuration.getPropertyValue("type1", "XXXXX"));
}