@Test
public void testCheckPropertyIds() {

  Set<String> propertyIds = new HashSet<String>();
  propertyIds.add("foo");
  propertyIds.add("bar");
  propertyIds.add("cat1/prop1");
  propertyIds.add("cat2/prop2");
  propertyIds.add("cat3/subcat3/prop3");
  propertyIds.add("cat4/subcat4/map");
  BaseProvider provider = new TestProvider(propertyIds);
  assertTrue(provider.checkPropertyIds(propertyIds).isEmpty());
  assertTrue(provider.checkPropertyIds(Collections.singleton("cat1")).isEmpty());
  assertTrue(provider.checkPropertyIds(Collections.singleton("cat2")).isEmpty());
  assertTrue(provider.checkPropertyIds(Collections.singleton("cat3")).isEmpty());
  assertTrue(provider.checkPropertyIds(Collections.singleton("cat3/subcat3")).isEmpty());
  assertTrue(provider.checkPropertyIds(
      Collections.singleton("cat4/subcat4/map")).isEmpty());
  // note that key is not in the set of known property ids.  We allow it if its parent is a known property.
  // this allows for Map type properties where we want to treat the entries as individual properties
  assertTrue(provider.checkPropertyIds(
      Collections.singleton("cat4/subcat4/map/key")).isEmpty());
  propertyIds.add("badprop");
  propertyIds.add("badcat");
  Set<String> unsupportedPropertyIds = provider.checkPropertyIds(propertyIds);
  assertFalse(unsupportedPropertyIds.isEmpty());
  assertEquals(2, unsupportedPropertyIds.size());
  assertTrue(unsupportedPropertyIds.contains("badprop"));
  assertTrue(unsupportedPropertyIds.contains("badcat"));
}