diff --git a/src/main/java/com/sk89q/worldguard/protection/ApplicableRegionSet.java b/src/main/java/com/sk89q/worldguard/protection/ApplicableRegionSet.java index 6a9fe1e2..62d5596f 100644 --- a/src/main/java/com/sk89q/worldguard/protection/ApplicableRegionSet.java +++ b/src/main/java/com/sk89q/worldguard/protection/ApplicableRegionSet.java @@ -26,23 +26,18 @@ import com.sk89q.worldguard.protection.flags.RegionGroup; import com.sk89q.worldguard.protection.flags.RegionGroupFlag; import com.sk89q.worldguard.protection.flags.StateFlag; -import com.sk89q.worldguard.protection.flags.StateFlag.*; import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.regions.ProtectedRegion; import javax.annotation.Nullable; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; -import java.util.Map; -import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import static com.google.common.base.Preconditions.checkNotNull; -import static com.sk89q.worldguard.protection.flags.StateFlag.*; +import static com.sk89q.worldguard.protection.flags.StateFlag.test; /** * Represents the effective set of flags, owners, and members for a given @@ -61,6 +56,7 @@ public class ApplicableRegionSet implements Iterable { private final SortedSet applicable; @Nullable private final ProtectedRegion globalRegion; + private final FlagValueCalculator flagValueCalculator; /** * Construct the object. @@ -84,6 +80,7 @@ public ApplicableRegionSet(SortedSet applicable, @Nullable Prot checkNotNull(applicable); this.applicable = applicable; this.globalRegion = globalRegion; + this.flagValueCalculator = new FlagValueCalculator(applicable, globalRegion); } /** @@ -94,7 +91,7 @@ public ApplicableRegionSet(SortedSet applicable, @Nullable Prot */ public boolean canBuild(LocalPlayer player) { checkNotNull(player); - return test(calculateState(DefaultFlag.BUILD, new RegionMemberTest(player), null)); + return test(flagValueCalculator.testPermission(player, DefaultFlag.BUILD)); } /** @@ -123,7 +120,7 @@ public boolean allows(StateFlag flag) { throw new IllegalArgumentException("Can't use build flag with allows()"); } - return test(calculateState(flag, null, null)); + return test(flagValueCalculator.queryState(null, flag)); } /** @@ -140,7 +137,8 @@ public boolean allows(StateFlag flag, @Nullable LocalPlayer player) { if (flag == DefaultFlag.BUILD) { throw new IllegalArgumentException("Can't use build flag with allows()"); } - return test(calculateState(flag, null, player)); + + return test(flagValueCalculator.queryState(player, flag)); } /** @@ -179,206 +177,6 @@ public boolean isMemberOfAll(LocalPlayer player) { return true; } - /** - * Calculate the effective value of a flag based on the regions - * in this set, membership, the global region (if set), and the default - * value of a flag {@link StateFlag#getDefault()}. - * - * @param flag the flag to check - * @param membershipTest null to perform a "wilderness check" or a predicate - * returns true if a the subject is a member of the - * region passed - * @param groupPlayer a player to use for the group flag check - * @return the allow/deny state for the flag - */ - private State calculateState(StateFlag flag, @Nullable Predicate membershipTest, @Nullable LocalPlayer groupPlayer) { - checkNotNull(flag); - - // This method works in two modes: - // - // 1) Membership mode (if membershipTest != null): - // a) Regions in this set -> Check membership + Check region flags - // a) No regions -> Use global region + default value - // 1) Flag mode: - // a) Regions in this set -> Use global region + default value - // a) No regions -> Use global region + default value - - int minimumPriority = Integer.MIN_VALUE; - boolean regionsThatCountExistHere = false; // We can't do a application.isEmpty() because - // PASSTHROUGH regions have to be skipped - // (in some cases) - State state = null; // Start with NONE - - // Say there are two regions in one location: CHILD and PARENT (CHILD - // is a child of PARENT). If there are two overlapping regions in WG, a - // player has to be a member of /both/ (or flags permit) in order to - // build in that location. However, inheritance is supposed - // to allow building if the player is a member of just CHILD. That - // presents a problem. - // - // To rectify this, we keep two sets. When we iterate over the list of - // regions, there are two scenarios that we may encounter: - // - // 1) PARENT first, CHILD later: - // a) When the loop reaches PARENT, PARENT is added to needsClear. - // b) When the loop reaches CHILD, parents of CHILD (which includes - // PARENT) are removed from needsClear. - // c) needsClear is empty again. - // - // 2) CHILD first, PARENT later: - // a) When the loop reaches CHILD, CHILD's parents (i.e. PARENT) are - // added to hasCleared. - // b) When the loop reaches PARENT, since PARENT is already in - // hasCleared, it does not add PARENT to needsClear. - // c) needsClear stays empty. - // - // As long as the process ends with needsClear being empty, then - // we have satisfied all membership requirements. - - Set needsClear = new HashSet(); - Set hasCleared = new HashSet(); - - for (ProtectedRegion region : applicable) { - // Don't consider lower priorities below minimumPriority - // (which starts at Integer.MIN_VALUE). A region that "counts" - // (has the flag set OR has members) will raise minimumPriority - // to its own priority. - if (region.getPriority() < minimumPriority) { - break; - } - - // If PASSTHROUGH is set and we are checking to see if a player - // is a member, then skip this region - if (membershipTest != null && getStateFlagIncludingParents(region, DefaultFlag.PASSTHROUGH) == State.ALLOW) { - continue; - } - - // If the flag has a group set on to it, skip this region if - // the group does not match our (group) player - if (groupPlayer != null && flag.getRegionGroupFlag() != null) { - RegionGroup group = region.getFlag(flag.getRegionGroupFlag()); - if (group == null) { - group = flag.getRegionGroupFlag().getDefault(); - } - - if (!RegionGroupFlag.isMember(region, group, groupPlayer)) { - continue; - } - } - - regionsThatCountExistHere = true; - - State v = getStateFlagIncludingParents(region, flag); - - // DENY overrides everything - if (v == State.DENY) { - state = State.DENY; - break; // No need to process any more regions - - // ALLOW means we don't care about membership - } else if (v == State.ALLOW) { - state = State.ALLOW; - minimumPriority = region.getPriority(); - - } else { - if (membershipTest != null) { - minimumPriority = region.getPriority(); - - if (!hasCleared.contains(region)) { - if (!membershipTest.apply(region)) { - needsClear.add(region); - } else { - // Need to clear all parents - clearParents(needsClear, hasCleared, region); - } - } - } - } - } - - if (membershipTest != null) { - State fallback; - - if (regionsThatCountExistHere) { - fallback = allowOrNone(needsClear.isEmpty()); - } else { - fallback = getDefault(flag, membershipTest); - } - - return combine(state, fallback); - } else { - return combine(state, getDefault(flag, null)); - } - } - - @Nullable - private State getDefault(StateFlag flag, @Nullable Predicate membershipTest) { - boolean allowed = flag.getDefault() == State.ALLOW; - - // Handle defaults - if (globalRegion != null) { - State globalState = globalRegion.getFlag(flag); - - // The global region has this flag set - if (globalState != null) { - // Build flag is very special - if (membershipTest != null && globalRegion.hasMembersOrOwners()) { - allowed = membershipTest.apply(globalRegion) && (globalState == State.ALLOW); - } else { - allowed = (globalState == State.ALLOW); - } - } else { - // Build flag is very special - if (membershipTest != null && globalRegion.hasMembersOrOwners()) { - allowed = membershipTest.apply(globalRegion); - } - } - } - - return allowed ? State.ALLOW : null; - } - - /** - * Clear a region's parents for isFlagAllowed(). - * - * @param needsClear the regions that should be cleared - * @param hasCleared the regions already cleared - * @param region the region to start from - */ - private void clearParents(Set needsClear, Set hasCleared, ProtectedRegion region) { - ProtectedRegion parent = region.getParent(); - - while (parent != null) { - if (!needsClear.remove(parent)) { - hasCleared.add(parent); - } - - parent = parent.getParent(); - } - } - - /** - * Get a region's state flag, checking parent regions until a value for the - * flag can be found (if one even exists). - * - * @param region the region - * @param flag the flag - * @return the value - */ - private static State getStateFlagIncludingParents(ProtectedRegion region, StateFlag flag) { - while (region != null) { - State value = region.getFlag(flag); - - if (value != null) { - return value; - } - - region = region.getParent(); - } - - return null; - } - /** * Gets the value of a flag. Do not use this for state flags * (use {@link #allows(StateFlag, LocalPlayer)} for that). @@ -402,82 +200,7 @@ public , V> V getFlag(T flag) { */ @Nullable public , V> V getFlag(T flag, @Nullable LocalPlayer groupPlayer) { - checkNotNull(flag); - - /* - if (flag instanceof StateFlag) { - throw new IllegalArgumentException("Cannot use StateFlag with getFlag()"); - } - */ - - int lastPriority = 0; - boolean found = false; - - Map needsClear = new HashMap(); - Set hasCleared = new HashSet(); - - for (ProtectedRegion region : applicable) { - // Ignore lower priority regions - if (found && region.getPriority() < lastPriority) { - break; - } - - // Check group permissions - if (groupPlayer != null && flag.getRegionGroupFlag() != null) { - RegionGroup group = region.getFlag(flag.getRegionGroupFlag()); - - if (group == null) { - group = flag.getRegionGroupFlag().getDefault(); - } - - if (!RegionGroupFlag.isMember(region, group, groupPlayer)) { - continue; - } - } - - //noinspection StatementWithEmptyBody - if (hasCleared.contains(region)) { - // Already cleared, so do nothing - } else if (region.getFlag(flag) != null) { - clearParents(needsClear, hasCleared, region); - - needsClear.put(region, region.getFlag(flag)); - - found = true; - } - - lastPriority = region.getPriority(); - } - - if (!needsClear.isEmpty()) { - return needsClear.values().iterator().next(); - } else { - if (globalRegion != null) { - V gFlag = globalRegion.getFlag(flag); - if (gFlag != null) return gFlag; - } - return null; - } - } - - /** - * Clear a region's parents for getFlag(). - * - * @param needsClear The regions that should be cleared - * @param hasCleared The regions already cleared - * @param region The region to start from - */ - private void clearParents(Map needsClear, - Set hasCleared, ProtectedRegion region) { - ProtectedRegion parent = region.getParent(); - - while (parent != null) { - if (needsClear.remove(parent) == null) { - hasCleared.add(parent); - } - - parent = parent.getParent(); - } + return flagValueCalculator.queryValue(groupPlayer, flag); } /** diff --git a/src/main/java/com/sk89q/worldguard/protection/FlagValueCalculator.java b/src/main/java/com/sk89q/worldguard/protection/FlagValueCalculator.java index b8bdb2f6..3455ab9d 100644 --- a/src/main/java/com/sk89q/worldguard/protection/FlagValueCalculator.java +++ b/src/main/java/com/sk89q/worldguard/protection/FlagValueCalculator.java @@ -19,6 +19,8 @@ package com.sk89q.worldguard.protection; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; import com.sk89q.worldguard.LocalPlayer; import com.sk89q.worldguard.protection.flags.DefaultFlag; import com.sk89q.worldguard.protection.flags.Flag; @@ -50,23 +52,37 @@ */ public class FlagValueCalculator { - private final SortedSet applicable; + private final SortedSet regions; @Nullable private final ProtectedRegion globalRegion; /** * Create a new instance. * - * @param applicable a list of applicable regions + * @param regions a list of applicable regions * @param globalRegion an optional global region (null to not use one) */ - public FlagValueCalculator(SortedSet applicable, @Nullable ProtectedRegion globalRegion) { - checkNotNull(applicable); + public FlagValueCalculator(SortedSet regions, @Nullable ProtectedRegion globalRegion) { + checkNotNull(regions); - this.applicable = applicable; + this.regions = regions; this.globalRegion = globalRegion; } + /** + * Returns an iterable of regions sorted by priority (descending), with + * the global region tacked on at the end if one exists. + * + * @return an iterable + */ + private Iterable getApplicable() { + if (globalRegion != null) { + return Iterables.concat(regions, ImmutableList.of(globalRegion)); + } else { + return regions; + } + } + /** * Return the membership status of the given player, indicating * whether there are no (counted) regions in the list of regions, @@ -119,12 +135,12 @@ public Result getMembership(LocalPlayer player) { Set needsClear = new HashSet(); Set hasCleared = new HashSet(); - for (ProtectedRegion region : applicable) { + for (ProtectedRegion region : getApplicable()) { // Don't consider lower priorities below minimumPriority // (which starts at Integer.MIN_VALUE). A region that "counts" // (has the flag set OR has members) will raise minimumPriority // to its own priority. - if (region.getPriority() < minimumPriority) { + if (getPriority(region) < minimumPriority) { break; } @@ -133,7 +149,7 @@ public Result getMembership(LocalPlayer player) { continue; } - minimumPriority = region.getPriority(); + minimumPriority = getPriority(region); foundApplicableRegion = true; if (!hasCleared.contains(region)) { @@ -194,37 +210,27 @@ public State testPermission(LocalPlayer player, StateFlag... flags) { switch (getMembership(player)) { case SUCCESS: - return StateFlag.combine(getState(player, flags), State.ALLOW); + return StateFlag.combine(queryState(player, flags), State.ALLOW); case FAIL: - return getState(player, flags); + return queryState(player, flags); case NO_REGIONS: - if (globalRegion != null && globalRegion.hasMembersOrOwners()) { - if (globalRegion.isMember(player)) { - return StateFlag.combine(getState(player, flags), State.ALLOW); - } else { - State value = null; - - for (StateFlag flag : flags) { - value = StateFlag.combine(value,globalRegion.getFlag(flag)); - if (value == State.DENY) { - break; - } - } - - return value; + default: + State fallback = null; + for (StateFlag flag : flags) { + if (flag.getDefault()) { + fallback = State.ALLOW; + break; } } - default: - return getStateWithFallback(player, flags); + return StateFlag.combine(queryState(player, flags), fallback); } } + /** * Get the effective value for a list of state flags. The rules of * states is observed here; that is, {@code DENY} overrides {@code ALLOW}, - * and {@code ALLOW} overrides {@code NONE}. This method will check - * the global region and {@link Flag#getDefault()} (in that order) if - * a value for the flag is not set in any region. + * and {@code ALLOW} overrides {@code NONE}. * *

This method does not properly process build * permissions. Instead, use {@link #testPermission(LocalPlayer, StateFlag...)} @@ -245,50 +251,11 @@ public State testPermission(LocalPlayer player, StateFlag... flags) { * @return a state */ @Nullable - public State getStateWithFallback(@Nullable LocalPlayer player, StateFlag... flags) { + public State queryState(@Nullable LocalPlayer player, StateFlag... flags) { State value = null; for (StateFlag flag : flags) { - value = StateFlag.combine(value, getSingleValueWithFallback(player, flag)); - if (value == State.DENY) { - break; - } - } - - return value; - } - - - /** - * Get the effective value for a list of state flags. The rules of - * states is observed here; that is, {@code DENY} overrides {@code ALLOW}, - * and {@code ALLOW} overrides {@code NONE}. This method does not check - * the global region and ignores a flag's default value. - * - *

This method does not properly process build - * permissions. Instead, use {@link #testPermission(LocalPlayer, StateFlag...)} - * for that purpose. This method is ideal for testing non-build related - * state flags (although a rarity), an example of which would be whether - * to play a song to players that enter an area.

- * - *

A player can be provided that is used to determine whether the value - * of a flag on a particular region should be used. For example, if a - * flag's region group is set to {@link RegionGroup#MEMBERS} and the given - * player is not a member, then the region would be skipped when - * querying that flag. If {@code null} is provided for the player, then - * only flags that use {@link RegionGroup#ALL}, - * {@link RegionGroup#NON_MEMBERS}, etc. will apply.

- * - * @param player an optional player, which would be used to determine the region group to apply - * @param flags a list of flags to check - * @return a state - */ - @Nullable - public State getState(@Nullable LocalPlayer player, StateFlag... flags) { - State value = null; - - for (StateFlag flag : flags) { - value = StateFlag.combine(value, getSingleValue(player, flag)); + value = StateFlag.combine(value, queryValue(player, flag)); if (value == State.DENY) { break; } @@ -302,8 +269,7 @@ public State getState(@Nullable LocalPlayer player, StateFlag... flags) { * (for example, if there are multiple regions with the same priority * but with different farewell messages set, there would be multiple * completing values), then the selected (or "winning") value will depend - * on the flag type. This method will check the global region - * for a value as well as the flag's default value. + * on the flag type. * *

Only some flag types actually have a strategy for picking the * "best value." For most types, the actual value that is chosen to be @@ -326,65 +292,10 @@ public State getState(@Nullable LocalPlayer player, StateFlag... flags) { * @param player an optional player, which would be used to determine the region group to apply * @param flag the flag * @return a value, which could be {@code null} - * @see #getSingleValue(LocalPlayer, Flag) does not check global region, defaults */ @Nullable - public V getSingleValueWithFallback(@Nullable LocalPlayer player, Flag flag) { - checkNotNull(flag); - - V value = getSingleValue(player, flag); - - if (value != null) { - return value; - } - - // Get the value from the global region - if (globalRegion != null) { - value = globalRegion.getFlag(flag); - } - - // Still no value? Check the default value for the flag - if (value == null) { - value = flag.getDefault(); - } - - return flag.validateDefaultValue(value); - } - - /** - * Get the effective value for a flag. If there are multiple values - * (for example, if there are multiple regions with the same priority - * but with different farewell messages set, there would be multiple - * completing values), then the selected (or "winning") value will depend - * on the flag type. This method never checks the global region or - * the flag's default value. - * - *

Only some flag types actually have a strategy for picking the - * "best value." For most types, the actual value that is chosen to be - * returned is undefined (it could be any value). As of writing, the only - * type of flag that can consistently return the same 'best' value is - * {@link StateFlag}.

- * - *

This method does not properly process build - * permissions. Instead, use {@link #testPermission(LocalPlayer, StateFlag...)} - * for that purpose.

- * - *

A player can be provided that is used to determine whether the value - * of a flag on a particular region should be used. For example, if a - * flag's region group is set to {@link RegionGroup#MEMBERS} and the given - * player is not a member, then the region would be skipped when - * querying that flag. If {@code null} is provided for the player, then - * only flags that use {@link RegionGroup#ALL}, - * {@link RegionGroup#NON_MEMBERS}, etc. will apply.

- * - * @param player an optional player, which would be used to determine the region group to apply - * @param flag the flag - * @return a value, which could be {@code null} - * @see #getSingleValueWithFallback(LocalPlayer, Flag) checks global regions, defaults - */ - @Nullable - public V getSingleValue(@Nullable LocalPlayer player, Flag flag) { - Collection values = getValues(player, flag); + public V queryValue(@Nullable LocalPlayer player, Flag flag) { + Collection values = queryAllValues(player, flag); return flag.chooseValue(values); } @@ -405,7 +316,7 @@ public V getSingleValue(@Nullable LocalPlayer player, Flag flag) { * only flags that use {@link RegionGroup#ALL}, * {@link RegionGroup#NON_MEMBERS}, etc. will apply.

*/ - public Collection getValues(@Nullable LocalPlayer player, Flag flag) { + public Collection queryAllValues(@Nullable LocalPlayer player, Flag flag) { checkNotNull(flag); int minimumPriority = Integer.MIN_VALUE; @@ -441,12 +352,12 @@ public Collection getValues(@Nullable LocalPlayer player, Flag flag) { Map consideredValues = new HashMap(); Set ignoredRegions = new HashSet(); - for (ProtectedRegion region : applicable) { + for (ProtectedRegion region : getApplicable()) { // Don't consider lower priorities below minimumPriority // (which starts at Integer.MIN_VALUE). A region that "counts" // (has the flag set) will raise minimumPriority to its own // priority. - if (region.getPriority() < minimumPriority) { + if (getPriority(region) < minimumPriority) { break; } @@ -454,7 +365,7 @@ public Collection getValues(@Nullable LocalPlayer player, Flag flag) { if (value != null) { if (!ignoredRegions.contains(region)) { - minimumPriority = region.getPriority(); + minimumPriority = getPriority(region); ignoreValuesOfParents(consideredValues, ignoredRegions, region); consideredValues.put(region, value); @@ -471,6 +382,21 @@ public Collection getValues(@Nullable LocalPlayer player, Flag flag) { return consideredValues.values(); } + /** + * Get the effective priority of a region, overriding a region's priority + * when appropriate (i.e. with the global region). + * + * @param region the region + * @return the priority + */ + public int getPriority(final ProtectedRegion region) { + if (region == globalRegion) { + return Integer.MIN_VALUE; + } else { + return region.getPriority(); + } + } + /** * Get a region's state flag, checking parent regions until a value for the * flag can be found (if one even exists). @@ -479,7 +405,19 @@ public Collection getValues(@Nullable LocalPlayer player, Flag flag) { * @param flag the flag * @return the value */ + @SuppressWarnings("unchecked") public V getEffectiveFlag(final ProtectedRegion region, Flag flag, @Nullable LocalPlayer player) { + // The global region normally does not prevent building so + // PASSTHROUGH has to be ALLOW, except when people use the global + // region as a whitelist + if (region == globalRegion && flag == DefaultFlag.PASSTHROUGH) { + if (region.hasMembersOrOwners()) { + return null; + } else { + return (V) State.ALLOW; + } + } + ProtectedRegion current = region; while (current != null) { diff --git a/src/main/java/com/sk89q/worldguard/protection/flags/Flag.java b/src/main/java/com/sk89q/worldguard/protection/flags/Flag.java index 996c8f3a..63da44d5 100644 --- a/src/main/java/com/sk89q/worldguard/protection/flags/Flag.java +++ b/src/main/java/com/sk89q/worldguard/protection/flags/Flag.java @@ -51,24 +51,6 @@ public String getName() { return name; } - /** - * Suppress the value of the flag that came from the global region, reducing - * its severity (i.e. DENY -> NONE). - * - *

This is really only used for the {@link StateFlag}.

- * - * @param current the value to suppress - * @return a new value - */ - public T validateDefaultValue(T current) { - return current; - } - - @Nullable - public T getDefault() { - return null; - } - @Nullable public T chooseValue(Collection values) { if (!values.isEmpty()) { diff --git a/src/main/java/com/sk89q/worldguard/protection/flags/RegionGroupFlag.java b/src/main/java/com/sk89q/worldguard/protection/flags/RegionGroupFlag.java index 01232f95..0e84a7eb 100644 --- a/src/main/java/com/sk89q/worldguard/protection/flags/RegionGroupFlag.java +++ b/src/main/java/com/sk89q/worldguard/protection/flags/RegionGroupFlag.java @@ -38,7 +38,6 @@ public RegionGroupFlag(String name, RegionGroup def) { this.def = def; } - @Override public RegionGroup getDefault() { return def; } diff --git a/src/main/java/com/sk89q/worldguard/protection/flags/StateFlag.java b/src/main/java/com/sk89q/worldguard/protection/flags/StateFlag.java index 8e2fed0d..4e3d92e7 100644 --- a/src/main/java/com/sk89q/worldguard/protection/flags/StateFlag.java +++ b/src/main/java/com/sk89q/worldguard/protection/flags/StateFlag.java @@ -48,14 +48,8 @@ public StateFlag(String name, boolean def) { this.def = def; } - @Override - public State getDefault() { - return def ? State.ALLOW : null; - } - - @Override - public State validateDefaultValue(State current) { - return denyToNone(current); + public boolean getDefault() { + return def; } @Override diff --git a/src/test/java/com/sk89q/worldguard/protection/FlagValueCalculatorTest.java b/src/test/java/com/sk89q/worldguard/protection/FlagValueCalculatorTest.java index a4351ad7..2837cf00 100644 --- a/src/test/java/com/sk89q/worldguard/protection/FlagValueCalculatorTest.java +++ b/src/test/java/com/sk89q/worldguard/protection/FlagValueCalculatorTest.java @@ -39,7 +39,7 @@ public class FlagValueCalculatorTest { @Test - public void testGetSingleFallbackMembershipWilderness() throws Exception { + public void testGetMembershipWilderness() throws Exception { MockApplicableRegionSet mock = new MockApplicableRegionSet(); LocalPlayer player = mock.createPlayer(); @@ -60,6 +60,32 @@ public void testGetMembershipWildernessWithGlobalRegion() throws Exception { assertThat(result.getMembership(player), is(Result.NO_REGIONS)); } + @Test + public void testGetMembershipGlobalRegion() throws Exception { + MockApplicableRegionSet mock = new MockApplicableRegionSet(); + + ProtectedRegion global = mock.global(); + + LocalPlayer player = mock.createPlayer(); + + FlagValueCalculator result = mock.getFlagCalculator(); + assertThat(result.getMembership(player), is(Result.NO_REGIONS)); + } + + @Test + public void testGetMembershipGlobalRegionAndRegion() throws Exception { + MockApplicableRegionSet mock = new MockApplicableRegionSet(); + + ProtectedRegion global = mock.global(); + + ProtectedRegion region = mock.add(0); + + LocalPlayer player = mock.createPlayer(); + + FlagValueCalculator result = mock.getFlagCalculator(); + assertThat(result.getMembership(player), is(Result.FAIL)); + } + @Test public void testGetMembershipPassthroughRegions() throws Exception { MockApplicableRegionSet mock = new MockApplicableRegionSet(); @@ -296,7 +322,8 @@ public void testTestPermissionWildernessDefaultsWithGlobalRegionOverride() throw FlagValueCalculator result = mock.getFlagCalculator(); assertThat(result.testPermission(player, flag1), is(State.ALLOW)); - assertThat(result.testPermission(player, flag2), is((State) null)); + assertThat(result.testPermission(player, flag2), is(State.DENY)); + assertThat(result.testPermission(player, flag1, flag2), is(State.DENY)); } @Test @@ -348,6 +375,110 @@ public void testTestPermissionWildernessWithGlobalRegionOverride() throws Except assertThat(result.testPermission(nonMember), is((State) null)); } + @Test + public void testTestPermissionWithPassthroughRegion() throws Exception { + MockApplicableRegionSet mock = new MockApplicableRegionSet(); + + StateFlag flag1 = new StateFlag("test1", false); + StateFlag flag2 = new StateFlag("test2", true); + + LocalPlayer member = mock.createPlayer(); + LocalPlayer nonMember = mock.createPlayer(); + + ProtectedRegion region = mock.add(0); + region.setFlag(DefaultFlag.PASSTHROUGH, State.ALLOW); + region.getMembers().addPlayer(member); + + FlagValueCalculator result = mock.getFlagCalculator(); + assertThat(result.testPermission(member, flag1), is((State) null)); + assertThat(result.testPermission(member, flag2), is(State.ALLOW)); + assertThat(result.testPermission(member, flag1, flag2), is(State.ALLOW)); + assertThat(result.testPermission(member), is((State) null)); + assertThat(result.testPermission(nonMember, flag1), is((State) null)); + assertThat(result.testPermission(nonMember, flag2), is(State.ALLOW)); + assertThat(result.testPermission(nonMember, flag1, flag2), is(State.ALLOW)); + assertThat(result.testPermission(nonMember), is((State) null)); + } + + @Test + public void testTestPermissionWithPassthroughRegionAndFlagAllow() throws Exception { + MockApplicableRegionSet mock = new MockApplicableRegionSet(); + + StateFlag flag1 = new StateFlag("test1", false); + StateFlag flag2 = new StateFlag("test2", true); + + LocalPlayer member = mock.createPlayer(); + LocalPlayer nonMember = mock.createPlayer(); + + ProtectedRegion region = mock.add(0); + region.setFlag(flag1, State.ALLOW); + region.setFlag(DefaultFlag.PASSTHROUGH, State.ALLOW); + region.getMembers().addPlayer(member); + + FlagValueCalculator result = mock.getFlagCalculator(); + assertThat(result.testPermission(member, flag1), is(State.ALLOW)); + assertThat(result.testPermission(member, flag2), is(State.ALLOW)); + assertThat(result.testPermission(member, flag1, flag2), is(State.ALLOW)); + assertThat(result.testPermission(member), is((State) null)); + assertThat(result.testPermission(nonMember, flag1), is(State.ALLOW)); + assertThat(result.testPermission(nonMember, flag2), is(State.ALLOW)); + assertThat(result.testPermission(nonMember, flag1, flag2), is(State.ALLOW)); + assertThat(result.testPermission(nonMember), is((State) null)); + } + + @Test + public void testTestPermissionWithPassthroughRegionAndFlagDeny() throws Exception { + MockApplicableRegionSet mock = new MockApplicableRegionSet(); + + StateFlag flag1 = new StateFlag("test1", false); + StateFlag flag2 = new StateFlag("test2", false); + + LocalPlayer member = mock.createPlayer(); + LocalPlayer nonMember = mock.createPlayer(); + + ProtectedRegion region = mock.add(0); + region.setFlag(flag1, State.DENY); + region.setFlag(DefaultFlag.PASSTHROUGH, State.ALLOW); + region.getMembers().addPlayer(member); + + FlagValueCalculator result = mock.getFlagCalculator(); + assertThat(result.testPermission(member, flag1), is(State.DENY)); + assertThat(result.testPermission(member, flag2), is((State) null)); + assertThat(result.testPermission(member, flag1, flag2), is(State.DENY)); + assertThat(result.testPermission(member), is((State) null)); + assertThat(result.testPermission(nonMember, flag1), is(State.DENY)); + assertThat(result.testPermission(nonMember, flag2), is((State) null)); + assertThat(result.testPermission(nonMember, flag1, flag2), is(State.DENY)); + assertThat(result.testPermission(nonMember), is((State) null)); + } + + @Test + public void testTestPermissionWithPassthroughRegionAndFlagDenyAndRegionGroups() throws Exception { + MockApplicableRegionSet mock = new MockApplicableRegionSet(); + + StateFlag flag1 = new StateFlag("test1", false); + StateFlag flag2 = new StateFlag("test2", false); + + LocalPlayer member = mock.createPlayer(); + LocalPlayer nonMember = mock.createPlayer(); + + ProtectedRegion region = mock.add(0); + region.setFlag(flag1, State.DENY); + region.setFlag(flag1.getRegionGroupFlag(), RegionGroup.MEMBERS); + region.setFlag(DefaultFlag.PASSTHROUGH, State.ALLOW); + region.getMembers().addPlayer(member); + + FlagValueCalculator result = mock.getFlagCalculator(); + assertThat(result.testPermission(member, flag1), is(State.DENY)); + assertThat(result.testPermission(member, flag2), is((State) null)); + assertThat(result.testPermission(member, flag1, flag2), is(State.DENY)); + assertThat(result.testPermission(member), is((State) null)); + assertThat(result.testPermission(nonMember, flag1), is((State) null)); + assertThat(result.testPermission(nonMember, flag2), is((State) null)); + assertThat(result.testPermission(nonMember, flag1, flag2), is((State) null)); + assertThat(result.testPermission(nonMember), is((State) null)); + } + @Test public void testTestPermissionWithRegion() throws Exception { MockApplicableRegionSet mock = new MockApplicableRegionSet(); @@ -483,18 +614,18 @@ public void testTestPermissionWithRegionAndGlobalRegionDeny() throws Exception { LocalPlayer nonMember = mock.createPlayer(); ProtectedRegion global = mock.global(); - global.setFlag(flag1, State.DENY); // No effect + global.setFlag(flag1, State.DENY); ProtectedRegion region = mock.add(0); region.getMembers().addPlayer(member); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.testPermission(member, flag1), is(State.ALLOW)); + assertThat(result.testPermission(member, flag1), is(State.DENY)); assertThat(result.testPermission(member, flag2), is(State.ALLOW)); - assertThat(result.testPermission(member, flag1, flag2), is(State.ALLOW)); - assertThat(result.testPermission(nonMember, flag1), is((State) null)); + assertThat(result.testPermission(member, flag1, flag2), is(State.DENY)); + assertThat(result.testPermission(nonMember, flag1), is(State.DENY)); assertThat(result.testPermission(nonMember, flag2), is((State) null)); - assertThat(result.testPermission(nonMember, flag1, flag2), is((State) null)); + assertThat(result.testPermission(nonMember, flag1, flag2), is(State.DENY)); } @Test @@ -508,7 +639,7 @@ public void testTestPermissionWithRegionAndGlobalRegionAllow() throws Exception LocalPlayer nonMember = mock.createPlayer(); ProtectedRegion global = mock.global(); - global.setFlag(flag1, State.ALLOW); // No effect + global.setFlag(flag1, State.ALLOW); ProtectedRegion region = mock.add(0); region.getMembers().addPlayer(member); @@ -518,13 +649,13 @@ public void testTestPermissionWithRegionAndGlobalRegionAllow() throws Exception assertThat(result.testPermission(member, flag2), is(State.ALLOW)); assertThat(result.testPermission(member, flag1, flag2), is(State.ALLOW)); assertThat(result.testPermission(member), is(State.ALLOW)); - assertThat(result.testPermission(nonMember, flag1), is((State) null)); + assertThat(result.testPermission(nonMember, flag1), is(State.ALLOW)); assertThat(result.testPermission(nonMember, flag2), is((State) null)); assertThat(result.testPermission(nonMember), is((State) null)); } @Test - public void testTestPermissionWithRegionAndGlobalRegionMembership() throws Exception { + public void testTestPermissionWithRegionAllowAndGlobalRegionDeny() throws Exception { MockApplicableRegionSet mock = new MockApplicableRegionSet(); StateFlag flag1 = new StateFlag("test1", false); @@ -534,7 +665,166 @@ public void testTestPermissionWithRegionAndGlobalRegionMembership() throws Excep LocalPlayer nonMember = mock.createPlayer(); ProtectedRegion global = mock.global(); - global.getMembers().addPlayer(nonMember); + global.setFlag(flag1, State.DENY); + + ProtectedRegion region = mock.add(0); + region.setFlag(flag1, State.ALLOW); + region.getMembers().addPlayer(member); + + FlagValueCalculator result = mock.getFlagCalculator(); + assertThat(result.testPermission(member, flag1), is(State.ALLOW)); + assertThat(result.testPermission(member, flag2), is(State.ALLOW)); + assertThat(result.testPermission(member, flag1, flag2), is(State.ALLOW)); + assertThat(result.testPermission(nonMember, flag1), is(State.ALLOW)); + assertThat(result.testPermission(nonMember, flag2), is((State) null)); + assertThat(result.testPermission(nonMember, flag1, flag2), is(State.ALLOW)); + } + + @Test + public void testTestPermissionWithRegionAllowAndGlobalRegionDenyDifferentFlags() throws Exception { + MockApplicableRegionSet mock = new MockApplicableRegionSet(); + + StateFlag flag1 = new StateFlag("test1", false); + StateFlag flag2 = new StateFlag("test2", true); + + LocalPlayer member = mock.createPlayer(); + LocalPlayer nonMember = mock.createPlayer(); + + ProtectedRegion global = mock.global(); + global.setFlag(flag1, State.DENY); + + ProtectedRegion region = mock.add(0); + region.setFlag(flag2, State.ALLOW); + region.getMembers().addPlayer(member); + + FlagValueCalculator result = mock.getFlagCalculator(); + assertThat(result.testPermission(member, flag1), is(State.DENY)); + assertThat(result.testPermission(member, flag2), is(State.ALLOW)); + assertThat(result.testPermission(member, flag1, flag2), is(State.DENY)); + assertThat(result.testPermission(nonMember, flag1), is(State.DENY)); + assertThat(result.testPermission(nonMember, flag2), is(State.ALLOW)); + assertThat(result.testPermission(nonMember, flag1, flag2), is(State.DENY)); + } + + @Test + public void testTestPermissionWithPassthroughRegionAllowAndGlobalRegionDenyWithRegionGroup() throws Exception { + MockApplicableRegionSet mock = new MockApplicableRegionSet(); + + StateFlag flag1 = new StateFlag("test1", false); + StateFlag flag2 = new StateFlag("test2", false); + + LocalPlayer member = mock.createPlayer(); + LocalPlayer nonMember = mock.createPlayer(); + + ProtectedRegion global = mock.global(); + global.setFlag(flag1, State.DENY); + + ProtectedRegion region = mock.add(0); + region.setFlag(DefaultFlag.PASSTHROUGH, State.ALLOW); + region.setFlag(flag1, State.ALLOW); + region.setFlag(flag1.getRegionGroupFlag(), RegionGroup.NON_MEMBERS); + region.getMembers().addPlayer(member); + + FlagValueCalculator result = mock.getFlagCalculator(); + assertThat(result.testPermission(member, flag1), is(State.DENY)); + assertThat(result.testPermission(member, flag2), is((State) null)); + assertThat(result.testPermission(member, flag1, flag2), is(State.DENY)); + assertThat(result.testPermission(nonMember, flag1), is(State.ALLOW)); + assertThat(result.testPermission(nonMember, flag2), is((State) null)); + assertThat(result.testPermission(nonMember, flag1, flag2), is(State.ALLOW)); + } + + @Test + public void testTestPermissionWithRegionAllowAndGlobalRegionDenyWithRegionGroup() throws Exception { + MockApplicableRegionSet mock = new MockApplicableRegionSet(); + + StateFlag flag1 = new StateFlag("test1", false); + StateFlag flag2 = new StateFlag("test2", true); + + LocalPlayer member = mock.createPlayer(); + LocalPlayer nonMember = mock.createPlayer(); + + ProtectedRegion global = mock.global(); + global.setFlag(flag1, State.DENY); + + ProtectedRegion region = mock.add(0); + region.setFlag(flag1, State.ALLOW); + region.setFlag(flag1.getRegionGroupFlag(), RegionGroup.NON_MEMBERS); + region.getMembers().addPlayer(member); + + FlagValueCalculator result = mock.getFlagCalculator(); + assertThat(result.testPermission(member, flag1), is(State.DENY)); + assertThat(result.testPermission(member, flag2), is(State.ALLOW)); + assertThat(result.testPermission(member, flag1, flag2), is(State.DENY)); + assertThat(result.testPermission(nonMember, flag1), is(State.ALLOW)); + assertThat(result.testPermission(nonMember, flag2), is((State) null)); + assertThat(result.testPermission(nonMember, flag1, flag2), is(State.ALLOW)); + } + + @Test + public void testTestPermissionWithRegionAllowAndGlobalRegionDenyDifferentFlagsWithRegionGroup() throws Exception { + MockApplicableRegionSet mock = new MockApplicableRegionSet(); + + StateFlag flag1 = new StateFlag("test1", false); + StateFlag flag2 = new StateFlag("test2", true); + + LocalPlayer member = mock.createPlayer(); + LocalPlayer nonMember = mock.createPlayer(); + + ProtectedRegion global = mock.global(); + global.setFlag(flag1, State.DENY); + + ProtectedRegion region = mock.add(0); + region.setFlag(flag2, State.ALLOW); + region.setFlag(flag2.getRegionGroupFlag(), RegionGroup.MEMBERS); + region.getMembers().addPlayer(member); + + FlagValueCalculator result = mock.getFlagCalculator(); + assertThat(result.testPermission(member, flag1), is(State.DENY)); + assertThat(result.testPermission(member, flag2), is(State.ALLOW)); + assertThat(result.testPermission(member, flag1, flag2), is(State.DENY)); + assertThat(result.testPermission(nonMember, flag1), is(State.DENY)); + assertThat(result.testPermission(nonMember, flag2), is((State) null)); + assertThat(result.testPermission(nonMember, flag1, flag2), is(State.DENY)); + } + + @Test + public void testTestPermissionWithGlobalRegionMembership() throws Exception { + MockApplicableRegionSet mock = new MockApplicableRegionSet(); + + StateFlag flag1 = new StateFlag("test1", false); + StateFlag flag2 = new StateFlag("test2", true); + + LocalPlayer nonMember = mock.createPlayer(); + LocalPlayer globalMember = mock.createPlayer(); + + ProtectedRegion global = mock.global(); + global.getMembers().addPlayer(globalMember); + + FlagValueCalculator result = mock.getFlagCalculator(); + assertThat(result.testPermission(globalMember, flag1), is(State.ALLOW)); + assertThat(result.testPermission(globalMember, flag2), is(State.ALLOW)); + assertThat(result.testPermission(globalMember, flag1, flag2), is(State.ALLOW)); + assertThat(result.testPermission(globalMember), is(State.ALLOW)); + assertThat(result.testPermission(nonMember, flag1), is((State) null)); + assertThat(result.testPermission(nonMember, flag2), is((State) null)); + assertThat(result.testPermission(nonMember, flag1, flag2), is((State) null)); + assertThat(result.testPermission(nonMember), is((State) null)); + } + + @Test + public void testTestPermissionWithGlobalRegionMembershipAndRegion() throws Exception { + MockApplicableRegionSet mock = new MockApplicableRegionSet(); + + StateFlag flag1 = new StateFlag("test1", false); + StateFlag flag2 = new StateFlag("test2", true); + + LocalPlayer nonMember = mock.createPlayer(); + LocalPlayer member = mock.createPlayer(); + LocalPlayer globalMember = mock.createPlayer(); + + ProtectedRegion global = mock.global(); + global.getMembers().addPlayer(globalMember); ProtectedRegion region = mock.add(0); region.getMembers().addPlayer(member); @@ -544,8 +834,115 @@ public void testTestPermissionWithRegionAndGlobalRegionMembership() throws Excep assertThat(result.testPermission(member, flag2), is(State.ALLOW)); assertThat(result.testPermission(member, flag1, flag2), is(State.ALLOW)); assertThat(result.testPermission(member), is(State.ALLOW)); + assertThat(result.testPermission(globalMember, flag1), is((State) null)); + assertThat(result.testPermission(globalMember, flag2), is((State) null)); + assertThat(result.testPermission(globalMember, flag1, flag2), is((State) null)); + assertThat(result.testPermission(globalMember), is((State) null)); assertThat(result.testPermission(nonMember, flag1), is((State) null)); assertThat(result.testPermission(nonMember, flag2), is((State) null)); + assertThat(result.testPermission(nonMember, flag1, flag2), is((State) null)); + assertThat(result.testPermission(nonMember), is((State) null)); + } + + @Test + public void testTestPermissionWithGlobalRegionMembershipAndRegionGlobalFlag() throws Exception { + MockApplicableRegionSet mock = new MockApplicableRegionSet(); + + StateFlag flag1 = new StateFlag("test1", false); + StateFlag flag2 = new StateFlag("test2", true); + + LocalPlayer nonMember = mock.createPlayer(); + LocalPlayer member = mock.createPlayer(); + LocalPlayer globalMember = mock.createPlayer(); + + ProtectedRegion global = mock.global(); + global.setFlag(flag2, State.DENY); + global.getMembers().addPlayer(globalMember); + + ProtectedRegion region = mock.add(0); + region.getMembers().addPlayer(member); + + FlagValueCalculator result = mock.getFlagCalculator(); + assertThat(result.testPermission(member, flag1), is(State.ALLOW)); + assertThat(result.testPermission(member, flag2), is(State.DENY)); + assertThat(result.testPermission(member, flag1, flag2), is(State.DENY)); + assertThat(result.testPermission(member), is(State.ALLOW)); + assertThat(result.testPermission(globalMember, flag1), is((State) null)); + assertThat(result.testPermission(globalMember, flag2), is(State.DENY)); + assertThat(result.testPermission(globalMember, flag1, flag2), is(State.DENY)); + assertThat(result.testPermission(globalMember), is((State) null)); + assertThat(result.testPermission(nonMember, flag1), is((State) null)); + assertThat(result.testPermission(nonMember, flag2), is(State.DENY)); + assertThat(result.testPermission(nonMember, flag1, flag2), is(State.DENY)); + assertThat(result.testPermission(nonMember), is((State) null)); + } + + @Test + public void testTestPermissionWithGlobalRegionMembershipAndRegionGlobalFlagRegionOverride() throws Exception { + MockApplicableRegionSet mock = new MockApplicableRegionSet(); + + StateFlag flag1 = new StateFlag("test1", false); + StateFlag flag2 = new StateFlag("test2", true); + + LocalPlayer nonMember = mock.createPlayer(); + LocalPlayer member = mock.createPlayer(); + LocalPlayer globalMember = mock.createPlayer(); + + ProtectedRegion global = mock.global(); + global.setFlag(flag2, State.DENY); + global.getMembers().addPlayer(globalMember); + + ProtectedRegion region = mock.add(0); + region.setFlag(flag2, State.ALLOW); + region.getMembers().addPlayer(member); + + FlagValueCalculator result = mock.getFlagCalculator(); + assertThat(result.testPermission(member, flag1), is(State.ALLOW)); + assertThat(result.testPermission(member, flag2), is(State.ALLOW)); + assertThat(result.testPermission(member, flag1, flag2), is(State.ALLOW)); + assertThat(result.testPermission(member), is(State.ALLOW)); + assertThat(result.testPermission(globalMember, flag1), is((State) null)); + assertThat(result.testPermission(globalMember, flag2), is(State.ALLOW)); + assertThat(result.testPermission(globalMember, flag1, flag2), is(State.ALLOW)); + assertThat(result.testPermission(globalMember), is((State) null)); + assertThat(result.testPermission(nonMember, flag1), is((State) null)); + assertThat(result.testPermission(nonMember, flag2), is(State.ALLOW)); + assertThat(result.testPermission(nonMember, flag1, flag2), is(State.ALLOW)); + assertThat(result.testPermission(nonMember), is((State) null)); + } + + @Test + public void testTestPermissionWithGlobalRegionMembershipAndRegionGlobalFlagRegionOverrideAndRegionGroups() throws Exception { + MockApplicableRegionSet mock = new MockApplicableRegionSet(); + + StateFlag flag1 = new StateFlag("test1", false); + StateFlag flag2 = new StateFlag("test2", true); + + LocalPlayer nonMember = mock.createPlayer(); + LocalPlayer member = mock.createPlayer(); + LocalPlayer globalMember = mock.createPlayer(); + + ProtectedRegion global = mock.global(); + global.setFlag(flag2, State.DENY); + global.getMembers().addPlayer(globalMember); + + ProtectedRegion region = mock.add(0); + region.setFlag(flag2, State.ALLOW); + region.setFlag(flag2.getRegionGroupFlag(), RegionGroup.MEMBERS); + region.getMembers().addPlayer(member); + + FlagValueCalculator result = mock.getFlagCalculator(); + assertThat(result.testPermission(member, flag1), is(State.ALLOW)); + assertThat(result.testPermission(member, flag2), is(State.ALLOW)); + assertThat(result.testPermission(member, flag1, flag2), is(State.ALLOW)); + assertThat(result.testPermission(member), is(State.ALLOW)); + assertThat(result.testPermission(globalMember, flag1), is((State) null)); + assertThat(result.testPermission(globalMember, flag2), is(State.DENY)); + assertThat(result.testPermission(globalMember, flag1, flag2), is(State.DENY)); + assertThat(result.testPermission(globalMember), is((State) null)); + assertThat(result.testPermission(nonMember, flag1), is((State) null)); + assertThat(result.testPermission(nonMember, flag2), is(State.DENY)); + assertThat(result.testPermission(nonMember, flag1, flag2), is(State.DENY)); assertThat(result.testPermission(nonMember), is((State) null)); } @@ -553,192 +950,96 @@ public void testTestPermissionWithRegionAndGlobalRegionMembership() throws Excep // ======================================================================== @Test - public void testGetStateWithFallbackSingle() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - StateFlag flag = new StateFlag("test", false); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is((State) null)); - } - - @Test - public void testGetStateWithFallbackSeveralNoneAreDenyNoneAreTrue() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - StateFlag flag1 = new StateFlag("test1", false); - StateFlag flag2 = new StateFlag("test2", false); - StateFlag flag3 = new StateFlag("test3", false); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getStateWithFallback(null, flag1, flag2, flag3), is((State) null)); - } - - @Test - public void testGetStateWithFallbackSeveralNoneAreDenyOneIsTrue() throws Exception { + public void testQueryStateWilderness() throws Exception { MockApplicableRegionSet mock = new MockApplicableRegionSet(); StateFlag flag1 = new StateFlag("test1", false); StateFlag flag2 = new StateFlag("test2", true); - StateFlag flag3 = new StateFlag("test3", false); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getStateWithFallback(null, flag1, flag2, flag3), is(State.ALLOW)); - } - - @Test - public void testGetStateWithFallbackSeveralNoneAreDenyNoneAreTrueWithEmptyGlobalRegion() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - StateFlag flag1 = new StateFlag("test1", false); - StateFlag flag2 = new StateFlag("test2", false); - StateFlag flag3 = new StateFlag("test3", false); - - ProtectedRegion global = mock.global(); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getStateWithFallback(null, flag1, flag2, flag3), is((State) null)); - } - - @Test - public void testGetStateWithFallbackSeveralNoneAreDenyNoneAreTrueWithGlobalRegionValueSetAllow() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - StateFlag flag1 = new StateFlag("test1", false); - StateFlag flag2 = new StateFlag("test2", false); - StateFlag flag3 = new StateFlag("test3", false); - - ProtectedRegion global = mock.global(); - global.setFlag(flag1, State.ALLOW); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getStateWithFallback(null, flag1, flag2, flag3), is(State.ALLOW)); - } - - @Test - public void testGetStateWithFallbackSeveralNoneAreDenySomeAreTrueWithGlobalRegionValueSetDeny() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - StateFlag flag1 = new StateFlag("test1", true); - StateFlag flag2 = new StateFlag("test2", false); - StateFlag flag3 = new StateFlag("test3", false); - - ProtectedRegion global = mock.global(); - global.setFlag(flag1, State.DENY); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getStateWithFallback(null, flag1, flag2, flag3), is((State) null)); - } - - @Test - public void testGetStateWithFallbackWithGlobalRegionAllowAndRegionDeny() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - StateFlag flag1 = new StateFlag("test1", false); - StateFlag flag2 = new StateFlag("test2", false); - StateFlag flag3 = new StateFlag("test3", false); - - ProtectedRegion global = mock.global(); - global.setFlag(flag1, State.ALLOW); - - ProtectedRegion region = mock.add(0); - region.setFlag(flag1, State.DENY); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getStateWithFallback(null, flag1, flag2, flag3), is(State.DENY)); - } - - @Test - public void testGetStateWithFallbackWithGlobalRegionAllowAndRegionDenyOnDifferentFlag() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - StateFlag flag1 = new StateFlag("test1", false); - StateFlag flag2 = new StateFlag("test2", false); - StateFlag flag3 = new StateFlag("test3", false); - - ProtectedRegion global = mock.global(); - global.setFlag(flag1, State.ALLOW); - - ProtectedRegion region = mock.add(0); - region.setFlag(flag2, State.DENY); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getStateWithFallback(null, flag1, flag2, flag3), is(State.DENY)); - } - - @Test - public void testGetStateWithFallbackWithGlobalRegionDenyAndRegionAllow() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - StateFlag flag1 = new StateFlag("test1", false); - StateFlag flag2 = new StateFlag("test2", false); - StateFlag flag3 = new StateFlag("test3", false); - - ProtectedRegion global = mock.global(); - global.setFlag(flag1, State.DENY); - - ProtectedRegion region = mock.add(0); - region.setFlag(flag1, State.ALLOW); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getStateWithFallback(null, flag1, flag2, flag3), is(State.ALLOW)); - } - - @Test - public void testGetStateWithFallbackWithGlobalRegionDenyOnDifferentAndRegionAllow() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - StateFlag flag1 = new StateFlag("test1", false); - StateFlag flag2 = new StateFlag("test2", false); - StateFlag flag3 = new StateFlag("test3", false); - - ProtectedRegion global = mock.global(); - global.setFlag(flag2, State.DENY); - - ProtectedRegion region = mock.add(0); - region.setFlag(flag1, State.ALLOW); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getStateWithFallback(null, flag1, flag2, flag3), is(State.ALLOW)); + assertThat(result.queryState(null, flag1), is((State) null)); + assertThat(result.queryState(null, flag2), is((State) null)); } // ======================================================================== // ======================================================================== @Test - public void testGetSingleValueWithFallbackWithFalseDefaultValue() throws Exception { + public void testQueryValueSingleRegion() throws Exception { MockApplicableRegionSet mock = new MockApplicableRegionSet(); - StateFlag flag = new StateFlag("test", false); + ProtectedRegion region = mock.add(0); + region.setFlag(DefaultFlag.PVP, State.DENY); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is((State) null)); + assertThat(result.queryValue(null, DefaultFlag.LIGHTER), is((State) null)); + assertThat(result.queryValue(null, DefaultFlag.PVP), is(State.DENY)); } @Test - public void testGetSingleValueWithFallbackWithTrueDefaultValue() throws Exception { + public void testQueryValueDenyOverridesAllow() throws Exception { MockApplicableRegionSet mock = new MockApplicableRegionSet(); - StateFlag flag = new StateFlag("test", true); + ProtectedRegion region = mock.add(0); + region.setFlag(DefaultFlag.PVP, State.DENY); + + region = mock.add(0); + region.setFlag(DefaultFlag.PVP, State.ALLOW); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is(State.ALLOW)); + assertThat(result.queryValue(null, DefaultFlag.LIGHTER), is((State) null)); + assertThat(result.queryValue(null, DefaultFlag.PVP), is(State.DENY)); } @Test - public void testGetSingleValueWithFallbackWithFalseDefaultValueEmptyGlobalRegion() throws Exception { + public void testQueryValueAllowOverridesNone() throws Exception { MockApplicableRegionSet mock = new MockApplicableRegionSet(); - StateFlag flag = new StateFlag("test", false); + ProtectedRegion region = mock.add(0); - ProtectedRegion global = mock.global(); + region = mock.add(0); + region.setFlag(DefaultFlag.PVP, State.ALLOW); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is((State) null)); + assertThat(result.queryValue(null, DefaultFlag.LIGHTER), is((State) null)); + assertThat(result.queryValue(null, DefaultFlag.PVP), is(State.ALLOW)); } @Test - public void testGetSingleValueWithFallbackWithTrueDefaultValueEmptyGlobalRegion() throws Exception { + public void testQueryValueMultipleFlags() throws Exception { + MockApplicableRegionSet mock = new MockApplicableRegionSet(); + + ProtectedRegion region = mock.add(0); + region.setFlag(DefaultFlag.LIGHTER, State.DENY); + region.setFlag(DefaultFlag.PVP, State.ALLOW); + + region = mock.add(0); + region.setFlag(DefaultFlag.PVP, State.DENY); + + FlagValueCalculator result = mock.getFlagCalculator(); + assertThat(result.queryValue(null, DefaultFlag.LIGHTER), is(State.DENY)); + assertThat(result.queryValue(null, DefaultFlag.PVP), is(State.DENY)); + assertThat(result.queryValue(null, DefaultFlag.LAVA_FIRE), is((State) null)); + } + + @Test + public void testQueryValueStringFlag() throws Exception { + MockApplicableRegionSet mock = new MockApplicableRegionSet(); + + ProtectedRegion region = mock.add(0); + region.setFlag(DefaultFlag.FAREWELL_MESSAGE, "test1"); + + region = mock.add(0); + region.setFlag(DefaultFlag.FAREWELL_MESSAGE, "test2"); + + FlagValueCalculator result = mock.getFlagCalculator(); + assertThat(result.queryValue(null, DefaultFlag.FAREWELL_MESSAGE), isOneOf("test1", "test2")); + assertThat(result.queryValue(null, DefaultFlag.GREET_MESSAGE), is((String) null)); + assertThat(result.queryValue(null, DefaultFlag.LAVA_FIRE), is((State) null)); + } + + @Test + public void testQueryValueEmptyGlobalRegion() throws Exception { MockApplicableRegionSet mock = new MockApplicableRegionSet(); StateFlag flag = new StateFlag("test", true); @@ -746,11 +1047,11 @@ public void testGetSingleValueWithFallbackWithTrueDefaultValueEmptyGlobalRegion( ProtectedRegion global = mock.global(); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is(State.ALLOW)); + assertThat(result.queryValue(null, flag), is((State) null)); } @Test - public void testGetSingleValueWithFallbackWithDefaultValueSameGlobalRegion() throws Exception { + public void testQueryValueGlobalRegionAllow() throws Exception { MockApplicableRegionSet mock = new MockApplicableRegionSet(); StateFlag flag = new StateFlag("test", true); @@ -759,11 +1060,11 @@ public void testGetSingleValueWithFallbackWithDefaultValueSameGlobalRegion() thr global.setFlag(flag, State.ALLOW); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is(State.ALLOW)); + assertThat(result.queryValue(null, flag), is(State.ALLOW)); } @Test - public void testGetSingleValueWithFallbackWithTrueDefaultValueDenyGlobalRegion() throws Exception { + public void testQueryValueGlobalRegionDeny() throws Exception { MockApplicableRegionSet mock = new MockApplicableRegionSet(); StateFlag flag = new StateFlag("test", true); @@ -772,34 +1073,11 @@ public void testGetSingleValueWithFallbackWithTrueDefaultValueDenyGlobalRegion() global.setFlag(flag, State.DENY); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is((State) null)); + assertThat(result.queryValue(null, flag), is(State.DENY)); } @Test - public void testGetSingleValueWithFallbackWithFalseDefaultValueAllowGlobalRegion() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - StateFlag flag = new StateFlag("test", false); - - ProtectedRegion global = mock.global(); - global.setFlag(flag, State.ALLOW); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is(State.ALLOW)); - } - - @Test - public void testGetSingleValueWithFallbackWithStringFlag() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - StringFlag flag = new StringFlag("test"); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is((String) null)); - } - - @Test - public void testGetSingleValueWithFallbackWithStringFlagEmptyGlobalRegion() throws Exception { + public void testQueryValueStringFlagWithGlobalRegion() throws Exception { MockApplicableRegionSet mock = new MockApplicableRegionSet(); StringFlag flag = new StringFlag("test"); @@ -807,145 +1085,62 @@ public void testGetSingleValueWithFallbackWithStringFlagEmptyGlobalRegion() thro ProtectedRegion global = mock.global(); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is((String) null)); + assertThat(result.queryValue(null, flag), is((String) null)); } @Test - public void testGetSingleValueWithFallbackWithStringFlagGlobalRegionValueSet() throws Exception { + public void testQueryValueStringFlagWithGlobalRegionValueSet() throws Exception { MockApplicableRegionSet mock = new MockApplicableRegionSet(); StringFlag flag = new StringFlag("test"); ProtectedRegion global = mock.global(); - global.setFlag(flag, "hello there"); + global.setFlag(flag, "hello"); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is("hello there")); + assertThat(result.queryValue(null, flag), is("hello")); } @Test - public void testGetSingleValueWithFallbackWithFalseDefaultValueAndEmptyRegion() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - StateFlag flag = new StateFlag("test", false); - - ProtectedRegion region = mock.add(0); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is((State) null)); - } - - @Test - public void testGetSingleValueWithFallbackWithTrueDefaultValueAndEmptyRegion() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - StateFlag flag = new StateFlag("test", true); - - ProtectedRegion region = mock.add(0); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is(State.ALLOW)); - } - - @Test - public void testGetSingleValueWithFallbackWithTrueDefaultValueAndRegionDeny() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - StateFlag flag = new StateFlag("test", true); - - ProtectedRegion region = mock.add(0); - region.setFlag(flag, State.DENY); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is(State.DENY)); - } - - @Test - public void testGetSingleValueWithFallbackWithTrueDefaultValueAndRegionAllow() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - StateFlag flag = new StateFlag("test", true); - - ProtectedRegion region = mock.add(0); - region.setFlag(flag, State.ALLOW); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is(State.ALLOW)); - } - - @Test - public void testGetSingleValueWithFallbackWithFalseDefaultValueAndRegionAllow() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - StateFlag flag = new StateFlag("test", false); - - ProtectedRegion region = mock.add(0); - region.setFlag(flag, State.ALLOW); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is(State.ALLOW)); - } - - @Test - public void testGetSingleValueWithFallbackWithFalseDefaultValueAndRegionDeny() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - StateFlag flag = new StateFlag("test", false); - - ProtectedRegion region = mock.add(0); - region.setFlag(flag, State.DENY); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is(State.DENY)); - } - - @Test - public void testGetSingleValueWithFallbackWithStringFlagAndEmptyRegion() throws Exception { + public void testQueryValueStringFlagWithGlobalRegionAndRegion() throws Exception { MockApplicableRegionSet mock = new MockApplicableRegionSet(); StringFlag flag = new StringFlag("test"); + ProtectedRegion global = mock.global(); + global.setFlag(flag, "hello"); + ProtectedRegion region = mock.add(0); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is((String) null)); + assertThat(result.queryValue(null, flag), is("hello")); } @Test - public void testGetSingleValueWithFallbackWithStringFlagAndRegionValueSet() throws Exception { + public void testQueryValueStringFlagWithGlobalRegionAndRegionOverride() throws Exception { MockApplicableRegionSet mock = new MockApplicableRegionSet(); StringFlag flag = new StringFlag("test"); + ProtectedRegion global = mock.global(); + global.setFlag(flag, "hello"); + ProtectedRegion region = mock.add(0); - region.setFlag(flag, "beep beep"); + region.setFlag(flag, "beep"); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is("beep beep")); + assertThat(result.queryValue(null, flag), is("beep")); } @Test - public void testGetSingleValueWithFallbackWithStringFlagAndRegionValueSetAndPriority() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - StringFlag flag = new StringFlag("test"); - - ProtectedRegion region = mock.add(10); - region.setFlag(flag, "ello there"); - - region = mock.add(0); - region.setFlag(flag, "beep beep"); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is("ello there")); - } - - @Test - public void testGetSingleValueWithFallbackWithStringFlagAndRegionValueSetAndInheritanceAndRegionGroup() throws Exception { + public void testQueryValueStringFlagWithEverything() throws Exception { MockApplicableRegionSet mock = new MockApplicableRegionSet(); StringFlag flag = new StringFlag("test", RegionGroup.ALL); + ProtectedRegion global = mock.global(); + global.setFlag(flag, "hello"); + ProtectedRegion parent = mock.add(0); parent.setFlag(flag, "ello there"); @@ -960,93 +1155,16 @@ public void testGetSingleValueWithFallbackWithStringFlagAndRegionValueSetAndInhe region.getMembers().addPlayer(member); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValueWithFallback(null, flag), is("ello there")); - assertThat(result.getSingleValueWithFallback(nonMember, flag), is("ello there")); - assertThat(result.getSingleValueWithFallback(member, flag), is("beep beep")); + assertThat(result.queryValue(null, flag), is("ello there")); + assertThat(result.queryValue(nonMember, flag), is("ello there")); + assertThat(result.queryValue(member, flag), is("beep beep")); } // ======================================================================== // ======================================================================== @Test - public void testGetSingleValueSingleRegion() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - ProtectedRegion region = mock.add(0); - region.setFlag(DefaultFlag.PVP, State.DENY); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValue(null, DefaultFlag.LIGHTER), is((State) null)); - assertThat(result.getSingleValue(null, DefaultFlag.PVP), is(State.DENY)); - } - - @Test - public void testGetSingleValueDenyOverridesAllow() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - ProtectedRegion region = mock.add(0); - region.setFlag(DefaultFlag.PVP, State.DENY); - - region = mock.add(0); - region.setFlag(DefaultFlag.PVP, State.ALLOW); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValue(null, DefaultFlag.LIGHTER), is((State) null)); - assertThat(result.getSingleValue(null, DefaultFlag.PVP), is(State.DENY)); - } - - @Test - public void testGetSingleValueAllowOverridesNone() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - ProtectedRegion region = mock.add(0); - - region = mock.add(0); - region.setFlag(DefaultFlag.PVP, State.ALLOW); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValue(null, DefaultFlag.LIGHTER), is((State) null)); - assertThat(result.getSingleValue(null, DefaultFlag.PVP), is(State.ALLOW)); - } - - @Test - public void testGetSingleValueMultipleFlags() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - ProtectedRegion region = mock.add(0); - region.setFlag(DefaultFlag.LIGHTER, State.DENY); - region.setFlag(DefaultFlag.PVP, State.ALLOW); - - region = mock.add(0); - region.setFlag(DefaultFlag.PVP, State.DENY); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValue(null, DefaultFlag.LIGHTER), is(State.DENY)); - assertThat(result.getSingleValue(null, DefaultFlag.PVP), is(State.DENY)); - assertThat(result.getSingleValue(null, DefaultFlag.LAVA_FIRE), is((State) null)); - } - - @Test - public void testGetSingleValueStringFlag() throws Exception { - MockApplicableRegionSet mock = new MockApplicableRegionSet(); - - ProtectedRegion region = mock.add(0); - region.setFlag(DefaultFlag.FAREWELL_MESSAGE, "test1"); - - region = mock.add(0); - region.setFlag(DefaultFlag.FAREWELL_MESSAGE, "test2"); - - FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(result.getSingleValue(null, DefaultFlag.FAREWELL_MESSAGE), isOneOf("test1", "test2")); - assertThat(result.getSingleValue(null, DefaultFlag.GREET_MESSAGE), is((String) null)); - assertThat(result.getSingleValue(null, DefaultFlag.LAVA_FIRE), is((State) null)); - } - - // ======================================================================== - // ======================================================================== - - @Test - public void testGetValuesTwoWithSamePriority() throws Exception { + public void testQueryAllValuesTwoWithSamePriority() throws Exception { // ==================================================================== // Two regions with the same priority // ==================================================================== @@ -1060,12 +1178,12 @@ public void testGetValuesTwoWithSamePriority() throws Exception { region.setFlag(DefaultFlag.FAREWELL_MESSAGE, "test2"); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(copyOf(result.getValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test1", "test2"))); - assertThat(result.getValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); + assertThat(copyOf(result.queryAllValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test1", "test2"))); + assertThat(result.queryAllValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); } @Test - public void testGetValuesTwoWithDuplicateFlagValues() throws Exception { + public void testQueryAllValuesTwoWithDuplicateFlagValues() throws Exception { // ==================================================================== // Two regions with duplicate values // ==================================================================== @@ -1079,12 +1197,12 @@ public void testGetValuesTwoWithDuplicateFlagValues() throws Exception { region.setFlag(DefaultFlag.FAREWELL_MESSAGE, "test"); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(copyOf(result.getValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test", "test"))); - assertThat(result.getValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); + assertThat(copyOf(result.queryAllValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test", "test"))); + assertThat(result.queryAllValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); } @Test - public void testGetValuesWithHigherPriority() throws Exception { + public void testQueryAllValuesWithHigherPriority() throws Exception { // ==================================================================== // One of the regions has a higher priority (should override) // ==================================================================== @@ -1098,12 +1216,12 @@ public void testGetValuesWithHigherPriority() throws Exception { region.setFlag(DefaultFlag.FAREWELL_MESSAGE, "test2"); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(copyOf(result.getValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test1"))); - assertThat(result.getValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); + assertThat(copyOf(result.queryAllValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test1"))); + assertThat(result.queryAllValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); } @Test - public void testGetValuesWithTwoElevatedPriorities() throws Exception { + public void testQueryAllValuesWithTwoElevatedPriorities() throws Exception { // ==================================================================== // Two regions with the same elevated priority // ==================================================================== @@ -1120,12 +1238,12 @@ public void testGetValuesWithTwoElevatedPriorities() throws Exception { region.setFlag(DefaultFlag.FAREWELL_MESSAGE, "test2"); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(copyOf(result.getValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test1", "test3"))); - assertThat(result.getValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); + assertThat(copyOf(result.queryAllValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test1", "test3"))); + assertThat(result.queryAllValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); } @Test - public void testGetValuesParentChildWithSamePriority() throws Exception { + public void testQueryAllValuesParentChildWithSamePriority() throws Exception { // ==================================================================== // Child region and parent region with the same priority // ==================================================================== @@ -1143,12 +1261,12 @@ public void testGetValuesParentChildWithSamePriority() throws Exception { region.setFlag(DefaultFlag.FAREWELL_MESSAGE, "test2"); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(copyOf(result.getValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test1"))); - assertThat(result.getValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); + assertThat(copyOf(result.queryAllValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test1"))); + assertThat(result.queryAllValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); } @Test - public void testGetValuesParentWithHigherPriority() throws Exception { + public void testQueryAllValuesParentWithHigherPriority() throws Exception { // ==================================================================== // Parent region with a higher priority than the child // ==================================================================== @@ -1166,12 +1284,12 @@ public void testGetValuesParentWithHigherPriority() throws Exception { region.setFlag(DefaultFlag.FAREWELL_MESSAGE, "test2"); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(copyOf(result.getValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test3"))); - assertThat(result.getValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); + assertThat(copyOf(result.queryAllValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test3"))); + assertThat(result.queryAllValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); } @Test - public void testGetValuesParentWithLowerPriority() throws Exception { + public void testQueryAllValuesParentWithLowerPriority() throws Exception { // ==================================================================== // Parent region with a lower priority than the child // ==================================================================== @@ -1189,12 +1307,12 @@ public void testGetValuesParentWithLowerPriority() throws Exception { region.setFlag(DefaultFlag.FAREWELL_MESSAGE, "test2"); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(copyOf(result.getValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test1"))); - assertThat(result.getValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); + assertThat(copyOf(result.queryAllValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test1"))); + assertThat(result.queryAllValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); } @Test - public void testGetValuesThirdRegionWithHigherPriorityThanParentChild() throws Exception { + public void testQueryAllValuesThirdRegionWithHigherPriorityThanParentChild() throws Exception { // ==================================================================== // Third region with higher priority than parent and child // ==================================================================== @@ -1212,12 +1330,12 @@ public void testGetValuesThirdRegionWithHigherPriorityThanParentChild() throws E region.setFlag(DefaultFlag.FAREWELL_MESSAGE, "test2"); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(copyOf(result.getValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test2"))); - assertThat(result.getValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); + assertThat(copyOf(result.queryAllValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test2"))); + assertThat(result.queryAllValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); } @Test - public void testGetValuesParentsAndInheritance() throws Exception { + public void testQueryAllValuesParentsAndInheritance() throws Exception { // ==================================================================== // Multiple regions with parents, one region using flag from parent // ==================================================================== @@ -1238,12 +1356,12 @@ public void testGetValuesParentsAndInheritance() throws Exception { region.setParent(parent2); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(copyOf(result.getValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test2", "test3"))); - assertThat(result.getValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); + assertThat(copyOf(result.queryAllValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test2", "test3"))); + assertThat(result.queryAllValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); } @Test - public void testGetValuesParentsAndInheritanceHighPriorityAndNoFlag() throws Exception { + public void testQueryAllValuesParentsAndInheritanceHighPriorityAndNoFlag() throws Exception { // ==================================================================== // Multiple regions with parents, one region with high priority but no flag // ==================================================================== @@ -1263,12 +1381,12 @@ public void testGetValuesParentsAndInheritanceHighPriorityAndNoFlag() throws Exc region = mock.add(30); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(copyOf(result.getValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test2"))); - assertThat(result.getValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); + assertThat(copyOf(result.queryAllValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test2"))); + assertThat(result.queryAllValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); } @Test - public void testGetValuesParentWithSamePriorityAsHighest() throws Exception { + public void testQueryAllValuesParentWithSamePriorityAsHighest() throws Exception { // ==================================================================== // As before, except a parent region has the same priority as the previous highest // ==================================================================== @@ -1288,8 +1406,31 @@ public void testGetValuesParentWithSamePriorityAsHighest() throws Exception { region = mock.add(30); FlagValueCalculator result = mock.getFlagCalculator(); - assertThat(copyOf(result.getValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test1"))); - assertThat(result.getValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); + assertThat(copyOf(result.queryAllValues(null, DefaultFlag.FAREWELL_MESSAGE)), equalTo(of("test1"))); + assertThat(result.queryAllValues(null, DefaultFlag.GREET_MESSAGE), is(Matchers.empty())); + } + + // ======================================================================== + // ======================================================================== + + @Test + public void testGetEffectivePriority() throws Exception { + MockApplicableRegionSet mock = new MockApplicableRegionSet(); + + ProtectedRegion region = mock.add(30); + + FlagValueCalculator result = mock.getFlagCalculator(); + assertThat(result.getPriority(region), is(30)); + } + + @Test + public void testGetEffectivePriorityGlobalRegion() throws Exception { + MockApplicableRegionSet mock = new MockApplicableRegionSet(); + + ProtectedRegion region = mock.global(); + + FlagValueCalculator result = mock.getFlagCalculator(); + assertThat(result.getPriority(region), is(Integer.MIN_VALUE)); } // ========================================================================