Skip to content

Commit b0ff272

Browse files
author
Otávio Santana
committed
Merge pull request #43 from otaviojava/refactor_summary
add default value to summary
2 parents e0b40d9 + 0dd37c9 commit b0ff272

File tree

5 files changed

+183
-18
lines changed

5 files changed

+183
-18
lines changed

src/main/java/org/javamoney/moneta/function/GroupMonetarySummaryStatistics.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
package org.javamoney.moneta.function;
1717

18-
import java.util.HashMap;
1918
import java.util.Map;
2019
import java.util.Objects;
2120

@@ -27,7 +26,7 @@
2726
*/
2827
public class GroupMonetarySummaryStatistics {
2928

30-
private Map<CurrencyUnit, MonetarySummaryStatistics> groupSummary = new HashMap<>();
29+
private Map<CurrencyUnit, MonetarySummaryStatistics> groupSummary = new MonetarySummaryMap();
3130

3231
GroupMonetarySummaryStatistics() {
3332

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package org.javamoney.moneta.function;
2+
3+
import java.util.Collection;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
import java.util.Objects;
7+
import java.util.Set;
8+
9+
import javax.money.CurrencyUnit;
10+
11+
/**
12+
* This map is decorator of HashMap that returns an empty Summary when there
13+
* isn't currency in get's method
14+
* @author otaviojava
15+
*/
16+
class MonetarySummaryMap implements
17+
Map<CurrencyUnit, MonetarySummaryStatistics> {
18+
19+
private Map<CurrencyUnit, MonetarySummaryStatistics> map = new HashMap<>();
20+
21+
@Override
22+
public int size() {
23+
return map.size();
24+
}
25+
26+
@Override
27+
public boolean isEmpty() {
28+
return map.isEmpty();
29+
}
30+
31+
@Override
32+
public boolean containsKey(Object key) {
33+
return map.containsKey(key);
34+
}
35+
36+
@Override
37+
public boolean containsValue(Object value) {
38+
return map.containsValue(value);
39+
}
40+
41+
@Override
42+
public MonetarySummaryStatistics get(Object key) {
43+
if (CurrencyUnit.class.isInstance(key)) {
44+
CurrencyUnit unit = CurrencyUnit.class.cast(key);
45+
return map.getOrDefault(unit, new MonetarySummaryStatistics(unit));
46+
}
47+
return map.get(key);
48+
}
49+
50+
@Override
51+
public MonetarySummaryStatistics put(CurrencyUnit key,
52+
MonetarySummaryStatistics value) {
53+
return map.put(key, value);
54+
}
55+
56+
@Override
57+
public MonetarySummaryStatistics remove(Object key) {
58+
return map.remove(key);
59+
}
60+
61+
@Override
62+
public void putAll(
63+
Map<? extends CurrencyUnit, ? extends MonetarySummaryStatistics> m) {
64+
map.putAll(m);
65+
}
66+
67+
@Override
68+
public void clear() {
69+
map.clear();
70+
}
71+
72+
@Override
73+
public Set<CurrencyUnit> keySet() {
74+
return map.keySet();
75+
}
76+
77+
@Override
78+
public Collection<MonetarySummaryStatistics> values() {
79+
return map.values();
80+
}
81+
82+
@Override
83+
public Set<java.util.Map.Entry<CurrencyUnit, MonetarySummaryStatistics>> entrySet() {
84+
return map.entrySet();
85+
}
86+
87+
@Override
88+
public boolean equals(Object obj) {
89+
if (MonetarySummaryMap.class.isInstance(obj)) {
90+
MonetarySummaryMap other = MonetarySummaryMap.class.cast(obj);
91+
return map.equals(other.map);
92+
}
93+
return false;
94+
}
95+
96+
@Override
97+
public MonetarySummaryStatistics putIfAbsent(CurrencyUnit key,
98+
MonetarySummaryStatistics value) {
99+
MonetarySummaryStatistics v = map.get(key);
100+
if (Objects.isNull(v)) {
101+
v = put(key, value);
102+
}
103+
return v;
104+
}
105+
106+
@Override
107+
public int hashCode() {
108+
return map.hashCode();
109+
}
110+
111+
@Override
112+
public String toString() {
113+
return "MonetarySummaryMap: " + map.toString();
114+
}
115+
}

src/main/java/org/javamoney/moneta/function/MonetarySummaryStatistics.java

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package org.javamoney.moneta.function;
22

3-
import org.javamoney.moneta.FastMoney;
4-
import org.javamoney.moneta.spi.MoneyUtils;
3+
import java.util.Objects;
54

65
import javax.money.CurrencyUnit;
76
import javax.money.MonetaryAmount;
8-
import java.util.Objects;
7+
8+
import org.javamoney.moneta.FastMoney;
99

1010
/**
1111
* A state object for collecting statistics such as count, min, max, sum, and
@@ -43,7 +43,11 @@ public class MonetarySummaryStatistics {
4343
* the input amount value to be addeed, not null.
4444
*/
4545
public void accept(MonetaryAmount amount) {
46-
MoneyUtils.checkAmountParameter(amount, this.empty.getCurrency());
46+
47+
if (!empty.getCurrency().equals(
48+
Objects.requireNonNull(amount).getCurrency())) {
49+
return;
50+
}
4751
if (isEmpty()) {
4852
setSameMonetary(amount);
4953
count++;
@@ -60,6 +64,10 @@ public void accept(MonetaryAmount amount) {
6064
*/
6165
public MonetarySummaryStatistics combine(MonetarySummaryStatistics summaryStatistics) {
6266
Objects.requireNonNull(summaryStatistics);
67+
68+
if (!equals(summaryStatistics)) {
69+
return this;
70+
}
6371
min = MonetaryFunctions.min(min, summaryStatistics.min);
6472
max = MonetaryFunctions.max(max, summaryStatistics.max);
6573
sum = sum.add(summaryStatistics.sum);
@@ -126,10 +134,28 @@ public MonetaryAmount getAverage() {
126134
return average;
127135
}
128136

137+
/**
138+
* will equals when the currency utils were equals
139+
*/
140+
@Override
141+
public boolean equals(Object obj) {
142+
if (MonetarySummaryStatistics.class.isInstance(obj)) {
143+
MonetarySummaryStatistics other = MonetarySummaryStatistics.class.cast(obj);
144+
return Objects.equals(empty.getCurrency(),
145+
other.empty.getCurrency());
146+
}
147+
return false;
148+
}
149+
@Override
150+
public int hashCode() {
151+
return empty.getCurrency().hashCode();
152+
}
153+
129154
@Override
130155
public String toString() {
131156
StringBuilder sb = new StringBuilder();
132-
sb.append("[count:").append(count).append(",");
157+
sb.append("[currency: ").append(empty.getCurrency()).append(",");
158+
sb.append("count:").append(count).append(",");
133159
sb.append("min:").append(min).append(",");
134160
sb.append("max:").append(max).append(",");
135161
sb.append("sum:").append(sum).append(",");

src/test/java/org/javamoney/moneta/function/GroupMonetarySummaryStatisticsTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,14 @@ public void acceptTest() {
3535

3636
Map<CurrencyUnit, MonetarySummaryStatistics> map = group.get();
3737
Assert.assertEquals(map.keySet().size(), 1);
38+
}
3839

40+
@Test
41+
public void shouldReturnsAnEmptySummaryWhenCurrencyThereIsNot() {
42+
GroupMonetarySummaryStatistics group = new GroupMonetarySummaryStatistics();
43+
MonetarySummaryStatistics brazilianSummary = group.get().get(
44+
BRAZILIAN_REAL);
45+
verifySummary(brazilianSummary, 0, 0, 0L);
3946
}
4047

4148
@Test

src/test/java/org/javamoney/moneta/function/MonetarySummaryStatisticsTest.java

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import static org.javamoney.moneta.function.StreamFactory.BRAZILIAN_REAL;
44
import static org.javamoney.moneta.function.StreamFactory.DOLLAR;
55

6-
import javax.money.MonetaryException;
6+
import javax.money.CurrencyUnit;
77

88
import junit.framework.Assert;
99

@@ -31,11 +31,16 @@ public void shouldErrorWhenIsNull() {
3131
summary.accept(null);
3232
}
3333

34-
@Test(expectedExceptions = MonetaryException.class)
35-
public void shouldErrorWhenIsDifferentCurrency() {
34+
@Test
35+
public void shouldStayEmptyWhenIsDifferentCurrency() {
3636
MonetarySummaryStatistics summary = new MonetarySummaryStatistics(
3737
BRAZILIAN_REAL);
3838
summary.accept(Money.of(10, DOLLAR));
39+
Assert.assertEquals(0L, summary.getCount());
40+
Assert.assertEquals(0L, summary.getMin().getNumber().longValue());
41+
Assert.assertEquals(0L, summary.getMax().getNumber().longValue());
42+
Assert.assertEquals(0L, summary.getSum().getNumber().longValue());
43+
Assert.assertEquals(0L, summary.getAverage().getNumber().longValue());
3944
}
4045

4146
@Test
@@ -52,7 +57,7 @@ public void shouldBeSameValueWhenOneMonetaryIsAdded() {
5257

5358
@Test
5459
public void addTest() {
55-
MonetarySummaryStatistics summary = createSummary();
60+
MonetarySummaryStatistics summary = createSummary(BRAZILIAN_REAL);
5661
Assert.assertEquals(3L, summary.getCount());
5762
Assert.assertEquals(10L, summary.getMin().getNumber().longValue());
5863
Assert.assertEquals(110L, summary.getMax().getNumber().longValue());
@@ -62,8 +67,8 @@ public void addTest() {
6267

6368
@Test
6469
public void combineTest() {
65-
MonetarySummaryStatistics summaryA = createSummary();
66-
MonetarySummaryStatistics summaryB = createSummary();
70+
MonetarySummaryStatistics summaryA = createSummary(BRAZILIAN_REAL);
71+
MonetarySummaryStatistics summaryB = createSummary(BRAZILIAN_REAL);
6772
summaryA.combine(summaryB);
6873
Assert.assertEquals(6L, summaryA.getCount());
6974
Assert.assertEquals(10L, summaryA.getMin().getNumber().longValue());
@@ -72,13 +77,26 @@ public void combineTest() {
7277
Assert.assertEquals(70L, summaryA.getAverage().getNumber().longValue());
7378
}
7479

75-
private MonetarySummaryStatistics createSummary() {
80+
@Test
81+
public void shouldIgnoreCombineWhenCurrencyInSummaryAreDifferent() {
82+
MonetarySummaryStatistics summaryA = createSummary(BRAZILIAN_REAL);
83+
MonetarySummaryStatistics summaryB = createSummary(DOLLAR);
84+
summaryA.combine(summaryB);
85+
Assert.assertEquals(3L, summaryA.getCount());
86+
Assert.assertEquals(10L, summaryA.getMin().getNumber().longValue());
87+
Assert.assertEquals(110L, summaryA.getMax().getNumber().longValue());
88+
Assert.assertEquals(210L, summaryA.getSum().getNumber().longValue());
89+
Assert.assertEquals(70L, summaryA.getAverage().getNumber().longValue());
90+
}
91+
92+
private MonetarySummaryStatistics createSummary(CurrencyUnit currencyUnit) {
7693
MonetarySummaryStatistics summary = new MonetarySummaryStatistics(
77-
BRAZILIAN_REAL);
78-
summary.accept(Money.of(10, BRAZILIAN_REAL));
79-
summary.accept(Money.of(90, BRAZILIAN_REAL));
80-
summary.accept(Money.of(110, BRAZILIAN_REAL));
94+
currencyUnit);
95+
summary.accept(Money.of(10, currencyUnit));
96+
summary.accept(Money.of(90, currencyUnit));
97+
summary.accept(Money.of(110, currencyUnit));
8198
return summary;
8299
}
83100

101+
84102
}

0 commit comments

Comments
 (0)