public void testSpendTime() {
((MockSun) universe.getEnvironment().getSun()).setLuminosity(new Percent(70));
// add mock observers on each leaf
List<ObservableTestHelper> observerHelpers = new ArrayList<ObservableTestHelper>();
for (TreeLeaf leaf : branchPart.getLeaves()) {
ObservableTestHelper observerHelper = new ObservableTestHelper();
observerHelpers.add(observerHelper);
observerHelper.addIObserver(leaf);
assertEquals(0, observerHelper.nbUpdated());
}
branchPart.spendTime();
assertEquals(16, branchPart.getAge());
// as computed in BasicTreeLeafTest#testSpendTime1
// -> freeEnergy in leaves should be 5.17056, except for falling leaf 0 (no more in the leaf list)
// total collected energy = 4 * 5.17056 = 20.68224
// energy = 20.68224 * 0.50 + 10 = 20.34112
// free energy = 20.68224 - 10.34112 + 3 = 13.34112
assertEquals(20.34112, branchPart.getEnergy().doubleValue(), 0.000001);
assertEquals(13.34112, branchPart.collectFreeEnergy().doubleValue(), 0.000001);
// can not collect the free energy more than once
assertEquals(new BigDecimal(0), branchPart.collectFreeEnergy());
int nbFall = 0;
for (ObservableTestHelper observerHelper : observerHelpers) {
if (observerHelper.nbUpdated() == 4) {
// the single falling leaf (the first one)
assertEquals(LeafUpdateCode.age, observerHelper.getUpdateObjects().get(0));
assertEquals(LeafUpdateCode.efficiency, observerHelper.getUpdateObjects().get(1));
assertEquals(LeafUpdateCode.energy, observerHelper.getUpdateObjects().get(2));
assertEquals(LeafUpdateCode.fall, observerHelper.getUpdateObjects().get(3));
nbFall++;
assertEquals(1, nbFall);
} else {
if (observerHelper.nbUpdated() == 5) {
// all the other leaves
assertEquals(LeafUpdateCode.age, observerHelper.getUpdateObjects().get(0));
assertEquals(LeafUpdateCode.efficiency, observerHelper.getUpdateObjects().get(1));
assertEquals(LeafUpdateCode.energy, observerHelper.getUpdateObjects().get(2));
assertEquals(LeafUpdateCode.efficiency, observerHelper.getUpdateObjects().get(3));
assertEquals(LeafUpdateCode.energy, observerHelper.getUpdateObjects().get(4));
} else {
// error case
fail("all observers should be called at least 4 times and at most 5 times. Here called="
+ observerHelper.nbUpdated());
}
}
}
// check one leaf has been removed from the list
assertEquals(branchPartState.getLeaveStates().size() - 1, branchPart.getLeaves().size());