Пример #1
0
        [Test] public void Locking()
        {
            GarbageCollectionUtils.CheckIfCleanedUp(() =>
            {
                VertexBatch <VertexC1P3> typedBatch = new VertexBatch <VertexC1P3>();
                IVertexBatch abstractBatch          = typedBatch;

                typedBatch.Vertices.Add(new VertexC1P3 {
                    Color = new ColorRgba(0)
                });
                typedBatch.Vertices.Add(new VertexC1P3 {
                    Color = new ColorRgba(1)
                });
                typedBatch.Vertices.Add(new VertexC1P3 {
                    Color = new ColorRgba(2)
                });
                typedBatch.Vertices.Add(new VertexC1P3 {
                    Color = new ColorRgba(3)
                });

                // Assert that we can retrieve all data via unmanaged pointer access
                VertexDeclaration layout = typedBatch.Declaration;
                int vertexSize           = layout.Size;
                int colorElementIndex    = layout.Elements.IndexOfFirst(item => item.FieldName == VertexDeclaration.ShaderFieldPrefix + "Color");
                int colorOffset          = (int)layout.Elements[colorElementIndex].Offset;
                using (PinnedArrayHandle locked = typedBatch.Lock())
                {
                    Assert.AreEqual(new ColorRgba(0), ReadColor(locked.Address, vertexSize * 0 + colorOffset));
                    Assert.AreEqual(new ColorRgba(1), ReadColor(locked.Address, vertexSize * 1 + colorOffset));
                    Assert.AreEqual(new ColorRgba(2), ReadColor(locked.Address, vertexSize * 2 + colorOffset));
                    Assert.AreEqual(new ColorRgba(3), ReadColor(locked.Address, vertexSize * 3 + colorOffset));
                }
                using (PinnedArrayHandle locked = abstractBatch.Lock())
                {
                    Assert.AreEqual(new ColorRgba(0), ReadColor(locked.Address, vertexSize * 0 + colorOffset));
                    Assert.AreEqual(new ColorRgba(1), ReadColor(locked.Address, vertexSize * 1 + colorOffset));
                    Assert.AreEqual(new ColorRgba(2), ReadColor(locked.Address, vertexSize * 2 + colorOffset));
                    Assert.AreEqual(new ColorRgba(3), ReadColor(locked.Address, vertexSize * 3 + colorOffset));
                }

                // Make sure that our locks released properly, i.e. allowing the array to be garbage collected
                WeakReference weakRefToLockedData = new WeakReference(typedBatch.Vertices.Data);
                Assert.IsTrue(weakRefToLockedData.IsAlive);

                return(new GarbageCollectionTestSet(weakRefToLockedData));
            });
        }
Пример #2
0
        public void GetInstance_PerCallLifetime_IsGarbageCollected()
        {
            GarbageCollectionUtils.CheckIfCleanedUp(() =>
            {
                //ARRANGE
                var container = new Container(c =>
                {
                    c.Register <Disposable>(s => s.With(ServiceAutoDispose.Always));
                });

                //ACT
                var weakRef = new WeakReference(container.GetInstance <Disposable>());
                container.Dispose();

                //ASSERT
                return(new CleanupTestSet(weakRef, new [] { container }));
            });
        }