Skip to content

Commit cd02461

Browse files
committed
Finished MapDiffer tests
1 parent a7f1660 commit cd02461

File tree

2 files changed

+83
-61
lines changed

2 files changed

+83
-61
lines changed

src/main/java/de/danielbechler/diff/map/MapEntryAccessor.java

Lines changed: 54 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222

2323
import java.util.Map;
2424

25-
/** @author Daniel Bechler */
25+
/**
26+
* @author Daniel Bechler
27+
*/
2628
public final class MapEntryAccessor implements Accessor
2729
{
2830
private final Object referenceKey;
@@ -33,18 +35,53 @@ public MapEntryAccessor(final Object referenceKey)
3335
this.referenceKey = referenceKey;
3436
}
3537

36-
public Element getPathElement()
38+
public Object getKey(final Map<?, ?> target)
3739
{
38-
return new MapElement(referenceKey);
40+
final Map<Object, Object> map = objectToMap(target);
41+
if (map == null)
42+
{
43+
return null;
44+
}
45+
final Object referenceKey = this.referenceKey;
46+
for (final Object key : map.keySet())
47+
{
48+
if (key == referenceKey || key.equals(referenceKey))
49+
{
50+
return key;
51+
}
52+
}
53+
return null;
3954
}
4055

41-
public void set(final Object target, final Object value)
56+
@Override
57+
public int hashCode()
4258
{
43-
final Map<Object, Object> targetMap = objectToMap(target);
44-
if (targetMap != null)
59+
return referenceKey.hashCode();
60+
}
61+
62+
@Override
63+
public boolean equals(final Object o)
64+
{
65+
if (this == o)
4566
{
46-
targetMap.put(referenceKey, value);
67+
return true;
4768
}
69+
if (o == null || getClass() != o.getClass())
70+
{
71+
return false;
72+
}
73+
return referenceKey.equals(((MapEntryAccessor) o).referenceKey);
74+
}
75+
76+
@Override
77+
public String toString()
78+
{
79+
return "map key " + getPathElement();
80+
}
81+
82+
public Element getPathElement()
83+
{
84+
return new MapElement(referenceKey);
4885
}
4986

5087
public Object get(final Object target)
@@ -57,18 +94,13 @@ public Object get(final Object target)
5794
return null;
5895
}
5996

60-
private static Map<Object, Object> objectToMap(final Object object)
97+
public void set(final Object target, final Object value)
6198
{
62-
if (object == null)
63-
{
64-
return null;
65-
}
66-
if (object instanceof Map)
99+
final Map<Object, Object> targetMap = objectToMap(target);
100+
if (targetMap != null)
67101
{
68-
//noinspection unchecked
69-
return (Map<Object, Object>) object;
102+
targetMap.put(referenceKey, value);
70103
}
71-
throw new IllegalArgumentException(object.getClass().toString());
72104
}
73105

74106
public void unset(final Object target)
@@ -80,55 +112,17 @@ public void unset(final Object target)
80112
}
81113
}
82114

83-
@Override
84-
public String toString()
85-
{
86-
return "map key " + getPathElement();
87-
}
88-
89-
public Object getKey(final Map<?, ?> target)
115+
private static Map<Object, Object> objectToMap(final Object object)
90116
{
91-
final Map<Object, Object> map = objectToMap(target);
92-
if (map == null)
117+
if (object == null)
93118
{
94119
return null;
95120
}
96-
final Object referenceKey = this.referenceKey;
97-
for (final Object key : map.keySet())
98-
{
99-
if (key == referenceKey || key.equals(referenceKey))
100-
{
101-
return key;
102-
}
103-
}
104-
return null;
105-
}
106-
107-
@Override
108-
public boolean equals(Object o)
109-
{
110-
if (this == o)
111-
{
112-
return true;
113-
}
114-
if (o == null || getClass() != o.getClass())
115-
{
116-
return false;
117-
}
118-
119-
MapEntryAccessor that = (MapEntryAccessor) o;
120-
121-
if (referenceKey != null ? !referenceKey.equals(that.referenceKey) : that.referenceKey != null)
121+
if (object instanceof Map)
122122
{
123-
return false;
123+
//noinspection unchecked
124+
return (Map<Object, Object>) object;
124125
}
125-
126-
return true;
127-
}
128-
129-
@Override
130-
public int hashCode()
131-
{
132-
return referenceKey != null ? referenceKey.hashCode() : 0;
126+
throw new IllegalArgumentException(object.getClass().toString());
133127
}
134128
}

src/test/java/de/danielbechler/diff/map/MapEntryAccessorTest.groovy

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ import de.danielbechler.diff.mock.ObjectWithIdentityAndValue
2020
import spock.lang.Shared
2121
import spock.lang.Specification
2222

23-
/** @author Daniel Bechler */
23+
/**
24+
* @author Daniel Bechler
25+
*/
2426
class MapEntryAccessorTest extends Specification {
2527

2628
@Shared
@@ -156,4 +158,30 @@ class MapEntryAccessorTest extends Specification {
156158
then:
157159
notThrown Throwable
158160
}
161+
162+
def "equals should work as expected"() {
163+
given:
164+
def accessor = new MapEntryAccessor("a")
165+
166+
expect:
167+
accessor.equals(otherAccessor) == expectedResult
168+
169+
and: "make sure the same instance is always equal"
170+
accessor.equals(accessor)
171+
172+
where:
173+
otherAccessor || expectedResult
174+
null || false
175+
"foo" || false
176+
new MapEntryAccessor("b") || false
177+
new MapEntryAccessor("a") || true
178+
}
179+
180+
def "hashCode should equal hashCode of referenceKey"() {
181+
setup:
182+
def referenceKey = "foo"
183+
184+
expect:
185+
new MapEntryAccessor(referenceKey).hashCode() == referenceKey.hashCode()
186+
}
159187
}

0 commit comments

Comments
 (0)