@Test
public void testRightResolver()
{

    try {
        wiki.add(new MockDocument(docRefResolver.resolve("wikiY:SpaceX.DocY"), "wikiY:XWiki.UserY"));
        Right[] rights = {ADMIN, PROGRAM };
        DocumentReference[] groups = { uResolver.resolve("GroupX", "wikiY"), uResolver.resolve("SpaceY.GroupY") };
        DocumentReference[] users  = { uResolver.resolve("UserX", "wikiY") };
        RightsObject o = new MockRightsObject(new HashSet(asList(rights)),
                                              ALLOW,
                                              new HashSet(asList(users)),
                                              new HashSet(asList(groups)));
        final DocumentReference doc = docRefResolver.resolve("wikiY:SpaceX.DocY");
        DocumentReference userX = uResolver.resolve("UserX", "wikiY");
        DocumentReference userY = uResolver.resolve("UserY", "wikiY");
        
        RightCacheKey key = new RightCacheKey() { public EntityReference getEntityReference() { return doc; }};
        List<Collection<RightsObject>> docLevel = new LinkedList();
        docLevel.add(new LinkedList());
        docLevel.add(new LinkedList());
        Collection<RightsObject> pageRights = new LinkedList();
        pageRights.add(o);
        docLevel.add(pageRights);
        AccessLevel level = resolver.resolve(userX, doc, key, new LinkedList(), docLevel);
        assertTrue(level.equals(AccessLevel.DEFAULT_ACCESS_LEVEL));
        level = resolver.resolve(userY, doc, key, asList(groups), docLevel);
        AccessLevel delete = AccessLevel.DEFAULT_ACCESS_LEVEL.clone();
        delete.allow(DELETE);
        assertTrue(level.equals(delete));
        level = resolver.resolve(userY, doc, key, new LinkedList(), docLevel);
        assertTrue(level.equals(delete));
        List<Collection<RightsObject>> spaceLevel = new LinkedList();
        spaceLevel.add(new LinkedList());
        Collection<RightsObject> spaceRights = new LinkedList();
        spaceRights.add(o);
        spaceLevel.add(spaceRights);
        spaceLevel.add(new LinkedList());
        
        
        level = resolver.resolve(userX, doc, key, new LinkedList(), spaceLevel);
        AccessLevel expected = AccessLevel.DEFAULT_ACCESS_LEVEL.clone();
        expected.allow(ADMIN);
        expected.allow(DELETE);
        assertTrue(level.equals(expected));
        level = resolver.resolve(userY, doc, key, asList(groups), spaceLevel);
        assertTrue(level.equals(expected));
        level = resolver.resolve(userY, doc, key, new LinkedList(), spaceLevel);
        assertTrue(level.equals(delete));
        List<Collection<RightsObject>> wikiLevel = new LinkedList();
        Collection<RightsObject> wikiRights = new LinkedList();
        wikiRights.add(o);
        wikiLevel.add(wikiRights);
        wikiLevel.add(new LinkedList());
        wikiLevel.add(new LinkedList());
        
        level = resolver.resolve(userX, doc, key, new LinkedList(), wikiLevel);
        expected.allow(PROGRAM);
        assertTrue(level.equals(expected));
        level = resolver.resolve(userY, doc, key, asList(groups), wikiLevel);
        assertTrue(level.equals(expected));
        level = resolver.resolve(userY, doc, key, new LinkedList(), wikiLevel);
        assertTrue(level.equals(delete));
    } catch (Exception e) {
        LOG.error("Caught exception!", e);
        assert false;
    }
}