Datei: IntegrationTests/IntegrationTests/NDOMitarbeiterReiseTests.cs

Last Commit (9d1552b)
1 //
2 // Copyright (c) 2002-2016 Mirko Matytschak
3 // (www.netdataobjects.de)
4 //
5 // Author: Mirko Matytschak
6 //
7 // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
8 // documentation files (the "Software"), to deal in the Software without restriction, including without limitation
9 // the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
10 // Software, and to permit persons to whom the Software is furnished to do so, subject to the following
11 // conditions:
12
13 // The above copyright notice and this permission notice shall be included in all copies or substantial portions
14 // of the Software.
15 //
16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
17 // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
19 // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20 // DEALINGS IN THE SOFTWARE.
21
22
23 using System;
24 using System.Linq;
25 using System.Reflection;
26 using System.Collections;
27 using System.Collections.Generic;
28 using NUnit.Framework;
29 using NDO;
30 using NDO.Query;
31 using Reisekosten;
32 using Reisekosten.Personal;
33 using NDO.Linq;
34 using NDO.Mapping;
 
35
36 namespace NdoUnitTests
37 {
38 ····/// <summary>
39 ····/// Combined Tests of Mitarbeiter and Reise to test uniqueness of object ids.
40 ····/// </summary>
41 ····[TestFixture]
42 public class NDOMitarbeiterReiseTests
43 ····{
44 ········public NDOMitarbeiterReiseTests()
45 ········{
46 ········}
47
48 ········private PersistenceManager pm;
49 ········private Mitarbeiter m;
50 ········private Reise r;
51
52 ········[SetUp]
53 ········public void Setup() {
54 ············pm = PmFactory.NewPersistenceManager();
55 ············m = CreateMitarbeiter("Hartmut", "Kocher");
56 ············r = CreateReise("ADC");
57 ········}
58
59 ········[TearDown]
60 ········public void TearDown() {
61 ············pm.Abort();
62 ············pm.UnloadCache();
63 IList mitarbeiterListe = pm. GetClassExtent( typeof( Mitarbeiter) , true) ;
64 ············pm.Delete(mitarbeiterListe);
65 ············pm.Save();
 
66 ············pm.Close();
67 ············pm.GetSqlPassThroughHandler().Execute( "DELETE FROM " + pm.NDOMapping.FindClass( typeof( Reise ) ).TableName );
68 ············pm.Dispose();
69 ········}
70
71 ········[Test]
72 ········public void TestCreateObjects() {
73 ············pm.MakePersistent(m);
74 ············pm.MakePersistent(r);
75 ············Assert.That(!m.NDOObjectId.Equals(r.NDOObjectId), "Ids should be different");
76 ············m = (Mitarbeiter)pm.FindObject(m.NDOObjectId);
77 ············r = (Reise)pm.FindObject(r.NDOObjectId);
78 ········}
79
80 ········[Test]
81 ········public void TestCreateObjectsSave() {
82 ············m.Hinzufuegen(r);
83 ············pm.MakePersistent(m);
84 ············pm.Save();
85 ············Assert.That(!m.NDOObjectId.Equals(r.NDOObjectId), "Ids should be different");
86 ············m = (Mitarbeiter)pm.FindObject(m.NDOObjectId);
87 ············r = (Reise)pm.FindObject(r.NDOObjectId);
88 ············Assert.That(m != null, "1. Mitarbeiter not found");
89 ············Assert.That(r != null, "1. Reise not found");
90
91 ············pm.UnloadCache();
92 ············m = (Mitarbeiter)pm.FindObject(m.NDOObjectId);
93 ············r = (Reise)pm.FindObject(r.NDOObjectId);
94 ············Assert.That(m != null, "2. Mitarbeiter not found");
95 ············Assert.That(r != null, "2. Reise not found");
96 ········}
97
98 ········[Test]
99 ········public void TestAddObjectSave() {
100 ············pm.MakePersistent(m);
101 ············pm.Save();
102 ············m.Hinzufuegen(r);
103 ············Assert.That(NDOObjectState.Created ==··r.NDOObjectState, "1. Wrong state");
104 ············pm.Save();
105 ············m = (Mitarbeiter)pm.FindObject(m.NDOObjectId);
106 ············r = (Reise)pm.FindObject(r.NDOObjectId);
107 ············Assert.That(m != null, "1. Mitarbeiter not found");
108 ············Assert.That(r != null, "1. Reise not found");
109 ············Assert.That(NDOObjectState.Persistent ==··r.NDOObjectState, "2. Wrong state");
110 ········}
111
112 ········int GetOrdinal(Relation r)
113 ········{
114 ············var t = r.Parent.SystemType;
115 ············Type mcType = t.GetNestedType( "MetaClass", BindingFlags.NonPublic | BindingFlags.Public );
116 ············if (null == mcType)
117 ················throw new NDOException( 13, "Missing nested class 'MetaClass' for type '" + t.Name + "'; the type doesn't seem to be enhanced." );
118 ············var mc = (IMetaClass2)Activator.CreateInstance( mcType, t );
119 ············return mc.GetRelationOrdinal( r.FieldName );
120 ········}
121
122 ········bool IsLoaded(IPersistentObject pc, Relation r)
123 ········{
124 ············return ((IPersistenceCapable)pc).NDOLoadState.RelationLoadState[GetOrdinal( r )];
125 ········}
126
127 ········[Test]
128 ········public void RestorePreservesRelationLists()
129 ········{
130 ············pm.MakePersistent( m );
131 ············pm.Save();
132 ············m.Hinzufuegen( r );
133 ············pm.Save();
134 ············Assert.That(1 ==··m.Reisen.Count );
135
136 ············pm.UnloadCache();
137 ············var m2 = pm.Objects<Mitarbeiter>().Single();
138
139 ············var relation = pm.NDOMapping.FindClass( typeof( Mitarbeiter ) ).FindRelation( "dieReisen" );
140
141 ············Assert.That( !IsLoaded( m2, relation ) );
142 ············var list = m2.Reisen;
143 ············m2.Vorname = "Testxxxx";
144
145 ············Assert.That( IsLoaded( m2, relation ) );
146
147 ············pm.Restore( m2 );
148 ············m2.Nachname = "Testyyyy";
149 ············pm.Save();
150
151
152 ············Assert.That(1 ==··m2.Reisen.Count );
153 ········}
154
155 ········[Test]
156 ········public void TestAddObjectAbort() {
157 ············pm.MakePersistent(m);
158 ············pm.Save();
159 ············m.Hinzufuegen(r);
160 ············Assert.That(NDOObjectState.Created ==··r.NDOObjectState, "1. Wrong state");
161 ············Assert.That(1 ==··m.Reisen.Count, "1. Wrong number of objects");
162 ············pm.Abort();
163 ············Assert.That(NDOObjectState.Transient ==··r.NDOObjectState, "2. Wrong state");
164 ············Assert.That(0 ==··m.Reisen.Count, "2. Wrong number of objects");
165 ········}
166 ········[Test]
167 ········public void TestRemoveObjectSave() {
168 ············pm.MakePersistent(m);
169 ············m.Hinzufuegen(r);
170 ············pm.Save();
171 ············Assert.That(1 ==··m.Reisen.Count, "1. Wrong number of objects");
172 ············m.Löschen(r);
173 ············Assert.That(NDOObjectState.Deleted ==··r.NDOObjectState, "1. Wrong state");
174 ············Assert.That(0 ==··m.Reisen.Count, "2. Wrong number of objects");
175 ············pm.Save();
176 ············Assert.That(0 ==··m.Reisen.Count, "3. Wrong number of objects");
177 ············Assert.That(NDOObjectState.Transient ==··r.NDOObjectState, "2. Wrong state");
178 ········}
179 ············
180 ········[Test]
181 ········public void TestRemoveObjectAbort() {
182 ············pm.MakePersistent(m);
183 ············m.Hinzufuegen(r);
184 ············pm.Save();
185 ············Assert.That(1 ==··m.Reisen.Count, "1. Wrong number of objects");
186 ············m.Löschen(r);
187 ············Assert.That(NDOObjectState.Deleted ==··r.NDOObjectState, "1. Wrong state");
188 ············Assert.That(0 ==··m.Reisen.Count, "2. Wrong number of objects");
189 ············pm.Abort();
190 ············Assert.That(1 ==··m.Reisen.Count, "3. Wrong number of objects");
191 ············Assert.That(NDOObjectState.Persistent ==··r.NDOObjectState, "2. Wrong state");
192 ········}
193
194 ········[Test]
195 ········public void TestDeleteSave() {
196 ············pm.MakePersistent(m);
197 ············m.Hinzufuegen(r);
198 ············pm.Save();
199 ············pm.Delete(m);
200 ············Assert.That(NDOObjectState.Deleted ==··m.NDOObjectState, "1. Wrong state");
201 ············Assert.That(NDOObjectState.Deleted ==··r.NDOObjectState, "2. Wrong state");
202 ············pm.Save();
203 ············Assert.That(NDOObjectState.Transient ==··m.NDOObjectState, "1. Wrong state");
204 ············Assert.That(NDOObjectState.Transient ==··r.NDOObjectState, "2. Wrong state");
205 ········}
206
207
208
209 ········[Test]
210 ········public void TestDeleteAbort() {
211 ············pm.MakePersistent(m);
212 ············m.Hinzufuegen(r);
213 ············pm.Save();
214 ············pm.Delete(m);
215 ············Assert.That(NDOObjectState.Deleted ==··m.NDOObjectState, "1. Wrong state");
216 ············Assert.That(NDOObjectState.Deleted ==··r.NDOObjectState, "2. Wrong state");
217 ············pm.Abort();
218 ············Assert.That(NDOObjectState.Persistent ==··m.NDOObjectState, "1. Wrong state");
219 ············Assert.That(NDOObjectState.Persistent ==··r.NDOObjectState, "2. Wrong state");
220 ········}
221
222 ········[Test]
223 ········public void TestAddRemoveSave() {
224 ············pm.MakePersistent(m);
225 ············pm.Save();
226 ············m.Hinzufuegen(r);
227 ············m.Löschen(r);
228 ············Assert.That(NDOObjectState.Transient ==··r.NDOObjectState, "1. Wrong state");
229 ············pm.Save();
230 ············Assert.That(NDOObjectState.Transient ==··r.NDOObjectState, "2. Wrong state");
231 ········}
232
233 ········[Test]
234 ········public void TestAddRemoveAbort() {
235 ············pm.MakePersistent(m);
236 ············pm.Save();
237 ············m.Hinzufuegen(r);
238 ············m.Löschen(r);
239 ············Assert.That(NDOObjectState.Transient ==··r.NDOObjectState, "1. Wrong state");
240 ············pm.Abort();
241 ············Assert.That(NDOObjectState.Transient ==··r.NDOObjectState, "2. Wrong state");
242 ········}
243
244 ········[Test]
245 ········public void TestClearRelatedObjectsSave() {
246 ············for(int i = 0; i < 10; i++) {
247 ················m.Hinzufuegen(CreateReise(i.ToString()));
248 ············}
249 ············pm.MakePersistent(m);
250 ············pm.Save();
251 ············IList rr = new ArrayList(m.Reisen);
252 ············m.LöscheReisen();
253 ············Assert.That(0 ==··m.Reisen.Count, "1. Wrong number of objects");
254 ············for(int i = 0; i < 10; i++) {
255 ················Assert.That(NDOObjectState.Deleted ==··((Reise)rr[i]).NDOObjectState, "2. Wrong state");
256 ············}
257 ············pm.Save();
258 ············Assert.That(0 ==··m.Reisen.Count, "3. Wrong number of objects");
259 ············for(int i = 0; i < 10; i++) {
260 ················Assert.That(NDOObjectState.Transient ==··((Reise)rr[i]).NDOObjectState, "4. Wrong state");
261 ············}
262 ········}
263
264 ········[Test]
265 ········public void TestClearRelatedObjectsAbort() {
266 ············for(int i = 0; i < 10; i++) {
267 ················m.Hinzufuegen(CreateReise(i.ToString()));
268 ············}
269 ············pm.MakePersistent(m);
270 ············pm.Save();
271 ············IList rr = new ArrayList(m.Reisen);
272 ············m.LöscheReisen();
273 ············Assert.That(0 ==··m.Reisen.Count, "1. Wrong number of objects");
274 ············for(int i = 0; i < 10; i++) {
275 ················Assert.That(NDOObjectState.Deleted ==··((Reise)rr[i]).NDOObjectState, "2. Wrong state");
276 ············}
277 ············pm.Abort();
278 ············Assert.That(10 ==··m.Reisen.Count, "3. Wrong number of objects");
279 ············for(int i = 0; i < 10; i++) {
280 ················Assert.That(NDOObjectState.Persistent ==··((Reise)rr[i]).NDOObjectState, "4. Wrong state");
281 ············}
282 ········}
283
284 ········[Test]
285 ········public void TestAssignRelatedObjectsNullSave() {
286 ············for(int i = 0; i < 3; i++) {
287 ················m.Hinzufuegen(CreateReise(i.ToString()));
288 ············}
289 ············pm.MakePersistent(m);
290 ············pm.Save();
291 ············IList rr = new ArrayList(m.Reisen);
292 ············m.ErsetzeReisen(null);
293 ············Assert.That(m.Reisen == null, "No objects should be there");
294 ············for(int i = 0; i < 3; i++) {
295 ················Assert.That(NDOObjectState.Deleted ==··((Reise)rr[i]).NDOObjectState, "2. Wrong state");
296 ············}
297 ············pm.Save();
298 ············Assert.That(m.Reisen == null, "No objects should be there");
299 ············for(int i = 0; i < 3; i++) {
300 ················Assert.That(NDOObjectState.Transient ==··((Reise)rr[i]).NDOObjectState, "4. Wrong state");
301 ············}
302 ········}
303
304 ········[Test]
305 ········public void TestAssignRelatedObjectsNullAbort() {
306 ············for(int i = 0; i < 3; i++) {
307 ················m.Hinzufuegen(CreateReise(i.ToString()));
308 ············}
309 ············pm.MakePersistent(m);
310 ············pm.Save();
311 ············IList rr = new ArrayList(m.Reisen);
312 ············m.ErsetzeReisen(null);
313 ············Assert.That(m.Reisen == null, "No objects should be there");
314 ············for(int i = 0; i < 3; i++) {
315 ················Assert.That(NDOObjectState.Deleted ==··((Reise)rr[i]).NDOObjectState, "2. Wrong state");
316 ············}
317 ············pm.Abort();
318 ············Assert.That(3 ==··m.Reisen.Count, "3. Wrong number of objects");
319 ············for(int i = 0; i < 3; i++) {
320 ················Assert.That(NDOObjectState.Persistent ==··((Reise)rr[i]).NDOObjectState, "4. Wrong state");
321 ············}
322 ········}
323
324 ········[Test]
325 ········public void TestAssignRelatedObjectsSave() {
326 ············for(int i = 0; i < 3; i++) {
327 ················m.Hinzufuegen(CreateReise(i.ToString()));
328 ············}
329 ············pm.MakePersistent(m);
330 ············pm.Save();
331 ············IList neueReisen = new ArrayList();
332 ············Reise nr = CreateReise("Test");
333 ············neueReisen.Add(nr);
334
335 ············IList rr = new ArrayList(m.Reisen);
336 ············m.ErsetzeReisen(neueReisen);
337 ············Assert.That(1 ==··m.Reisen.Count, "1. Wrong number of objects");
338 ············for(int i = 0; i < 3; i++) {
339 ················Assert.That(NDOObjectState.Deleted ==··((Reise)rr[i]).NDOObjectState, "2. Wrong state");
340 ············}
341 ············Assert.That(NDOObjectState.Created ==··nr.NDOObjectState, "3. Wrong state");
342
343 ············pm.Save();
344 ············Assert.That(1 ==··m.Reisen.Count, "4. Wrong number of objects");
345 ············for(int i = 0; i < 3; i++) {
346 ················Assert.That(NDOObjectState.Transient ==··((Reise)rr[i]).NDOObjectState, "5. Wrong state");
347 ············}
348 ············Assert.That(NDOObjectState.Persistent ==··nr.NDOObjectState, "6. Wrong state");
349 ········}
350
351 ········[Test]
352 ········public void TestAssignRelatedObjectsAbort() {
353 ············for(int i = 0; i < 3; i++) {
354 ················m.Hinzufuegen(CreateReise(i.ToString()));
355 ············}
356 ············pm.MakePersistent(m);
357 ············pm.Save();
358 ············IList neueReisen = new ArrayList();
359 ············Reise nr = CreateReise("Test");
360 ············neueReisen.Add(nr);
361
362 ············IList rr = new ArrayList(m.Reisen);
363 ············m.ErsetzeReisen(neueReisen);
364 ············Assert.That(1 ==··m.Reisen.Count, "1. Wrong number of objects");
365 ············for(int i = 0; i < 3; i++) {
366 ················Assert.That(NDOObjectState.Deleted ==··((Reise)rr[i]).NDOObjectState, "2. Wrong state");
367 ············}
368 ············Assert.That(NDOObjectState.Created ==··nr.NDOObjectState, "3. Wrong state");
369
370 ············pm.Abort();
371 ············Assert.That(3 ==··m.Reisen.Count, "4. Wrong number of objects");
372 ············for(int i = 0; i < 3; i++) {
373 ················Assert.That(NDOObjectState.Persistent ==··((Reise)rr[i]).NDOObjectState, "5. Wrong state");
374 ············}
375 ············Assert.That(NDOObjectState.Transient ==··nr.NDOObjectState, "6. Wrong state");
376 ········}
377
378 ········[Test]
379 ········public void TestAddNewReise()
380 ········{
381 ············m.Hinzufuegen(r);
382 ············pm.MakePersistent(m);
383 ············pm.Save();
384 ············pm.UnloadCache();
385 ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm);
386 ············m = q.ExecuteSingle(true);
387 ············Reise r2 = CreateReise("Schnulli");
388 ············m.Hinzufuegen(r2);
389 ············pm.Save();
390 ············m = q.ExecuteSingle(true);
391 ············Assert.That(2 ==··m.Reisen.Count, "Count wrong");
392 ········}
393
394 ········[Test]
395 ········public void RefreshReloadsRelation()
396 ········{
397 ············m.Hinzufuegen( r );
398 ············pm.MakePersistent( m );
399 ············pm.Save();
400 ············PersistenceManager pm2 = PmFactory.NewPersistenceManager();
401 ············Mitarbeiter m2 = pm2.Objects<Mitarbeiter>().ResultTable.First();
402 ············Assert.That(m.Reisen.Count ==··m2.Reisen.Count );
403 ············Assert.That(1 ==··m.Reisen.Count );
404 ············Reise r2 = new Reise() { Zweck = "Test" };
405 ············m2.Hinzufuegen( r2 );
406 ············pm2.Save();
407 ············Assert.That(1 ==··m.Reisen.Count );
408 ············pm.Refresh( m );
409 ············Assert.That(2 ==··m.Reisen.Count );
410 ········}
411
412 ········[Test]
413 ········public void CanIterateThrougRelatedObjectsWithLinq()
414 ········{
415 ············m.Hinzufuegen( r );
416 ············r = new Reise() { Zweck = "Test" };
417 ············m.Hinzufuegen( r );
418 ············pm.MakePersistent( m );
419 ············pm.Save();
420 ············Assert.That(2 ==··m.Reisen.Count );
421 ············ObjectId oid = m.NDOObjectId;
422 ············pm.UnloadCache();
423 ············pm = PmFactory.NewPersistenceManager();
424 ············m = (Mitarbeiter) pm.FindObject( oid );
425 ············Assert.That( m.NDOObjectState == NDOObjectState.Hollow );
426 ············Reise tr = (from reise in m.Reisen where reise.Zweck == "Test" select reise).SingleOrDefault();
427 ············Assert.That(tr··!= null);
428 ············Assert.That("Test" ==··tr.Zweck );
429 ········}
430
431 ········[Test]
432 ········public void TestHollow() {
433 ············m.Hinzufuegen(r);
434 ············pm.MakePersistent(m);
435 ············pm.Save();
436 ············pm.MakeHollow(m);
437 ············Assert.That(NDOObjectState.Hollow ==··m.NDOObjectState, "1: Mitarbeiter should be hollow");
438 ············Assert.That(NDOObjectState.Persistent ==··r.NDOObjectState, "1: Reise should be persistent");
439 ············IList reise = m.Reisen;
440
441 ············pm.MakeHollow(m, true);
442 ············Assert.That(NDOObjectState.Hollow ==··m.NDOObjectState, "2: Mitarbeiter should be hollow");
443 ············Assert.That(NDOObjectState.Hollow ==··r.NDOObjectState, "2: Reise should be hollow");
444
445 ············reise = m.Reisen;
446 ············Assert.That(NDOObjectState.Persistent ==··m.NDOObjectState, "3: Mitarbeiter should be persistent");
447 ············Assert.That(NDOObjectState.Hollow ==··r.NDOObjectState, "3: Reise should be hollow");
448 ············Assert.That("ADC" ==··r.Zweck, "3: Reise should have correct Zweck");
449 ············Assert.That(NDOObjectState.Persistent ==··r.NDOObjectState, "4: Reise should be persistent");
450 ········}
451
452 ········[Test]
453 ········public void··TestMakeAllHollow() {
454 ············m.Hinzufuegen(r);
455 ············pm.MakePersistent(m);
456 ············pm.Save();
457 ············pm.MakeAllHollow();
458 ············Assert.That(NDOObjectState.Hollow ==··m.NDOObjectState, "1: Mitarbeiter should be hollow");
459 ············Assert.That(NDOObjectState.Hollow ==··r.NDOObjectState, "1: Reise should be hollow");
460 ············pm.UnloadCache();
461 ········}
462
463 ········[Test]
464 ········public void··TestMakeAllHollowUnsaved() {
465 ············m.Hinzufuegen(r);
466 ············pm.MakePersistent(m);
467 ············pm.MakeAllHollow();··// before save, objects cannot be made hollow. => in locked objects
468 ············Assert.That(NDOObjectState.Created ==··m.NDOObjectState, "1: Mitarbeiter should be created");
469 ············Assert.That(NDOObjectState.Created ==··r.NDOObjectState, "1: Reise should be created");
470 ········}
471
472 ········[Test]
473 ········public void TestLoadRelatedObjects() {
474 ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm, null);
475 ············IList dellist = q.Execute();
476 ············pm.Delete(dellist);
477 ············pm.Save();
478 ············pm.UnloadCache();
479
480 ············for(int i = 0; i < 10; i++) {
481 ················m.Hinzufuegen(CreateReise(i.ToString()));
482 ············}
483 ············pm.MakePersistent(m);
484 ············pm.Save();
485 ············pm.MakeHollow(m, true);
486
487 ············IList reisen = new ArrayList(m.Reisen);
488 ············Assert.That(10 ==··reisen.Count, "Array size should be 10");
489
490 ············for(int i = 0; i < 10; i++) {
491 ················Reise rr = (Reise)reisen[i];
492 ················Assert.That(NDOObjectState.Hollow ==··rr.NDOObjectState, "1: Reise should be hollow");
493 //················if (i.ToString()!= rr.Zweck)
494 //················{
495 //····················for (int j = 0; j < 10; j++)
496 //························System.Diagnostics.Debug.WriteLine("Reise: " + ((Reise)reisen[j]).Zweck);
497 //················}
498 #if !ORACLE && !MYSQL && !FIREBIRD
499 ················if (rr.NDOObjectId.Id[0] is Int32)
500 ····················Assert.That(i.ToString() ==··rr.Zweck, "2: Reise should be in right order");
501 #endif
502 ············}
503
504
505 ············pm.MakeAllHollow();
506 ············pm.UnloadCache();
507 ············IList reisen2 = m.Reisen;
508 ············for(int i = 0; i < 10; i++) {
509 ················Reise r1 = (Reise)reisen[i];
510 ················Reise r2 = (Reise)reisen2[i];
511 #if !ORACLE && !MYSQL && !FIREBIRD
512 ················if (r1.NDOObjectId.Id[0] is Int32)
513 ················Assert.That(i.ToString() ==··r1.Zweck, "3: Reise should be in right order");
514 #endif
515 ················Assert.That(r1 !=··r2, "Objects should be different");
516 ············}
517 ········}
518
519 ········[Test]
520 ········public void TestLoadRelatedObjectsSave() {
521 ············pm.MakePersistent(m);
522 ············pm.Save();
523 ············for(int i = 0; i < 10; i++) {
524 ················m.Hinzufuegen(CreateReise(i.ToString()));
525 ············}
526 ············pm.Save();
527 ············pm.MakeHollow(m, true);
528
529 ············IList reisen = new ArrayList(m.Reisen);
530
531 ············for(int i = 0; i < 10; i++) {
532 ················Reise rr = (Reise)reisen[i];
533 ················Assert.That(NDOObjectState.Hollow ==··rr.NDOObjectState, "1: Reise should be hollow");
534 #if !ORACLE && !MYSQL && !FIREBIRD
535 ················if (rr.NDOObjectId.Id[0] is Int32)
536 ····················Assert.That(i.ToString() ==··rr.Zweck, "2: Reise should be in right order");
537 #endif
538 ············}
539
540
541 ············pm.MakeAllHollow();
542 ············pm.UnloadCache();
543 ············IList reisen2 = m.Reisen;
544 ············for(int i = 0; i < 10; i++) {
545 ················Reise r1 = (Reise)reisen[i];
546 ················Reise r2 = (Reise)reisen2[i];
547 #if !ORACLE && !MYSQL && !FIREBIRD
548 ················if (r1.NDOObjectId.Id[0] is Int32)
549 ················Assert.That(i.ToString() ==··r1.Zweck, "3: Reise should be in right order");
550 #endif
551 ················Assert.That(r1 !=··r2, "Objects should be different");
552 ············}
553 ········}
554
555 ········[Test]
556 ········public void TestExtentRelatedObjects() {
557 ············m.Hinzufuegen(r);
558 ············pm.MakePersistent(m);
559 ············pm.Save();
560 ············IList liste = pm.GetClassExtent(typeof(Mitarbeiter));
561 ············m = (Mitarbeiter)liste[0];
562 ············Assert.That(NDOObjectState.Persistent ==··m.NDOObjectState, "1: Mitarbeiter should be persistent");
563 ············Assert.That(m.Reisen != null, "2. Relation is missing");
564 ············Assert.That(1 ==··m.Reisen.Count, "3. Wrong number of objects");
565 ············Assert.That(NDOObjectState.Persistent ==··((Reise)m.Reisen[0]).NDOObjectState, "4.: Reise should be hollow");
566
567 ············pm.UnloadCache();
568 ············liste = pm.GetClassExtent(typeof(Mitarbeiter));
569 ············m = (Mitarbeiter)liste[0];
570 ············Assert.That(NDOObjectState.Hollow ==··m.NDOObjectState, "5: Mitarbeiter should be hollow");
571 ············Assert.That(m.Reisen != null, "6. Relation is missing");
572 ············Assert.That(1 ==··m.Reisen.Count, "7. Wrong number of objects");
573 ············Assert.That(NDOObjectState.Hollow ==··((Reise)m.Reisen[0]).NDOObjectState, "8.: Reise should be hollow");
574
575 ············pm.UnloadCache();
576 ············liste = pm.GetClassExtent(typeof(Mitarbeiter), false);
577 ············m = (Mitarbeiter)liste[0];
578 ············Assert.That(NDOObjectState.Persistent ==··m.NDOObjectState, "9: Mitarbeiter should be persistent");
579 ············Assert.That(m.Reisen != null, "10. Relation is missing");
580 ············Assert.That(1 ==··m.Reisen.Count, "11. Wrong number of objects");
581 ············Assert.That(NDOObjectState.Hollow ==··((Reise)m.Reisen[0]).NDOObjectState, "12.: Reise should be hollow");
582 ········}
583
584 ········[Test]
585 ········public void TestReiseChangeReload()
586 ········{
587 ············m.Hinzufuegen(r);
588 ············pm.MakePersistent(m);
589 ············pm.Save();
590 ············pm.UnloadCache();
591 ············var provider = pm.NDOMapping.FindClass( typeof( Reise ) ).Provider;
592 ············NDOQuery<Reise> q = new NDOQuery<Reise>(pm, $"zweck LIKE 'A{provider.Wildcard}'");
593 ············r = (Reise) q.ExecuteSingle(true);
594 ············r.Zweck = "NewPurpose";
595 ············pm.VerboseMode = true;
596 ············pm.Save();
597 ············pm.VerboseMode= false;
598 ············NDOQuery<Mitarbeiter> qm = new NDOQuery<Mitarbeiter>(pm);
599 ············m = qm.ExecuteSingle(true);
600 ············Assert.That(1 ==··m.Reisen.Count, "Count wrong");
601 ············Assert.That("NewPurpose" ==··r.Zweck, "Reise wrong");
602 ········}
603
604 ········[Test]
605 ········public void RelationEmptyAssignment()
606 ········{
607 ············m.Hinzufuegen(r);
608 ············pm.MakePersistent(m);
609 ············pm.Save();
610 ············pm.UnloadCache();
611 ············m = (Mitarbeiter) pm.FindObject(m.NDOObjectId);
612 ············//Assert.That(m.Reisen.Count == 1);
613 ············m.ErsetzeReisen(new ArrayList());
614 ············pm.Save();
615 ············pm.UnloadCache();
616 //············// This code gets the same result
617 //············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm, "oid = {0}");
618 //············q.Parameters.Add(m.NDOObjectId.Id.Value);
619 //············m = (Mitarbeiter) q.ExecuteSingle(true);
620
621 ············m = (Mitarbeiter) pm.FindObject(m.NDOObjectId);
622 ············Assert.That(m.Reisen.Count == 0, "Reisen should be empty");
623 ········}
624
625 ········[Test]
626 ········public void RelationNullAssignment()
627 ········{
628 ············m.Hinzufuegen(r);
629 ············pm.MakePersistent(m);
630 ············pm.Save();
631 ············pm.UnloadCache();
632 ············m = (Mitarbeiter) pm.FindObject(m.NDOObjectId);
633 ············//Assert.That(m.Reisen.Count == 1);
634 ············m.ErsetzeReisen(null);
635 ············pm.Save();
636 ············pm.UnloadCache();
637 ············m = (Mitarbeiter) pm.FindObject(m.NDOObjectId);
638 ············Assert.That(m.Reisen.Count == 0, "Reisen should be empty");
639 ········}
640
641 ········[Test]
642 // [Ignore( "Erzeugt Exception in TearDown") ]
643 ········public void AbortedTransaction()
644 ········{
645 ············m.Hinzufuegen( r );
646 ············pm.MakePersistent( m );
647 ············pm.Save();
648 ············pm.UnloadCache();
649
650 ············pm.TransactionMode = TransactionMode.Optimistic;
651
652 ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>( pm, null );
653 ············m = (Mitarbeiter)q.ExecuteSingle( true );
654 ············m.Vorname = "Hans";
655 ············((Reise)m.Reisen[0]).Zweck = "Neuer Zweck";
656
657 ············FieldInfo fi = pm.NDOMapping.GetType().GetField( "persistenceHandler", BindingFlags.Instance | BindingFlags.NonPublic );
658
659 ············Dictionary<Type, IPersistenceHandler> ht = (Dictionary<Type, IPersistenceHandler>)fi.GetValue( pm.NDOMapping );
660 ············ht.Clear();
661 ············pm.NDOMapping.FindClass( typeof( Reise ) ).FindField( "zweck" ).Column.Name = "nix";
662
663 ············try
664 ············{
665 ················pm.Save();
666 ············}
667 ············catch
668 ············{
669 ················ht.Clear();
670 ················pm.NDOMapping.FindClass( typeof( Reise ) ).FindField( "zweck" ).Column.Name = "Zweck";
671 ················pm.Abort();
672 ············}
673
674 ············pm.UnloadCache();
675 ············m = (Mitarbeiter)q.ExecuteSingle( true );
676 ············Assert.That("Hartmut" ==··m.Vorname, "Vorname falsch" );
677 ············Assert.That("ADC" ==··((Reise)m.Reisen[0]).Zweck, "Vorname falsch" );
678 ········}
679
680 ········[Test]
681 ········public void ResolveTest()
682 ········{
683 ············// This makes sure, that each resolve delivers a new PersistenceHandler.
684 var h1 = pm. ConfigContainer. Resolve<IPersistenceHandler>( ) ;
685 var h2 = pm. ConfigContainer. Resolve<IPersistenceHandler>( ) ;
686 ············Assert.That( !object.ReferenceEquals( h1, h2 ) );
687 ········}
688
689 ········[Test]
690 ········public void TestListEnumerator()
691 ········{
692 ············m.Hinzufuegen(r);
693 ············pm.MakePersistent(m);
694 ············pm.Save();
695 ············pm.UnloadCache();
696 ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm, null);
697 ············m = (Mitarbeiter) q.ExecuteSingle(true);
698 ············IEnumerator ie = m.Reisen.GetEnumerator();
699 ············bool result = ie.MoveNext();
700 ············Assert.That(result, "Enumerator should give a result");
701 ············Assert.That(ie.Current != null);
702 ········}
703
704 ········[Test]
705 ········public void TestListCount()
706 ········{
707 ············m.Hinzufuegen(r);
708 ············pm.MakePersistent(m);
709 ············pm.Save();
710 ············pm.UnloadCache();
711 ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm, null);
712 ············m = (Mitarbeiter) q.ExecuteSingle(true);
713 ············Assert.That(1 ==··m.Reisen.Count, "Count should be 1");
714 ········}
715
716 ········[Test]
717 ········public void TestLinqQuery()
718 ········{
719 ············m.Hinzufuegen(r);
720 ············pm.MakePersistent(m);
721 ············pm.Save();
722 ············pm.UnloadCache();
723 ············m = (from mi in pm.Objects<Mitarbeiter>() where mi.Reisen[Any.Index].Zweck == "ADC" select mi).FirstOrDefault();
724 ············Assert.That(m != null, "There should be 1 object");
725 ············Assert.That(1 ==··m.Reisen.Count, "Count should be 1");
726 ········}
727
728
729 ········private Mitarbeiter CreateMitarbeiter(string vorname, string nachname)
730 ········{
731 ············Mitarbeiter m = new Mitarbeiter();
732 ············m.Vorname = vorname;
733 ············m.Nachname = nachname;
734 ············return m;
735 ········}
736
737 ········private Reise CreateReise(string zweck) {
738 ············Reise r = new Reise();
739 ············r.Zweck = zweck;
740 ············return r;
741 ········}
742 ····}
743 }
744
New Commit (60cb179)
1 //
2 // Copyright (c) 2002-2016 Mirko Matytschak
3 // (www.netdataobjects.de)
4 //
5 // Author: Mirko Matytschak
6 //
7 // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
8 // documentation files (the "Software"), to deal in the Software without restriction, including without limitation
9 // the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
10 // Software, and to permit persons to whom the Software is furnished to do so, subject to the following
11 // conditions:
12
13 // The above copyright notice and this permission notice shall be included in all copies or substantial portions
14 // of the Software.
15 //
16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
17 // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
19 // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20 // DEALINGS IN THE SOFTWARE.
21
22
23 using System;
24 using System.Linq;
25 using System.Reflection;
26 using System.Collections;
27 using System.Collections.Generic;
28 using NUnit.Framework;
29 using NDO;
30 using NDO.Query;
31 using Reisekosten;
32 using Reisekosten.Personal;
33 using NDO.Linq;
34 using NDO.Mapping;
35 using Microsoft.Extensions.DependencyInjection;
36
37 namespace NdoUnitTests
38 {
39 ····/// <summary>
40 ····/// Combined Tests of Mitarbeiter and Reise to test uniqueness of object ids.
41 ····/// </summary>
42 ····[TestFixture]
43 public class NDOMitarbeiterReiseTests : NDOTest
44 ····{
45 ········public NDOMitarbeiterReiseTests()
46 ········{
47 ········}
48
49 ········private PersistenceManager pm;
50 ········private Mitarbeiter m;
51 ········private Reise r;
52
53 ········[SetUp]
54 ········public void Setup() {
55 ············pm = PmFactory.NewPersistenceManager();
56 ············m = CreateMitarbeiter("Hartmut", "Kocher");
57 ············r = CreateReise("ADC");
58 ········}
59
60 ········[TearDown]
61 ········public void TearDown() {
62 ············pm.Abort();
63 ············pm.UnloadCache();
64 var mitarbeiterListe = pm. Objects<Mitarbeiter>( ) . ResultTable;
65 ············pm.Delete(mitarbeiterListe);
66 ············pm.Save();
67 ············pm.Objects<Reise>().DeleteDirectly();
68 ············pm.Close();
 
69 ············pm.Dispose();
70 ········}
71
72 ········[Test]
73 ········public void TestCreateObjects() {
74 ············pm.MakePersistent(m);
75 ············pm.MakePersistent(r);
76 ············Assert.That(!m.NDOObjectId.Equals(r.NDOObjectId), "Ids should be different");
77 ············m = (Mitarbeiter)pm.FindObject(m.NDOObjectId);
78 ············r = (Reise)pm.FindObject(r.NDOObjectId);
79 ········}
80
81 ········[Test]
82 ········public void TestCreateObjectsSave() {
83 ············m.Hinzufuegen(r);
84 ············pm.MakePersistent(m);
85 ············pm.Save();
86 ············Assert.That(!m.NDOObjectId.Equals(r.NDOObjectId), "Ids should be different");
87 ············m = (Mitarbeiter)pm.FindObject(m.NDOObjectId);
88 ············r = (Reise)pm.FindObject(r.NDOObjectId);
89 ············Assert.That(m != null, "1. Mitarbeiter not found");
90 ············Assert.That(r != null, "1. Reise not found");
91
92 ············pm.UnloadCache();
93 ············m = (Mitarbeiter)pm.FindObject(m.NDOObjectId);
94 ············r = (Reise)pm.FindObject(r.NDOObjectId);
95 ············Assert.That(m != null, "2. Mitarbeiter not found");
96 ············Assert.That(r != null, "2. Reise not found");
97 ········}
98
99 ········[Test]
100 ········public void TestAddObjectSave() {
101 ············pm.MakePersistent(m);
102 ············pm.Save();
103 ············m.Hinzufuegen(r);
104 ············Assert.That(NDOObjectState.Created ==··r.NDOObjectState, "1. Wrong state");
105 ············pm.Save();
106 ············m = (Mitarbeiter)pm.FindObject(m.NDOObjectId);
107 ············r = (Reise)pm.FindObject(r.NDOObjectId);
108 ············Assert.That(m != null, "1. Mitarbeiter not found");
109 ············Assert.That(r != null, "1. Reise not found");
110 ············Assert.That(NDOObjectState.Persistent ==··r.NDOObjectState, "2. Wrong state");
111 ········}
112
113 ········int GetOrdinal(Relation r)
114 ········{
115 ············var t = r.Parent.SystemType;
116 ············Type mcType = t.GetNestedType( "MetaClass", BindingFlags.NonPublic | BindingFlags.Public );
117 ············if (null == mcType)
118 ················throw new NDOException( 13, "Missing nested class 'MetaClass' for type '" + t.Name + "'; the type doesn't seem to be enhanced." );
119 ············var mc = (IMetaClass2)Activator.CreateInstance( mcType, t );
120 ············return mc.GetRelationOrdinal( r.FieldName );
121 ········}
122
123 ········bool IsLoaded(IPersistentObject pc, Relation r)
124 ········{
125 ············return ((IPersistenceCapable)pc).NDOLoadState.RelationLoadState[GetOrdinal( r )];
126 ········}
127
128 ········[Test]
129 ········public void RestorePreservesRelationLists()
130 ········{
131 ············pm.MakePersistent( m );
132 ············pm.Save();
133 ············m.Hinzufuegen( r );
134 ············pm.Save();
135 ············Assert.That(1 ==··m.Reisen.Count );
136
137 ············pm.UnloadCache();
138 ············var m2 = pm.Objects<Mitarbeiter>().Single();
139
140 ············var relation = pm.NDOMapping.FindClass( typeof( Mitarbeiter ) ).FindRelation( "dieReisen" );
141
142 ············Assert.That( !IsLoaded( m2, relation ) );
143 ············var list = m2.Reisen;
144 ············m2.Vorname = "Testxxxx";
145
146 ············Assert.That( IsLoaded( m2, relation ) );
147
148 ············pm.Restore( m2 );
149 ············m2.Nachname = "Testyyyy";
150 ············pm.Save();
151
152
153 ············Assert.That(1 ==··m2.Reisen.Count );
154 ········}
155
156 ········[Test]
157 ········public void TestAddObjectAbort() {
158 ············pm.MakePersistent(m);
159 ············pm.Save();
160 ············m.Hinzufuegen(r);
161 ············Assert.That(NDOObjectState.Created ==··r.NDOObjectState, "1. Wrong state");
162 ············Assert.That(1 ==··m.Reisen.Count, "1. Wrong number of objects");
163 ············pm.Abort();
164 ············Assert.That(NDOObjectState.Transient ==··r.NDOObjectState, "2. Wrong state");
165 ············Assert.That(0 ==··m.Reisen.Count, "2. Wrong number of objects");
166 ········}
167 ········[Test]
168 ········public void TestRemoveObjectSave() {
169 ············pm.MakePersistent(m);
170 ············m.Hinzufuegen(r);
171 ············pm.Save();
172 ············Assert.That(1 ==··m.Reisen.Count, "1. Wrong number of objects");
173 ············m.Löschen(r);
174 ············Assert.That(NDOObjectState.Deleted ==··r.NDOObjectState, "1. Wrong state");
175 ············Assert.That(0 ==··m.Reisen.Count, "2. Wrong number of objects");
176 ············pm.Save();
177 ············Assert.That(0 ==··m.Reisen.Count, "3. Wrong number of objects");
178 ············Assert.That(NDOObjectState.Transient ==··r.NDOObjectState, "2. Wrong state");
179 ········}
180 ············
181 ········[Test]
182 ········public void TestRemoveObjectAbort() {
183 ············pm.MakePersistent(m);
184 ············m.Hinzufuegen(r);
185 ············pm.Save();
186 ············Assert.That(1 ==··m.Reisen.Count, "1. Wrong number of objects");
187 ············m.Löschen(r);
188 ············Assert.That(NDOObjectState.Deleted ==··r.NDOObjectState, "1. Wrong state");
189 ············Assert.That(0 ==··m.Reisen.Count, "2. Wrong number of objects");
190 ············pm.Abort();
191 ············Assert.That(1 ==··m.Reisen.Count, "3. Wrong number of objects");
192 ············Assert.That(NDOObjectState.Persistent ==··r.NDOObjectState, "2. Wrong state");
193 ········}
194
195 ········[Test]
196 ········public void TestDeleteSave() {
197 ············pm.MakePersistent(m);
198 ············m.Hinzufuegen(r);
199 ············pm.Save();
200 ············pm.Delete(m);
201 ············Assert.That(NDOObjectState.Deleted ==··m.NDOObjectState, "1. Wrong state");
202 ············Assert.That(NDOObjectState.Deleted ==··r.NDOObjectState, "2. Wrong state");
203 ············pm.Save();
204 ············Assert.That(NDOObjectState.Transient ==··m.NDOObjectState, "1. Wrong state");
205 ············Assert.That(NDOObjectState.Transient ==··r.NDOObjectState, "2. Wrong state");
206 ········}
207
208
209
210 ········[Test]
211 ········public void TestDeleteAbort() {
212 ············pm.MakePersistent(m);
213 ············m.Hinzufuegen(r);
214 ············pm.Save();
215 ············pm.Delete(m);
216 ············Assert.That(NDOObjectState.Deleted ==··m.NDOObjectState, "1. Wrong state");
217 ············Assert.That(NDOObjectState.Deleted ==··r.NDOObjectState, "2. Wrong state");
218 ············pm.Abort();
219 ············Assert.That(NDOObjectState.Persistent ==··m.NDOObjectState, "1. Wrong state");
220 ············Assert.That(NDOObjectState.Persistent ==··r.NDOObjectState, "2. Wrong state");
221 ········}
222
223 ········[Test]
224 ········public void TestAddRemoveSave() {
225 ············pm.MakePersistent(m);
226 ············pm.Save();
227 ············m.Hinzufuegen(r);
228 ············m.Löschen(r);
229 ············Assert.That(NDOObjectState.Transient ==··r.NDOObjectState, "1. Wrong state");
230 ············pm.Save();
231 ············Assert.That(NDOObjectState.Transient ==··r.NDOObjectState, "2. Wrong state");
232 ········}
233
234 ········[Test]
235 ········public void TestAddRemoveAbort() {
236 ············pm.MakePersistent(m);
237 ············pm.Save();
238 ············m.Hinzufuegen(r);
239 ············m.Löschen(r);
240 ············Assert.That(NDOObjectState.Transient ==··r.NDOObjectState, "1. Wrong state");
241 ············pm.Abort();
242 ············Assert.That(NDOObjectState.Transient ==··r.NDOObjectState, "2. Wrong state");
243 ········}
244
245 ········[Test]
246 ········public void TestClearRelatedObjectsSave() {
247 ············for(int i = 0; i < 10; i++) {
248 ················m.Hinzufuegen(CreateReise(i.ToString()));
249 ············}
250 ············pm.MakePersistent(m);
251 ············pm.Save();
252 ············IList rr = new ArrayList(m.Reisen);
253 ············m.LöscheReisen();
254 ············Assert.That(0 ==··m.Reisen.Count, "1. Wrong number of objects");
255 ············for(int i = 0; i < 10; i++) {
256 ················Assert.That(NDOObjectState.Deleted ==··((Reise)rr[i]).NDOObjectState, "2. Wrong state");
257 ············}
258 ············pm.Save();
259 ············Assert.That(0 ==··m.Reisen.Count, "3. Wrong number of objects");
260 ············for(int i = 0; i < 10; i++) {
261 ················Assert.That(NDOObjectState.Transient ==··((Reise)rr[i]).NDOObjectState, "4. Wrong state");
262 ············}
263 ········}
264
265 ········[Test]
266 ········public void TestClearRelatedObjectsAbort() {
267 ············for(int i = 0; i < 10; i++) {
268 ················m.Hinzufuegen(CreateReise(i.ToString()));
269 ············}
270 ············pm.MakePersistent(m);
271 ············pm.Save();
272 ············IList rr = new ArrayList(m.Reisen);
273 ············m.LöscheReisen();
274 ············Assert.That(0 ==··m.Reisen.Count, "1. Wrong number of objects");
275 ············for(int i = 0; i < 10; i++) {
276 ················Assert.That(NDOObjectState.Deleted ==··((Reise)rr[i]).NDOObjectState, "2. Wrong state");
277 ············}
278 ············pm.Abort();
279 ············Assert.That(10 ==··m.Reisen.Count, "3. Wrong number of objects");
280 ············for(int i = 0; i < 10; i++) {
281 ················Assert.That(NDOObjectState.Persistent ==··((Reise)rr[i]).NDOObjectState, "4. Wrong state");
282 ············}
283 ········}
284
285 ········[Test]
286 ········public void TestAssignRelatedObjectsNullSave() {
287 ············for(int i = 0; i < 3; i++) {
288 ················m.Hinzufuegen(CreateReise(i.ToString()));
289 ············}
290 ············pm.MakePersistent(m);
291 ············pm.Save();
292 ············IList rr = new ArrayList(m.Reisen);
293 ············m.ErsetzeReisen(null);
294 ············Assert.That(m.Reisen == null, "No objects should be there");
295 ············for(int i = 0; i < 3; i++) {
296 ················Assert.That(NDOObjectState.Deleted ==··((Reise)rr[i]).NDOObjectState, "2. Wrong state");
297 ············}
298 ············pm.Save();
299 ············Assert.That(m.Reisen == null, "No objects should be there");
300 ············for(int i = 0; i < 3; i++) {
301 ················Assert.That(NDOObjectState.Transient ==··((Reise)rr[i]).NDOObjectState, "4. Wrong state");
302 ············}
303 ········}
304
305 ········[Test]
306 ········public void TestAssignRelatedObjectsNullAbort() {
307 ············for(int i = 0; i < 3; i++) {
308 ················m.Hinzufuegen(CreateReise(i.ToString()));
309 ············}
310 ············pm.MakePersistent(m);
311 ············pm.Save();
312 ············IList rr = new ArrayList(m.Reisen);
313 ············m.ErsetzeReisen(null);
314 ············Assert.That(m.Reisen == null, "No objects should be there");
315 ············for(int i = 0; i < 3; i++) {
316 ················Assert.That(NDOObjectState.Deleted ==··((Reise)rr[i]).NDOObjectState, "2. Wrong state");
317 ············}
318 ············pm.Abort();
319 ············Assert.That(3 ==··m.Reisen.Count, "3. Wrong number of objects");
320 ············for(int i = 0; i < 3; i++) {
321 ················Assert.That(NDOObjectState.Persistent ==··((Reise)rr[i]).NDOObjectState, "4. Wrong state");
322 ············}
323 ········}
324
325 ········[Test]
326 ········public void TestAssignRelatedObjectsSave() {
327 ············for(int i = 0; i < 3; i++) {
328 ················m.Hinzufuegen(CreateReise(i.ToString()));
329 ············}
330 ············pm.MakePersistent(m);
331 ············pm.Save();
332 ············IList neueReisen = new ArrayList();
333 ············Reise nr = CreateReise("Test");
334 ············neueReisen.Add(nr);
335
336 ············IList rr = new ArrayList(m.Reisen);
337 ············m.ErsetzeReisen(neueReisen);
338 ············Assert.That(1 ==··m.Reisen.Count, "1. Wrong number of objects");
339 ············for(int i = 0; i < 3; i++) {
340 ················Assert.That(NDOObjectState.Deleted ==··((Reise)rr[i]).NDOObjectState, "2. Wrong state");
341 ············}
342 ············Assert.That(NDOObjectState.Created ==··nr.NDOObjectState, "3. Wrong state");
343
344 ············pm.Save();
345 ············Assert.That(1 ==··m.Reisen.Count, "4. Wrong number of objects");
346 ············for(int i = 0; i < 3; i++) {
347 ················Assert.That(NDOObjectState.Transient ==··((Reise)rr[i]).NDOObjectState, "5. Wrong state");
348 ············}
349 ············Assert.That(NDOObjectState.Persistent ==··nr.NDOObjectState, "6. Wrong state");
350 ········}
351
352 ········[Test]
353 ········public void TestAssignRelatedObjectsAbort() {
354 ············for(int i = 0; i < 3; i++) {
355 ················m.Hinzufuegen(CreateReise(i.ToString()));
356 ············}
357 ············pm.MakePersistent(m);
358 ············pm.Save();
359 ············IList neueReisen = new ArrayList();
360 ············Reise nr = CreateReise("Test");
361 ············neueReisen.Add(nr);
362
363 ············IList rr = new ArrayList(m.Reisen);
364 ············m.ErsetzeReisen(neueReisen);
365 ············Assert.That(1 ==··m.Reisen.Count, "1. Wrong number of objects");
366 ············for(int i = 0; i < 3; i++) {
367 ················Assert.That(NDOObjectState.Deleted ==··((Reise)rr[i]).NDOObjectState, "2. Wrong state");
368 ············}
369 ············Assert.That(NDOObjectState.Created ==··nr.NDOObjectState, "3. Wrong state");
370
371 ············pm.Abort();
372 ············Assert.That(3 ==··m.Reisen.Count, "4. Wrong number of objects");
373 ············for(int i = 0; i < 3; i++) {
374 ················Assert.That(NDOObjectState.Persistent ==··((Reise)rr[i]).NDOObjectState, "5. Wrong state");
375 ············}
376 ············Assert.That(NDOObjectState.Transient ==··nr.NDOObjectState, "6. Wrong state");
377 ········}
378
379 ········[Test]
380 ········public void TestAddNewReise()
381 ········{
382 ············m.Hinzufuegen(r);
383 ············pm.MakePersistent(m);
384 ············pm.Save();
385 ············pm.UnloadCache();
386 ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm);
387 ············m = q.ExecuteSingle(true);
388 ············Reise r2 = CreateReise("Schnulli");
389 ············m.Hinzufuegen(r2);
390 ············pm.Save();
391 ············m = q.ExecuteSingle(true);
392 ············Assert.That(2 ==··m.Reisen.Count, "Count wrong");
393 ········}
394
395 ········[Test]
396 ········public void RefreshReloadsRelation()
397 ········{
398 ············m.Hinzufuegen( r );
399 ············pm.MakePersistent( m );
400 ············pm.Save();
401 ············PersistenceManager pm2 = PmFactory.NewPersistenceManager();
402 ············Mitarbeiter m2 = pm2.Objects<Mitarbeiter>().ResultTable.First();
403 ············Assert.That(m.Reisen.Count ==··m2.Reisen.Count );
404 ············Assert.That(1 ==··m.Reisen.Count );
405 ············Reise r2 = new Reise() { Zweck = "Test" };
406 ············m2.Hinzufuegen( r2 );
407 ············pm2.Save();
408 ············Assert.That(1 ==··m.Reisen.Count );
409 ············pm.Refresh( m );
410 ············Assert.That(2 ==··m.Reisen.Count );
411 ········}
412
413 ········[Test]
414 ········public void CanIterateThrougRelatedObjectsWithLinq()
415 ········{
416 ············m.Hinzufuegen( r );
417 ············r = new Reise() { Zweck = "Test" };
418 ············m.Hinzufuegen( r );
419 ············pm.MakePersistent( m );
420 ············pm.Save();
421 ············Assert.That(2 ==··m.Reisen.Count );
422 ············ObjectId oid = m.NDOObjectId;
423 ············pm.UnloadCache();
424 ············pm = PmFactory.NewPersistenceManager();
425 ············m = (Mitarbeiter) pm.FindObject( oid );
426 ············Assert.That( m.NDOObjectState == NDOObjectState.Hollow );
427 ············Reise tr = (from reise in m.Reisen where reise.Zweck == "Test" select reise).SingleOrDefault();
428 ············Assert.That(tr··!= null);
429 ············Assert.That("Test" ==··tr.Zweck );
430 ········}
431
432 ········[Test]
433 ········public void TestHollow() {
434 ············m.Hinzufuegen(r);
435 ············pm.MakePersistent(m);
436 ············pm.Save();
437 ············pm.MakeHollow(m);
438 ············Assert.That(NDOObjectState.Hollow ==··m.NDOObjectState, "1: Mitarbeiter should be hollow");
439 ············Assert.That(NDOObjectState.Persistent ==··r.NDOObjectState, "1: Reise should be persistent");
440 ············IList reise = m.Reisen;
441
442 ············pm.MakeHollow(m, true);
443 ············Assert.That(NDOObjectState.Hollow ==··m.NDOObjectState, "2: Mitarbeiter should be hollow");
444 ············Assert.That(NDOObjectState.Hollow ==··r.NDOObjectState, "2: Reise should be hollow");
445
446 ············reise = m.Reisen;
447 ············Assert.That(NDOObjectState.Persistent ==··m.NDOObjectState, "3: Mitarbeiter should be persistent");
448 ············Assert.That(NDOObjectState.Hollow ==··r.NDOObjectState, "3: Reise should be hollow");
449 ············Assert.That("ADC" ==··r.Zweck, "3: Reise should have correct Zweck");
450 ············Assert.That(NDOObjectState.Persistent ==··r.NDOObjectState, "4: Reise should be persistent");
451 ········}
452
453 ········[Test]
454 ········public void··TestMakeAllHollow() {
455 ············m.Hinzufuegen(r);
456 ············pm.MakePersistent(m);
457 ············pm.Save();
458 ············pm.MakeAllHollow();
459 ············Assert.That(NDOObjectState.Hollow ==··m.NDOObjectState, "1: Mitarbeiter should be hollow");
460 ············Assert.That(NDOObjectState.Hollow ==··r.NDOObjectState, "1: Reise should be hollow");
461 ············pm.UnloadCache();
462 ········}
463
464 ········[Test]
465 ········public void··TestMakeAllHollowUnsaved() {
466 ············m.Hinzufuegen(r);
467 ············pm.MakePersistent(m);
468 ············pm.MakeAllHollow();··// before save, objects cannot be made hollow. => in locked objects
469 ············Assert.That(NDOObjectState.Created ==··m.NDOObjectState, "1: Mitarbeiter should be created");
470 ············Assert.That(NDOObjectState.Created ==··r.NDOObjectState, "1: Reise should be created");
471 ········}
472
473 ········[Test]
474 ········public void TestLoadRelatedObjects() {
475 ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm, null);
476 ············IList dellist = q.Execute();
477 ············pm.Delete(dellist);
478 ············pm.Save();
479 ············pm.UnloadCache();
480
481 ············for(int i = 0; i < 10; i++) {
482 ················m.Hinzufuegen(CreateReise(i.ToString()));
483 ············}
484 ············pm.MakePersistent(m);
485 ············pm.Save();
486 ············pm.MakeHollow(m, true);
487
488 ············IList reisen = new ArrayList(m.Reisen);
489 ············Assert.That(10 ==··reisen.Count, "Array size should be 10");
490
491 ············for(int i = 0; i < 10; i++) {
492 ················Reise rr = (Reise)reisen[i];
493 ················Assert.That(NDOObjectState.Hollow ==··rr.NDOObjectState, "1: Reise should be hollow");
494 //················if (i.ToString()!= rr.Zweck)
495 //················{
496 //····················for (int j = 0; j < 10; j++)
497 //························System.Diagnostics.Debug.WriteLine("Reise: " + ((Reise)reisen[j]).Zweck);
498 //················}
499 #if !ORACLE && !MYSQL && !FIREBIRD
500 ················if (rr.NDOObjectId.Id[0] is Int32)
501 ····················Assert.That(i.ToString() ==··rr.Zweck, "2: Reise should be in right order");
502 #endif
503 ············}
504
505
506 ············pm.MakeAllHollow();
507 ············pm.UnloadCache();
508 ············IList reisen2 = m.Reisen;
509 ············for(int i = 0; i < 10; i++) {
510 ················Reise r1 = (Reise)reisen[i];
511 ················Reise r2 = (Reise)reisen2[i];
512 #if !ORACLE && !MYSQL && !FIREBIRD
513 ················if (r1.NDOObjectId.Id[0] is Int32)
514 ················Assert.That(i.ToString() ==··r1.Zweck, "3: Reise should be in right order");
515 #endif
516 ················Assert.That(r1 !=··r2, "Objects should be different");
517 ············}
518 ········}
519
520 ········[Test]
521 ········public void TestLoadRelatedObjectsSave() {
522 ············pm.MakePersistent(m);
523 ············pm.Save();
524 ············for(int i = 0; i < 10; i++) {
525 ················m.Hinzufuegen(CreateReise(i.ToString()));
526 ············}
527 ············pm.Save();
528 ············pm.MakeHollow(m, true);
529
530 ············IList reisen = new ArrayList(m.Reisen);
531
532 ············for(int i = 0; i < 10; i++) {
533 ················Reise rr = (Reise)reisen[i];
534 ················Assert.That(NDOObjectState.Hollow ==··rr.NDOObjectState, "1: Reise should be hollow");
535 #if !ORACLE && !MYSQL && !FIREBIRD
536 ················if (rr.NDOObjectId.Id[0] is Int32)
537 ····················Assert.That(i.ToString() ==··rr.Zweck, "2: Reise should be in right order");
538 #endif
539 ············}
540
541
542 ············pm.MakeAllHollow();
543 ············pm.UnloadCache();
544 ············IList reisen2 = m.Reisen;
545 ············for(int i = 0; i < 10; i++) {
546 ················Reise r1 = (Reise)reisen[i];
547 ················Reise r2 = (Reise)reisen2[i];
548 #if !ORACLE && !MYSQL && !FIREBIRD
549 ················if (r1.NDOObjectId.Id[0] is Int32)
550 ················Assert.That(i.ToString() ==··r1.Zweck, "3: Reise should be in right order");
551 #endif
552 ················Assert.That(r1 !=··r2, "Objects should be different");
553 ············}
554 ········}
555
556 ········[Test]
557 ········public void TestExtentRelatedObjects() {
558 ············m.Hinzufuegen(r);
559 ············pm.MakePersistent(m);
560 ············pm.Save();
561 ············IList liste = pm.GetClassExtent(typeof(Mitarbeiter));
562 ············m = (Mitarbeiter)liste[0];
563 ············Assert.That(NDOObjectState.Persistent ==··m.NDOObjectState, "1: Mitarbeiter should be persistent");
564 ············Assert.That(m.Reisen != null, "2. Relation is missing");
565 ············Assert.That(1 ==··m.Reisen.Count, "3. Wrong number of objects");
566 ············Assert.That(NDOObjectState.Persistent ==··((Reise)m.Reisen[0]).NDOObjectState, "4.: Reise should be hollow");
567
568 ············pm.UnloadCache();
569 ············liste = pm.GetClassExtent(typeof(Mitarbeiter));
570 ············m = (Mitarbeiter)liste[0];
571 ············Assert.That(NDOObjectState.Hollow ==··m.NDOObjectState, "5: Mitarbeiter should be hollow");
572 ············Assert.That(m.Reisen != null, "6. Relation is missing");
573 ············Assert.That(1 ==··m.Reisen.Count, "7. Wrong number of objects");
574 ············Assert.That(NDOObjectState.Hollow ==··((Reise)m.Reisen[0]).NDOObjectState, "8.: Reise should be hollow");
575
576 ············pm.UnloadCache();
577 ············liste = pm.GetClassExtent(typeof(Mitarbeiter), false);
578 ············m = (Mitarbeiter)liste[0];
579 ············Assert.That(NDOObjectState.Persistent ==··m.NDOObjectState, "9: Mitarbeiter should be persistent");
580 ············Assert.That(m.Reisen != null, "10. Relation is missing");
581 ············Assert.That(1 ==··m.Reisen.Count, "11. Wrong number of objects");
582 ············Assert.That(NDOObjectState.Hollow ==··((Reise)m.Reisen[0]).NDOObjectState, "12.: Reise should be hollow");
583 ········}
584
585 ········[Test]
586 ········public void TestReiseChangeReload()
587 ········{
588 ············m.Hinzufuegen(r);
589 ············pm.MakePersistent(m);
590 ············pm.Save();
591 ············pm.UnloadCache();
592 ············var provider = pm.NDOMapping.FindClass( typeof( Reise ) ).Provider;
593 ············NDOQuery<Reise> q = new NDOQuery<Reise>(pm, $"zweck LIKE 'A{provider.Wildcard}'");
594 ············r = (Reise) q.ExecuteSingle(true);
595 ············r.Zweck = "NewPurpose";
 
596 ············pm.Save();
 
597 ············NDOQuery<Mitarbeiter> qm = new NDOQuery<Mitarbeiter>(pm);
598 ············m = qm.ExecuteSingle(true);
599 ············Assert.That(1 ==··m.Reisen.Count, "Count wrong");
600 ············Assert.That("NewPurpose" ==··r.Zweck, "Reise wrong");
601 ········}
602
603 ········[Test]
604 ········public void RelationEmptyAssignment()
605 ········{
606 ············m.Hinzufuegen(r);
607 ············pm.MakePersistent(m);
608 ············pm.Save();
609 ············pm.UnloadCache();
610 ············m = (Mitarbeiter) pm.FindObject(m.NDOObjectId);
611 ············//Assert.That(m.Reisen.Count == 1);
612 ············m.ErsetzeReisen(new ArrayList());
613 ············pm.Save();
614 ············pm.UnloadCache();
615 //············// This code gets the same result
616 //············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm, "oid = {0}");
617 //············q.Parameters.Add(m.NDOObjectId.Id.Value);
618 //············m = (Mitarbeiter) q.ExecuteSingle(true);
619
620 ············m = (Mitarbeiter) pm.FindObject(m.NDOObjectId);
621 ············Assert.That(m.Reisen.Count == 0, "Reisen should be empty");
622 ········}
623
624 ········[Test]
625 ········public void RelationNullAssignment()
626 ········{
627 ············m.Hinzufuegen(r);
628 ············pm.MakePersistent(m);
629 ············pm.Save();
630 ············pm.UnloadCache();
631 ············m = (Mitarbeiter) pm.FindObject(m.NDOObjectId);
632 ············//Assert.That(m.Reisen.Count == 1);
633 ············m.ErsetzeReisen(null);
634 ············pm.Save();
635 ············pm.UnloadCache();
636 ············m = (Mitarbeiter) pm.FindObject(m.NDOObjectId);
637 ············Assert.That(m.Reisen.Count == 0, "Reisen should be empty");
638 ········}
639
640 ········[Test]
641 [Ignore( "persistenceHandler doesn't exist anymore") ]
642 ········public void AbortedTransaction()
643 ········{
644 ············m.Hinzufuegen( r );
645 ············pm.MakePersistent( m );
646 ············pm.Save();
647 ············pm.UnloadCache();
648
649 ············pm.TransactionMode = TransactionMode.Optimistic;
650
651 ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>( pm, null );
652 ············m = (Mitarbeiter)q.ExecuteSingle( true );
653 ············m.Vorname = "Hans";
654 ············((Reise)m.Reisen[0]).Zweck = "Neuer Zweck";
655
656 ············FieldInfo fi = pm.NDOMapping.GetType().GetField( "persistenceHandler", BindingFlags.Instance | BindingFlags.NonPublic );
657
658 ············Dictionary<Type, IPersistenceHandler> ht = (Dictionary<Type, IPersistenceHandler>)fi.GetValue( pm.NDOMapping );
659 ············ht.Clear();
660 ············pm.NDOMapping.FindClass( typeof( Reise ) ).FindField( "zweck" ).Column.Name = "nix";
661
662 ············try
663 ············{
664 ················pm.Save();
665 ············}
666 ············catch
667 ············{
668 ················ht.Clear();
669 ················pm.NDOMapping.FindClass( typeof( Reise ) ).FindField( "zweck" ).Column.Name = "Zweck";
670 ················pm.Abort();
671 ············}
672
673 ············pm.UnloadCache();
674 ············m = (Mitarbeiter)q.ExecuteSingle( true );
675 ············Assert.That("Hartmut" ==··m.Vorname, "Vorname falsch" );
676 ············Assert.That("ADC" ==··((Reise)m.Reisen[0]).Zweck, "Vorname falsch" );
677 ········}
678
679 ········[Test]
680 ········public void ResolveTest()
681 ········{
682 ············// This makes sure, that each resolve delivers a new PersistenceHandler.
683 var h1 = Host. Services. GetRequiredService<IPersistenceHandler>( ) ;
684 var h2 = Host. Services. GetRequiredService<IPersistenceHandler>( ) ;
685 ············Assert.That( !object.ReferenceEquals( h1, h2 ) );
686 ········}
687
688 ········[Test]
689 ········public void TestListEnumerator()
690 ········{
691 ············m.Hinzufuegen(r);
692 ············pm.MakePersistent(m);
693 ············pm.Save();
694 ············pm.UnloadCache();
695 ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm, null);
696 ············m = (Mitarbeiter) q.ExecuteSingle(true);
697 ············IEnumerator ie = m.Reisen.GetEnumerator();
698 ············bool result = ie.MoveNext();
699 ············Assert.That(result, "Enumerator should give a result");
700 ············Assert.That(ie.Current != null);
701 ········}
702
703 ········[Test]
704 ········public void TestListCount()
705 ········{
706 ············m.Hinzufuegen(r);
707 ············pm.MakePersistent(m);
708 ············pm.Save();
709 ············pm.UnloadCache();
710 ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm, null);
711 ············m = (Mitarbeiter) q.ExecuteSingle(true);
712 ············Assert.That(1 ==··m.Reisen.Count, "Count should be 1");
713 ········}
714
715 ········[Test]
716 ········public void TestLinqQuery()
717 ········{
718 ············m.Hinzufuegen(r);
719 ············pm.MakePersistent(m);
720 ············pm.Save();
721 ············pm.UnloadCache();
722 ············m = (from mi in pm.Objects<Mitarbeiter>() where mi.Reisen[Any.Index].Zweck == "ADC" select mi).FirstOrDefault();
723 ············Assert.That(m != null, "There should be 1 object");
724 ············Assert.That(1 ==··m.Reisen.Count, "Count should be 1");
725 ········}
726
727
728 ········private Mitarbeiter CreateMitarbeiter(string vorname, string nachname)
729 ········{
730 ············Mitarbeiter m = new Mitarbeiter();
731 ············m.Vorname = vorname;
732 ············m.Nachname = nachname;
733 ············return m;
734 ········}
735
736 ········private Reise CreateReise(string zweck) {
737 ············Reise r = new Reise();
738 ············r.Zweck = zweck;
739 ············return r;
740 ········}
741 ····}
742 }
743