Datei: IntegrationTests/NdoUnitTests/NDOMitarbeiterTests.cs
Last Commit (16046d5)
			
| 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.Diagnostics; | 
| 27 | using System.IO; | 
| 28 | using System.Collections; | 
| 29 | using NUnit.Framework; | 
| 30 | using System.Collections.Generic; | 
| 31 | using NDO; | 
| 32 | using Reisekosten.Personal; | 
| 33 | using NDO.Query; | 
| 34 | using NDO.Linq; | 
| 35 | |
| 36 | namespace NdoUnitTests | 
| 37 | { | 
| 38 | ····[TestFixture] | 
| 39 | ····public class NDOMitarbeiterTests | 
| 40 | ····{ | 
| 41 | ········public NDOMitarbeiterTests() | 
| 42 | ········{ | 
| 43 | ········} | 
| 44 | |
| 45 | ········private PersistenceManager pm; | 
| 46 | ········private Mitarbeiter m; | 
| 47 | |
| 48 | |
| 49 | ········[SetUp] | 
| 50 | ········public void Setup() | 
| 51 | ········{ | 
| 52 | ············pm = PmFactory.NewPersistenceManager(); | 
| 53 | ············m = CreateMitarbeiter("Hartmut", "Kocher"); | 
| 54 | ········} | 
| 55 | |
| 56 | ········[TearDown] | 
| 57 | ········public void TearDown() | 
| 58 | ········{ | 
| 59 | ············if ( null != pm ) | 
| 60 | ············{ | 
| 61 | ················IList mitarbeiterListe = pm.GetClassExtent( typeof( Mitarbeiter ), true ); | 
| 62 | ················if ( mitarbeiterListe.Count > 0 ) | 
| 63 | ················{ | 
| 64 | ····················pm.Delete( mitarbeiterListe ); | 
| 65 | ····················pm.Save(); | 
| 66 | ················} | 
| 67 | ················pm.Close(); | 
| 68 | ············} | 
| 69 | ········} | 
| 70 | |
| 71 | ········[Test] | 
| 72 | ········public void TestMappingFileName() | 
| 73 | ········{ | 
| 74 | ············Debug.WriteLine("Mapping file = " + pm.NDOMapping.FileName); | 
| 75 | ········} | 
| 76 | |
| 77 | |
| 78 | ········[Test] | 
| 79 | ········public void TestEmptyTransactionSave() | 
| 80 | ········{ | 
| 81 | ············pm.Save(); | 
| 82 | ········} | 
| 83 | |
| 84 | ········[Test] | 
| 85 | ········public void TestEmptyTransactionAbort() | 
| 86 | ········{ | 
| 87 | ············pm.Abort(); | 
| 88 | ········} | 
| 89 | |
| 90 | ········/// <summary> | 
| 91 | ········/// This is not a real test, it just ensures that the DB is empty. | 
| 92 | ········/// </summary> | 
| 93 | ········[Test] | 
| 94 | ········public void EmptyDB() | 
| 95 | ········{ | 
| 96 | ············IList mitarbeiterListe = pm.GetClassExtent(typeof(Mitarbeiter), true); | 
| 97 | ············pm.Delete(mitarbeiterListe); | 
| 98 | ············pm.Save(); | 
| 99 | ········} | 
| 100 | |
| 101 | |
| 102 | ········[Test] | 
| 103 | ········public void TestObjectCreation() | 
| 104 | ········{ | 
| 105 | ············pm.MakePersistent(m); | 
| 106 | ············Assert.NotNull(m.NDOObjectId, "ObjectId should be valid"); | 
| 107 | ············Assert.AreEqual(NDOObjectState.Created, m.NDOObjectState, "Status wrong"); | 
| 108 | ········} | 
| 109 | |
| 110 | ········[Test] | 
| 111 | ········public void CheckBits() | 
| 112 | ········{ | 
| 113 | ············Console.WriteLine( "Running as " + (IntPtr.Size * 8) + " bit app." ); | 
| 114 | ········} | 
| 115 | |
| 116 | ········[Test] | 
| 117 | ········public void CheckPath() | 
| 118 | ········{ | 
| 119 | ············Console.WriteLine( Environment.GetEnvironmentVariable( "PATH" ) ); | 
| 120 | ········} | 
| 121 | |
| 122 | ········[Test] | 
| 123 | ········public void TestObjectCreationSave() | 
| 124 | ········{ | 
| 125 | ············pm.MakePersistent(m); | 
| 126 | ············pm.Save(); | 
| 127 | ············Assert.AreEqual(NDOObjectState.Persistent, m.NDOObjectState, "Status wrong"); | 
| 128 | ········} | 
| 129 | |
| 130 | ········[Test] | 
| 131 | ········public void TestRequery() | 
| 132 | ········{ | 
| 133 | ············pm.MakePersistent(m); | 
| 134 | ············pm.Save(); | 
| 135 | ············Mitarbeiter m1 = new NDOQuery<Mitarbeiter>( pm ).ExecuteSingle(); | 
| 136 | ············m1.Nachname = "Matytschak"; | 
| 137 | ············Mitarbeiter m2 = new NDOQuery<Mitarbeiter>( pm ).ExecuteSingle(); | 
| 138 | ············Assert.AreEqual( "Matytschak", m2.Nachname, "Objekt nicht wiederverwendet" ); | 
| 139 | ············m2.Vorname = "Mirko"; | 
| 140 | ········} | 
| 141 | |
| 142 | ········[Test] | 
| 143 | ········public void TestObjectCreationSaveChanged() | 
| 144 | ········{ | 
| 145 | ············pm.MakePersistent(m); | 
| 146 | ············m.Nachname = "Müller"; | 
| 147 | ············pm.Save(); | 
| 148 | ············Assert.AreEqual("Müller", m.Nachname, "Nachname wrong"); | 
| 149 | ········} | 
| 150 | |
| 151 | ········[Test] | 
| 152 | ········public void TestObjectCreationAbort() | 
| 153 | ········{ | 
| 154 | ············pm.MakePersistent(m); | 
| 155 | ············pm.Abort(); | 
| 156 | ············Assert.Null(m.NDOObjectId, "Transient object shouldn't have ID"); | 
| 157 | ············Assert.Null(((IPersistenceCapable)m).NDOStateManager, "Transient object shouldn't have state manager"); | 
| 158 | ············Assert.AreEqual(NDOObjectState.Transient, m.NDOObjectState, "Status wrong"); | 
| 159 | ········} | 
| 160 | |
| 161 | ········[Test] | 
| 162 | ········public void TestObjectCreationAbortChanged() | 
| 163 | ········{ | 
| 164 | ············pm.MakePersistent(m); | 
| 165 | ············m.Nachname = "Müller"; | 
| 166 | ············pm.Abort(); | 
| 167 | ············Assert.AreEqual("Kocher", m.Nachname, "Nachname wrong"); | 
| 168 | ········} | 
| 169 | |
| 170 | ········[Test] | 
| 171 | ········public void TestObjectId() | 
| 172 | ········{ | 
| 173 | ············pm.MakePersistent(m); | 
| 174 | ············ObjectId id = m.NDOObjectId; | 
| 175 | ············ObjectId id2 = new ObjectId(id); | 
| 176 | ············Assert.AreEqual(m.NDOObjectId, id, "IDs should be equal"); | 
| 177 | ············Assert.AreEqual(m.NDOObjectId, id2, "IDs should be equal"); | 
| 178 | ············if (!pm.HasOwnerCreatedIds && m.NDOObjectId.Id[0] is int) | 
| 179 | ················Assert.That((int)m.NDOObjectId.Id[0] < 0, "Negative key in DS"); | 
| 180 | ············pm.Save(); | 
| 181 | ············Assert.AreEqual(m.NDOObjectId, id, "IDs should be equal"); | 
| 182 | ············Assert.AreEqual(m.NDOObjectId, id2, "IDs should be equal"); | 
| 183 | ············if (!pm.HasOwnerCreatedIds && m.NDOObjectId.Id[0] is int) | 
| 184 | ················Assert.That((int)m.NDOObjectId.Id[0] > 0, "Positive key in DB"); | 
| 185 | ········} | 
| 186 | |
| 187 | ········[Test] | 
| 188 | ········public void TestCreateDeleteTransitionSave() | 
| 189 | ········{ | 
| 190 | ············pm.MakePersistent(m); | 
| 191 | ············pm.Delete(m); | 
| 192 | ············Assert.Null(m.NDOObjectId, "Transient object shouldn't have ID"); | 
| 193 | ············Assert.Null( ((IPersistenceCapable)m).NDOStateManager, "Transient object shouldn't have state manager"); | 
| 194 | ············Assert.AreEqual(NDOObjectState.Transient, m.NDOObjectState, "Status wrong"); | 
| 195 | ············pm.Save(); | 
| 196 | ············Assert.Null(m.NDOObjectId, "Transient object shouldn't have ID"); | 
| 197 | ············Assert.Null( ((IPersistenceCapable)m).NDOStateManager, "Transient object shouldn't have state manager"); | 
| 198 | ············Assert.AreEqual(NDOObjectState.Transient, m.NDOObjectState, "Status wrong"); | 
| 199 | ········} | 
| 200 | |
| 201 | ········[Test] | 
| 202 | ········public void TestCreateDeleteTransitionAbort() | 
| 203 | ········{ | 
| 204 | ············pm.MakePersistent(m); | 
| 205 | ············ObjectId id = m.NDOObjectId; | 
| 206 | ············pm.Delete(m); | 
| 207 | ············pm.Abort(); | 
| 208 | ············Assert.Null(m.NDOObjectId, "Transient object shouldn't have ID"); | 
| 209 | ············Assert.Null( ((IPersistenceCapable)m).NDOStateManager, "Transient object shouldn't have state manager"); | 
| 210 | ············Assert.AreEqual(NDOObjectState.Transient, m.NDOObjectState, "Status wrong"); | 
| 211 | ············IPersistenceCapable pc = pm.FindObject(id); | 
| 212 | ············Assert.NotNull( pc, "There should be a hollow object." ); | 
| 213 | ············Assert.AreEqual(NDOObjectState.Hollow, pc.NDOObjectState, "Status wrong"); | 
| 214 | ········} | 
| 215 | |
| 216 | ········[Test] | 
| 217 | ········public void TestCleanupCache() | 
| 218 | ········{ | 
| 219 | ············pm.MakePersistent(m); | 
| 220 | ············pm.CleanupCache(); | 
| 221 | ············Assert.AreSame(m, pm.FindObject(m.NDOObjectId), "Getting same object twice should return same object"); | 
| 222 | ············pm.Save(); | 
| 223 | ············pm.CleanupCache(); | 
| 224 | ············Assert.AreSame(m, pm.FindObject(m.NDOObjectId), "Getting same object twice should return same object"); | 
| 225 | ············ObjectId id = m.NDOObjectId; | 
| 226 | ············m = null; | 
| 227 | ············pm.CleanupCache(); | 
| 228 | ············Assert.NotNull(pm.FindObject(id), "Should find object"); | 
| 229 | ········} | 
| 230 | |
| 231 | ········[Test] | 
| 232 | ········public void TestUnloadCache() | 
| 233 | ········{ | 
| 234 | ············pm.MakePersistent(m); | 
| 235 | ············Assert.AreSame(m, pm.FindObject(m.NDOObjectId), "Getting same object twice should return same object"); | 
| 236 | ············pm.Save(); | 
| 237 | ············pm.UnloadCache(); | 
| 238 | ············Assert.That(m != pm.FindObject(m.NDOObjectId), "Getting same object twice should return different objects"); | 
| 239 | ············ObjectId id = m.NDOObjectId; | 
| 240 | ············m = null; | 
| 241 | ············pm.UnloadCache(); | 
| 242 | ············Assert.NotNull(pm.FindObject(id), "Should find object"); | 
| 243 | ········} | 
| 244 | |
| 245 | ········[Test] | 
| 246 | ········public void PmWithCachedMappingsWorks() | 
| 247 | ········{ | 
| 248 | ············PersistenceManager pm2 = new PersistenceManager( pm.NDOMapping ); | 
| 249 | |
| 250 | ············pm2.MakePersistent( m ); | 
| 251 | ············pm2.Save(); | 
| 252 | ············pm2.UnloadCache(); | 
| 253 | ············var m2 = pm2.Objects<Mitarbeiter>().First(); | 
| 254 | |
| 255 | ············Assert.AreEqual( m.NDOObjectId, m2.NDOObjectId ); | 
| 256 | ········} | 
| 257 | |
| 258 | ········[Test] | 
| 259 | ········public void TestClassExtent() | 
| 260 | ········{ | 
| 261 | ············ArrayList··mliste = new ArrayList(); | 
| 262 | ············for(int i = 0; i < 100; i++) | 
| 263 | ············{ | 
| 264 | ················Mitarbeiter mm = CreateMitarbeiter("Hartmut", i.ToString()); | 
| 265 | ················pm.MakePersistent(mm); | 
| 266 | ················mliste.Add(mm); | 
| 267 | ············} | 
| 268 | |
| 269 | ············IList mitarbeiterListe = pm.GetClassExtent(typeof(Mitarbeiter)); | 
| 270 | ············Assert.AreEqual(0, mitarbeiterListe.Count, "Current extent should be empty"); | 
| 271 | ············pm.Save(); | 
| 272 | |
| 273 | ············mitarbeiterListe = pm.GetClassExtent(typeof(Mitarbeiter)); | 
| 274 | ············Assert.AreEqual(100, mitarbeiterListe.Count, "Number of read objects is wrong"); | 
| 275 | ············// Check that all objects come from cache... | 
| 276 | ············foreach(Mitarbeiter m1 in mitarbeiterListe) | 
| 277 | ············{ | 
| 278 | ················Assert.AreEqual(NDOObjectState.Persistent, m1.NDOObjectState, "Wrong state"); | 
| 279 | ············} | 
| 280 | |
| 281 | ············mliste.Clear(); | 
| 282 | ············mliste = null; | 
| 283 | ············mitarbeiterListe.Clear(); | 
| 284 | ············mitarbeiterListe = null; | 
| 285 | ············//pm.CleanupCache(); | 
| 286 | ············pm.UnloadCache(); | 
| 287 | ············mitarbeiterListe = pm.GetClassExtent(typeof(Mitarbeiter)); | 
| 288 | ············Assert.AreEqual(100, mitarbeiterListe.Count, "Number of read objects is wrong"); | 
| 289 | ············// Check that all objects are reloaded | 
| 290 | ············foreach(Mitarbeiter m1 in mitarbeiterListe) | 
| 291 | ············{ | 
| 292 | ················Assert.AreEqual(NDOObjectState.Hollow, m1.NDOObjectState, "Wrong state"); | 
| 293 | ············} | 
| 294 | ········} | 
| 295 | |
| 296 | |
| 297 | ········[Test] | 
| 298 | ········public void TestMakePersistentHierarchy() | 
| 299 | ········{ | 
| 300 | ············Reisekosten.Email email = new Reisekosten.Email(); | 
| 301 | ············m.Hinzufuegen(email); | 
| 302 | ············email.Subject = new Reisekosten.Subject(); | 
| 303 | ············email.Subject.Text = "Test"; | 
| 304 | ············Assert.AreEqual(NDOObjectState.Transient, m.NDOObjectState, "Mitarbeiter muss transient sein"); | 
| 305 | ············Assert.AreEqual(NDOObjectState.Transient, email.NDOObjectState, "Email muss transient sein"); | 
| 306 | ············Assert.AreEqual(NDOObjectState.Transient, email.Subject.NDOObjectState, "Subject muss transient sein"); | 
| 307 | ············pm.MakePersistent(m); | 
| 308 | ············Assert.AreEqual(NDOObjectState.Created, m.NDOObjectState, "Mitarbeiter muss Created sein"); | 
| 309 | ············Assert.AreEqual(NDOObjectState.Created, email.NDOObjectState, "Email muss Created sein"); | 
| 310 | ············Assert.AreEqual(NDOObjectState.Created, email.Subject.NDOObjectState, "Subject muss Created sein"); | 
| 311 | ············pm.Save(); | 
| 312 | ············Assert.AreEqual(NDOObjectState.Persistent, m.NDOObjectState, "Mitarbeiter muss Persistent sein"); | 
| 313 | ············Assert.AreEqual(NDOObjectState.Persistent, email.NDOObjectState, "Email muss Persistent sein"); | 
| 314 | ············Assert.AreEqual(NDOObjectState.Persistent, email.Subject.NDOObjectState, "Subject muss Persistent sein"); | 
| 315 | ············ | 
| 316 | ········} | 
| 317 | |
| 318 | ········[Test] | 
| 319 | ········public void TestQuery() | 
| 320 | ········{ | 
| 321 | ············ArrayList··mliste = new ArrayList(); | 
| 322 | ············for(int i = 1; i <= 100; i++) | 
| 323 | ············{ | 
| 324 | ················Mitarbeiter mm = CreateMitarbeiter("Hartmut", (i %··3)··== 0 ? "Test" : "xxx"); | 
| 325 | ················pm.MakePersistent(mm); | 
| 326 | ················mliste.Add(mm); | 
| 327 | ············} | 
| 328 | ············pm.Save();········ | 
| 329 | |
| 330 | ············// Empty query: just like class extent. | 
| 331 | ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm, null, true); | 
| 332 | ············IList mitarbeiterListe = q.Execute(); | 
| 333 | ············Assert.AreEqual(100, mitarbeiterListe.Count, "Number of read objects is wrong"); | 
| 334 | |
| 335 | ············q = new NDOQuery<Mitarbeiter>(pm, "nachname = 'Test'", true); | 
| 336 | ············//System.Diagnostics.Debug.WriteLine(q.GeneratedQuery); | 
| 337 | ············mitarbeiterListe = q.Execute(); | 
| 338 | ············Assert.AreEqual(100/3, mitarbeiterListe.Count, "Number of read objects is wrong"); | 
| 339 | ········} | 
| 340 | |
| 341 | ········[Test] | 
| 342 | ········public void TestLinqQuery() | 
| 343 | ········{ | 
| 344 | ············ArrayList··mliste = new ArrayList(); | 
| 345 | ············for(int i = 1; i <= 100; i++) | 
| 346 | ············{ | 
| 347 | ················Mitarbeiter mm = CreateMitarbeiter("Hartmut", (i % 3)··== 0 ? "Test" : "xxx"); | 
| 348 | ················pm.MakePersistent(mm); | 
| 349 | ················mliste.Add(mm); | 
| 350 | ············} | 
| 351 | ············pm.Save();········ | 
| 352 | ············ | 
| 353 | ············List<Mitarbeiter> mitarbeiterListe = from m in pm.Objects<Mitarbeiter>() select m; | 
| 354 | |
| 355 | ············Assert.AreEqual(100, mitarbeiterListe.Count, "Number of read objects is wrong #1"); | 
| 356 | |
| 357 | ············mitarbeiterListe = from m in pm.Objects<Mitarbeiter>() where m.Nachname == "Test" select m; | 
| 358 | ············Assert.AreEqual(100/3, mitarbeiterListe.Count, "Number of read objects is wrong #2"); | 
| 359 | |
| 360 | ············// Partial select | 
| 361 | ············List<string> nameList = from m in pm.Objects<Mitarbeiter>() select m.Vorname; | 
| 362 | |
| 363 | ············Assert.AreEqual(100, nameList.Count, "Number of read objects is wrong #3"); | 
| 364 | |
| 365 | ············nameList = from m in pm.Objects<Mitarbeiter>() where m.Nachname == "Test" select m.Vorname; | 
| 366 | ············Assert.AreEqual(100/3, mitarbeiterListe.Count, "Number of read objects is wrong #4"); | 
| 367 | ········} | 
| 368 | |
| 369 | ········[Test] | 
| 370 | ········public void LinqQueryWithParameterWorks() | 
| 371 | ········{ | 
| 372 | ············pm.MakePersistent( m ); | 
| 373 | ············pm.Save(); | 
| 374 | ············Mitarbeiter m2 = Mitarbeiter.QueryByName(pm, "Hartmut"); | 
| 375 | ············Assert.NotNull( m2 ); | 
| 376 | ········} | 
| 377 | |
| 378 | ········[Test] | 
| 379 | ········public void LinqQueryWithNullParameterWorks() | 
| 380 | ········{ | 
| 381 | ············pm.MakePersistent( m ); | 
| 382 | ············pm.Save(); | 
| 383 | ············Mitarbeiter m2 = Mitarbeiter.QueryByName(pm, null); | 
| 384 | ············Assert.IsNull( m2 ); | 
| 385 | ········} | 
| 386 | |
| 387 | ········[Test] | 
| 388 | ········public void TestDeleteHollow() | 
| 389 | ········{ | 
| 390 | //············System.Diagnostics.Debug.WriteLine("TestDeleteHollow"); | 
| 391 | ············pm.MakePersistent(m); | 
| 392 | ············pm.Save(); | 
| 393 | ············pm.UnloadCache(); | 
| 394 | ············m = (Mitarbeiter)pm.FindObject(m.NDOObjectId); | 
| 395 | ············Assert.AreEqual(NDOObjectState.Hollow, m.NDOObjectState, "Wrong state #1"); | 
| 396 | ············pm.Delete(m); | 
| 397 | ············Assert.AreEqual(NDOObjectState.Deleted, m.NDOObjectState, "Wrong state #2"); | 
| 398 | ············pm.Abort(); | 
| 399 | ············Assert.AreEqual(NDOObjectState.Persistent, m.NDOObjectState, "Wrong state #3"); | 
| 400 | ············pm.UnloadCache(); | 
| 401 | ············m = (Mitarbeiter)pm.FindObject(m.NDOObjectId); | 
| 402 | ············Assert.AreEqual(NDOObjectState.Hollow, m.NDOObjectState, "Wrong state #4"); | 
| 403 | ············pm.Delete(m); | 
| 404 | ············pm.Save(); | 
| 405 | ············Assert.AreEqual(NDOObjectState.Transient, m.NDOObjectState, "Wrong state #5"); | 
| 406 | |
| 407 | ············IList l = pm.GetClassExtent(typeof(Mitarbeiter)); | 
| 408 | ············Assert.AreEqual(0, l.Count, "Number of read objects is wrong"); | 
| 409 | ········} | 
| 410 | |
| 411 | ········[Test] | 
| 412 | ········public void TestDeletePersistent() | 
| 413 | ········{ | 
| 414 | ············pm.MakePersistent(m); | 
| 415 | ············pm.Save(); | 
| 416 | ············pm.Delete(m); | 
| 417 | ············Assert.AreEqual(NDOObjectState.Deleted, m.NDOObjectState, "Wrong state #1"); | 
| 418 | ············IList l = pm.GetClassExtent(typeof(Mitarbeiter)); | 
| 419 | ············Assert.AreEqual(1, l.Count, "Number of read objects is wrong"); | 
| 420 | ············pm.Save(); | 
| 421 | ············l = pm.GetClassExtent(typeof(Mitarbeiter)); | 
| 422 | ············Assert.AreEqual(0, l.Count, "Number of read objects is wrong"); | 
| 423 | ········} | 
| 424 | |
| 425 | ········[Test] | 
| 426 | ········public void TestDeletePersistentDirty() | 
| 427 | ········{ | 
| 428 | ············pm.MakePersistent(m); | 
| 429 | ············pm.Save(); | 
| 430 | ············m.Nachname = "Test"; | 
| 431 | ············Assert.AreEqual(NDOObjectState.PersistentDirty, m.NDOObjectState, "Wrong state #1"); | 
| 432 | ············pm.Delete(m); | 
| 433 | ············Assert.AreEqual(NDOObjectState.Deleted, m.NDOObjectState, "Wrong state #1"); | 
| 434 | ············pm.Abort(); | 
| 435 | ············Assert.AreEqual("Kocher", m.Nachname, "Name shouldn't be changed"); | 
| 436 | ············pm.Delete(m); | 
| 437 | ············pm.Save(); | 
| 438 | ············IList l = pm.GetClassExtent(typeof(Mitarbeiter)); | 
| 439 | ············Assert.AreEqual(0, l.Count, "Number of read objects is wrong"); | 
| 440 | ········} | 
| 441 | |
| 442 | ········[Test] | 
| 443 | ········public void TestPersistentDirty() | 
| 444 | ········{ | 
| 445 | ············pm.MakePersistent(m); | 
| 446 | ············pm.Save(); | 
| 447 | ············m.Nachname = "Test"; | 
| 448 | ············Assert.AreEqual(NDOObjectState.PersistentDirty, m.NDOObjectState, "Wrong state #1"); | 
| 449 | ············pm.Abort(); | 
| 450 | ············Assert.AreEqual(NDOObjectState.Persistent, m.NDOObjectState, "Wrong state #2"); | 
| 451 | ············Assert.AreEqual("Kocher", m.Nachname, "Name shouldn't be changed"); | 
| 452 | ········} | 
| 453 | |
| 454 | ········[Test] | 
| 455 | ········public void TestMakeTransient() | 
| 456 | ········{ | 
| 457 | ············pm.MakePersistent(m); | 
| 458 | ············pm.Save(); | 
| 459 | ············ObjectId id = m.NDOObjectId; | 
| 460 | ············pm.MakeTransient(m); | 
| 461 | ············Assert.NotNull(id.Id, "MakeTransient shouldn't remove the ID");············ | 
| 462 | ············Assert.Null( ((IPersistenceCapable)m).NDOStateManager, "Transient object shouldn't have state manager"); | 
| 463 | ············Assert.AreEqual(NDOObjectState.Transient, m.NDOObjectState, "Wrong state #1"); | 
| 464 | ············Assert.That(id.IsValid(), "Id should still be valid #1"); | 
| 465 | ············m = (Mitarbeiter)pm.FindObject(id); | 
| 466 | ············Assert.AreEqual(NDOObjectState.Hollow, m.NDOObjectState, "Wrong state #2"); | 
| 467 | ············pm.MakeTransient(m); | 
| 468 | ············Assert.Null( ((IPersistenceCapable)m).NDOStateManager, "Transient object shouldn't have state manager"); | 
| 469 | ············Assert.AreEqual(NDOObjectState.Transient, m.NDOObjectState, "Wrong state #3"); | 
| 470 | ············Assert.That(id.IsValid(), "Id should still be valid #2"); | 
| 471 | ············m = (Mitarbeiter)pm.FindObject(id); | 
| 472 | ············pm.Delete(m); | 
| 473 | ············pm.Save(); | 
| 474 | ············Assert.That(id.IsValid(), "Id should be valid for the ChangeLog"); | 
| 475 | ········} | 
| 476 | |
| 477 | ········[Test] | 
| 478 | ········public void TestMakeHollow() | 
| 479 | ········{ | 
| 480 | ············pm.MakePersistent(m); | 
| 481 | ············pm.Save(); | 
| 482 | ············pm.MakeHollow(m); | 
| 483 | ············Assert.AreEqual(NDOObjectState.Hollow, m.NDOObjectState, "Wrong state #1"); | 
| 484 | ············string access = m.Nachname; | 
| 485 | ············Assert.AreEqual(NDOObjectState.Persistent, m.NDOObjectState, "Wrong state #2"); | 
| 486 | ············pm.MakeAllHollow(); | 
| 487 | ············Assert.AreEqual(NDOObjectState.Hollow, m.NDOObjectState, "Wrong state #3"); | 
| 488 | ········} | 
| 489 | |
| 490 | ········[Test] | 
| 491 | ········public void TestChangeHollow() | 
| 492 | ········{ | 
| 493 | ············pm.MakePersistent(m); | 
| 494 | ············pm.Save(); | 
| 495 | ············pm.MakeHollow(m); | 
| 496 | ············m.Nachname = "Test"; | 
| 497 | ············pm.Abort(); | 
| 498 | ············Assert.AreEqual("Kocher", m.Nachname, "Name shouldn't be changed"); | 
| 499 | ············pm.MakeHollow(m); | 
| 500 | ············m.Nachname = "Test"; | 
| 501 | ············pm.Save(); | 
| 502 | ············Assert.AreEqual("Test", m.Nachname, "Name should be changed"); | 
| 503 | ········} | 
| 504 | |
| 505 | ········[Test] | 
| 506 | ········public void TestRefreshFailed() | 
| 507 | ········{ | 
| 508 | ············bool thrown = false; | 
| 509 | ············try | 
| 510 | ············{ | 
| 511 | ················pm.Refresh( m ); | 
| 512 | ············} | 
| 513 | ············catch (NDOException) | 
| 514 | ············{ | 
| 515 | ················thrown = true; | 
| 516 | ············} | 
| 517 | ············Assert.AreEqual( true, thrown ); | 
| 518 | ········} | 
| 519 | |
| 520 | ········[Test] | 
| 521 | ········public void TestRefresh() | 
| 522 | ········{ | 
| 523 | ············pm.MakePersistent(m); | 
| 524 | ············pm.Save(); | 
| 525 | ············pm.MakeHollow(m); | 
| 526 | ············pm.Refresh(m); | 
| 527 | ············Assert.AreEqual(NDOObjectState.Persistent, m.NDOObjectState, "Wrong state #1"); | 
| 528 | ············pm.Refresh(m); | 
| 529 | ············Assert.AreEqual(NDOObjectState.Persistent, m.NDOObjectState, "Wrong state #2"); | 
| 530 | ············ObjectId id = m.NDOObjectId; | 
| 531 | |
| 532 | ············PersistenceManager pm2 = PmFactory.NewPersistenceManager(); | 
| 533 | ············Mitarbeiter m2 = (Mitarbeiter)pm2.FindObject(id); | 
| 534 | ············Assert.NotNull(m2, "Cannot load object"); | 
| 535 | ············m2.Nachname = "Test"; | 
| 536 | ············pm2.Save(); | 
| 537 | ············pm2.Close(); | 
| 538 | |
| 539 | ············Assert.AreEqual("Kocher", m.Nachname, "Wrong name #1"); | 
| 540 | ············Assert.AreEqual("Test", m2.Nachname, "Wrong name #2"); | 
| 541 | ············pm.Refresh(m); | 
| 542 | ············Assert.AreEqual("Test", m.Nachname, "Wrong name #3"); | 
| 543 | ········} | 
| 544 | |
| 545 | ········[Test] | 
| 546 | ········public void TestHollowMode() | 
| 547 | ········{ | 
| 548 | ············pm.MakePersistent(m); | 
| 549 | ············pm.HollowMode = true; | 
| 550 | ············pm.Save();············ | 
| 551 | ············Assert.AreEqual(NDOObjectState.Hollow, m.NDOObjectState, "Wrong state #1"); | 
| 552 | ············m.Nachname = "Test"; | 
| 553 | ············pm.Abort(); | 
| 554 | ············Assert.AreEqual(NDOObjectState.Hollow, m.NDOObjectState, "Wrong state #2"); | 
| 555 | ············m.Nachname = "Test"; | 
| 556 | ············pm.Save(); | 
| 557 | ············Assert.AreEqual(NDOObjectState.Hollow, m.NDOObjectState, "Wrong state #3"); | 
| 558 | ········} | 
| 559 | |
| 560 | ········[Test] | 
| 561 | ········public void TestAggregateQuery() | 
| 562 | ········{ | 
| 563 | ············Mitarbeiter mm; | 
| 564 | ············IList l = new ArrayList(); | 
| 565 | |
| 566 | ············for (int i = 0; i < 20; i++) | 
| 567 | ············{ | 
| 568 | ················mm = new Mitarbeiter(); | 
| 569 | ················mm.Vorname = "lkj"; | 
| 570 | ················mm.Nachname = i.ToString(); | 
| 571 | ················mm.Position = new System.Drawing.Point(0, i); | 
| 572 | ················pm.MakePersistent(mm); | 
| 573 | ················l.Add(mm); | 
| 574 | ············} | 
| 575 | ············pm.Save(); | 
| 576 | ············decimal sum = 0m;············ | 
| 577 | ············foreach(Mitarbeiter m2 in l) | 
| 578 | ············{ | 
| 579 | ················sum += m2.Position.Y; | 
| 580 | ············} | 
| 581 | ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm, null); | 
| 582 | ············decimal newsum = (decimal)q.ExecuteAggregate("position.Y", AggregateType.Sum); | 
| 583 | ············Assert.AreEqual(sum, newsum, "Summe stimmt nicht"); | 
| 584 | ············decimal count = (decimal)q.ExecuteAggregate("position.X", AggregateType.Count); | 
| 585 | ············Assert.AreEqual(20, count, "Count stimmt nicht"); | 
| 586 | ········} | 
| 587 | |
| 588 | |
| 589 | ········[Test] | 
| 590 | ········public void LinqTestAggregateQuery() | 
| 591 | ········{ | 
| 592 | ············Mitarbeiter mm; | 
| 593 | ············var l = new List<Mitarbeiter>(); | 
| 594 | |
| 595 | ············for (int i = 0; i < 20; i++) | 
| 596 | ············{ | 
| 597 | ················mm = new Mitarbeiter(); | 
| 598 | ················mm.Vorname = "lkj"; | 
| 599 | ················mm.Nachname = i.ToString(); | 
| 600 | ················mm.Gehalt = 5000m + i * 100m; | 
| 601 | ················pm.MakePersistent( mm ); | 
| 602 | ················l.Add( mm ); | 
| 603 | ············} | 
| 604 | ············pm.Save(); | 
| 605 | ············decimal sum = 0m; | 
| 606 | ············foreach (Mitarbeiter m2 in l) | 
| 607 | ············{ | 
| 608 | ················sum += m2.Gehalt; | 
| 609 | ············} | 
| 610 | |
| 611 | ············decimal avg = sum / 20m; | 
| 612 | |
| 613 | ············var virtualTable = pm.Objects<Mitarbeiter>(); | 
| 614 | |
| 615 | ············decimal count = virtualTable.Count; | 
| 616 | ············Assert.AreEqual( 20, count, "Count stimmt nicht" ); | 
| 617 | |
| 618 | ············decimal newsum = virtualTable.Sum( m => m.Gehalt ); | 
| 619 | ············Assert.AreEqual( sum, newsum, "Summe stimmt nicht" ); | 
| 620 | |
| 621 | ············decimal newavg = virtualTable.Average( m => m.Gehalt ); | 
| 622 | ············Assert.AreEqual( avg, newavg, "Durchschnitt stimmt nicht" ); | 
| 623 | ········} | 
| 624 | |
| 625 | |
| 626 | ········[Test] | 
| 627 | ········public void TestPolymorphicQuery() | 
| 628 | ········{ | 
| 629 | ············// If two classes are mapped to the same table, the query | 
| 630 | ············// should give us the class which is given as parameter | 
| 631 | |
| 632 | ············pm.MakePersistent(m); // Manager with privilegstufe 0 | 
| 633 | ············pm.Save(); | 
| 634 | ············pm.UnloadCache(); | 
| 635 | ············IQuery q = new NDOQuery<Mitarbeiter>(pm, null); | 
| 636 | ············IList l = q.Execute(); | 
| 637 | ············Assert.AreEqual(1, l.Count, "Only one object should be returned"); | 
| 638 | ············Assert.AreEqual(typeof(Mitarbeiter), l[0].GetType(), "Object should be a Mitarbeiter"); | 
| 639 | |
| 640 | ············// Fetch the same object as manager | 
| 641 | ············q = new NDOQuery<Manager>(pm, null); | 
| 642 | ············l = q.Execute(); | 
| 643 | ············Assert.AreEqual(1, l.Count, "Only one object should be returned"); | 
| 644 | ············Assert.AreEqual(typeof(Manager), l[0].GetType(), "Object should be a Manager"); | 
| 645 | ········} | 
| 646 | |
| 647 | ········[Test] | 
| 648 | ········public void TestStringLen() | 
| 649 | ········{ | 
| 650 | ············string s = string.Empty; | 
| 651 | ············for (int i = 0; i < 255; i++) | 
| 652 | ············{ | 
| 653 | ················s += "A"; | 
| 654 | ············} | 
| 655 | ············m.Vorname = s; | 
| 656 | ············pm.MakePersistent(m); | 
| 657 | ············pm.Save(); | 
| 658 | ············pm.UnloadCache(); | 
| 659 | ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm); | 
| 660 | ············Mitarbeiter m2 = (Mitarbeiter) q.ExecuteSingle(true); | 
| 661 | ············Assert.AreEqual(255, m2.Vorname.Length, "Lönge des Vornamens falsch"); | 
| 662 | ········} | 
| 663 | |
| 664 | |
| 665 | ········[Test] | 
| 666 | ········public void TestHollowDelete() | 
| 667 | ········{ | 
| 668 | ············pm.MakePersistent(m); | 
| 669 | ············pm.Save(); | 
| 670 | ············pm.UnloadCache(); | 
| 671 | ············// Load hollow | 
| 672 | ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm, null, true); | 
| 673 | ············IList l = q.Execute(); | 
| 674 | ············Assert.AreEqual(1, l.Count, "Anzahl Mitarbeiter falsch #1"); | 
| 675 | ············pm.Delete(l); | 
| 676 | ············pm.Save(); | 
| 677 | ············pm.UnloadCache(); | 
| 678 | ············q = new NDOQuery<Mitarbeiter>(pm); | 
| 679 | ············l = q.Execute(); | 
| 680 | ············Assert.AreEqual(0, l.Count, "Anzahl Mitarbeiter falsch #2"); | 
| 681 | |
| 682 | ········} | 
| 683 | |
| 684 | ········[Test] | 
| 685 | ········public void TestHollowDelete2Pm() | 
| 686 | ········{ | 
| 687 | ············pm.MakePersistent(m); | 
| 688 | ············pm.Save(); | 
| 689 | ············pm.UnloadCache(); | 
| 690 | ············// Load hollow | 
| 691 | ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm, null, true); | 
| 692 | ············IList l = q.Execute(); | 
| 693 | ············Assert.AreEqual(1, l.Count, "Anzahl Mitarbeiter falsch #1"); | 
| 694 | ············PersistenceManager pm2 = PmFactory.NewPersistenceManager(); | 
| 695 | ············pm2.Delete(l); | 
| 696 | ············pm2.Save(); | 
| 697 | ············q = new NDOQuery<Mitarbeiter>(pm); | 
| 698 | ············l = q.Execute(); | 
| 699 | ············Assert.AreEqual(0, l.Count, "Anzahl Mitarbeiter falsch #2"); | 
| 700 | ········} | 
| 701 | |
| 702 | |
| 703 | //········[Test] | 
| 704 | //········void TestVerboseMode() | 
| 705 | //········{ | 
| 706 | //············PersistenceManager pm = new PersistenceManager(); | 
| 707 | // | 
| 708 | //············pm.MakePersistent(m); | 
| 709 | //············pm.Save(); | 
| 710 | // | 
| 711 | //············m.Vorname = "Hallo"; | 
| 712 | // | 
| 713 | //············m.NDOStateManager.PersistenceManager.LogPath = "C:\\Temp"; | 
| 714 | //············Assert.AreEqual(m.NDOStateManager.PersistenceManager.LogPath, pm.LogPath, "LogPath falsch"); | 
| 715 | //············if (File.Exists(pm.LogFile)) | 
| 716 | //················.... | 
| 717 | //············m.NDOStateManager.PersistenceManager.VerboseMode = true; | 
| 718 | //········ | 
| 719 | //············m.NDOStateManager.PersistenceManager.Save();···· | 
| 720 | //········} | 
| 721 | |
| 722 | |
| 723 | ········[Test] | 
| 724 | ········public void Angriff() | 
| 725 | ········{ | 
| 726 | //············pm.MakePersistent(m); | 
| 727 | //············pm.Save(); | 
| 728 | ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm, "nachname LIKE {0}"); | 
| 729 | ············q.Parameters.Add("dummy';SELECT * from Mitarbeiter; --"); | 
| 730 | ············IList l = q.Execute(); | 
| 731 | ········} | 
| 732 | |
| 733 | ········[Test] | 
| 734 | ········public void LoadDataOnUnknownObjectThrows() | 
| 735 | ········{ | 
| 736 | ············Mitarbeiter m = (Mitarbeiter)pm.FindObject( typeof( Mitarbeiter ), 1000000 ); | 
| 737 | ············bool thrown = false; | 
| 738 | ············try | 
| 739 | ············{ | 
| 740 | ················pm.LoadData( m ); | 
| 741 | ············} | 
| 742 | ············catch (NDOException ex) | 
| 743 | ············{ | 
| 744 | ················Assert.AreEqual( 72, ex.ErrorNumber ); | 
| 745 | ················thrown = true; | 
| 746 | ············} | 
| 747 | |
| 748 | ············Assert.That( thrown ); | 
| 749 | ········} | 
| 750 | |
| 751 | ········[Test] | 
| 752 | ········public void LoadDataOnUnknownObjectCallsEventHandler() | 
| 753 | ········{ | 
| 754 | ············pm.ObjectNotPresentEvent += ea => true;··// prevents throwing an exception | 
| 755 | ············Mitarbeiter m = (Mitarbeiter)pm.FindObject( typeof( Mitarbeiter ), 1000000 ); | 
| 756 | ············pm.LoadData( m ); | 
| 757 | ········} | 
| 758 | |
| 759 | ········[Test] | 
| 760 | ········public void LoadDataReturnsPersistentObject() | 
| 761 | ········{ | 
| 762 | ············pm.MakePersistent( m ); | 
| 763 | ············var oid = m.NDOObjectId; | 
| 764 | ············pm.Save(); | 
| 765 | ············pm.UnloadCache(); | 
| 766 | ············var m2 = pm.FindObject( oid ); | 
| 767 | ············Assert.AreEqual( NDOObjectState.Hollow, m2.NDOObjectState ); | 
| 768 | ············pm.LoadData( m2 ); | 
| 769 | ············Assert.AreEqual( NDOObjectState.Persistent, m2.NDOObjectState ); | 
| 770 | ········} | 
| 771 | |
| 772 | ········[Test] | 
| 773 | ········public void CanQueryWithInClause() | 
| 774 | ········{ | 
| 775 | ············var pm = PmFactory.NewPersistenceManager(); | 
| 776 | ············var m1 = CreateMitarbeiter("Mirko", "Matytschak"); | 
| 777 | ············var m2 = CreateMitarbeiter("Hans", "Huber"); | 
| 778 | ············pm.MakePersistent( m1 ); | 
| 779 | ············pm.MakePersistent( m2 ); | 
| 780 | ············pm.Save(); | 
| 781 | ············pm.UnloadCache(); | 
| 782 | ············var l = pm.Objects<Mitarbeiter>().Where(m=>m.Vorname.In(new []{ "Mirko" } )).ResultTable; | 
| 783 | ············Assert.AreEqual( 1, l.Count ); | 
| 784 | ············l = pm.Objects<Mitarbeiter>().Where(m=>m.Vorname.In(new []{ "Mirko", "Hans" } )).ResultTable; | 
| 785 | ············Assert.AreEqual( 2, l.Count ); | 
| 786 | ············Assert.AreEqual( 0, QueryByGuid( new[] { Guid.NewGuid() } ).Count ); | 
| 787 | ········} | 
| 788 | |
| 789 | ········List<Mitarbeiter> QueryByGuid(Guid[] guids) | 
| 790 | ········{ | 
| 791 | ············return pm.Objects<Mitarbeiter>().Where( m => m.Vorname.In( guids ) ); | 
| 792 | ········} | 
| 793 | |
| 794 | ········[Test] | 
| 795 | ········public void CanInsertObjectsUsingSqlHandler() | 
| 796 | ········{ | 
| 797 | ············var pm = PmFactory.NewPersistenceManager(); | 
| 798 | ············pm.TransactionMode = TransactionMode.None; | 
| 799 | ············using (var handler = pm.GetSqlPassThroughHandler()) | 
| 800 | ············{ | 
| 801 | ················var sql = "INSERT INTO [Mitarbeiter] ([Vorname],[Nachname],[Gehalt]) VALUES (@p0, @p1, @p2)"; | 
| 802 | ················handler.Execute( sql, false, "Fritz", "Müller", 123456.34m ); | 
| 803 | ············} | 
| 804 | ············var m = pm.Objects<Mitarbeiter>().SingleOrDefault(); | 
| 805 | ············Assert.NotNull( m ); | 
| 806 | ············Assert.AreEqual( "Fritz", m.Vorname ); | 
| 807 | ············Assert.AreEqual( "Müller", m.Nachname ); | 
| 808 | ············Assert.AreEqual( 123456.34m, m.Gehalt ); | 
| 809 | ········} | 
| 810 | |
| 811 | ········[Test] | 
| 812 | ········public void CanInsertObjectsWithNullParameterUsingSqlHandler() | 
| 813 | ········{ | 
| 814 | ············var pm = PmFactory.NewPersistenceManager(); | 
| 815 | ············pm.TransactionMode = TransactionMode.None; | 
| 816 | ············using (var handler = pm.GetSqlPassThroughHandler()) | 
| 817 | ············{ | 
| 818 | ················var sql = "INSERT INTO [Mitarbeiter] ([Vorname],[Nachname],[Gehalt]) VALUES (@p0, @p1, @p2)"; | 
| 819 | ················handler.Execute( sql, false, null, "Müller", 123456.34m ); | 
| 820 | ············} | 
| 821 | ············var m = pm.Objects<Mitarbeiter>().SingleOrDefault(); | 
| 822 | ············Assert.NotNull( m ); | 
| 823 | ············Assert.AreEqual( "Müller", m.Nachname ); | 
| 824 | ············Assert.AreEqual( 123456.34m, m.Gehalt ); | 
| 825 | ········} | 
| 826 | |
| 827 | ········private Mitarbeiter CreateMitarbeiter(string vorname, string nachname) | 
| 828 | ········{ | 
| 829 | ············Mitarbeiter m = new Mitarbeiter(); | 
| 830 | ············m.Vorname = vorname; | 
| 831 | ············m.Nachname = nachname; | 
| 832 | ············return m; | 
| 833 | ········} | 
| 834 | ····} | 
| 835 | } | 
| 836 | 
New Commit (43dcc14)
			
| 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.Diagnostics; | 
| 27 | using System.IO; | 
| 28 | using System.Collections; | 
| 29 | using NUnit.Framework; | 
| 30 | using System.Collections.Generic; | 
| 31 | using NDO; | 
| 32 | using Reisekosten.Personal; | 
| 33 | using NDO.Query; | 
| 34 | using NDO.Linq; | 
| 35 | |
| 36 | namespace NdoUnitTests | 
| 37 | { | 
| 38 | ····[TestFixture] | 
| 39 | ····public class NDOMitarbeiterTests | 
| 40 | ····{ | 
| 41 | ········public NDOMitarbeiterTests() | 
| 42 | ········{ | 
| 43 | ········} | 
| 44 | |
| 45 | ········private PersistenceManager pm; | 
| 46 | ········private Mitarbeiter m; | 
| 47 | |
| 48 | |
| 49 | ········[SetUp] | 
| 50 | ········public void Setup() | 
| 51 | ········{ | 
| 52 | ············pm = PmFactory.NewPersistenceManager(); | 
| 53 | ············m = CreateMitarbeiter("Hartmut", "Kocher"); | 
| 54 | ········} | 
| 55 | |
| 56 | ········[TearDown] | 
| 57 | ········public void TearDown() | 
| 58 | ········{ | 
| 59 | ············if ( null != pm ) | 
| 60 | ············{ | 
| 61 | ················IList mitarbeiterListe = pm.GetClassExtent( typeof( Mitarbeiter ), true ); | 
| 62 | ················if ( mitarbeiterListe.Count > 0 ) | 
| 63 | ················{ | 
| 64 | ····················pm.Delete( mitarbeiterListe ); | 
| 65 | ····················pm.Save(); | 
| 66 | ················} | 
| 67 | ················pm.Close(); | 
| 68 | ············} | 
| 69 | ········} | 
| 70 | |
| 71 | ········[Test] | 
| 72 | ········public void TestMappingFileName() | 
| 73 | ········{ | 
| 74 | ············Debug.WriteLine("Mapping file = " + pm.NDOMapping.FileName); | 
| 75 | ········} | 
| 76 | |
| 77 | |
| 78 | ········[Test] | 
| 79 | ········public void TestEmptyTransactionSave() | 
| 80 | ········{ | 
| 81 | ············pm.Save(); | 
| 82 | ········} | 
| 83 | |
| 84 | ········[Test] | 
| 85 | ········public void TestEmptyTransactionAbort() | 
| 86 | ········{ | 
| 87 | ············pm.Abort(); | 
| 88 | ········} | 
| 89 | |
| 90 | ········/// <summary> | 
| 91 | ········/// This is not a real test, it just ensures that the DB is empty. | 
| 92 | ········/// </summary> | 
| 93 | ········[Test] | 
| 94 | ········public void EmptyDB() | 
| 95 | ········{ | 
| 96 | ············IList mitarbeiterListe = pm.GetClassExtent(typeof(Mitarbeiter), true); | 
| 97 | ············pm.Delete(mitarbeiterListe); | 
| 98 | ············pm.Save(); | 
| 99 | ········} | 
| 100 | |
| 101 | |
| 102 | ········[Test] | 
| 103 | ········public void TestObjectCreation() | 
| 104 | ········{ | 
| 105 | ············pm.MakePersistent(m); | 
| 106 | ············Assert.NotNull(m.NDOObjectId, "ObjectId should be valid"); | 
| 107 | ············Assert.AreEqual(NDOObjectState.Created, m.NDOObjectState, "Status wrong"); | 
| 108 | ········} | 
| 109 | |
| 110 | ········[Test] | 
| 111 | ········public void CheckBits() | 
| 112 | ········{ | 
| 113 | ············Console.WriteLine( "Running as " + (IntPtr.Size * 8) + " bit app." ); | 
| 114 | ········} | 
| 115 | |
| 116 | ········[Test] | 
| 117 | ········public void CheckPath() | 
| 118 | ········{ | 
| 119 | ············Console.WriteLine( Environment.GetEnvironmentVariable( "PATH" ) ); | 
| 120 | ········} | 
| 121 | |
| 122 | ········[Test] | 
| 123 | ········public void TestObjectCreationSave() | 
| 124 | ········{ | 
| 125 | ············pm.MakePersistent(m); | 
| 126 | ············pm.Save(); | 
| 127 | ············Assert.AreEqual(NDOObjectState.Persistent, m.NDOObjectState, "Status wrong"); | 
| 128 | ········} | 
| 129 | |
| 130 | ········[Test] | 
| 131 | ········public void TestRequery() | 
| 132 | ········{ | 
| 133 | ············pm.MakePersistent(m); | 
| 134 | ············pm.Save(); | 
| 135 | ············Mitarbeiter m1 = new NDOQuery<Mitarbeiter>( pm ).ExecuteSingle(); | 
| 136 | ············m1.Nachname = "Matytschak"; | 
| 137 | ············Mitarbeiter m2 = new NDOQuery<Mitarbeiter>( pm ).ExecuteSingle(); | 
| 138 | ············Assert.AreEqual( "Matytschak", m2.Nachname, "Objekt nicht wiederverwendet" ); | 
| 139 | ············m2.Vorname = "Mirko"; | 
| 140 | ········} | 
| 141 | |
| 142 | ········[Test] | 
| 143 | ········public void TestObjectCreationSaveChanged() | 
| 144 | ········{ | 
| 145 | ············pm.MakePersistent(m); | 
| 146 | ············m.Nachname = "Müller"; | 
| 147 | ············pm.Save(); | 
| 148 | ············Assert.AreEqual("Müller", m.Nachname, "Nachname wrong"); | 
| 149 | ········} | 
| 150 | |
| 151 | ········[Test] | 
| 152 | ········public void TestObjectCreationAbort() | 
| 153 | ········{ | 
| 154 | ············pm.MakePersistent(m); | 
| 155 | ············pm.Abort(); | 
| 156 | ············Assert.Null(m.NDOObjectId, "Transient object shouldn't have ID"); | 
| 157 | ············Assert.Null(((IPersistenceCapable)m).NDOStateManager, "Transient object shouldn't have state manager"); | 
| 158 | ············Assert.AreEqual(NDOObjectState.Transient, m.NDOObjectState, "Status wrong"); | 
| 159 | ········} | 
| 160 | |
| 161 | ········[Test] | 
| 162 | ········public void TestObjectCreationAbortChanged() | 
| 163 | ········{ | 
| 164 | ············pm.MakePersistent(m); | 
| 165 | ············m.Nachname = "Müller"; | 
| 166 | ············pm.Abort(); | 
| 167 | ············Assert.AreEqual("Kocher", m.Nachname, "Nachname wrong"); | 
| 168 | ········} | 
| 169 | |
| 170 | ········[Test] | 
| 171 | ········public void TestObjectId() | 
| 172 | ········{ | 
| 173 | ············pm.MakePersistent(m); | 
| 174 | ············ObjectId id = m.NDOObjectId; | 
| 175 | ············ObjectId id2 = new ObjectId(id); | 
| 176 | ············Assert.AreEqual(m.NDOObjectId, id, "IDs should be equal"); | 
| 177 | ············Assert.AreEqual(m.NDOObjectId, id2, "IDs should be equal"); | 
| 178 | ············if (!pm.HasOwnerCreatedIds && m.NDOObjectId.Id[0] is int) | 
| 179 | ················Assert.That((int)m.NDOObjectId.Id[0] < 0, "Negative key in DS"); | 
| 180 | ············pm.Save(); | 
| 181 | ············Assert.AreEqual(m.NDOObjectId, id, "IDs should be equal"); | 
| 182 | ············Assert.AreEqual(m.NDOObjectId, id2, "IDs should be equal"); | 
| 183 | ············if (!pm.HasOwnerCreatedIds && m.NDOObjectId.Id[0] is int) | 
| 184 | ················Assert.That((int)m.NDOObjectId.Id[0] > 0, "Positive key in DB"); | 
| 185 | ········} | 
| 186 | |
| 187 | ········[Test] | 
| 188 | ········public void TestCreateDeleteTransitionSave() | 
| 189 | ········{ | 
| 190 | ············pm.MakePersistent(m); | 
| 191 | ············pm.Delete(m); | 
| 192 | ············Assert.Null(m.NDOObjectId, "Transient object shouldn't have ID"); | 
| 193 | ············Assert.Null( ((IPersistenceCapable)m).NDOStateManager, "Transient object shouldn't have state manager"); | 
| 194 | ············Assert.AreEqual(NDOObjectState.Transient, m.NDOObjectState, "Status wrong"); | 
| 195 | ············pm.Save(); | 
| 196 | ············Assert.Null(m.NDOObjectId, "Transient object shouldn't have ID"); | 
| 197 | ············Assert.Null( ((IPersistenceCapable)m).NDOStateManager, "Transient object shouldn't have state manager"); | 
| 198 | ············Assert.AreEqual(NDOObjectState.Transient, m.NDOObjectState, "Status wrong"); | 
| 199 | ········} | 
| 200 | |
| 201 | ········[Test] | 
| 202 | ········public void TestCreateDeleteTransitionAbort() | 
| 203 | ········{ | 
| 204 | ············pm.MakePersistent(m); | 
| 205 | ············ObjectId id = m.NDOObjectId; | 
| 206 | ············pm.Delete(m); | 
| 207 | ············pm.Abort(); | 
| 208 | ············Assert.Null(m.NDOObjectId, "Transient object shouldn't have ID"); | 
| 209 | ············Assert.Null( ((IPersistenceCapable)m).NDOStateManager, "Transient object shouldn't have state manager"); | 
| 210 | ············Assert.AreEqual(NDOObjectState.Transient, m.NDOObjectState, "Status wrong"); | 
| 211 | ············IPersistenceCapable pc = pm.FindObject(id); | 
| 212 | ············Assert.NotNull( pc, "There should be a hollow object." ); | 
| 213 | ············Assert.AreEqual(NDOObjectState.Hollow, pc.NDOObjectState, "Status wrong"); | 
| 214 | ········} | 
| 215 | |
| 216 | ········[Test] | 
| 217 | ········public void TestCleanupCache() | 
| 218 | ········{ | 
| 219 | ············pm.MakePersistent(m); | 
| 220 | ············pm.CleanupCache(); | 
| 221 | ············Assert.AreSame(m, pm.FindObject(m.NDOObjectId), "Getting same object twice should return same object"); | 
| 222 | ············pm.Save(); | 
| 223 | ············pm.CleanupCache(); | 
| 224 | ············Assert.AreSame(m, pm.FindObject(m.NDOObjectId), "Getting same object twice should return same object"); | 
| 225 | ············ObjectId id = m.NDOObjectId; | 
| 226 | ············m = null; | 
| 227 | ············pm.CleanupCache(); | 
| 228 | ············Assert.NotNull(pm.FindObject(id), "Should find object"); | 
| 229 | ········} | 
| 230 | |
| 231 | ········[Test] | 
| 232 | ········public void TestUnloadCache() | 
| 233 | ········{ | 
| 234 | ············pm.MakePersistent(m); | 
| 235 | ············Assert.AreSame(m, pm.FindObject(m.NDOObjectId), "Getting same object twice should return same object"); | 
| 236 | ············pm.Save(); | 
| 237 | ············pm.UnloadCache(); | 
| 238 | ············Assert.That(m != pm.FindObject(m.NDOObjectId), "Getting same object twice should return different objects"); | 
| 239 | ············ObjectId id = m.NDOObjectId; | 
| 240 | ············m = null; | 
| 241 | ············pm.UnloadCache(); | 
| 242 | ············Assert.NotNull(pm.FindObject(id), "Should find object"); | 
| 243 | ········} | 
| 244 | |
| 245 | ········[Test] | 
| 246 | ········public void PmWithCachedMappingsWorks() | 
| 247 | ········{ | 
| 248 | ············PersistenceManager pm2 = new PersistenceManager( pm.NDOMapping ); | 
| 249 | |
| 250 | ············pm2.MakePersistent( m ); | 
| 251 | ············pm2.Save(); | 
| 252 | ············pm2.UnloadCache(); | 
| 253 | ············var m2 = pm2.Objects<Mitarbeiter>().First(); | 
| 254 | |
| 255 | ············Assert.AreEqual( m.NDOObjectId, m2.NDOObjectId ); | 
| 256 | ········} | 
| 257 | |
| 258 | ········[Test] | 
| 259 | ········public void TestClassExtent() | 
| 260 | ········{ | 
| 261 | ············ArrayList··mliste = new ArrayList(); | 
| 262 | ············for(int i = 0; i < 100; i++) | 
| 263 | ············{ | 
| 264 | ················Mitarbeiter mm = CreateMitarbeiter("Hartmut", i.ToString()); | 
| 265 | ················pm.MakePersistent(mm); | 
| 266 | ················mliste.Add(mm); | 
| 267 | ············} | 
| 268 | |
| 269 | ············IList mitarbeiterListe = pm.GetClassExtent(typeof(Mitarbeiter)); | 
| 270 | ············Assert.AreEqual(0, mitarbeiterListe.Count, "Current extent should be empty"); | 
| 271 | ············pm.Save(); | 
| 272 | |
| 273 | ············mitarbeiterListe = pm.GetClassExtent(typeof(Mitarbeiter)); | 
| 274 | ············Assert.AreEqual(100, mitarbeiterListe.Count, "Number of read objects is wrong"); | 
| 275 | ············// Check that all objects come from cache... | 
| 276 | ············foreach(Mitarbeiter m1 in mitarbeiterListe) | 
| 277 | ············{ | 
| 278 | ················Assert.AreEqual(NDOObjectState.Persistent, m1.NDOObjectState, "Wrong state"); | 
| 279 | ············} | 
| 280 | |
| 281 | ············mliste.Clear(); | 
| 282 | ············mliste = null; | 
| 283 | ············mitarbeiterListe.Clear(); | 
| 284 | ············mitarbeiterListe = null; | 
| 285 | ············//pm.CleanupCache(); | 
| 286 | ············pm.UnloadCache(); | 
| 287 | ············mitarbeiterListe = pm.GetClassExtent(typeof(Mitarbeiter)); | 
| 288 | ············Assert.AreEqual(100, mitarbeiterListe.Count, "Number of read objects is wrong"); | 
| 289 | ············// Check that all objects are reloaded | 
| 290 | ············foreach(Mitarbeiter m1 in mitarbeiterListe) | 
| 291 | ············{ | 
| 292 | ················Assert.AreEqual(NDOObjectState.Hollow, m1.NDOObjectState, "Wrong state"); | 
| 293 | ············} | 
| 294 | ········} | 
| 295 | |
| 296 | |
| 297 | ········[Test] | 
| 298 | ········public void TestMakePersistentHierarchy() | 
| 299 | ········{ | 
| 300 | ············Reisekosten.Email email = new Reisekosten.Email(); | 
| 301 | ············m.Hinzufuegen(email); | 
| 302 | ············email.Subject = new Reisekosten.Subject(); | 
| 303 | ············email.Subject.Text = "Test"; | 
| 304 | ············Assert.AreEqual(NDOObjectState.Transient, m.NDOObjectState, "Mitarbeiter muss transient sein"); | 
| 305 | ············Assert.AreEqual(NDOObjectState.Transient, email.NDOObjectState, "Email muss transient sein"); | 
| 306 | ············Assert.AreEqual(NDOObjectState.Transient, email.Subject.NDOObjectState, "Subject muss transient sein"); | 
| 307 | ············pm.MakePersistent(m); | 
| 308 | ············Assert.AreEqual(NDOObjectState.Created, m.NDOObjectState, "Mitarbeiter muss Created sein"); | 
| 309 | ············Assert.AreEqual(NDOObjectState.Created, email.NDOObjectState, "Email muss Created sein"); | 
| 310 | ············Assert.AreEqual(NDOObjectState.Created, email.Subject.NDOObjectState, "Subject muss Created sein"); | 
| 311 | ············pm.Save(); | 
| 312 | ············Assert.AreEqual(NDOObjectState.Persistent, m.NDOObjectState, "Mitarbeiter muss Persistent sein"); | 
| 313 | ············Assert.AreEqual(NDOObjectState.Persistent, email.NDOObjectState, "Email muss Persistent sein"); | 
| 314 | ············Assert.AreEqual(NDOObjectState.Persistent, email.Subject.NDOObjectState, "Subject muss Persistent sein"); | 
| 315 | ············ | 
| 316 | ········} | 
| 317 | |
| 318 | ········[Test] | 
| 319 | ········public void TestQuery() | 
| 320 | ········{ | 
| 321 | ············ArrayList··mliste = new ArrayList(); | 
| 322 | ············for(int i = 1; i <= 100; i++) | 
| 323 | ············{ | 
| 324 | ················Mitarbeiter mm = CreateMitarbeiter("Hartmut", (i %··3)··== 0 ? "Test" : "xxx"); | 
| 325 | ················pm.MakePersistent(mm); | 
| 326 | ················mliste.Add(mm); | 
| 327 | ············} | 
| 328 | ············pm.Save();········ | 
| 329 | |
| 330 | ············// Empty query: just like class extent. | 
| 331 | ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm, null, true); | 
| 332 | ············IList mitarbeiterListe = q.Execute(); | 
| 333 | ············Assert.AreEqual(100, mitarbeiterListe.Count, "Number of read objects is wrong"); | 
| 334 | |
| 335 | ············q = new NDOQuery<Mitarbeiter>(pm, "nachname = 'Test'", true); | 
| 336 | ············//System.Diagnostics.Debug.WriteLine(q.GeneratedQuery); | 
| 337 | ············mitarbeiterListe = q.Execute(); | 
| 338 | ············Assert.AreEqual(100/3, mitarbeiterListe.Count, "Number of read objects is wrong"); | 
| 339 | ········} | 
| 340 | |
| 341 | ········[Test] | 
| 342 | ········public void TestLinqQuery() | 
| 343 | ········{ | 
| 344 | ············ArrayList··mliste = new ArrayList(); | 
| 345 | ············for(int i = 1; i <= 100; i++) | 
| 346 | ············{ | 
| 347 | ················Mitarbeiter mm = CreateMitarbeiter("Hartmut", (i % 3)··== 0 ? "Test" : "xxx"); | 
| 348 | ················pm.MakePersistent(mm); | 
| 349 | ················mliste.Add(mm); | 
| 350 | ············} | 
| 351 | ············pm.Save();········ | 
| 352 | ············ | 
| 353 | ············List<Mitarbeiter> mitarbeiterListe = from m in pm.Objects<Mitarbeiter>() select m; | 
| 354 | |
| 355 | ············Assert.AreEqual(100, mitarbeiterListe.Count, "Number of read objects is wrong #1"); | 
| 356 | |
| 357 | ············mitarbeiterListe = from m in pm.Objects<Mitarbeiter>() where m.Nachname == "Test" select m; | 
| 358 | ············Assert.AreEqual(100/3, mitarbeiterListe.Count, "Number of read objects is wrong #2"); | 
| 359 | |
| 360 | ············// Partial select | 
| 361 | ············List<string> nameList = from m in pm.Objects<Mitarbeiter>() select m.Vorname; | 
| 362 | |
| 363 | ············Assert.AreEqual(100, nameList.Count, "Number of read objects is wrong #3"); | 
| 364 | |
| 365 | ············nameList = from m in pm.Objects<Mitarbeiter>() where m.Nachname == "Test" select m.Vorname; | 
| 366 | ············Assert.AreEqual(100/3, mitarbeiterListe.Count, "Number of read objects is wrong #4"); | 
| 367 | ········} | 
| 368 | |
| 369 | ········[Test] | 
| 370 | ········public void LinqQueryWithParameterWorks() | 
| 371 | ········{ | 
| 372 | ············pm.MakePersistent( m ); | 
| 373 | ············pm.Save(); | 
| 374 | ············Mitarbeiter m2 = Mitarbeiter.QueryByName(pm, "Hartmut"); | 
| 375 | ············Assert.NotNull( m2 ); | 
| 376 | ········} | 
| 377 | |
| 378 | ········[Test] | 
| 379 | ········public void LinqQueryWithNullParameterWorks() | 
| 380 | ········{ | 
| 381 | ············pm.MakePersistent( m ); | 
| 382 | ············pm.Save(); | 
| 383 | ············Mitarbeiter m2 = Mitarbeiter.QueryByName(pm, null); | 
| 384 | ············Assert.IsNull( m2 ); | 
| 385 | ········} | 
| 386 | |
| 387 | ········[Test] | 
| 388 | ········public void TestDeleteHollow() | 
| 389 | ········{ | 
| 390 | //············System.Diagnostics.Debug.WriteLine("TestDeleteHollow"); | 
| 391 | ············pm.MakePersistent(m); | 
| 392 | ············pm.Save(); | 
| 393 | ············pm.UnloadCache(); | 
| 394 | ············m = (Mitarbeiter)pm.FindObject(m.NDOObjectId); | 
| 395 | ············Assert.AreEqual(NDOObjectState.Hollow, m.NDOObjectState, "Wrong state #1"); | 
| 396 | ············pm.Delete(m); | 
| 397 | ············Assert.AreEqual(NDOObjectState.Deleted, m.NDOObjectState, "Wrong state #2"); | 
| 398 | ············pm.Abort(); | 
| 399 | ············Assert.AreEqual(NDOObjectState.Persistent, m.NDOObjectState, "Wrong state #3"); | 
| 400 | ············pm.UnloadCache(); | 
| 401 | ············m = (Mitarbeiter)pm.FindObject(m.NDOObjectId); | 
| 402 | ············Assert.AreEqual(NDOObjectState.Hollow, m.NDOObjectState, "Wrong state #4"); | 
| 403 | ············pm.Delete(m); | 
| 404 | ············pm.Save(); | 
| 405 | ············Assert.AreEqual(NDOObjectState.Transient, m.NDOObjectState, "Wrong state #5"); | 
| 406 | |
| 407 | ············IList l = pm.GetClassExtent(typeof(Mitarbeiter)); | 
| 408 | ············Assert.AreEqual(0, l.Count, "Number of read objects is wrong"); | 
| 409 | ········} | 
| 410 | |
| 411 | ········[Test] | 
| 412 | ········public void TestDeletePersistent() | 
| 413 | ········{ | 
| 414 | ············pm.MakePersistent(m); | 
| 415 | ············pm.Save(); | 
| 416 | ············pm.Delete(m); | 
| 417 | ············Assert.AreEqual(NDOObjectState.Deleted, m.NDOObjectState, "Wrong state #1"); | 
| 418 | ············IList l = pm.GetClassExtent(typeof(Mitarbeiter)); | 
| 419 | ············Assert.AreEqual(1, l.Count, "Number of read objects is wrong"); | 
| 420 | ············pm.Save(); | 
| 421 | ············l = pm.GetClassExtent(typeof(Mitarbeiter)); | 
| 422 | ············Assert.AreEqual(0, l.Count, "Number of read objects is wrong"); | 
| 423 | ········} | 
| 424 | |
| 425 | ········[Test] | 
| 426 | ········public void TestDeletePersistentDirty() | 
| 427 | ········{ | 
| 428 | ············pm.MakePersistent(m); | 
| 429 | ············pm.Save(); | 
| 430 | ············m.Nachname = "Test"; | 
| 431 | ············Assert.AreEqual(NDOObjectState.PersistentDirty, m.NDOObjectState, "Wrong state #1"); | 
| 432 | ············pm.Delete(m); | 
| 433 | ············Assert.AreEqual(NDOObjectState.Deleted, m.NDOObjectState, "Wrong state #1"); | 
| 434 | ············pm.Abort(); | 
| 435 | ············Assert.AreEqual("Kocher", m.Nachname, "Name shouldn't be changed"); | 
| 436 | ············pm.Delete(m); | 
| 437 | ············pm.Save(); | 
| 438 | ············IList l = pm.GetClassExtent(typeof(Mitarbeiter)); | 
| 439 | ············Assert.AreEqual(0, l.Count, "Number of read objects is wrong"); | 
| 440 | ········} | 
| 441 | |
| 442 | ········[Test] | 
| 443 | ········public void TestPersistentDirty() | 
| 444 | ········{ | 
| 445 | ············pm.MakePersistent(m); | 
| 446 | ············pm.Save(); | 
| 447 | ············m.Nachname = "Test"; | 
| 448 | ············Assert.AreEqual(NDOObjectState.PersistentDirty, m.NDOObjectState, "Wrong state #1"); | 
| 449 | ············pm.Abort(); | 
| 450 | ············Assert.AreEqual(NDOObjectState.Persistent, m.NDOObjectState, "Wrong state #2"); | 
| 451 | ············Assert.AreEqual("Kocher", m.Nachname, "Name shouldn't be changed"); | 
| 452 | ········} | 
| 453 | |
| 454 | ········[Test] | 
| 455 | ········public void TestMakeTransient() | 
| 456 | ········{ | 
| 457 | ············pm.MakePersistent(m); | 
| 458 | ············pm.Save(); | 
| 459 | ············ObjectId id = m.NDOObjectId; | 
| 460 | ············pm.MakeTransient(m); | 
| 461 | ············Assert.NotNull(id.Id, "MakeTransient shouldn't remove the ID");············ | 
| 462 | ············Assert.Null( ((IPersistenceCapable)m).NDOStateManager, "Transient object shouldn't have state manager"); | 
| 463 | ············Assert.AreEqual(NDOObjectState.Transient, m.NDOObjectState, "Wrong state #1"); | 
| 464 | ············Assert.That(id.IsValid(), "Id should still be valid #1"); | 
| 465 | ············m = (Mitarbeiter)pm.FindObject(id); | 
| 466 | ············Assert.AreEqual(NDOObjectState.Hollow, m.NDOObjectState, "Wrong state #2"); | 
| 467 | ············pm.MakeTransient(m); | 
| 468 | ············Assert.Null( ((IPersistenceCapable)m).NDOStateManager, "Transient object shouldn't have state manager"); | 
| 469 | ············Assert.AreEqual(NDOObjectState.Transient, m.NDOObjectState, "Wrong state #3"); | 
| 470 | ············Assert.That(id.IsValid(), "Id should still be valid #2"); | 
| 471 | ············m = (Mitarbeiter)pm.FindObject(id); | 
| 472 | ············pm.Delete(m); | 
| 473 | ············pm.Save(); | 
| 474 | ············Assert.That(id.IsValid(), "Id should be valid for the ChangeLog"); | 
| 475 | ········} | 
| 476 | |
| 477 | ········[Test] | 
| 478 | ········public void TestMakeHollow() | 
| 479 | ········{ | 
| 480 | ············pm.MakePersistent(m); | 
| 481 | ············pm.Save(); | 
| 482 | ············pm.MakeHollow(m); | 
| 483 | ············Assert.AreEqual(NDOObjectState.Hollow, m.NDOObjectState, "Wrong state #1"); | 
| 484 | ············string access = m.Nachname; | 
| 485 | ············Assert.AreEqual(NDOObjectState.Persistent, m.NDOObjectState, "Wrong state #2"); | 
| 486 | ············pm.MakeAllHollow(); | 
| 487 | ············Assert.AreEqual(NDOObjectState.Hollow, m.NDOObjectState, "Wrong state #3"); | 
| 488 | ········} | 
| 489 | |
| 490 | ········[Test] | 
| 491 | ········public void TestChangeHollow() | 
| 492 | ········{ | 
| 493 | ············pm.MakePersistent(m); | 
| 494 | ············pm.Save(); | 
| 495 | ············pm.MakeHollow(m); | 
| 496 | ············m.Nachname = "Test"; | 
| 497 | ············pm.Abort(); | 
| 498 | ············Assert.AreEqual("Kocher", m.Nachname, "Name shouldn't be changed"); | 
| 499 | ············pm.MakeHollow(m); | 
| 500 | ············m.Nachname = "Test"; | 
| 501 | ············pm.Save(); | 
| 502 | ············Assert.AreEqual("Test", m.Nachname, "Name should be changed"); | 
| 503 | ········} | 
| 504 | |
| 505 | ········[Test] | 
| 506 | ········public void TestRefreshFailed() | 
| 507 | ········{ | 
| 508 | ············bool thrown = false; | 
| 509 | ············try | 
| 510 | ············{ | 
| 511 | ················pm.Refresh( m ); | 
| 512 | ············} | 
| 513 | ············catch (NDOException) | 
| 514 | ············{ | 
| 515 | ················thrown = true; | 
| 516 | ············} | 
| 517 | ············Assert.AreEqual( true, thrown ); | 
| 518 | ········} | 
| 519 | |
| 520 | ········[Test] | 
| 521 | ········public void TestRefresh() | 
| 522 | ········{ | 
| 523 | ············pm.MakePersistent(m); | 
| 524 | ············pm.Save(); | 
| 525 | ············pm.MakeHollow(m); | 
| 526 | ············pm.Refresh(m); | 
| 527 | ············Assert.AreEqual(NDOObjectState.Persistent, m.NDOObjectState, "Wrong state #1"); | 
| 528 | ············pm.Refresh(m); | 
| 529 | ············Assert.AreEqual(NDOObjectState.Persistent, m.NDOObjectState, "Wrong state #2"); | 
| 530 | ············ObjectId id = m.NDOObjectId; | 
| 531 | |
| 532 | ············PersistenceManager pm2 = PmFactory.NewPersistenceManager(); | 
| 533 | ············Mitarbeiter m2 = (Mitarbeiter)pm2.FindObject(id); | 
| 534 | ············Assert.NotNull(m2, "Cannot load object"); | 
| 535 | ············m2.Nachname = "Test"; | 
| 536 | ············pm2.Save(); | 
| 537 | ············pm2.Close(); | 
| 538 | |
| 539 | ············Assert.AreEqual("Kocher", m.Nachname, "Wrong name #1"); | 
| 540 | ············Assert.AreEqual("Test", m2.Nachname, "Wrong name #2"); | 
| 541 | ············pm.Refresh(m); | 
| 542 | ············Assert.AreEqual("Test", m.Nachname, "Wrong name #3"); | 
| 543 | ········} | 
| 544 | |
| 545 | ········[Test] | 
| 546 | ········public void TestHollowMode() | 
| 547 | ········{ | 
| 548 | ············pm.MakePersistent(m); | 
| 549 | ············pm.HollowMode = true; | 
| 550 | ············pm.Save();············ | 
| 551 | ············Assert.AreEqual(NDOObjectState.Hollow, m.NDOObjectState, "Wrong state #1"); | 
| 552 | ············m.Nachname = "Test"; | 
| 553 | ············pm.Abort(); | 
| 554 | ············Assert.AreEqual(NDOObjectState.Hollow, m.NDOObjectState, "Wrong state #2"); | 
| 555 | ············m.Nachname = "Test"; | 
| 556 | ············pm.Save(); | 
| 557 | ············Assert.AreEqual(NDOObjectState.Hollow, m.NDOObjectState, "Wrong state #3"); | 
| 558 | ········} | 
| 559 | |
| 560 | ········[Test] | 
| 561 | ········public void TestAggregateQuery() | 
| 562 | ········{ | 
| 563 | ············Mitarbeiter mm; | 
| 564 | ············IList l = new ArrayList(); | 
| 565 | |
| 566 | ············for (int i = 0; i < 20; i++) | 
| 567 | ············{ | 
| 568 | ················mm = new Mitarbeiter(); | 
| 569 | ················mm.Vorname = "lkj"; | 
| 570 | ················mm.Nachname = i.ToString(); | 
| 571 | ················mm.Position = new System.Drawing.Point(0, i); | 
| 572 | ················pm.MakePersistent(mm); | 
| 573 | ················l.Add(mm); | 
| 574 | ············} | 
| 575 | ············pm.Save(); | 
| 576 | ············decimal sum = 0m;············ | 
| 577 | ············foreach(Mitarbeiter m2 in l) | 
| 578 | ············{ | 
| 579 | ················sum += m2.Position.Y; | 
| 580 | ············} | 
| 581 | ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm, null); | 
| 582 | ············decimal newsum = (decimal)q.ExecuteAggregate("position.Y", AggregateType.Sum); | 
| 583 | ············Assert.AreEqual(sum, newsum, "Summe stimmt nicht"); | 
| 584 | ············decimal count = (decimal)q.ExecuteAggregate("position.X", AggregateType.Count); | 
| 585 | ············Assert.AreEqual(20, count, "Count stimmt nicht"); | 
| 586 | ········} | 
| 587 | |
| 588 | |
| 589 | ········[Test] | 
| 590 | ········public void LinqTestAggregateQuery() | 
| 591 | ········{ | 
| 592 | ············Mitarbeiter mm; | 
| 593 | ············var l = new List<Mitarbeiter>(); | 
| 594 | |
| 595 | ············for (int i = 0; i < 20; i++) | 
| 596 | ············{ | 
| 597 | ················mm = new Mitarbeiter(); | 
| 598 | ················mm.Vorname = "lkj"; | 
| 599 | ················mm.Nachname = i.ToString(); | 
| 600 | ················mm.Gehalt = 5000m + i * 100m; | 
| 601 | ················pm.MakePersistent( mm ); | 
| 602 | ················l.Add( mm ); | 
| 603 | ············} | 
| 604 | ············pm.Save(); | 
| 605 | ············decimal sum = 0m; | 
| 606 | ············foreach (Mitarbeiter m2 in l) | 
| 607 | ············{ | 
| 608 | ················sum += m2.Gehalt; | 
| 609 | ············} | 
| 610 | |
| 611 | ············decimal avg = sum / 20m; | 
| 612 | |
| 613 | ············var virtualTable = pm.Objects<Mitarbeiter>(); | 
| 614 | |
| 615 | ············decimal count = virtualTable.Count; | 
| 616 | ············Assert.AreEqual( 20, count, "Count stimmt nicht" ); | 
| 617 | |
| 618 | ············decimal newsum = virtualTable.Sum( m => m.Gehalt ); | 
| 619 | ············Assert.AreEqual( sum, newsum, "Summe stimmt nicht" ); | 
| 620 | |
| 621 | ············decimal newavg = virtualTable.Average( m => m.Gehalt ); | 
| 622 | ············Assert.AreEqual( avg, newavg, "Durchschnitt stimmt nicht" ); | 
| 623 | ········} | 
| 624 | |
| 625 | |
| 626 | ········[Test] | 
| 627 | ········public void TestPolymorphicQuery() | 
| 628 | ········{ | 
| 629 | ············// If two classes are mapped to the same table, the query | 
| 630 | ············// should give us the class which is given as parameter | 
| 631 | |
| 632 | ············pm.MakePersistent(m); // Manager with privilegstufe 0 | 
| 633 | ············pm.Save(); | 
| 634 | ············pm.UnloadCache(); | 
| 635 | ············IQuery q = new NDOQuery<Mitarbeiter>(pm, null); | 
| 636 | ············IList l = q.Execute(); | 
| 637 | ············Assert.AreEqual(1, l.Count, "Only one object should be returned"); | 
| 638 | ············Assert.AreEqual(typeof(Mitarbeiter), l[0].GetType(), "Object should be a Mitarbeiter"); | 
| 639 | |
| 640 | ············// Fetch the same object as manager | 
| 641 | ············q = new NDOQuery<Manager>(pm, null); | 
| 642 | ············l = q.Execute(); | 
| 643 | ············Assert.AreEqual(1, l.Count, "Only one object should be returned"); | 
| 644 | ············Assert.AreEqual(typeof(Manager), l[0].GetType(), "Object should be a Manager"); | 
| 645 | ········} | 
| 646 | |
| 647 | ········[Test] | 
| 648 | ········public void TestStringLen() | 
| 649 | ········{ | 
| 650 | ············string s = string.Empty; | 
| 651 | ············for (int i = 0; i < 255; i++) | 
| 652 | ············{ | 
| 653 | ················s += "A"; | 
| 654 | ············} | 
| 655 | ············m.Vorname = s; | 
| 656 | ············pm.MakePersistent(m); | 
| 657 | ············pm.Save(); | 
| 658 | ············pm.UnloadCache(); | 
| 659 | ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm); | 
| 660 | ············Mitarbeiter m2 = (Mitarbeiter) q.ExecuteSingle(true); | 
| 661 | ············Assert.AreEqual(255, m2.Vorname.Length, "Lönge des Vornamens falsch"); | 
| 662 | ········} | 
| 663 | |
| 664 | |
| 665 | ········[Test] | 
| 666 | ········public void TestHollowDelete() | 
| 667 | ········{ | 
| 668 | ············pm.MakePersistent(m); | 
| 669 | ············pm.Save(); | 
| 670 | ············pm.UnloadCache(); | 
| 671 | ············// Load hollow | 
| 672 | ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm, null, true); | 
| 673 | ············IList l = q.Execute(); | 
| 674 | ············Assert.AreEqual(1, l.Count, "Anzahl Mitarbeiter falsch #1"); | 
| 675 | ············pm.Delete(l); | 
| 676 | ············pm.Save(); | 
| 677 | ············pm.UnloadCache(); | 
| 678 | ············q = new NDOQuery<Mitarbeiter>(pm); | 
| 679 | ············l = q.Execute(); | 
| 680 | ············Assert.AreEqual(0, l.Count, "Anzahl Mitarbeiter falsch #2"); | 
| 681 | |
| 682 | ········} | 
| 683 | |
| 684 | ········[Test] | 
| 685 | ········public void TestHollowDelete2Pm() | 
| 686 | ········{ | 
| 687 | ············pm.MakePersistent(m); | 
| 688 | ············pm.Save(); | 
| 689 | ············pm.UnloadCache(); | 
| 690 | ············// Load hollow | 
| 691 | ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm, null, true); | 
| 692 | ············IList l = q.Execute(); | 
| 693 | ············Assert.AreEqual(1, l.Count, "Anzahl Mitarbeiter falsch #1"); | 
| 694 | ············PersistenceManager pm2 = PmFactory.NewPersistenceManager(); | 
| 695 | ············pm2.Delete(l); | 
| 696 | ············pm2.Save(); | 
| 697 | ············q = new NDOQuery<Mitarbeiter>(pm); | 
| 698 | ············l = q.Execute(); | 
| 699 | ············Assert.AreEqual(0, l.Count, "Anzahl Mitarbeiter falsch #2"); | 
| 700 | ········} | 
| 701 | |
| 702 | |
| 703 | //········[Test] | 
| 704 | //········void TestVerboseMode() | 
| 705 | //········{ | 
| 706 | //············PersistenceManager pm = new PersistenceManager(); | 
| 707 | // | 
| 708 | //············pm.MakePersistent(m); | 
| 709 | //············pm.Save(); | 
| 710 | // | 
| 711 | //············m.Vorname = "Hallo"; | 
| 712 | // | 
| 713 | //············m.NDOStateManager.PersistenceManager.LogPath = "C:\\Temp"; | 
| 714 | //············Assert.AreEqual(m.NDOStateManager.PersistenceManager.LogPath, pm.LogPath, "LogPath falsch"); | 
| 715 | //············if (File.Exists(pm.LogFile)) | 
| 716 | //················.... | 
| 717 | //············m.NDOStateManager.PersistenceManager.VerboseMode = true; | 
| 718 | //········ | 
| 719 | //············m.NDOStateManager.PersistenceManager.Save();···· | 
| 720 | //········} | 
| 721 | |
| 722 | |
| 723 | ········[Test] | 
| 724 | ········public void Angriff() | 
| 725 | ········{ | 
| 726 | //············pm.MakePersistent(m); | 
| 727 | //············pm.Save(); | 
| 728 | ············NDOQuery<Mitarbeiter> q = new NDOQuery<Mitarbeiter>(pm, "nachname LIKE {0}"); | 
| 729 | ············q.Parameters.Add("dummy';SELECT * from Mitarbeiter; --"); | 
| 730 | ············IList l = q.Execute(); | 
| 731 | ········} | 
| 732 | |
| 733 | ········[Test] | 
| 734 | ········public void LoadDataOnUnknownObjectThrows() | 
| 735 | ········{ | 
| 736 | ············Mitarbeiter m = (Mitarbeiter)pm.FindObject( typeof( Mitarbeiter ), 1000000 ); | 
| 737 | ············bool thrown = false; | 
| 738 | ············try | 
| 739 | ············{ | 
| 740 | ················pm.LoadData( m ); | 
| 741 | ············} | 
| 742 | ············catch (NDOException ex) | 
| 743 | ············{ | 
| 744 | ················Assert.AreEqual( 72, ex.ErrorNumber ); | 
| 745 | ················thrown = true; | 
| 746 | ············} | 
| 747 | |
| 748 | ············Assert.That( thrown ); | 
| 749 | ········} | 
| 750 | |
| 751 | ········[Test] | 
| 752 | ········public void LoadDataOnUnknownObjectCallsEventHandler() | 
| 753 | ········{ | 
| 754 | ············pm.ObjectNotPresentEvent += ea => true;··// prevents throwing an exception | 
| 755 | ············Mitarbeiter m = (Mitarbeiter)pm.FindObject( typeof( Mitarbeiter ), 1000000 ); | 
| 756 | ············pm.LoadData( m ); | 
| 757 | ········} | 
| 758 | |
| 759 | ········[Test] | 
| 760 | ········public void LoadDataReturnsPersistentObject() | 
| 761 | ········{ | 
| 762 | ············pm.MakePersistent( m ); | 
| 763 | ············var oid = m.NDOObjectId; | 
| 764 | ············pm.Save(); | 
| 765 | ············pm.UnloadCache(); | 
| 766 | ············var m2 = pm.FindObject( oid ); | 
| 767 | ············Assert.AreEqual( NDOObjectState.Hollow, m2.NDOObjectState ); | 
| 768 | ············pm.LoadData( m2 ); | 
| 769 | ············Assert.AreEqual( NDOObjectState.Persistent, m2.NDOObjectState ); | 
| 770 | ········} | 
| 771 | |
| 772 | ········[Test] | 
| 773 | ········public void CanQueryWithInClause() | 
| 774 | ········{ | 
| 775 | ············var pm = PmFactory.NewPersistenceManager(); | 
| 776 | ············var m1 = CreateMitarbeiter("Mirko", "Matytschak"); | 
| 777 | ············var m2 = CreateMitarbeiter("Hans", "Huber"); | 
| 778 | ············pm.MakePersistent( m1 ); | 
| 779 | ············pm.MakePersistent( m2 ); | 
| 780 | ············pm.Save(); | 
| 781 | ············pm.UnloadCache(); | 
| 782 | ············var l = pm.Objects<Mitarbeiter>().Where(m=>m.Vorname.In(new []{ "Mirko" } )).ResultTable; | 
| 783 | ············Assert.AreEqual( 1, l.Count ); | 
| 784 | ············l = pm.Objects<Mitarbeiter>().Where(m=>m.Vorname.In(new []{ "Mirko", "Hans" } )).ResultTable; | 
| 785 | ············Assert.AreEqual( 2, l.Count ); | 
| 786 | ············Assert.AreEqual( 0, QueryByGuid( new[] { Guid.NewGuid() } ).Count ); | 
| 787 | ········} | 
| 788 | |
| 789 | ········List<Mitarbeiter> QueryByGuid(Guid[] guids) | 
| 790 | ········{ | 
| 791 | ············return pm.Objects<Mitarbeiter>().Where( m => m.Vorname.In( guids ) ); | 
| 792 | ········} | 
| 793 | |
| 794 | ········[Test] | 
| 795 | ········public void CanInsertObjectsUsingSqlHandler() | 
| 796 | ········{ | 
| 797 | ············var pm = PmFactory.NewPersistenceManager(); | 
| 798 | ············pm.TransactionMode = TransactionMode.None; | 
| 799 | ············using (var handler = pm.GetSqlPassThroughHandler()) | 
| 800 | ············{ | 
| 801 | ················var sql = "INSERT INTO [Mitarbeiter] ([Vorname],[Nachname],[Gehalt]) VALUES (@p0, @p1, @p2)"; | 
| 802 | ················handler.Execute( sql, false, "Fritz", "Müller", 123456.34m ); | 
| 803 | ············} | 
| 804 | ············var m = pm.Objects<Mitarbeiter>().SingleOrDefault(); | 
| 805 | ············Assert.NotNull( m ); | 
| 806 | ············Assert.AreEqual( "Fritz", m.Vorname ); | 
| 807 | ············Assert.AreEqual( "Müller", m.Nachname ); | 
| 808 | ············Assert.AreEqual( 123456.34m, m.Gehalt ); | 
| 809 | ········} | 
| 810 | |
| 811 | ········[Test] | 
| 812 | ········public void CanInsertObjectsWithNullParameterUsingSqlHandler() | 
| 813 | ········{ | 
| 814 | ············var pm = PmFactory.NewPersistenceManager(); | 
| 815 | ············pm.TransactionMode = TransactionMode.None; | 
| 816 | ············using (var handler = pm.GetSqlPassThroughHandler()) | 
| 817 | ············{ | 
| 818 | ················var sql = "INSERT INTO [Mitarbeiter] ([Vorname],[Nachname],[Gehalt]) VALUES (@p0, @p1, @p2)"; | 
| 819 | ················handler.Execute( sql, false, null, "Müller", 123456.34m ); | 
| 820 | ············} | 
| 821 | ············var m = pm.Objects<Mitarbeiter>().SingleOrDefault(); | 
| 822 | ············Assert.NotNull( m ); | 
| 823 | ············Assert.AreEqual( "Müller", m.Nachname ); | 
| 824 | ············Assert.AreEqual( 123456.34m, m.Gehalt ); | 
| 825 | ········} | 
| 826 | |
| 827 | ········[Test] | 
| 828 | ········public void CanPerformDirectDelete() | 
| 829 | ········{ | 
| 830 | ············pm.MakePersistent( m ); | 
| 831 | ············pm.Save(); | 
| 832 | ············var firstName = m.Vorname; | 
| 833 | |
| 834 | ············Assert.IsTrue( pm.Objects<Mitarbeiter>().Where( m => m.Vorname == firstName ).Count > 0 ); | 
| 835 | |
| 836 | ············var q = new NDOQuery<Mitarbeiter>( pm, "vorname = {0}" ); | 
| 837 | ············q.Parameters.Add( firstName ); | 
| 838 | ············q.DeleteDirectly(); | 
| 839 | |
| 840 | ············Assert.AreEqual( 0, pm.Objects<Mitarbeiter>().Where( m => m.Vorname == firstName ).Count ); | 
| 841 | |
| 842 | ············m = CreateMitarbeiter( "Mirko", "Matytschak" ); | 
| 843 | ············pm.MakePersistent( m ); | 
| 844 | ············pm.Save(); | 
| 845 | ············firstName = m.Vorname; | 
| 846 | |
| 847 | ············Assert.IsTrue( pm.Objects<Mitarbeiter>().Where( m => m.Vorname == firstName ).Count > 0 ); | 
| 848 | |
| 849 | ············pm.Objects<Mitarbeiter>().Where( m => m.Vorname == firstName ).DeleteDirectly(); | 
| 850 | |
| 851 | ············Assert.AreEqual( 0, pm.Objects<Mitarbeiter>().Where( m => m.Vorname == firstName ).Count ); | 
| 852 | ········} | 
| 853 | |
| 854 | ········private Mitarbeiter CreateMitarbeiter(string vorname, string nachname) | 
| 855 | ········{ | 
| 856 | ············Mitarbeiter m = new Mitarbeiter(); | 
| 857 | ············m.Vorname = vorname; | 
| 858 | ············m.Nachname = nachname; | 
| 859 | ············return m; | 
| 860 | ········} | 
| 861 | ····} | 
| 862 | } | 
| 863 |