Skip to content

Commit

Permalink
Add tests for WorkaroundSet. Related fixes/changes.
Browse files Browse the repository at this point in the history
  • Loading branch information
asofold committed Jan 17, 2016
1 parent aacb97b commit 228ed2f
Show file tree
Hide file tree
Showing 3 changed files with 206 additions and 25 deletions.
Expand Up @@ -6,6 +6,7 @@
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import fr.neatmonster.nocheatplus.utilities.ds.count.acceptdeny.IAcceptDenyCounter;

Expand Down Expand Up @@ -88,7 +89,8 @@ public WorkaroundSet(final IWorkaround[] bluePrints, final Map<String, String[]>
this.stagedGroups.put(groupId, stagedGroup.toArray(new IStagedWorkaround[stagedGroup.size()]));
}
}
} else {
}
else {
this.groups = null;
this.stagedGroups = null;
}
Expand All @@ -99,11 +101,19 @@ public <C extends IWorkaround> C getWorkaround(final String id, final Class<C> w
final IWorkaround present = getWorkaround(id);
if (!workaroundClass.isAssignableFrom(present.getClass())) {
throw new IllegalArgumentException("Wrong type of registered workaround requested: " + workaroundClass.getName() + " instead of " + present.getClass().getName());
} else {
}
else {
return (C) present;
}
}

/**
*
* @param id
* @return
* @throws IllegalArgumentException
* If no workaround is set for the id.
*/
public IWorkaround getWorkaround(final String id) {
final IWorkaround present = workaroundsById.get(id);
if (present == null) {
Expand Down Expand Up @@ -144,13 +154,19 @@ public void resetConditions(final String groupId) {
*
* @param workaroundId
* @return The result of IWorkaround.use() for the registered instance.
* @throws NullPointerException
* if no workaround is registered for this id.
* @throws IllegalArgumentException
* If no workaround is registered for this id.
*
*/
public boolean use(String workaroundId) {
// TODO: For consistency might throw the same exception everywhere (IllegalArgument?).
return workaroundsById.get(workaroundId).use();
final IWorkaround workaround = workaroundsById.get(workaroundId);
if (workaround == null) {
throw new IllegalArgumentException("Workaround id not registered: " + workaroundId);
}
else {
return workaround.use();
}
}

/**
Expand Down Expand Up @@ -182,26 +198,13 @@ public boolean canUse(String workaroundId) {

/**
* Specify what workaround ids belong to a certain group. Workarounds can be
* in multiple groups.
* in multiple groups. The workaroundIds must exist.
*
* @param groupId
* @param workaroundIds
*/
public void setGroup(String groupId, Collection<String> workaroundIds);

/**
* Define which workarounds and which groups belong to the WorkaroundSet of
* the given workaroundSetId.
*
* @param workaroundSetId
* @param bluePrints
* Lazily registers, if no blueprint is present (calling setWorkaroundBluePrint, note parent counters). Already
* registered blueprints are kept.
* @param groupIds
* Must already be registered.
*/
public void setWorkaroundSet(String workaroundSetId, Collection<IWorkaround> bluePrints, String... groupIds);

/**
* Define which workarounds and which groups belong to the WorkaroundSet of
* the given workaroundSetId.
Expand Down Expand Up @@ -265,11 +268,32 @@ public boolean canUse(String workaroundId) {
public IWorkaround getWorkaround(String id);

/**
* Retrieve an unmodifiable map for all registered global counters. The counters
* are not copies, so they could be altered, discouraged though.
* Retrieve an unmodifiable map for all registered global counters. The
* counters are not copies, so they could be altered, discouraged though.
*
* @return
*/
public Map<String, IAcceptDenyCounter> getGlobalCounters();

/**
* Convenience to get the internally registered id.
*
* @param workaroundId
* @return
* @throws IllegalArgumentException
* If an id is not registered for a given workaround.
*/
public String getCheckedWorkaroundId(String workaroundId);

/**
* Convenience method to get a set of ids, testing if bluePrints exist.
*
* @param workarounds
* @return A set fit for iteration. Contained ids are taken from the
* internally registered instances.
* @throws IllegalArgumentException
* If an id is not registered for a given workaround.
*/
public Set<String> getCheckedIdSet(Collection<? extends IWorkaround> workarounds); // UH.

}
Expand Up @@ -4,8 +4,10 @@
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import fr.neatmonster.nocheatplus.utilities.ds.count.acceptdeny.AcceptDenyCounter;
import fr.neatmonster.nocheatplus.utilities.ds.count.acceptdeny.IAcceptDenyCounter;
Expand Down Expand Up @@ -53,11 +55,15 @@ public void setWorkaroundBluePrint(final IWorkaround... bluePrints) {

@Override
public void setGroup(final String groupId, final Collection<String> workaroundIds) {
for (final String id : workaroundIds) {
if (!bluePrints.containsKey(id)) {
throw new IllegalArgumentException("No blueprint for id '" + id + "' in group '" + groupId + "'.");
}
}
groups.put(groupId, workaroundIds.toArray(new String[workaroundIds.size()]));
}

@Override
public void setWorkaroundSet(final String workaroundSetId, final Collection<IWorkaround> bluePrints, final String... groupIds) {
private void setWorkaroundSet(final String workaroundSetId, final Collection<IWorkaround> bluePrints, final String... groupIds) {
final String[] ids = new String[bluePrints.size()];
int i = 0;
for (final IWorkaround bluePrint : bluePrints) {
Expand Down Expand Up @@ -159,4 +165,29 @@ public Map<String, IAcceptDenyCounter> getGlobalCounters() {
return Collections.unmodifiableMap(counters);
}

@Override
public String getCheckedWorkaroundId(String workaroundId) {
final IWorkaround bluePrint = this.bluePrints.get(workaroundId);
if (bluePrint == null) {
throw new IllegalArgumentException("No blueprint registered for: " + workaroundId);
} else {
return bluePrint.getId();
}
}

@Override
public Set<String> getCheckedIdSet(Collection<? extends IWorkaround> workarounds) {
final Set<String> ids = new LinkedHashSet<String>();
for (final IWorkaround workaround : workarounds) {
final IWorkaround bluePrint = this.bluePrints.get(workaround.getId());
if (bluePrint == null) {
throw new IllegalArgumentException("No blueprint registered for: " + workaround.getId());
}
else {
ids.add(bluePrint.getId());
}
}
return ids;
}

}
Expand Up @@ -2,6 +2,11 @@

import static org.junit.Assert.fail;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import org.junit.Test;

import fr.neatmonster.nocheatplus.utilities.ds.count.acceptdeny.AcceptDenyCounter;
Expand All @@ -10,6 +15,7 @@
import fr.neatmonster.nocheatplus.workaround.IStagedWorkaround;
import fr.neatmonster.nocheatplus.workaround.IWorkaround;
import fr.neatmonster.nocheatplus.workaround.IWorkaroundRegistry;
import fr.neatmonster.nocheatplus.workaround.IWorkaroundRegistry.WorkaroundSet;
import fr.neatmonster.nocheatplus.workaround.SimpleWorkaroundRegistry;
import fr.neatmonster.nocheatplus.workaround.WorkaroundCountDown;
import fr.neatmonster.nocheatplus.workaround.WorkaroundCounter;
Expand Down Expand Up @@ -125,7 +131,7 @@ public void testSimpleWorkaroundRegistry() {
// Register a single workaround (no parent counter).
checkSetWorkaroundBluePrint(new WorkaroundCounter("wc.man"), reg);

// Register a single workaround with a parent counter set (createed from registry).
// Register a single workaround with a parent counter set (created from registry).
IWorkaround wrp = new WorkaroundCounter("wc.man.rp"); // With parent counter from registry.
((ICounterWithParent) wrp.getAllTimeCounter()).setParentCounter(c_man);
checkSetWorkaroundBluePrint(wrp, reg);
Expand All @@ -135,7 +141,127 @@ public void testSimpleWorkaroundRegistry() {
((ICounterWithParent) wep.getAllTimeCounter()).setParentCounter(new AcceptDenyCounter());
checkSetWorkaroundBluePrint(wep, reg);

// TODO: Test a WorkaroundSet with all types of workarounds. Groups, WorkaroundSet methods.
// WorkaroundSet

// Register workarounds.
List<WorkaroundCounter> wg1 = getWorkaroundCounters("w.man", 15);
List<WorkaroundCountDown> wg2 = getWorkaroundcountDowns("w.man", 15);
List<IWorkaround> wgAll = new ArrayList<IWorkaround>(30);
wgAll.addAll(wg1);
wgAll.addAll(wg2);
try {
reg.getCheckedIdSet(wg1);
fail("Expect IllegalArgumentException for not registered workarounds.");
}
catch (IllegalArgumentException ex) {
// Success.
}
reg.setWorkaroundBluePrint(wgAll.toArray(new IWorkaround[2 * 15]));
List<String> ids1 = new ArrayList<String>(reg.getCheckedIdSet(wg1));
List<String> ids2 = new ArrayList<String>(reg.getCheckedIdSet(wg2));
List<String> idsAll = new ArrayList<String>(reg.getCheckedIdSet(wgAll));
// Register groups.
reg.setGroup("group.mix", Arrays.asList(ids1.get(0), ids2.get(0)));
reg.setGroup("group.wc", ids1);
reg.setGroup("group.wcd", ids2);
// reg.setWorkaroundSet with string ids.
reg.setWorkaroundSetByIds("ws.all", idsAll, "group.mix", "group.wc", "group.wcd");
// reg.getWorkaroundSet.
WorkaroundSet ws = reg.getWorkaroundSet("ws.all");
// Test the WorkaroundSet
for (String id : idsAll) {
ws.getWorkaround(id);
}
// Test reset all.
useAll(idsAll, ws);
int accept = 1;
int deny = 0;
checkAllTimeCount(idsAll, ws, accept, deny);
checkStageCount(ids2, ws, 1, 0);
ws.resetConditions();
checkAllTimeCount(idsAll, ws, accept, deny);
checkStageCount(ids2, ws, 0, 0);
// Reset group.wc.
useAll(idsAll, ws);
accept += 1;
ws.resetConditions("group.wc");
checkAllTimeCount(idsAll, ws, accept, deny);
checkStageCount(ids2, ws, 1, 0);
ws.resetConditions();
// group.wcd
useAll(idsAll, ws);
accept += 1;
ws.resetConditions("group.wcd");
checkAllTimeCount(idsAll, ws, accept, deny);
checkStageCount(ids2, ws, 0, 0);
ws.resetConditions();
// group.mix
useAll(idsAll, ws);
accept += 1;
ws.resetConditions("group.mix");
checkAllTimeCount(idsAll, ws, accept, deny);
TestAcceptDenyCounters.checkCounts(((IStagedWorkaround) (ws.getWorkaround(ids2.get(0)))).getStageCounter(), 0, 0, "stageCounter/" + ids2.get(0));
for (int i = 1; i < ids2.size(); i++) {
TestAcceptDenyCounters.checkCounts(((IStagedWorkaround) (ws.getWorkaround(ids2.get(i)))).getStageCounter(), 1, 0, "stageCounter/" + ids2.get(i));
}
ws.resetConditions();
// TODO: Individual group reset (needs half of group.wcd).

// TODO: More details/cases (also failure cases, exceptions, etc).

}

/**
* Get a collection of new WorkaroundCounter instances.
*
* @param name
* Prefix of naming name.class.count
* @param repeatCount
* @return
*/
public static List<WorkaroundCounter> getWorkaroundCounters(String name, int repeatCount) {
final List<WorkaroundCounter> workarounds = new ArrayList<WorkaroundCounter>();
for (int i = 0; i < repeatCount; i++) {
workarounds.add(new WorkaroundCounter(name + ".WorkaroundCounter." + i));
}
return workarounds;
}

/**
* Get a collection of new WorkaroundCountDown instances, initialized with
* counting up from 1.
*
* @param name
* Prefix of naming name.class.count
* @param repeatCount
* @return
*/
public static List<WorkaroundCountDown> getWorkaroundcountDowns(String name, int repeatCount) {
final List<WorkaroundCountDown> workarounds = new ArrayList<WorkaroundCountDown>();
for (int i = 0; i < repeatCount; i++) {
workarounds.add(new WorkaroundCountDown(name + ".WorkaroundCountDown." + i, i + 1));
}
return workarounds;
}

public static void useAll(Collection<String> ids, WorkaroundSet ws) {
for (String id : ids) {
ws.use(id);
}
}

public static void checkStageCount(Collection<String> ids, WorkaroundSet ws, int acceptCount, int denyCount) {
for (String id : ids) {
IAcceptDenyCounter counter = ((IStagedWorkaround) ws.getWorkaround(id)).getStageCounter();
TestAcceptDenyCounters.checkCounts(counter, acceptCount, denyCount, "stageCounter/" + id);
}
}

public static void checkAllTimeCount(Collection<String> ids, WorkaroundSet ws, int acceptCount, int denyCount) {
for (String id : ids) {
IAcceptDenyCounter counter = ws.getWorkaround(id).getAllTimeCounter();
TestAcceptDenyCounters.checkCounts(counter, acceptCount, denyCount, "allTimeCounter/" + id);
}
}

/**
Expand Down

0 comments on commit 228ed2f

Please sign in to comment.