@Test
public void testScopedCaching() {

    KeySpace keySpace = new KeySpace(
            new KeySpaceDirectory("path1", KeyType.STRING, "path1"),
            new KeySpaceDirectory("path2", KeyType.STRING, "path2")
    );
    try (FDBRecordContext context = database.openContext()) {
        final ResolvedKeySpacePath path1 = keySpace.resolveFromKey(context, Tuple.from("path1"));
        final LocatableResolver resolver1 = scopedDirectoryGenerator.apply(database, path1);
        Cache<ScopedValue<String>, Long> cache = CacheBuilder.newBuilder().build();
        cache.put(resolver1.wrap("stuff"), 1L);
        assertThat("values can be read from the cache by scoped string",
                cache.getIfPresent(resolver1.wrap("stuff")), is(1L));
        assertThat("cache misses when looking for unknown name in scope",
                cache.getIfPresent(resolver1.wrap("missing")), equalTo(null));
        final ResolvedKeySpacePath path2 = keySpace.resolveFromKey(context, Tuple.from("path2"));
        final LocatableResolver resolver2 = scopedDirectoryGenerator.apply(database, path2);
        assertThat("cache misses when string is not in this scope",
                cache.getIfPresent(resolver2.wrap("stuff")), equalTo(null));
        final LocatableResolver newResolver = scopedDirectoryGenerator.apply(database, path1);
        assertThat("scoping is determined by value of scope directory, not a reference to it",
                cache.getIfPresent(newResolver.wrap("stuff")), is(1L));
    }
}