Update of /cvsroot/jcframework/dotnet/Nunit/InheritedClasses In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv815/Nunit/InheritedClasses Added Files: AtomsFrameworkTests.vb AutoIdClasses.vb AutoIdTests.vb CEmployee.vb CJob.vb CSharedClasses.vb CStudent.vb CTeam.vb CWorker.vb ManyToManyClasses_v2.vb ManyToManyTests_v2.vb MultiRetrieveTestClasses.vb MultiRetrieveTests.vb RetrieveCriteriaTests.vb SharedTests.vb SuperClassTests.vb TableA_B.vb tblAtoKClasses.vb Log Message: Name changes to bring class library into line with Microsoft naming standards. FxCop directory added Nunit tests moved into main repository --- NEW FILE: CJob.vb --- Imports AtomsFramework Namespace InheritedClasses <AFTable("jobs", "MSA", AFTableAttribute.KeyType.useOIDValue, OIDcolumn:="oidvalue")> _ Public Class CJob Inherits PersistentObject Private m_description As String <AFColumn("description", Find:=True)> _ Public Property Description() As String Get Return m_description End Get Set(ByVal Value As String) m_description = Value SetDirtyFlag() End Set End Property Public Overrides Function getNewObject() As AtomsFramework.PersistentObject Return New CJob End Function Public Overrides Function IsValid() As Boolean Return True End Function End Class End Namespace --- NEW FILE: MultiRetrieveTestClasses.vb --- Imports AtomsFramework Namespace InheritedClasses Public Class mr1 Inherits PersistentObject Private _id As String Private _mr2_id As String Private _mr2 As mr2 Private _field1 As String Private _field2 As Integer Public Property id() As String Get Return _id End Get Set(ByVal Value As String) _id = Value SetDirtyFlag() End Set End Property Public Property mr2_id() As String Get If Not _mr2 Is Nothing Then Return _mr2.id End If Return _mr2_id End Get Set(ByVal Value As String) _mr2_id = Value SetDirtyFlag() End Set End Property Public Property mr2() As mr2 Get Return _mr2 End Get Set(ByVal Value As mr2) _mr2 = Value SetDirtyFlag() End Set End Property Public Property field1() As String Get Return _field1 End Get Set(ByVal Value As String) _field1 = Value SetDirtyFlag() End Set End Property Public Property field2() As Integer Get Return _field2 End Get Set(ByVal Value As Integer) _field2 = Value SetDirtyFlag() End Set End Property Public Overrides Function getNewObject() As AtomsFramework.PersistentObject Return New mr1 End Function Public Overrides Function IsValid() As Boolean Return True End Function End Class Public Class mr2 Inherits PersistentObject Private _id As String Public Property id() As String Get Return _id End Get Set(ByVal Value As String) _id = Value SetDirtyFlag() End Set End Property Private _field1 As String Public Property field1() As String Get Return _field1 End Get Set(ByVal Value As String) _field1 = Value SetDirtyFlag() End Set End Property Private _field2 As Integer Public Property field2() As Integer Get Return _field2 End Get Set(ByVal Value As Integer) _field2 = Value SetDirtyFlag() End Set End Property Private _mr3_id As String Private _mr3 As mr3 Public Property mr3_id() As String Get If Not _mr3 Is Nothing Then Return _mr3.id End If Return _mr3_id End Get Set(ByVal Value As String) _mr3_id = Value SetDirtyFlag() End Set End Property Public Property mr3() As mr3 Get Return _mr3 End Get Set(ByVal Value As mr3) _mr3 = Value SetDirtyFlag() End Set End Property Public Overrides Function getNewObject() As AtomsFramework.PersistentObject Return New mr2 End Function Public Overrides Function IsValid() As Boolean Return True End Function End Class Public Class mr3 Inherits PersistentObject Private _id As String Public Property id() As String Get Return _id End Get Set(ByVal Value As String) _id = Value SetDirtyFlag() End Set End Property Private _field1 As String Public Property field1() As String Get Return _field1 End Get Set(ByVal Value As String) _field1 = Value SetDirtyFlag() End Set End Property Private _field2 As Integer Public Property field2() As Integer Get Return _field2 End Get Set(ByVal Value As Integer) _field2 = Value SetDirtyFlag() End Set End Property Public Overrides Function getNewObject() As AtomsFramework.PersistentObject Return New mr3 End Function Public Overrides Function IsValid() As Boolean Return True End Function End Class End Namespace --- NEW FILE: TableA_B.vb --- Imports AtomsFramework Namespace InheritedClasses Public Class TableA Inherits PersistentObject Private _id As String Public Property Id() As String Get Return _id End Get Set(ByVal Value As String) _id = Value SetDirtyFlag() End Set End Property Private _field1 As String Public Property field1() As String Get Return _field1 End Get Set(ByVal Value As String) _field1 = Value SetDirtyFlag() End Set End Property Private WithEvents _tableBCol As New PersistentObjectCollection Public Property TableBCollection() As PersistentObjectCollection Get Return _tableBCol End Get Set(ByVal Value As PersistentObjectCollection) _tableBCol = Value End Set End Property Private _tableCCol As New PersistentObjectCollection Public Property TableCCollection() As PersistentObjectCollection Get Return _tableCCol End Get Set(ByVal Value As PersistentObjectCollection) _tableCCol = Value End Set End Property Public Overrides Function getNewObject() As AtomsFramework.PersistentObject Return New TableA End Function Public Overrides Function IsValid() As Boolean Return True End Function Private Sub _tableBCol_ItemDirtied(ByVal sender As Object, ByVal e As System.EventArgs) Handles _tableBCol.ItemDirtied Me.SetDirtyFlag() End Sub Private Sub _tableBCol_ObjectAdded(ByVal index As Integer, ByRef value As Object) Handles _tableBCol.ObjectAdded Me.SetDirtyFlag() End Sub Private Sub _tableBCol_ObjectRemoved(ByVal index As Integer, ByRef value As Object) Handles _tableBCol.ObjectRemoved Me.SetDirtyFlag() End Sub End Class Public Class TableB Inherits PersistentObject Private _id As String Public Property Id() As String Get Return _id End Get Set(ByVal Value As String) _id = Value SetDirtyFlag() End Set End Property Private _field1 As String Public Property field1() As String Get Return _field1 End Get Set(ByVal Value As String) _field1 = Value SetDirtyFlag() End Set End Property Private _a As TableA Private _a_id As String Public Property TableA() As TableA Get Return _a End Get Set(ByVal Value As TableA) _a = Value SetDirtyFlag() End Set End Property Public Property AId() As String Get If _a Is Nothing Then Return _a_id End If Return _a.Id End Get Set(ByVal Value As String) _a_id = Value End Set End Property Public Overrides Function getNewObject() As AtomsFramework.PersistentObject Return New TableB End Function Public Overrides Function IsValid() As Boolean Return True End Function End Class Public Class TableC Inherits PersistentObject Private _id As String Public Property Id() As String Get Return _id End Get Set(ByVal Value As String) _id = Value SetDirtyFlag() End Set End Property Private _field1 As String Public Property field1() As String Get Return _field1 End Get Set(ByVal Value As String) _field1 = Value SetDirtyFlag() End Set End Property Private _a As TableA Private _a_id As String Public Property TableA() As TableA Get Return _a End Get Set(ByVal Value As TableA) _a = Value SetDirtyFlag() End Set End Property Public Property AId() As String Get If _a Is Nothing Then Return _a_id End If Return _a.Id End Get Set(ByVal Value As String) _a_id = Value End Set End Property Public Overrides Function getNewObject() As AtomsFramework.PersistentObject Return New TableC End Function Public Overrides Function IsValid() As Boolean Return True End Function End Class End Namespace --- NEW FILE: RetrieveCriteriaTests.vb --- Imports AtomsFramework Imports NUnit.Framework Namespace InheritedClasses <TestFixture()> Public Class RetrieveCriteriaTests Private pbroker As PersistenceBroker Private emp As CEmployee Private r As RetrieveCriteria Private mr As MultiRetrieveCriteria Private c As ResultCursor <TestFixtureSetUp()> Public Sub Init() Environment.CurrentDirectory = System.AppDomain.CurrentDomain.BaseDirectory Dim retry As Boolean = True While retry = True Try 'Remove any existing test database System.IO.File.Delete(".\db1.mdb") retry = False Catch iox As IO.IOException 'file is in use - so we will loop around until it is released GC.Collect() Catch ex As Exception retry = False End Try End While System.IO.File.Copy(".\original db1.mdb", ".\db1.mdb") pbroker = New PersistenceBroker pbroker.init() End Sub <TestFixtureTearDown()> Public Sub Dispose() pbroker.Dispose() pbroker = Nothing End Sub <SetUp()> Public Sub testInit() emp = New CEmployee End Sub <Test()> Public Sub SingleClassRetrieve() r = New RetrieveCriteria r.ClassMap = emp.getClassMap c = r.perform Assert.IsTrue(c.hasElements) Assert.IsTrue(Not c.EOF) Assert.IsTrue(c.HoldsProxies) Assert.AreEqual(c.ResultSet.ResultSet.Tables(0).Rows.Count, 6) End Sub <Test()> Public Sub MultiRetrieveTest1() Dim si As SelectInCriteria mr = New MultiRetrieveCriteria(emp) mr.WhereCondition.addSelectEqualTo("Name", "ac") si = New SelectInCriteria(emp) si.WhereCondition.addSelectEqualTo("Name", "ac") si.SetSelectAttribute("Name") mr.WhereCondition.addSelectNotIn("Name", si) c = mr.perform Assert.IsFalse(c.hasElements) Assert.IsTrue(c.EOF) End Sub <Test()> Public Sub RetrieveCriteriaOffset() r = New RetrieveCriteria r.ClassMap = emp.getClassMap r.RowLimit = 1 r.Offset = 1 c = r.perform Assert.IsTrue(c.hasElements) Assert.AreEqual(1, c.TotalRows) End Sub <Test()> Public Sub LoadFullObjects() r = New RetrieveCriteria r.ReturnFullObjects = True c = r.perform(emp) Assert.IsFalse(c.HoldsProxies) While c.hasElements And Not c.EOF emp = New CEmployee c.loadObject(emp) Assert.IsTrue(emp.Persistent) c.nextCursor() End While c.SetCursor(0) emp = New CEmployee c.loadObject(emp) Assert.AreEqual(emp.Name, "ab") End Sub <Test()> Public Sub SimpleOrCriteria() r = New RetrieveCriteria r.ClassMap = emp.getClassMap r.WhereCondition.addSelectEqualTo("Name", "aa") r.WhereCondition.addSelectEqualTo("Name", "b", True) c = r.perform Assert.IsTrue(c.hasElements) Assert.AreEqual(c.ResultSet.ResultSet.Tables(0).Rows.Count, 2) c.loadObject(emp) Assert.AreEqual(emp.Name, "aa") c.nextCursor() emp = New CEmployee c.loadObject(emp) Assert.AreEqual(emp.Name, "b") End Sub <Test()> Public Sub SelectInList() Dim al As New ArrayList al.Add("aa") al.Add("b") r = New RetrieveCriteria r.ClassMap = emp.getClassMap r.WhereCondition.addSelectInList("Name", al) c = r.perform Assert.IsTrue(c.hasElements) Assert.AreEqual(c.ResultSet.ResultSet.Tables(0).Rows.Count, 2) c.loadObject(emp) Assert.AreEqual(emp.Name, "aa") c.nextCursor() emp = New CEmployee c.loadObject(emp) Assert.AreEqual(emp.Name, "b") End Sub <Test()> Public Sub SubCriteria() Dim xx_1 As New CriteriaCondition Dim xx_2 As New CriteriaCondition Dim xx_3 As New CriteriaCondition Dim xx_4 As New CriteriaCondition r = New RetrieveCriteria r.ClassMap = emp.getClassMap xx_1.ClassMap = r.ClassMap xx_2.ClassMap = r.ClassMap xx_3.ClassMap = r.ClassMap xx_4.ClassMap = r.ClassMap xx_1.addSelectEqualTo("Name", "aa") xx_2.addSelectEqualTo("Name", "ab") xx_1.addSubCriteria(xx_2, True) xx_3.addSelectEqualTo("Name", "ab") xx_4.addSelectEqualTo("Name", "ac") xx_3.addSubCriteria(xx_4, True) r.WhereCondition.addSubCriteria(xx_1, True) r.WhereCondition.addSubCriteria(xx_3, False) c = r.perform Assert.IsTrue(c.hasElements) Assert.AreEqual(c.ResultSet.ResultSet.Tables(0).Rows.Count, 1) While c.hasElements And Not c.EOF emp = New CEmployee c.loadObject(emp) Assert.AreEqual(emp.Name, "ab") c.nextCursor() End While End Sub End Class End Namespace --- NEW FILE: ManyToManyClasses_v2.vb --- Imports AtomsFramework Namespace InheritedClasses #Region "M2MA" Public Class M2MA Inherits PersistentObject Private _description As String Private WithEvents _bCol As M2MBCollection Public Property Description() As String Get Return _description End Get Set(ByVal Value As String) _description = Value SetDirtyFlag() End Set End Property Public Property M2MBCollection() As M2MBCollection Get Return _bCol End Get Set(ByVal Value As M2MBCollection) _bCol = Value End Set End Property Public Overrides Function getNewObject() As AtomsFramework.PersistentObject Return New M2MA End Function Public Overrides Function IsValid() As Boolean Return True End Function Public Sub New() _bCol = New M2MBCollection End Sub Private Sub _bCol_ListChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ListChangedEventArgs) Handles _bCol.ListChanged Me.SetDirtyFlag() End Sub End Class #End Region #Region "M2MB" Public Class M2MB Inherits PersistentObject Private _description As String Private _aCol As M2MACollection Public Property Description() As String Get Return _description End Get Set(ByVal Value As String) _description = Value SetDirtyFlag() End Set End Property Public Property M2MACollection() As M2MACollection Get Return _aCol End Get Set(ByVal Value As M2MACollection) _aCol = Value End Set End Property Public Overrides Function getNewObject() As AtomsFramework.PersistentObject Return New M2MB End Function Public Overrides Function IsValid() As Boolean Return True End Function Public Sub New() _aCol = New M2MACollection End Sub End Class #End Region #Region "M2MACollection" Public Class M2MACollection Inherits PersistentObjectCollection Public Overloads Sub Add(ByVal a As M2MA) list.Add(a) End Sub Public Shadows Function Item(ByVal index As Integer) As M2MA Return CType(MyBase.Item(index), M2MA) End Function End Class #End Region #Region "M2MBCollection" Public Class M2MBCollection Inherits PersistentObjectCollection Public Overloads Sub Add(ByVal b As M2MB) list.Add(b) End Sub Public Shadows Function Item(ByVal index As Integer) As M2MB Return CType(MyBase.Item(index), M2MB) End Function End Class #End Region End Namespace --- NEW FILE: AtomsFrameworkTests.vb --- Imports AtomsFramework Imports NUnit.Framework Namespace InheritedClasses <TestFixture()> Public Class _BasicTests Private pbroker As PersistenceBroker Private emp As CEmployee Private job As CJob Private team As CTeam Dim WithEvents coll As PersistentObjectCollection Private eventcount As Integer <TestFixtureSetUp()> Public Sub Init() Environment.CurrentDirectory = System.AppDomain.CurrentDomain.BaseDirectory Dim retry As Boolean = True While retry = True Try 'Remove any existing test database System.IO.File.Delete(".\db1.mdb") retry = False Catch iox As IO.IOException GC.Collect() 'file is in use - so we will loop around until it is released Catch ex As Exception retry = False End Try End While System.IO.File.Copy(".\original db1.mdb", ".\db1.mdb") pbroker = New PersistenceBroker pbroker.init() End Sub <TestFixtureTearDown()> Public Sub Dispose() pbroker.Dispose() pbroker = Nothing End Sub <SetUp()> Public Sub TestInit() emp = New CEmployee job = New CJob team = New CTeam End Sub <Test()> Public Sub LoadSaveandDeleteEmployee() Dim oidvalue As String emp.Name = "new" emp.Find() Assert.IsFalse(emp.Persistent) oidvalue = emp.OIDValue emp.Save() Assert.IsTrue(emp.Persistent) Assert.IsTrue(emp.ReportsTo Is Nothing) Assert.IsFalse(emp.IsReferenced) emp = New CEmployee emp.Name = "new" emp.Find() Assert.IsTrue(emp.Persistent) Assert.AreEqual(emp.OIDValue, oidvalue) Assert.AreEqual(emp.Name, "new") emp.Delete() Assert.IsFalse(emp.Persistent) emp = New CEmployee emp.Name = "new" emp.Find() Assert.IsFalse(emp.Persistent) Assert.IsTrue(emp.OIDValue <> oidvalue) End Sub <Test()> Public Sub ChangeFindFieldValue() Dim oidvalue As String emp.Name = "SaveThenChange" emp.Find() Assert.IsFalse(emp.Persistent) oidvalue = emp.OIDValue emp.Save() Assert.IsTrue(emp.Persistent) Assert.IsTrue(emp.ReportsTo Is Nothing) Assert.IsFalse(emp.IsReferenced) emp = New CEmployee emp.Name = "SaveThenChange" emp.Find() Assert.IsTrue(emp.Persistent) Assert.AreEqual(emp.OIDValue, oidvalue) Assert.AreEqual(emp.Name, "SaveThenChange") emp.Name = "Changed" emp.Save() Assert.IsTrue(emp.Persistent) emp.Delete() Assert.IsFalse(emp.Persistent) emp = New CEmployee emp.Name = "Changed" emp.Find() Assert.IsFalse(emp.Persistent) emp = New CEmployee emp.Name = "SaveThenChange" emp.Find() Assert.IsFalse(emp.Persistent) End Sub <Test()> Public Sub SetPropertyToNothing() Dim oidvalue As String emp.Name = "SomeNewEmp" emp.Find() Assert.IsFalse(emp.Persistent) oidvalue = emp.OIDValue emp.Save() emp = New CEmployee emp.Name = "SomeNewEmp" emp.Find() Assert.IsTrue(emp.Persistent) Assert.AreEqual(emp.OIDValue, oidvalue) Assert.AreEqual(emp.Name, "SomeNewEmp") emp.Name = Nothing emp.Save() Assert.IsTrue(emp.Persistent) End Sub <Test()> Public Sub DeleteMultipleEmployees() emp.Name = "DeleteMe1" emp.Save() emp = New CEmployee emp.Name = "DeleteMe2" emp.Save() emp = New CEmployee emp.Name = "DeleteMe3" emp.Save() Dim dc As DeleteCriteria dc = New DeleteCriteria dc.ClassMap = emp.getClassMap dc.WhereCondition.addSelectLike("Name", "DeleteMe%") Dim i As Integer = dc.perform() Assert.AreEqual(i, 3) emp = New CEmployee emp.Name = "DeleteMe1" emp.Find() Assert.IsFalse(emp.Persistent) emp = New CEmployee emp.Name = "DeleteMe2" emp.Find() Assert.IsFalse(emp.Persistent) emp = New CEmployee emp.Name = "DeleteMe3" emp.Find() Assert.IsFalse(emp.Persistent) End Sub <Test()> Public Sub LoadEmployee_ac() emp.Name = "ac" emp.Find() Assert.IsTrue(emp.Persistent) Assert.AreEqual(emp.Workers.Count, 3) emp = CType(emp.Workers.Item(1), CEmployee) Assert.AreEqual(emp.Name, "aa") Assert.AreEqual(emp.ReportsTo.Name, "ac") End Sub <Test()> Public Sub LoadEmployee_a() emp.Name = "a" emp.Find() Assert.IsTrue(emp.Persistent) Assert.AreEqual(emp.Workers.Count, 0) Assert.IsTrue(Not emp.ReportsTo Is Nothing) Assert.AreEqual(emp.ReportsTo.Name, "c") End Sub <Test(), ExpectedException(GetType(AssertionException))> _ Public Sub CheckCacheCopiesAreDifferent() Dim emp2 As CEmployee emp.Name = "ac" emp.Find() emp2 = New CEmployee emp2.Find() Assert.AreSame(emp2, emp) End Sub <Test()> Public Sub PersistentObjectEquality() Dim emp2 As CEmployee emp.Name = "ac" emp.Find() emp2 = New CEmployee emp2.Name = "aa" emp2.Find() Assert.IsTrue(PersistentObject.Equals(emp2.ReportsTo, emp)) Assert.IsTrue(emp.Equals(emp2.ReportsTo)) End Sub <Test()> Public Sub CheckSchemaBasedProperties() emp.Name = "ac" emp.Find() Assert.AreEqual(emp.getFieldLengthByName("Name"), 50) Assert.IsTrue(emp.getFieldTypeByName("Name") Is GetType([String])) End Sub <Test()> Public Sub CacheTest() emp.Name = "Initial" emp.Find() Assert.IsFalse(emp.Persistent) emp.Save() pbroker.ClearCache() emp = New CEmployee emp.Name = "Initial" emp.Find() emp.Name = "Final" emp.Save() Assert.AreEqual("Final", emp.Name) emp = New CEmployee emp.Name = "Initial" emp.Find() Assert.IsFalse(emp.Persistent) emp.Name = "Final" emp.Find() Assert.IsTrue(emp.Persistent) End Sub <Test()> Public Sub CacheTest2() 'Check that local object changes don't impact the cache emp.Name = "Initial2" emp.Find() Assert.IsFalse(emp.Persistent) emp.Save() pbroker.ClearCache() emp = New CEmployee emp.Name = "Initial2" emp.Find() 'Change local copy emp.Name = "Final" emp = New CEmployee emp.Name = "Initial2" emp.Find() Assert.AreEqual("Initial2", emp.Name) End Sub <Test()> Public Sub AutoDelete() Dim a As New TableA Dim b As New TableB Dim cc As ResultCursor a.Id = "a1" a.Retrieve() Assert.IsTrue(a.Persistent) Assert.AreEqual(2, a.TableBCollection.Count) a.Delete() Dim rc As New RetrieveCriteria rc.ClassMap = b.getClassMap rc.WhereCondition.addSelectEqualTo("AId", "a1") cc = rc.perform() Assert.AreEqual(0, cc.TotalRows) Assert.IsFalse(cc.hasElements) End Sub <Test()> Public Sub AutoSave() Dim a As New TableA Dim b As New TableB Dim cc As ResultCursor a.Id = "a3" b.Id = "b33" b.TableA = a a.TableBCollection.Add(b) a.Save() Dim rc As New RetrieveCriteria rc.ClassMap = b.getClassMap rc.WhereCondition.addSelectEqualTo("AId", "a3") cc = rc.perform() Assert.AreEqual(1, cc.TotalRows) Assert.IsTrue(cc.hasElements) End Sub <Test()> Public Sub CheckForDuplicates() 'Tests is multiple one-to-many associations in an object causes 'duplicates in a collection. Dim a As New TableA Dim b As New TableB Dim c As New TableC a.Id = "aa" b.Id = "bb1" b.TableA = a a.TableBCollection.Add(b) b = New TableB b.Id = "bb2" b.TableA = a a.TableBCollection.Add(b) c = New TableC c.Id = "cc1" c.TableA = a a.TableCCollection.Add(c) c = New TableC c.Id = "cc2" c.TableA = a a.TableCCollection.Add(c) c = New TableC c.Id = "cc3" c.TableA = a a.TableCCollection.Add(c) c = New TableC c.Id = "cc4" c.TableA = a a.TableCCollection.Add(c) a.Save() pbroker.ClearCache() a = New TableA a.Id = "aa" a.Retrieve() Assert.AreEqual(2, a.TableBCollection.Count) Assert.AreEqual(4, a.TableCCollection.Count) End Sub <Test()> Public Sub CheckCacheBehaviour() Dim a As New TableA Dim b As New TableB Dim c As New TableC a.Id = "aaa" b.Id = "bbb1" b.TableA = a a.TableBCollection.Add(b) b = New TableB b.Id = "bbb2" b.TableA = a a.TableBCollection.Add(b) b = New TableB b.Id = "bbb3" b.TableA = a a.TableBCollection.Add(b) b = New TableB b.Id = "bbb4" b.TableA = a a.TableBCollection.Add(b) c = New TableC c.Id = "ccc1" c.TableA = a a.TableCCollection.Add(c) c = New TableC c.Id = "ccc2" c.TableA = a a.TableCCollection.Add(c) a.Save() Assert.AreEqual(4, a.TableBCollection.Count) Assert.AreEqual(2, a.TableCCollection.Count) pbroker.ClearCache() a = New TableA a.Id = "aaa" a.Retrieve(a) Assert.AreEqual(4, a.TableBCollection.Count) Assert.AreEqual(2, a.TableCCollection.Count) b = a.TableBCollection(2) b.field1 = "a3" b.Id = "bbb5" Debug.WriteLine(pbroker.DumpCacheDetails()) a = New TableA a.Id = "aaa" a.Retrieve(a, False) 'Bug existed where code above caused cached objects to change values Assert.AreEqual("bbb3", CType(a.TableBCollection(2), TableB).Id) a.field1 = "aa2" a.Save() a = New TableA a.Id = "aaa" a.Retrieve(a, False) Assert.AreEqual(4, a.TableBCollection.Count) Assert.AreEqual(2, a.TableCCollection.Count) End Sub <Test()> Public Sub CheckCollectionEvents() coll = New PersistentObjectCollection eventcount = 0 emp = New CEmployee emp.Name = "somename" coll.Add(emp) emp = New CEmployee emp.Name = "someOtherName" coll.Add(emp) coll.Remove(0) Assert.AreEqual(1, coll.Count) Assert.AreEqual("someOtherName", CType(coll.Item(0), CEmployee).Name) Assert.AreEqual(3, eventcount) End Sub Private Sub coll_ObjectAdded(ByVal index As Integer, ByRef value As Object) Handles coll.ObjectAdded eventcount += 1 If eventcount = 1 Then Assert.AreEqual(0, index) Assert.AreEqual("somename", CType(value, CEmployee).Name) End If If eventcount = 2 Then Assert.AreEqual(1, index) Assert.AreEqual("someOtherName", CType(value, CEmployee).Name) End If End Sub Private Sub coll_ObjectRemoved(ByVal index As Integer, ByRef value As Object) Handles coll.ObjectRemoved eventcount += 1 If eventcount = 3 Then Assert.AreEqual(0, index) Assert.AreEqual("somename", CType(value, CEmployee).Name) End If End Sub <Test()> Public Sub CheckCacheAfterRollback() Dim oid As String Dim e2 As CEmployee emp.Name = "me" emp.Save() oid = emp.OIDValue pbroker.startTransaction() emp.Name = "you" emp.Save() e2 = New CEmployee e2.OIDValue = oid e2.Retrieve() Assert.AreEqual("you", e2.Name) pbroker.rollback() e2 = New CEmployee e2.OIDValue = oid e2.Retrieve() Assert.AreEqual("me", e2.Name) End Sub <Test()> Public Sub CheckCacheAfterRollback2() 'Check that items are put back into collections and that deleted items are restored Dim a As New TableA Dim b As New TableB Dim a1 As New TableA a.Id = "1a" b.Id = "1b" b.TableA = a a.TableBCollection.Add(b) b = New TableB b.Id = "2b" b.TableA = a a.TableBCollection.Add(b) b = New TableB b.Id = "3b" b.TableA = a a.TableBCollection.Add(b) a.Save() Assert.AreEqual(3, a.TableBCollection.Count) pbroker.startTransaction() a1.Id = "1a" a1.Retrieve() Assert.AreEqual(3, a1.TableBCollection.Count) b = a.TableBCollection.Item(1) Assert.AreEqual("2b", b.Id) a.TableBCollection.Remove(1) b.Delete() Assert.AreEqual(2, a.TableBCollection.Count) a.Save() a1 = New TableA a1.Id = "1a" a1.Retrieve() b = New TableB b.Id = "2b" b.Retrieve() Assert.IsFalse(b.Persistent) Assert.AreEqual(2, a1.TableBCollection.Count) 'Now abort the transaction pbroker.rollback() a1 = New TableA a1.Id = "1a" a1.Retrieve() b = New TableB b.Id = "2b" b.Retrieve() Assert.IsTrue(b.Persistent) Assert.AreEqual(3, a1.TableBCollection.Count) Assert.AreEqual("2b", CType(a1.TableBCollection.Item(1), TableB).Id) End Sub <Test()> Public Sub CheckCacheAfterRollback3() 'Check that null collections are correctly handled Dim a As New TableA Dim b As New TableB Dim a1 As New TableA a.Id = "aa1a" a.TableBCollection = Nothing a.TableCCollection = Nothing a.Save() Assert.IsNull(a.TableBCollection) pbroker.startTransaction() a1.Id = "aa1a" a1.Retrieve() a1.TableBCollection = New PersistentObjectCollection b.Id = "b1b" b.TableA = a1 a1.TableBCollection.Add(b) Assert.AreEqual(1, a1.TableBCollection.Count) a1.Save() a1 = New TableA a1.Id = "aa1a" a1.Retrieve() b = New TableB b.Id = "b1b" b.Retrieve() Assert.IsTrue(b.Persistent) Assert.AreEqual(1, a1.TableBCollection.Count) 'Now abort the transaction pbroker.rollback() a1 = New TableA a1.Id = "aa1a" a1.Retrieve() b = New TableB b.Id = "b1b" b.Retrieve() Assert.IsFalse(b.Persistent) Assert.IsNull(a1.TableBCollection) End Sub <Test()> Public Sub CheckCacheAfterRollback4() 'Add and remove items in the collection during the transaction Dim a As New TableA Dim b As New TableB Dim a1 As New TableA a.Id = "aa4" b.Id = "bb41" b.TableA = a a.TableBCollection.Add(b) b = New TableB b.Id = "bb42" b.TableA = a a.TableBCollection.Add(b) a.Save() Assert.AreEqual(2, a.TableBCollection.Count) pbroker.startTransaction() a1.Id = "aa4" a1.Retrieve() Assert.AreEqual(2, a1.TableBCollection.Count) b = New TableB b.Id = "bb43" b.TableA = a a.TableBCollection.Add(b) b = New TableB b.Id = "bb44" b.TableA = a a.TableBCollection.Add(b) b = a.TableBCollection.Item(1) Assert.AreEqual("bb42", b.Id) a.TableBCollection.Remove(1) b.Delete() Assert.AreEqual(3, a.TableBCollection.Count) a.Save() a1 = New TableA a1.Id = "aa4" a1.Retrieve() b = New TableB b.Id = "bb42" b.Retrieve() Assert.IsFalse(b.Persistent) Assert.AreEqual(3, a1.TableBCollection.Count) 'Now abort the transaction pbroker.rollback() a1 = New TableA a1.Id = "aa4" a1.Retrieve() b = New TableB b.Id = "bb42" b.Retrieve() Assert.IsTrue(b.Persistent) Assert.AreEqual(2, a1.TableBCollection.Count) Assert.AreEqual("bb42", CType(a1.TableBCollection.Item(1), TableB).Id) End Sub <Test()> Public Sub CheckCacheAfterRollback5() 'Modify but don't save an object during a transaction Dim a As New TableA Dim b As New TableB Dim a1 As New TableA a.Id = "aa5" b.Id = "bb51" b.TableA = a a.TableBCollection.Add(b) b = New TableB b.Id = "bb52" b.TableA = a a.TableBCollection.Add(b) a.Save() Assert.AreEqual(2, a.TableBCollection.Count) pbroker.startTransaction() a1.Id = "aa5" a1.Retrieve() Assert.AreEqual(2, a1.TableBCollection.Count) b = New TableB b.Id = "bb53" b.TableA = a a.TableBCollection.Add(b) b = New TableB b.Id = "bb54" b.TableA = a a.TableBCollection.Add(b) b = a.TableBCollection.Item(1) Assert.AreEqual("bb52", b.Id) a.TableBCollection.Remove(1) Assert.AreEqual(3, a.TableBCollection.Count) 'Now abort the transaction pbroker.rollback() a1 = New TableA a1.Id = "aa5" a1.Retrieve() 'Will get from cache Assert.AreEqual(2, a1.TableBCollection.Count) Assert.AreEqual("bb52", CType(a1.TableBCollection.Item(1), TableB).Id) End Sub <Test()> Public Sub SaveThenSaveWithoutRetrieve() Dim oidvalue As String emp.Name = "SaveThisEmp" emp.Find() Assert.IsFalse(emp.Persistent) oidvalue = emp.OIDValue emp.Save() emp = New CEmployee emp.OIDValue = oidvalue emp.Name = "Should update record" emp.Save() Assert.IsTrue(emp.Persistent, "persistent check failed") End Sub <Test()> Public Sub CheckEvents() AddHandler emp.NameChanged, AddressOf NameChanged eventcount = 0 emp.Name = "Events" Assert.AreEqual(1, eventcount) emp.Find() Assert.IsFalse(emp.Persistent) emp.Save() emp = New CEmployee emp.Name = "Events" emp.Find() 'Should not have any events from the previous handler still firing eventcount = 0 emp.Name = "New Name 1" Assert.AreEqual(0, eventcount) AddHandler emp.NameChanged, AddressOf NameChanged emp.Name = "New Name 2" Assert.AreEqual(1, eventcount) End Sub <Test()> Public Sub CheckEvents2() AddHandler emp.NameChanged, AddressOf NameChanged eventcount = 0 emp.Name = "Events2" Assert.AreEqual(1, eventcount) emp.Find() Assert.IsFalse(emp.Persistent) emp.Save() emp = New CEmployee eventcount = 0 AddHandler emp.NameChanged, AddressOf NameChanged emp.Name = "Events2" Assert.AreEqual(1, eventcount) 'Should retain the event handlers emp.Find() emp.Name = "New Name 1" Assert.AreEqual(2, eventcount) End Sub <Test()> Public Sub CheckEvents3() AddHandler emp.NameChanged, AddressOf NameChanged eventcount = 0 emp.Name = "Events3" Assert.AreEqual(1, eventcount) emp.Find() Assert.IsFalse(emp.Persistent) emp.Save() pbroker.ClearCache() emp = New CEmployee eventcount = 0 AddHandler emp.NameChanged, AddressOf NameChanged emp.Name = "Events3" Assert.AreEqual(1, eventcount) 'Event should fire when property is set during retrieve emp.Find() Assert.AreEqual(2, eventcount) 'Check event is still wired up after find completes emp.Name = "Events3a" Assert.AreEqual(3, eventcount) End Sub <Test()> Public Sub CheckEvents4() AddHandler emp.NameChanged, AddressOf NameChanged eventcount = 0 emp.Name = "Events4" Assert.AreEqual(1, eventcount) emp.Find() Assert.IsFalse(emp.Persistent) emp.Save() emp = New CEmployee emp.Name = "Events4" emp.Find(emp) 'Should not have any events from the previous handler still firing eventcount = 0 emp.Name = "Events4a" Assert.AreEqual(0, eventcount) AddHandler emp.NameChanged, AddressOf NameChanged emp.Name = "Events4b" Assert.AreEqual(1, eventcount) End Sub Private Sub NameChanged(ByVal sender As Object, ByVal e As System.EventArgs) eventcount += 1 End Sub End Class End Namespace --- NEW FILE: CWorker.vb --- Namespace InheritedClasses Public Class CWorker Inherits CEmployee Private m_job As String Public Property Job() As String Get Return m_job End Get Set(ByVal Value As String) m_job = Value End Set End Property End Class End Namespace --- NEW FILE: CEmployee.vb --- Imports AtomsFramework Namespace InheritedClasses <AFTable("employee", "MSA", AFTableAttribute.KeyType.UseOidValue, OIDColumn:="oid"), _ AFAssociation(GetType(CEmployee), "ReportsTo", AssociationMap.Cardinality.OneToOne, Name:="boss", Retrieve:=True), _ AFAssociationEntry("boss", "ReportsToOID", "OIDValue"), _ AFAssociation(GetType(CEmployee), "Workers", AssociationMap.Cardinality.OneToMany, Retrieve:=True), _ AFAssociationEntry("Workers", "OIDValue", "ReportsToOID")> _ Public Class CEmployee Inherits PersistentObject Private m_name As String Private m_parentoid As String Private m_parent As CEmployee Private WithEvents m_children As PersistentObjectCollection Private m_team As CTeam Private m_teamoid As String Public Event NameChanged As EventHandler <AFColumn("name", Find:=True)> _ Public Property Name() As String Get Return m_name End Get Set(ByVal Value As String) m_name = Value SetDirtyFlag() RaiseEvent NameChanged(Me, New System.EventArgs) End Set End Property Public Property ReportsTo() As CEmployee Get Return m_parent End Get Set(ByVal Value As CEmployee) If Not Value Is Nothing Then m_parent = Value m_parentoid = Value.OIDValue SetDirtyFlag() End If End Set End Property <AFColumn("parentoid")> _ Public Property ReportsToOID() As String Get If m_parent Is Nothing Then Return m_parentoid Else Return (m_parent.OIDValue) End If End Get Set(ByVal Value As String) m_parentoid = Value SetDirtyFlag() End Set End Property Public Property Workers() As PersistentObjectCollection Get Return m_children End Get Set(ByVal Value As PersistentObjectCollection) m_children = Value SetDirtyFlag() End Set End Property Public Property Team() As CTeam Get Return m_team End Get Set(ByVal Value As CTeam) If Not Value Is Nothing Then m_team = Value m_teamoid = Value.OIDValue SetDirtyFlag() End If End Set End Property <AFColumn("teamoid")> _ Public Property TeamOID() As String Get If m_team Is Nothing Then Return m_teamoid Else Return (m_team.OIDValue) End If End Get Set(ByVal Value As String) m_teamoid = Value SetDirtyFlag() End Set End Property Public Overrides Function getNewObject() As AtomsFramework.PersistentObject Return New CEmployee End Function Public Overrides Function IsValid() As Boolean Return True End Function Public Sub New() MyBase.New() m_children = New PersistentObjectCollection End Sub Private Sub m_children_ListChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ListChangedEventArgs) Handles m_children.ListChanged Me.SetDirtyFlag() End Sub End Class End Namespace --- NEW FILE: SuperClassTests.vb --- Imports AtomsFramework Imports NUnit.Framework Namespace InheritedClasses <TestFixture()> Public Class SuperClassTests Private pbroker As PersistenceBroker <TestFixtureSetUp()> Public Sub Init() Environment.CurrentDirectory = System.AppDomain.CurrentDomain.BaseDirectory Dim retry As Boolean = True While retry = True Try 'Remove any existing test database System.IO.File.Delete(".\db1.mdb") retry = False Catch iox As IO.IOException GC.Collect() 'file is in use - so we will loop around until it is released Catch ex As Exception retry = False End Try End While System.IO.File.Copy(".\original db1.mdb", ".\db1.mdb") pbroker = New PersistenceBroker pbroker.init() End Sub <TestFixtureTearDown()> Public Sub Dispose() pbroker.Dispose() pbroker = Nothing End Sub <SetUp()> Public Sub TestInit() End Sub <TearDown()> Public Sub TestEnd() pbroker.ClearCache() Dim col As PersistentObjectCollection Dim cpo As PersistentObject = New A col = cpo.getAll(True) For Each a As A In col a.Delete(True) Next pbroker.ClearCache() End Sub <Test()> Public Sub CheckMultiInheritance1() Dim root As New A root.Id = 1 root.Text = "Root object" root.BCol = New PersistentObjectCollection ' create G and add it to the collection Dim g As New G g.Id = 5 g.Text = "Child class of E" g.Str = "Added to collection" g.I = 555 g.A = root root.BCol.Add(g) ' create oneToOne object (K) and add it to root Dim k As New K k.Id = 6 k.Text = "Child of class H" k.Str = "Added to oneToOne association" k.I = 666 root.C = k 'save root (class A) root.Save(True) 'Now check that A, G and K are in the database pbroker.ClearCache() Dim col As PersistentObjectCollection Dim cpo As PersistentObject = New A col = cpo.getAll(True) Assert.IsTrue(col.Count > 0) For Each a As A In col Assert.IsTrue(a.C.GetType Is GetType(K)) For Each b As B In a.BCol Assert.IsTrue(b.GetType Is GetType(G)) Next Next End Sub <Test()> Public Sub CheckMultiInheritance2() Dim root As New A root.Id = 1 root.Text = "Root object" root.BCol = New PersistentObjectCollection ' create G and add it to the collection Dim g As New G g.Id = 5 g.Text = "Child class of E" g.Str = "Added to collection" g.I = 555 g.A = root root.BCol.Add(g) ' create oneToOne object (K) and add it to root Dim k As New K k.Id = 6 k.Text = "Child of class H" k.Str = "Added to oneToOne association" k.I = 666 root.C = k 'save root (class A) root.Save(True) 'Now check that A, G and K are in the database pbroker.ClearCache() Dim col As PersistentObjectCollection Dim cpo As PersistentObject = New A col = cpo.getAll(True) Assert.IsTrue(col.Count > 0) For Each a As A In col Assert.IsNull(CType(CType(a.C, K).M, M), "Object is not NULL") For Each b As B In a.BCol Assert.IsTrue(b.GetType Is GetType(G)) Assert.IsNull(CType(CType(b, G).M1, M), "Object is not NULL") Next Next End Sub <Test()> Public Sub RetrievalViaParentAttributes() Dim j As New J j.I = 1 j.Id = 123 j.Text = "Class C Text" j.Str = "Class H Str" j.Save() j = New J Dim rc As New RetrieveCriteria rc.ClassMap = j.getClassMap Dim condition As New CriteriaCondition condition.ClassMap = j.getClassMap condition.Tables = rc.Tables condition.addSelectEqualTo("Text", "Class C Text") rc.WhereCondition = condition Dim cursor As ResultCursor = rc.perform Assert.IsTrue(cursor.hasElements) Assert.AreEqual(1, cursor.TotalRows) cursor.loadObject(j) Assert.AreEqual("Class C Text", j.Text) Assert.AreEqual("Class H Str", j.Str) Assert.AreEqual(123, j.Id) End Sub <Test()> Public Sub RetrievalViaParentAttributes2() Dim j As New J j.I = 1 j.Id = 124 j.Text = "Class C Text1" j.Str = "Class H Str" j.Save() j = New J Dim rc As New RetrieveCriteria rc.ClassMap = j.getClassMap rc.WhereCondition.addSelectEqualTo("Text", "Class C Text1") Dim cursor As ResultCursor = rc.perform Assert.IsTrue(cursor.hasElements) Assert.AreEqual(1, cursor.TotalRows) cursor.loadObject(j) Assert.AreEqual("Class C Text1", j.Text) Assert.AreEqual("Class H Str", j.Str) Assert.AreEqual(124, j.Id) End Sub <Test()> Public Sub MultiRetreiveCreteria() Dim a As A Dim b As B Dim n As N a = New A a.Id = 5 a.Text = "Instance of class A" b = New B b.Id = 1 b.Text = "Instance of class B" b.A = a a.BCol.Add(b) n = New N n.I = 7 n.B = b b.NCol.Add(n) a.Save() pbroker.ClearCache() Dim mrc As New MultiRetrieveCriteria Dim a1 As New A Dim cpo As PersistentObject Dim c As ResultCursor cpo = CType(a1, A) mrc.addObjectToJoin(a1, Nothing, "") mrc.ClassMap = cpo.getClassMap mrc.ReturnFullObjects = True mrc.WhereCondition.ClassMap = cpo.getClassMap mrc.WhereCondition.addSelectEqualTo("Id", 5) c = mrc.perform c.loadObject(cpo, pbroker) cpo.Retrieve(cpo) a1 = CType(cpo, A) Assert.AreEqual(1, a1.BCol.Count, "Number of objects in collection is greater then 1") End Sub End Class End Namespace --- NEW FILE: tblAtoKClasses.vb --- Imports AtomsFramework Namespace InheritedClasses Public Class A Inherits PersistentObject Public _id As Integer = 0 Public _text As String = String.Empty Public _c As C Public _cOID As String Public WithEvents _bCol As PersistentObjectCollection Public Sub New() _bCol = New PersistentObjectCollection Me.SetDirtyFlag() End Sub Public Property Id() As Integer Get Return _id End Get Set(ByVal value As Integer) If (_id <> value) Then _id = value SetDirtyFlag() End If End Set End Property Public Property Text() As String Get Return _text End Get Set(ByVal Value As String) If (_text <> Value) Then _text = Value SetDirtyFlag() End If End Set End Property Public Property C() As C Get 'Retrieving manually when we have an association set to autoretrieve can produce 'unpredictable results. 'If _c Is Nothing AndAlso _cOID <> String.Empty Then ' _c = New C ' _c.OIDValue = _cOID ' _c.Retrieve() 'End If Return _c End Get Set(ByVal Value As C) If Me._c Is Nothing AndAlso Not (Value Is Nothing) Then Me._c = Value Me._cOID = Value.OIDValue Else If Value Is Nothing Then Me._c = Nothing Me._cOID = Nothing Else If Not Me._c.Equals(Value) Then Me._c = Value Me._cOID = Value.OIDValue End If End If End If Me.SetDirtyFlag() End Set End Property Public Property COID() As String Get If Not _c Is Nothing Then Return _c.OIDValue Else Return _cOID End If End Get Set(ByVal Value As String) _cOID = Value End Set End Property Public Property BCol() As PersistentObjectCollection Get Return _bCol End Get Set(ByVal Value As PersistentObjectCollection) If _bCol.Equals(Value) Then _bCol = Value For Each _b As B In _bCol _b.A = Me Next SetDirtyFlag() End If End Set End Property Public Overrides Function getNewObject() As PersistentObject Return New A End Function Public Overrides Function IsValid() As Boolean Return True End Function Private Sub _bCol_ListChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ListChangedEventArgs) Handles _bCol.ListChanged Me.SetDirtyFlag() End Sub End Class Public Class B Inherits PersistentObject Public Sub New() _nCol = New PersistentObjectCollection Me.SetDirtyFlag() End Sub Public _id As Integer = 0 Public _text As String = String.Empty Public _a As A = Nothing Public _aOID As String = Nothing Public WithEvents _nCol As PersistentObjectCollection Public Property Id() As Integer Get Return Me._id End Get Set(ByVal Value As Integer) If Not (Me._id = Value) Then Me._id = Value Me.SetDirtyFlag() End If End Set End Property Public Property Text() As String Get Return Me._text End Get Set(ByVal Value As String) If Not (Me._text = Value) Then Me._text = Value Me.SetDirtyFlag() End If End Set End Property Public Property A() As A Get Return Me._a End Get Set(ByVal Value As A) If Me._a Is Nothing AndAlso Not (Value Is Nothing) Then Me._a = Value Me._aOID = Value.OIDValue Else If Value Is Nothing Then Me._a = Nothing Me._aOID = Nothing Else If Not Me._a.Equals(Value) Then Me._a = Value Me._aOID = Value.OIDValue End If End If End If Me.SetDirtyFlag() End Set End Property Public Property AOID() As String Get If Not (Me._a Is Nothing) Then Return Me._a.OIDValue Else Return Me._aOID End If End Get Set(ByVal Value As String) If Not (Me._a Is Nothing) Then If Not (Me._a.OIDValue = Value) Then Me._a.OIDValue = Value Me.SetDirtyFlag() End If End If Me._aOID = Value End Set End Property Public Property NCol() As PersistentObjectCollection Get Return Me._nCol End Get Set(ByVal Value As PersistentObjectCollection) If Me._nCol.Equals(Value) Then Me._nCol = Value For Each _n As N In Me._nCol _n.B = Me Next SetDirtyFlag() End If End Set End Property Public Overloads Overrides Function getNewObject() As PersistentObject Return New B End Function Public Overloads Overrides Function IsValid() As Boolean Return True End Function Private Sub _nCol_ListChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ListChangedEventArgs) Handles _nCol.ListChanged Me.SetDirtyFlag() End Sub End Class Public Class C Inherits PersistentObject Public Sub New() End Sub Private _id As Integer = 0 Private _text As String = String.Empty Public Property Id() As Integer Get Return Me._id End Get Set(ByVal Value As Integer) If Not (Me._id = Value) Then Me._id = Value Me.SetDirtyFlag() End If End Set End Property Public Property Text() As String Get Return Me._text End Get Set(ByVal Value As String) If Not (Me._text = Value) Then Me._text = Value Me.SetDirtyFlag() End If End Set End Property Public Overloads Overrides Function getNewObject() As PersistentObject Return New C End Function Public Overloads Overrides Function IsValid() As Boolean Return True End Function End Class Public Class D Inherits B Public Sub New() End Sub Private _str As String = String.Empty Public Property Str() As String Get Return Me._str End Get Set(ByVal Value As String) If Not (Me._str = Value) Then Me._str = Value Me.SetDirtyFlag() End If End Set End Property Public Overloads Overrides Function getNewObject() As PersistentObject Return New D End Function Public Overloads Overrides Function IsValid() As Boolean Return True End Function End Class Public Class E Inherits B Public Sub New() End Sub Private _str As String = String.Empty Private _m As M = Nothing Private _mOID As String Public Property Str() As String Get Return Me._str End Get Set(ByVal Value As String) If Not (Me._str = Value) Then Me._str = Value Me.SetDirtyFlag() End If End Set End Property Public Property M1() Get Return Me._m End Get Set(ByVal Value) If Me._m Is Nothing AndAlso Not (Value Is Nothing) Then Me._m = Value Me._mOID = Value.OIDValue Else If Value Is Nothing Then Me._m = Nothing Me._mOID = Nothing Else If Not Me._m.Equals(Value) Then Me._m = Value Me._mOID = Value.OIDValue End If End If End If Me.SetDirtyFlag() End Set End Property Public Property M1OID() Get If Not Me._m Is Nothing Then Return Me._m.OIDValue Else Return Me._mOID End If End Get Set(ByVal Value) If Not Me._m Is Nothing Then If Not Me._m.OIDValue.Equals(Value) Then Me._m.OIDValue = Value Me.SetDirtyFlag() End If End If Me._mOID = Value End Set End Property Public Overloads Overrides Function getNewObject() As PersistentObject Return New E End Function Public Overloads Overrides Function IsValid() As Boolean Return True End Function End Class Public Class F Inherits E Public Sub New() End Sub Private _i As Integer = 0 Public Property I() As Integer Get Return Me._i End Get Set(ByVal Value As Integer) If Not (Me._i = Value) Then Me._i = Value Me.SetDirtyFlag() End If End Set End Property Public Overloads Overrides Function getNewObject() As PersistentObject Return New F End Function Public Overloads Overrides Function IsValid() As Boolean Return True End Function End Class Public Class G Inherits E Public Sub New() End Sub Private _i As Integer = 0 Private _m As M = Nothing Private _mOID As String = Nothing Public Property I() As Integer Get Return Me._i End Get Set(ByVal Value As Integer) If Not (Me._i = Value) Then Me._i = Value Me.SetDirtyFlag() End If End Set End Property Public Property M() Get Return Me._m End Get Set(ByVal Value) If Me._m Is Nothing AndAlso Not (Value Is Nothing) Then Me._m = Value Me._mOID = Value.OIDValue Else If Value Is Nothing Then Me._m = Nothing Me._mOID = Nothing Else If Not Me._m.Equals(Value) Then Me._m = Value Me._mOID = Value.OIDValue End If End If End If Me.SetDirtyFlag() End Set End Property Public Property MOID() Get If Not Me._m Is Nothing Then Return Me._m.OIDValue Else Return Me._mOID End If End Get Set(ByVal Value) If Not Me._m Is Nothing Then If Not Me._m.OIDValue.Equals(Value) Then Me._m.OIDValue = Value Me.SetDirtyFlag() End If End If Me._mOID = Value End Set End Property Public Overloads Overrides Function getNewObject() As PersistentObject Return New G End Function Public Overloads Overrides Function IsValid() As Boolean Return True End Function End Class Public Class H Inherits C Public Sub New() End Sub Private _str As String = String.Empty Private _m As M = Nothing Private _mOID As String Public Property Str() As String Get Return Me._str End Get Set(ByVal Value As String) If Not (Me._str = Value) Then Me._str = Value Me.SetDirtyFlag() End If End Set End Property Public Property M1() Get Return Me._m End Get Set(ByVal Value) If Me._m Is Nothing AndAlso Not (Value Is Nothing) Then Me._m = Value Me._mOID = Value.OIDValue Else If Value Is Nothing Then Me._m = Nothing Me._mOID = Nothing Else If Not Me._m.Equals(Value) Then Me._m = Value Me._mOID = Value.OIDValue End If End If End If Me.SetDirtyFlag() End Set End Property Public Property M1OID() Get If Not Me._m Is Nothing Then Return Me._m.OIDValue Else Return Me._mOID End If End Get Set(ByVal Value) If Not Me._m Is Nothing Then If Not Me._m.OIDValue.Equals(Value) Then Me._m.OIDValue = Value Me.SetDirtyFlag() End If End If Me._mOID = Value End Set End Property Public Overloads Overrides Function getNewObject() As PersistentObject Return New H End Function Public Overloads Overrides Function IsValid() As Boolean Return True End Function End Class Public Class I Inherits C Public Sub New() End Sub Private _str As String = String.Empty Public Property Str() As String Get Return Me._str End Get Set(ByVal Value As String) If Not (Me._str = Value) Then Me._str = Value Me.SetDirtyFlag() End If End Set End Property Public Overloads Overrides Function getNewObject() As PersistentObject Return New I End Function Public Overloads Overrides Function IsValid() As Boolean Return True End Function End Class Public Class J Inherits H Public Sub New() End Sub Private _i As Integer = 0 Public Property I() As Integer Get Return Me._i End Get Set(ByVal Value As Integer) If Not (Me._i = Value) Then Me._i = Value Me.SetDirtyFlag() End If End Set End Property Public Overloads Overrides Function getNewObject() As PersistentObject Return New J End Function Public Overloads Overrides Function IsValid() As Boolean Return True End Function End Class Public Class K Inherits H Public Sub New() End Sub Private _i As Integer = 0 Private _m As M = Nothing Private _mOID As String Public Property I() As Integer Get Return Me._i End Get Set(ByVal Value As Integer) If Not (Me._i = Value) Then Me._i = Value Me.SetDirtyFlag() End If End Set End Property Public Property M() Get Return Me._m End Get Set(ByVal Value) If Me._m Is Nothing AndAlso Not (Value Is Nothing) Then Me._m = Value Me._mOID = Value.OIDValue Else If Value Is Nothing Then Me._m = Nothing Me._mOID = Nothing Else If Not Me._m.Equals(Value) Then Me._m = Value Me._mOID = Value.OIDValue End If End If End If Me.SetDirtyFlag() End Set End Property Public Property MOID() Get If Not Me._m Is Nothing Then Return Me._m.OIDValue Else Return Me._mOID End If End Get Set(ByVal Value) If Not Me._m Is Nothing Then If Not Me._m.OIDValue.Equals(Value) Then Me._m.OIDValue = Value Me.SetDirtyFlag() End If End If Me._mOID = Value End Set End Property Public Overloads Overrides Function getNewObject() As PersistentObject Return New K End Function Public Overloads Overrides Function IsValid() As Boolean Return True End Function End Class Public Class M Inherits PersistentObject Public Sub New() End Sub Private _i As Integer = 0 Public Property I() As Integer Get Return Me._i End Get Set(ByVal Value As Integer) If Not (Me._i = Value) Then Me._i = Value Me.SetDirtyFlag() End If End Set End Property Public Overloads Overrides Function getNewObject() As PersistentObject Return New M End Function Public Overloads Overrides Function IsValid() As Boolean Return True End Function End Class Public Class N Inherits PersistentObject Public Sub New() End Sub Private _i As Integer = 0 Private _b As B = Nothing Private _bOID As String = Nothing Public Property I() As Integer Get Return Me._i End Get Set(ByVal Value As Integer) If Not (Me._i = Value) Then Me._i = Value Me.SetDirtyFlag() End If End Set End Property Public Property B() As B Get Return Me._b End Get Set(ByVal Value As B) If Me._b Is Nothing AndAlso Not (Value Is Nothing) Then Me._b = Value Me._bOID = Value.OIDValue Else If Value Is Nothing Then Me._b = Nothing Me._bOID = Nothing Else If Not Me._b.Equals(Value) Then Me._b = Value Me._bOID = Value.OIDValue End If End If End If Me.SetDirtyFlag() End Set End Property Public Property BOID() As String Get If Not (Me._b Is Nothing) Then Return Me._b.OIDValue Else Return Me._bOID End If End Get Set(ByVal Value As String) If Not (Me._b Is Nothing) Then If Not (Me._b.OIDValue = Value) Then Me._b.OIDValue = Value Me.SetDirtyFlag() End If End If Me._bOID = Value End Set End Property Public Overloads Overrides Function getNewObject() As PersistentObject Return New N End Function Public Overloads Overrides Function IsValid() As Boolean Return True End Function End Class End Namespace --- NEW FILE: SharedTests.vb --- Imports AtomsFramework Imports NUnit.Framework Namespace InheritedClasses <TestFixture()> Public Class SharedTests Private pbroker As PersistenceBroker Dim sc As SharedChild Dim sp As SharedParent <TestFixtureSetUp()> Public Sub Init() Environment.CurrentDirectory = System.AppDomain.CurrentDomain.BaseDirectory Dim retry As Boolean = True While retry = True Try 'Remove any existing test database System.IO.File.Delete(".\db1.mdb") retry = False Catch iox As IO.IOException 'file is in use - so we will loop around until it is released GC.Collect() Catch ex As Exception retry = False End Try End While System.IO.File.Copy(".\original db1.mdb", ".\db1.mdb") pbroker = New PersistenceBroker pbroker.init() End Sub <TestFixtureTearDown()> Public Sub Dispose() pbroker.Dispose() pbroker = Nothing End Sub <SetUp()> Public Sub testInit() sc = New SharedChild sp = New SharedParent End Sub <Test()> Public Sub SaveAndRetrieveSharedChild() Dim result As Boolean Dim origOid As String = String.Empty Dim newOid As String = String.Empty sc.IsDirty = True sc.Field1 = "a" sc.Field2 = "b" sc.Save() origOid = sc.OIDValue sc = New SharedChild newOid = sc.OIDValue sc.OIDValue = origOid result = sc.Retrieve() Assert.IsTrue(sc.OIDValue = origOid) Assert.IsTrue(origOid <> newOid) Assert.IsTrue(result) Assert.IsFalse(sc.IsDirty) sc.IsDirty = True sc.Save() End Sub <Test()> Public Sub SaveChildAndRetrieveParent() Dim result As Boolean Dim origOid As String = String.Empty sc.IsDirty = True sc.Field1 = "xx" sc.Field2 = "yy" sc.Save() origOid = sc.OIDValue sp.OIDValue = origOid result = sp.Retrieve() Assert.IsTrue(sp.OIDValue = origOid) Assert.AreEqual("xx", sp.Field1) Assert.IsTrue(result) Assert.IsFalse(sp.IsDirty) Assert.IsFalse(sp.GetType Is GetType(SharedChild)) End Sub End Class End Namespace --- NEW FILE: ManyToManyTests_v2.vb --- Imports AtomsFramework Imports NUnit.Framework Namespace InheritedClasses <TestFixture()> Public Class ManyToManyTests_v2 Private pbroker As PersistenceBroker Private A As M2MA Private B As M2MB <TestFixtureSetUp()> Public Sub Init() Environment.CurrentDirectory = System.AppDomain.CurrentDomain.BaseDirectory Dim retry As Boolean = True While retry = True Try 'Remove any existing test database System.IO.File.Delete(".\db1.mdb") retry = False Catch iox As IO.IOException 'file is in use - so we will loop around until it is released GC.Collect() Catch ex As Exception retry = False End Try End While System.IO.File.Copy(".\original db1.mdb", ".\db1.mdb") pbroker = New PersistenceBroker pbroker.init() End Sub <TestFixtureTearDown()> Public Sub Dispose() pbroker.Dispose() pbroker = Nothing End Sub <Test()> Public Sub SaveThenRetrieve() Dim gval As String Dim x As Integer, y As Integer A = New M2MA A.Description = "A-one" gval = A.GUIDValue B = New M2MB B.Description = "B-one" A.M2MBCollection.Add(B) B.M2MACollection.Add(A) Dim B2 As M2MB = New M2MB B2.Description = "B-two" A.M2MBCollection.Add(B2) Dim A2 As M2MA = New M2MA A2.Description = "A-two" B2.M2MACollection.Add(A2) A.Save() pbroker.ClearCache() A = New M2MA A.GUIDValue = gval A.Retrieve() Assert.AreEqual(2, A.M2MBCollection.Count) 'Order of guids can affect order of the collection If A.M2MBCollection.Item(... [truncated message content] |