1
+ using System . Collections ;
2
+ using NHibernate . Test . NHSpecificTest . NH3932 . Model ;
3
+ using NUnit . Framework ;
4
+
5
+ namespace NHibernate . Test . NHSpecificTest . NH3932
6
+ {
7
+ public abstract class Fixture : BugTestCase
8
+ {
9
+ private IParent storedParent ;
10
+ protected abstract bool CareAboutOrder { get ; }
11
+
12
+ [ Test ]
13
+ public void ShouldKeepDirtyCollectionDirtyAfterMergingClone ( )
14
+ {
15
+ using ( var s = OpenSession ( ) )
16
+ {
17
+ using ( s . BeginTransaction ( ) )
18
+ {
19
+ s . Lock ( storedParent , LockMode . None ) ;
20
+ storedParent . ClearChildren ( ) ;
21
+ Assert . IsTrue ( s . IsDirty ( ) ) ;
22
+
23
+ var loadedClone = storedParent . Clone ( ) ;
24
+ s . Merge ( loadedClone ) ;
25
+ Assert . IsTrue ( s . IsDirty ( ) ) ;
26
+ }
27
+ }
28
+ }
29
+
30
+ [ Test ]
31
+ public void ShouldCareAboutOrder_MergeObjectNotInSession ( )
32
+ {
33
+ var parent = CreateParent ( 2 ) ;
34
+ using ( var s = OpenSession ( ) )
35
+ {
36
+ using ( var tx = s . BeginTransaction ( ) )
37
+ {
38
+ s . Save ( parent ) ;
39
+ tx . Commit ( ) ;
40
+ }
41
+ }
42
+ var parentClone = parent . Clone ( ) ;
43
+ parentClone . ReverseChildren ( ) ;
44
+ using ( var s = OpenSession ( ) )
45
+ {
46
+ s . SessionFactory . Statistics . Clear ( ) ;
47
+ using ( var tx = s . BeginTransaction ( ) )
48
+ {
49
+ s . Merge ( parentClone ) ;
50
+ tx . Commit ( ) ;
51
+ }
52
+ Assert . That ( s . SessionFactory . Statistics . EntityUpdateCount , CareAboutOrder ? Is . EqualTo ( 1 ) : Is . EqualTo ( 0 ) ) ;
53
+ }
54
+ }
55
+
56
+ [ Test ]
57
+ public void ShouldCareAboutOrder_MergeObjectInSession ( )
58
+ {
59
+ var parent = CreateParent ( 2 ) ;
60
+ using ( var s = OpenSession ( ) )
61
+ {
62
+ using ( var tx = s . BeginTransaction ( ) )
63
+ {
64
+ s . Save ( parent ) ;
65
+ tx . Commit ( ) ;
66
+ }
67
+ }
68
+ var parentClone = parent . Clone ( ) ;
69
+ parentClone . ReverseChildren ( ) ;
70
+ using ( var s = OpenSession ( ) )
71
+ {
72
+ s . SessionFactory . Statistics . Clear ( ) ;
73
+ using ( var tx = s . BeginTransaction ( ) )
74
+ {
75
+ s . Lock ( parent , LockMode . None ) ;
76
+ s . Merge ( parentClone ) ;
77
+ tx . Commit ( ) ;
78
+ }
79
+ Assert . That ( s . SessionFactory . Statistics . EntityUpdateCount , CareAboutOrder ? Is . EqualTo ( 1 ) : Is . EqualTo ( 0 ) ) ;
80
+ }
81
+ }
82
+
83
+ [ Test ]
84
+ public void MergeCleanCloneShouldNotResultInUpdate ( )
85
+ {
86
+ var parentClone = storedParent . Clone ( ) ;
87
+ using ( var s = OpenSession ( ) )
88
+ {
89
+ s . SessionFactory . Statistics . Clear ( ) ;
90
+ using ( var tx = s . BeginTransaction ( ) )
91
+ {
92
+ s . Merge ( parentClone ) ;
93
+ tx . Commit ( ) ;
94
+ }
95
+ Assert . That ( s . SessionFactory . Statistics . EntityUpdateCount , Is . EqualTo ( 0 ) ) ;
96
+ }
97
+ }
98
+
99
+ [ Test ]
100
+ public void MergeCleanCloneShouldNotMakeSessionDirty ( )
101
+ {
102
+ var parentClone = storedParent . Clone ( ) ;
103
+ using ( var s = OpenSession ( ) )
104
+ {
105
+ s . SessionFactory . Statistics . Clear ( ) ;
106
+ using ( var tx = s . BeginTransaction ( ) )
107
+ {
108
+ s . Merge ( parentClone ) ;
109
+ Assert . That ( s . IsDirty ( ) , Is . False ) ;
110
+ tx . Commit ( ) ;
111
+ }
112
+ }
113
+ }
114
+
115
+ [ Test ]
116
+ public void MergeCloneOnNonCloneShouldNotResultInUpdate ( )
117
+ {
118
+ var parentClone = storedParent . Clone ( ) ;
119
+ using ( var s = OpenSession ( ) )
120
+ {
121
+ s . SessionFactory . Statistics . Clear ( ) ;
122
+ using ( var tx = s . BeginTransaction ( ) )
123
+ {
124
+ s . Lock ( storedParent , LockMode . None ) ;
125
+ s . Merge ( parentClone ) ;
126
+ tx . Commit ( ) ;
127
+ }
128
+ Assert . That ( s . SessionFactory . Statistics . EntityUpdateCount , Is . EqualTo ( 0 ) ) ;
129
+ }
130
+ }
131
+
132
+ [ Test ]
133
+ public void MergeCloneOnNonCloneShouldNotMakeSessionDirty ( )
134
+ {
135
+ var parentClone = storedParent . Clone ( ) ;
136
+ using ( var s = OpenSession ( ) )
137
+ {
138
+ s . SessionFactory . Statistics . Clear ( ) ;
139
+ using ( var tx = s . BeginTransaction ( ) )
140
+ {
141
+ s . Lock ( storedParent , LockMode . None ) ;
142
+ s . Merge ( parentClone ) ;
143
+ Assert . That ( s . IsDirty ( ) , Is . False ) ;
144
+ tx . Commit ( ) ;
145
+ }
146
+ }
147
+ }
148
+
149
+ [ Test ]
150
+ public void MoreElementsInTargetShouldBeTreatedAsDirty ( )
151
+ {
152
+ var parent = CreateParent ( 2 ) ;
153
+ using ( var s = OpenSession ( ) )
154
+ {
155
+ using ( var tx = s . BeginTransaction ( ) )
156
+ {
157
+ s . Save ( parent ) ;
158
+ tx . Commit ( ) ;
159
+ }
160
+ }
161
+ var parentClone = parent . Clone ( ) ;
162
+ parentClone . RemoveLastChild ( ) ;
163
+ using ( var s = OpenSession ( ) )
164
+ {
165
+ s . SessionFactory . Statistics . Clear ( ) ;
166
+ using ( var tx = s . BeginTransaction ( ) )
167
+ {
168
+ s . Merge ( parentClone ) ;
169
+ tx . Commit ( ) ;
170
+ }
171
+ Assert . That ( s . SessionFactory . Statistics . EntityUpdateCount , Is . EqualTo ( 1 ) ) ;
172
+ }
173
+ }
174
+
175
+ protected abstract IParent CreateParent ( int numberOfChildren ) ;
176
+
177
+ protected override void OnSetUp ( )
178
+ {
179
+ storedParent = CreateParent ( 1 ) ;
180
+ using ( var s = OpenSession ( ) )
181
+ {
182
+ using ( var tx = s . BeginTransaction ( ) )
183
+ {
184
+ s . Save ( storedParent ) ;
185
+ tx . Commit ( ) ;
186
+ }
187
+ }
188
+ }
189
+
190
+ protected override void OnTearDown ( )
191
+ {
192
+ using ( var s = sessions . OpenSession ( ) )
193
+ {
194
+ using ( var tx = s . BeginTransaction ( ) )
195
+ {
196
+ s . Delete ( "from " + storedParent . GetType ( ) ) ;
197
+ tx . Commit ( ) ;
198
+ }
199
+ }
200
+ }
201
+
202
+ protected override void Configure ( Cfg . Configuration configuration )
203
+ {
204
+ configuration . SetProperty ( Cfg . Environment . GenerateStatistics , "true" ) ;
205
+ }
206
+
207
+ protected override IList Mappings => new [ ] { "NHSpecificTest." + BugNumber + ".Model.Mappings.hbm.xml" } ;
208
+ }
209
+ }
0 commit comments