[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)); }); }
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 })); }); }