@@ -18,7 +18,9 @@ package de.danielbechler.diff.identity
1818
1919import de.danielbechler.diff.ObjectDiffer
2020import de.danielbechler.diff.ObjectDifferBuilder
21+ import de.danielbechler.diff.access.CollectionItemAccessor
2122import de.danielbechler.diff.comparison.IdentityStrategy
23+ import de.danielbechler.diff.differ.CollectionDiffer
2224import de.danielbechler.diff.node.DiffNode
2325import de.danielbechler.diff.path.NodePath
2426import de.danielbechler.diff.selector.CollectionItemElementSelector
@@ -27,7 +29,9 @@ import groovy.transform.AutoClone
2729import groovy.transform.EqualsAndHashCode
2830import groovy.transform.ToString
2931import spock.lang.Specification
32+ import spock.lang.Subject
3033
34+ @Subject ([IdentityStrategy , CollectionItemElementSelector , CollectionItemAccessor , CollectionDiffer ])
3135class IdentityStrategyIT extends Specification {
3236
3337 def ' #scenario IdentityStrategy to determine item identity' () {
@@ -59,13 +63,71 @@ class IdentityStrategyIT extends Specification {
5963 node. getChild(workingSelector). state == expectedWorkingState
6064
6165 where :
62- identityStrategyEnabled || expectedBaseState | expectedWorkingState
63- false || DiffNode.State . CHANGED | DiffNode.State . CHANGED
64- true || DiffNode.State . REMOVED | DiffNode.State . ADDED
66+ identityStrategyEnabled | expectedBaseState | expectedWorkingState
67+ false | DiffNode.State . CHANGED | DiffNode.State . CHANGED
68+ true | DiffNode.State . REMOVED | DiffNode.State . ADDED
6569
6670 scenario = identityStrategyEnabled ? ' should use' : ' should not use'
6771 }
6872
73+ def ' should properly get item' () {
74+ given :
75+ def identityStrategy = new CodeIdentityStrategy ()
76+ def working = [new Code (id : ' working' , code : ' 1' )]
77+ def base = [new Code (id : ' base' , code : ' 1' )]
78+ def node = ObjectDifferBuilder . startBuilding()
79+ .comparison(). ofCollectionItems(NodePath . withRoot()). toUse(identityStrategy)
80+ .and(). build()
81+ .compare(working, base)
82+ and :
83+ def targetCode = new Code (code : ' 1' )
84+ def target = [targetCode]
85+ def itemPath = NodePath . startBuilding(). collectionItem(targetCode). build()
86+
87+ expect :
88+ node. getChild(itemPath). canonicalGet(target). is(targetCode)
89+ }
90+
91+ def ' should properly set item' () {
92+ given :
93+ def identityStrategy = new CodeIdentityStrategy ()
94+ def working = [new Code (id : ' working' , code : ' 1' )]
95+ def base = [new Code (id : ' base' , code : ' 1' )]
96+ def node = ObjectDifferBuilder . startBuilding()
97+ .comparison(). ofCollectionItems(NodePath . withRoot()). toUse(identityStrategy)
98+ .and(). build()
99+ .compare(working, base)
100+ and :
101+ def targetCode = new Code (code : ' 1' )
102+ def target = [targetCode]
103+ def itemPath = NodePath . startBuilding(). collectionItem(targetCode). build()
104+
105+ when :
106+ node. getChild(itemPath). canonicalSet(target, new Code (id : ' set' , code : ' 1' ))
107+ then :
108+ node. getChild(itemPath). canonicalGet(target) == new Code (id : ' set' , code : ' 1' )
109+ }
110+
111+ def 'should properly unset (remove ) item' () {
112+ given:
113+ def identityStrategy = new CodeIdentityStrategy()
114+ def working = [new Code(id: ' working' , code: ' 1 ' )]
115+ def base = [new Code(id: ' base' , code: ' 1 ' )]
116+ def node = ObjectDifferBuilder.startBuilding()
117+ .comparison().ofCollectionItems(NodePath.withRoot()).toUse(identityStrategy)
118+ .and().build()
119+ .compare(working, base)
120+ and:
121+ def targetCode = new Code(code: ' 1 ' )
122+ def target = [targetCode]
123+ def itemPath = NodePath.startBuilding().collectionItem(targetCode).build()
124+
125+ when:
126+ node.getChild(itemPath).canonicalUnset(target)
127+ then:
128+ node.getChild(itemPath).canonicalGet(target) == null
129+ }
130+
69131 @AutoClone
70132 @EqualsAndHashCode(includes = [' id' ])
71133 @ToString(includePackage = false)
0 commit comments