@@ -18,137 +18,66 @@ package de.danielbechler.diff.identity
1818
1919import de.danielbechler.diff.ObjectDifferBuilder
2020import de.danielbechler.diff.comparison.IdentityStrategy
21- import de.danielbechler.diff.node.DiffNode
22- import de.danielbechler.diff.node.Visit
2321import de.danielbechler.diff.path.NodePath
2422import de.danielbechler.diff.selector.CollectionItemElementSelector
23+ import groovy.transform.AutoClone
24+ import groovy.transform.EqualsAndHashCode
25+ import groovy.transform.ToString
2526import spock.lang.Specification
2627
2728class IdentityStrategyIT extends Specification {
2829
29- List<A> list1 = [
30- new A(id : " Id1" , code : " Code1" ),
31- new A(id : " Id2" , code : " Code2" ),
32- new A(id : " Id3" , code : " Code3" )
33- ]
34- List<A> list2 = [
35- new A(id : " Id1" , code : " Code1" ),
36- new A(id : " Id2" , code : " Code2" ),
37- new A(id : " Id3" , code : " Code3" )
38- ]
39- List<A> list2b = [
40- new A(id : " Id2" , code : " Code2" ),
41- new A(id : " Id3" , code : " Code3" ),
42- new A(id : " Id1" , code : " Code1" )
43- ]
44- List<A> list3 = [
45- new A(id : " Id1" , code : " Code1" ),
46- new A(id : " Id2" , code : " newCode" ),
47- new A(id : " newId" , code : " Code2" )
48- ]
30+ Code code1 = new Code (id : " Id1" , code : " Code1" )
31+ Code code2 = new Code (id : " Id2" , code : " Code2" )
32+ Code code3 = new Code (id : " Id3" , code : " Code3" )
4933
50- // def 'Test default equals SAME'() {
51- // when:
52- // def diffNode = ObjectDifferBuilder.startBuilding()
53- // .build().compare(list2, list1)
54- // then:
55- // diffNode.untouched
56- // }
57- //
58- // def 'Test default equals SAME B'() {
59- // when:
60- // def diffNode = ObjectDifferBuilder.startBuilding()
61- // .build().compare(list2b, list1)
62- // then:
63- // diffNode.untouched
64- // }
65- //
66- // def 'Test default equals CHANGED'() {
67- // when:
68- // def diffNode = ObjectDifferBuilder.startBuilding()
69- // .build().compare(list3, list1)
70- // then:
71- // diffNode.changed
72- // diffNode.getChild(new CollectionItemElementSelector(new A(id: "Id1"))) == null
73- // diffNode.getChild(new CollectionItemElementSelector(new A(id: "Id2"))).changed
74- // diffNode.getChild(new CollectionItemElementSelector(new A(id: "newId"))).added
75- // diffNode.getChild(new CollectionItemElementSelector(new A(id: "Id3"))).removed
76- // }
77- //
78- // def 'Test field CODE equals SAME'() {
79- // when:
80- // def diffNode = ObjectDifferBuilder.startBuilding()
81- // .comparison().ofType(A).toUseEqualsMethodOfValueProvidedByMethod("getCode").and()
82- // .build().compare(list2, list1)
83- // then:
84- // diffNode.state == DiffNode.State.UNTOUCHED
85- // }
86- //
87- // def 'Test field CODE equals SAME B'() {
88- // when:
89- // def diffNode = ObjectDifferBuilder.startBuilding()
90- // .identity().ofType(A).toUse(new CodeIdentity()).and()
91- // .build().compare(list2b, list1)
92- // then:
93- // diffNode.state == DiffNode.State.UNTOUCHED
94- // }
34+ def ' Test field CODE equals CHANGED' () {
35+ given :
36+ def code2WithModifiedCode = new Code (id : code2. id, code : " newCode" )
37+ def code2WithModifiedId = new Code (id : " newId" , code : code2. code)
38+ def base = [code1, code2, code3]
39+ def working = [code1. clone(), code2WithModifiedCode, code2WithModifiedId]
40+ when :
41+ def codeStrategy = new CodeIdentity ()
42+ def diffNode = ObjectDifferBuilder . startBuilding()
43+ .comparison(). ofCollectionItems(NodePath . withRoot())
44+ .toUse(codeStrategy). and()
45+ .build(). compare(working, base)
46+ then :
47+ diffNode. getChild(new CollectionItemElementSelector (new Code (code : " Code1" ), codeStrategy)) == null
48+ diffNode. getChild(new CollectionItemElementSelector (new Code (code : " newCode" ), codeStrategy)). added
49+ diffNode. getChild(new CollectionItemElementSelector (new Code (code : " Code2" ), codeStrategy)). changed
50+ diffNode. getChild(new CollectionItemElementSelector (new Code (code : " Code3" ), codeStrategy)). removed
51+ }
9552
96- def ' Test field CODE equals equals CHANGED' () {
97- when :
98- def codeStrategy = new CodeIdentity ();
99- def diffNode = ObjectDifferBuilder . startBuilding()
100- .comparison(). ofCollectionItems(NodePath . withRoot()) // TODO configuration shouldn't be like this!
101- .toUse(codeStrategy). and()
102- .build(). compare(list3, list1)
103- then :
104- diffNode. state == DiffNode.State . CHANGED
105- diffNode. getChild(new CollectionItemElementSelector (new A(code : " Code1" ), codeStrategy)) == null
106- diffNode. getChild(new CollectionItemElementSelector (new A(code : " newCode" ), codeStrategy)). added
107- diffNode. getChild(new CollectionItemElementSelector (new A(code : " Code2" ), codeStrategy)). changed
108- diffNode. getChild(new CollectionItemElementSelector (new A(code : " Code3" ), codeStrategy)). removed
109- }
53+ def ' should detect addition via IdentityStrategy' () {
54+ given :
55+ def codeStrategy = new CodeIdentity ()
56+ def baseCode = new Code (id : " foo" , code : " original code" )
57+ def workingCode = new Code (id : " foo" , code : " modified code" )
58+ expect : ' without identity strategy'
59+ ObjectDifferBuilder . startBuilding(). build()
60+ .compare([workingCode], [baseCode])
61+ .getChild(new CollectionItemElementSelector (workingCode. clone())). changed
62+ and : ' with identity strategy'
63+ ObjectDifferBuilder . startBuilding()
64+ .comparison(). ofCollectionItems(NodePath . withRoot()). toUse(codeStrategy). and(). build()
65+ .compare([workingCode], [baseCode])
66+ .getChild(new CollectionItemElementSelector (workingCode. clone(), codeStrategy)). added
67+ }
11068
111- private void print (final DiffNode diffNode , final Object working ,
112- final Object base ) {
113- diffNode. visit(new DiffNode.Visitor () {
114- @Override
115- void node (final DiffNode node , final Visit visit ) {
116- System . out. println (" " + node. getPath() + " " + node. getState() + " "
117- + node. canonicalGet(base) + " => " + node. canonicalGet(working))
118- }
119- })
120- }
69+ @AutoClone
70+ @EqualsAndHashCode (includes = [' id' ])
71+ @ToString (includePackage = false )
72+ public static class Code {
73+ String id
74+ String code
75+ }
12176
122- public static class A {
123- String id;
124- String code;
125-
126- String getCode () {
127- return code
128- }
129-
130- @Override
131- boolean equals (final o ) {
132- if (this . is(o)) return true
133- if (! (o instanceof A)) return false
134-
135- A a = (A) o
136-
137- if (! Objects . equals(id, a. id)) return false
138-
139- return true
140- }
141-
142- @Override
143- int hashCode () {
144- return (id != null ? id. hashCode() : 0 )
145- }
146- }
147-
148- public static class CodeIdentity implements IdentityStrategy {
149- @Override
150- boolean equals (final Object working , final Object base ) {
151- return Objects . equals(((A) working). getCode(), ((A) base). getCode());
152- }
153- }
77+ public static class CodeIdentity implements IdentityStrategy {
78+ @Override
79+ boolean equals (final Object working , final Object base ) {
80+ return Objects . equals(((Code ) working). getCode(), ((Code ) base). getCode())
81+ }
82+ }
15483}
0 commit comments