Пример #1
0
        public void ComplexHierachyOfDependenciesEmulateGCRandomDisposalOrder_Success()
        {
            var obj  = new TesterClass(new IntPtr[] { });
            var obj2 = new TesterClass(new[] { obj.Handle });
            var obj3 = new TesterClass(new[] { obj.Handle });
            var obj4 = new TesterClass(new[] { obj3.Handle, obj2.Handle });

            obj4.Dispose();
            Thread.Sleep(200);
            Assert.IsTrue(obj4.destroyed);
            Assert.IsFalse(obj.destroyed);
            Assert.IsFalse(obj2.destroyed);
            Assert.IsFalse(obj3.destroyed);
            obj2.Dispose();
            Thread.Yield();
            Thread.Sleep(200);
            Assert.IsTrue(obj2.destroyed);
            Assert.IsFalse(obj.destroyed);
            Assert.IsFalse(obj3.destroyed);
            obj3.Dispose();
            Thread.Yield();
            Thread.Sleep(200);
            Assert.IsFalse(obj.destroyed);
            Assert.IsTrue(obj3.destroyed);
            obj.Dispose();
            Thread.Yield();
            Thread.Sleep(200);
            Assert.IsTrue(obj.destroyed);
            Assert.AreEqual(obj.Handle, obj.destroyedHandle);
            Assert.AreEqual(obj2.Handle, obj2.destroyedHandle);
            Assert.AreEqual(obj3.Handle, obj3.destroyedHandle);
            Assert.AreEqual(obj4.Handle, obj4.destroyedHandle);
        }
Пример #2
0
        public void CircularDependenciesDisposeAllRemoveOneParent_Success()
        {
            var obj  = new TesterClass(new IntPtr[] { });
            var obj2 = new TesterClass(new[] { obj.Handle });
            var obj3 = new TesterClass(new[] { obj2.Handle });

            TesterClass.UnmanagedObjectLifecycle.AddParent(typeof(TesterClass).Name, obj.Handle, typeof(TesterClass).Name, obj3.Handle); // Circular parent
            Assert.IsFalse(obj.destroyed);
            Assert.IsFalse(obj2.destroyed);
            Assert.IsFalse(obj3.destroyed);
            obj.Dispose();
            obj2.Dispose();
            obj3.Dispose();
            Thread.Yield();
            Thread.Sleep(200);
            Assert.IsFalse(obj.destroyed);
            Assert.IsFalse(obj2.destroyed);
            Assert.IsFalse(obj3.destroyed);
            /* Only way to get objects destroyed is by removing one parent to destroy the circle */
            TesterClass.UnmanagedObjectLifecycle.RemoveParent(typeof(TesterClass).Name, obj.Handle, typeof(TesterClass).Name, obj3.Handle);
            Thread.Yield();
            Thread.Sleep(200);
            Assert.IsTrue(obj.destroyed);
            Assert.IsTrue(obj2.destroyed);
            Assert.IsTrue(obj3.destroyed);
            Assert.AreEqual(obj.Handle, obj.destroyedHandle);
            Assert.AreEqual(obj2.Handle, obj2.destroyedHandle);
            Assert.AreEqual(obj3.Handle, obj3.destroyedHandle);
        }
Пример #3
0
        public void BasicTest_Success()
        {
            var obj = new TesterClass(new IntPtr[] {});

            Assert.IsFalse(obj.destroyed);
            obj.Dispose();
            Thread.Sleep(200);
            Assert.IsTrue(obj.destroyed);
            Assert.AreEqual(obj.Handle, obj.destroyedHandle);
        }
Пример #4
0
        public void MultiCircularDependenciesDisposeAllRemoveDependencies_Success()
        {
            var obj  = new TesterClass(new IntPtr[] { });
            var obj2 = new TesterClass(new[] { obj.Handle });
            var obj3 = new TesterClass(new[] { obj2.Handle, obj.Handle });

            TesterClass.UnmanagedObjectLifecycle.AddParent(typeof(TesterClass).Name, obj.Handle, typeof(TesterClass).Name, obj3.Handle);  // Circular parent
            TesterClass.UnmanagedObjectLifecycle.AddParent(typeof(TesterClass).Name, obj.Handle, typeof(TesterClass).Name, obj2.Handle);  // Circular parent
            TesterClass.UnmanagedObjectLifecycle.AddParent(typeof(TesterClass).Name, obj2.Handle, typeof(TesterClass).Name, obj3.Handle); // Circular parent
            Assert.IsFalse(obj.destroyed);
            Assert.IsFalse(obj2.destroyed);
            Assert.IsFalse(obj3.destroyed);
            obj.Dispose();
            Thread.Yield();
            Thread.Sleep(200);
            Assert.IsFalse(obj.destroyed);
            Assert.IsFalse(obj2.destroyed);
            Assert.IsFalse(obj3.destroyed);
            obj2.Dispose();
            Thread.Yield();
            Thread.Sleep(200);
            Assert.IsFalse(obj.destroyed);
            Assert.IsFalse(obj2.destroyed);
            Assert.IsFalse(obj3.destroyed);
            obj3.Dispose();
            Thread.Sleep(200);
            Assert.IsFalse(obj.destroyed);
            Assert.IsFalse(obj2.destroyed);
            Assert.IsFalse(obj3.destroyed);
            TesterClass.UnmanagedObjectLifecycle.RemoveParent(typeof(TesterClass).Name, obj.Handle, typeof(TesterClass).Name, obj3.Handle);
            Thread.Yield();
            Thread.Sleep(200);
            Assert.IsFalse(obj.destroyed);
            Assert.IsFalse(obj2.destroyed);
            Assert.IsFalse(obj3.destroyed);
            TesterClass.UnmanagedObjectLifecycle.RemoveParent(typeof(TesterClass).Name, obj.Handle, typeof(TesterClass).Name, obj2.Handle);
            Thread.Yield();
            Thread.Sleep(200);
            Assert.IsFalse(obj.destroyed);
            Assert.IsFalse(obj2.destroyed);
            Assert.IsFalse(obj3.destroyed);
            TesterClass.UnmanagedObjectLifecycle.RemoveParent(typeof(TesterClass).Name, obj2.Handle, typeof(TesterClass).Name, obj3.Handle);
            Thread.Yield();
            Thread.Sleep(200);
            Assert.IsTrue(obj.destroyed);
            Assert.IsTrue(obj2.destroyed);
            Assert.IsTrue(obj3.destroyed);
            Assert.AreEqual(obj.Handle, obj.destroyedHandle);
            Assert.AreEqual(obj2.Handle, obj2.destroyedHandle);
            Assert.AreEqual(obj3.Handle, obj3.destroyedHandle);
        }
Пример #5
0
        public void RegisterObjectTwice_Success()
        {
            var obj = new TesterClass(new IntPtr[] { });

            Assert.IsFalse(obj.destroyed);
            TesterClass.UnmanagedObjectLifecycle.Register(typeof(TesterClass).Name, obj.Handle, obj.GetDestroyDelegate());
            Assert.IsFalse(obj.destroyed);
            obj.Dispose();
            Thread.Yield();
            Thread.Sleep(200);
            Assert.IsFalse(obj.destroyed);
            TesterClass.UnmanagedObjectLifecycle.Unregister(typeof(TesterClass).Name, obj.Handle);
            Thread.Yield();
            Thread.Sleep(200);
            Assert.IsTrue(obj.destroyed);
            Assert.AreEqual(obj.Handle, obj.destroyedHandle);
        }
Пример #6
0
        public void BasicTestTwoDifferentTypeNames_Success()
        {
            var obj = new TesterClass(new IntPtr[] { });

            TesterClass.UnmanagedObjectLifecycle.Register("AnotherClass", obj.Handle);
            TesterClass.UnmanagedObjectLifecycle.Unregister("AnotherClass", obj.Handle);
            TesterClass.UnmanagedObjectLifecycle.Unregister("AnotherClass", obj.Handle);
            Thread.Yield();
            Thread.Sleep(200);
            Assert.IsTrue(_raisedException is EObjectNotFound <string, IntPtr>);
            _raisedException = null;
            obj.Dispose();
            Thread.Yield();
            Thread.Sleep(200);
            Assert.IsTrue(obj.destroyed);
            Assert.AreEqual(obj.Handle, obj.destroyedHandle);
        }
Пример #7
0
        public void SimpleParentDisposeLeafLast_Success()
        {
            var obj  = new TesterClass(new IntPtr[] {});
            var obj2 = new TesterClass(new[] { obj.Handle });

            obj.Dispose();
            Thread.Yield();
            Thread.Sleep(200);
            Assert.IsFalse(obj.destroyed);
            Assert.IsFalse(obj2.destroyed);
            obj2.Dispose();
            Thread.Yield();
            Thread.Sleep(200);
            Assert.IsTrue(obj.destroyed);
            Assert.IsTrue(obj2.destroyed);
            Assert.AreEqual(obj.Handle, obj.destroyedHandle);
            Assert.AreEqual(obj2.Handle, obj2.destroyedHandle);
        }
Пример #8
0
        public void SimpleParentDisposeByRemovingParent_Success()
        {
            var obj  = new TesterClass(new IntPtr[] { });
            var obj2 = new TesterClass(new[] { obj.Handle });

            obj.Dispose();
            Thread.Sleep(200);
            Assert.IsFalse(obj.destroyed);
            Assert.IsFalse(obj2.destroyed);
            TesterClass.UnmanagedObjectLifecycle.RemoveParent(typeof(TesterClass).Name, obj2.Handle, typeof(TesterClass).Name, obj.Handle);
            Thread.Yield();
            Thread.Sleep(200);
            Assert.IsTrue(obj.destroyed);
            Assert.IsFalse(obj2.destroyed);
            obj2.Dispose();
            Thread.Yield();
            Thread.Sleep(200);
            Assert.IsTrue(obj2.destroyed);
            Assert.AreEqual(obj.Handle, obj.destroyedHandle);
            Assert.AreEqual(obj2.Handle, obj2.destroyedHandle);
        }
Пример #9
0
        public void LinearHierachyOfDependenciesDisposeLeafLast_Success()
        {
            var obj  = new TesterClass(new IntPtr[] { });
            var obj2 = new TesterClass(new [] { obj.Handle });
            var obj3 = new TesterClass(new[] { obj2.Handle });

            obj.Dispose();
            obj2.Dispose();
            Thread.Sleep(200);
            Assert.IsFalse(obj.destroyed);
            Assert.IsFalse(obj2.destroyed);
            Assert.IsFalse(obj3.destroyed);
            obj3.Dispose();
            Thread.Yield();
            Thread.Sleep(200);
            Assert.IsTrue(obj.destroyed);
            Assert.IsTrue(obj2.destroyed);
            Assert.IsTrue(obj3.destroyed);
            Assert.AreEqual(obj.Handle, obj.destroyedHandle);
            Assert.AreEqual(obj2.Handle, obj2.destroyedHandle);
            Assert.AreEqual(obj3.Handle, obj3.destroyedHandle);
        }