Exemple #1
0
        public void AssignDisposableWorks()
        {
            var i = 0;
            var a = DisposableEx.Assign(DisposableEx.Action(() => i++));

            Assert.Equal(0, i);
            var newItem = DisposableEx.Action(() => i += 10);

            a.Item = newItem;
            Assert.Equal(1, i);
            a.Item = newItem;
            Assert.Equal(1, i);
            a.Dispose();
            Assert.Equal(11, i);
            a.Dispose();
            Assert.Equal(11, i);
            a.Item = DisposableEx.Action(() => i = 0);
            Assert.Equal(11, i);
            a.Item = newItem;
            Assert.Equal(0, i);
            using (var d = DisposableEx.Assign <IDisposable>())
            {
                d.Item = null;
            }
        }
Exemple #2
0
        public void DisposeCollectionWorks()
        {
            var a    = 0;
            var b    = 0;
            var ad   = DisposableEx.AlwaysAction(() => a++);
            var bd   = DisposableEx.AlwaysAction(() => b++);
            var arr  = new[] { ad, bd };
            var list = new List <IDisposable> {
                ad
            };

            list.AddAction(() => b++);
            DisposableEx.Dispose(arr);
            Assert.Equal(2, arr.Length);
            Assert.Equal(1, a);
            Assert.Equal(1, b);
            DisposableEx.Dispose((IEnumerable <IDisposable>)list);
            Assert.Equal(2, list.Count);
            Assert.Equal(2, a);
            Assert.Equal(2, b);
            DisposableEx.Dispose(list);
            Assert.Equal(0, list.Count);
            Assert.Equal(3, a);
            Assert.Equal(2, b);
        }
Exemple #3
0
        public void UseContextWorks()
        {
            var defaultTaskScheduler = TaskScheduler.Default;
            var v  = 0;
            var ts = new ThreadLocal <int>(() => v++);

            EventLoop.Run(() =>
            {
                var sc   = SynchronizationContext.Current;
                var done = false;

                var threadId     = -1;
                var realThreadId = -1;
                var disp         = DisposableEx.Action(() => threadId = ts.Value).UseContext(sc);
                Task.Factory.StartNew(() =>
                {
                    realThreadId = ts.Value;
                    disp.Dispose();
                    done = true;
                }, CancellationToken.None, TaskCreationOptions.None, defaultTaskScheduler);

                while (!done)
                {
                    EventLoop.DoEvents();
                }
                Assert.Equal(ts.Value, threadId);
                Assert.NotEqual(realThreadId, threadId);
            });
        }
 public void Dispose()
 {
     lock (_cache)
     {
         DisposableEx.Dispose(_cache.Values);
         _cache.Clear();
     }
 }
Exemple #5
0
        public void DisposeOnFinalizeWorks()
        {
            var i = 0;

            DisposableEx.Action(() => i++).DisposeOnFinalize();
            GCEx.CollectAndWait();
            Assert.Equal(1, i);
        }
        public void UsingOk()
        {
            var lambda   = Lambda(p => Using(p(typeof(IDisposable), "a"), 2));
            var compiled = (Func <IDisposable, int>)lambda.Compile();
            var disposed = false;
            var dis      = DisposableEx.Action(() => disposed = true);

            Assert.Equal(2, compiled(dis));
            Assert.True(disposed);
        }
Exemple #7
0
        public void ConcatDisposableWorks()
        {
            var i = 0;
            var j = 0;

            using (DisposableEx.Concat(DisposableEx.Action(() => i = 1), DisposableEx.Action(() => j = 1)))
            {
            }
            Assert.Equal(1, i);
            Assert.Equal(1, j);
        }
Exemple #8
0
        public IDisposable Read(IQuery <T> query, Action <T> callback, LinkedList <IWaitingAction> ownerList)
        {
            var readItem = TryRead(query);

            if (readItem != null)
            {
                callback(readItem);
                return(DisposableEx.Null());
            }

            // add waiting action
            return(WaitingAction <T> .Install(this, Root != null?Root.WaitingActions : ownerList, query, callback, false));
        }
Exemple #9
0
        public IDisposable Take(IQuery <T> query, Action <T> callback, LinkedList <IWaitingAction> ownerList)
        {
            var takenItem = TryTake(query);

            if (takenItem != null)
            {
                callback(takenItem);
                return(DisposableEx.Null());
            }

            // add waiting action
            return(WaitingAction <T> .Install(this, Root != null?Root.WaitingActions : ownerList, query, callback, true));
        }
Exemple #10
0
 public static IDisposable UseCancellation <T>(this TaskCompletionSource <T> source, CancellationToken cancellation)
 {
     if (!cancellation.CanBeCanceled)
     {
         return(DisposableEx.Null());
     }
     if (!cancellation.IsCancellationRequested)
     {
         return(cancellation.Register(x => ((TaskCompletionSource <T>)x).TrySetCanceled(), source));
     }
     source.TrySetCanceled();
     return(DisposableEx.Null());
 }
Exemple #11
0
        public void AlwaysActionWorks()
        {
            var         a = 1;
            IDisposable disposable;

            using (disposable = DisposableEx.AlwaysAction(() => a = 3))
            {
                a = 2;
            }
            Assert.Equal(3, a);
            a = 5;
            disposable.Dispose();
            Assert.Equal(3, a);
        }
Exemple #12
0
        public void ActionInvokesOnDispose()
        {
            var         a = 1;
            IDisposable disposable;

            using (disposable = DisposableEx.Action(() => a = 3))
            {
                a = 2;
            }
            Assert.Equal(3, a);
            a = 5;
            disposable.Dispose();
            Assert.Equal(5, a);
        }
Exemple #13
0
        public void KeepAliveTest()
        {
            WeakReference wr;

            {
                wr = new WeakReference(new object());
                using (DisposableEx.Null().KeepAlive(wr.Target))
                {
                    GCEx.CollectAndWait();
                    Assert.True(wr.IsAlive);
                }
            }
            GCEx.CollectAndWait();
            Assert.False(wr.IsAlive);
        }
Exemple #14
0
        public void CollectionRemoveWorks()
        {
            var list = new List <int> {
                1, 2
            };
            var d1 = DisposableEx.Remove(list, 1);
            var d2 = DisposableEx.Remove(list, 2);

            Assert.True(list.SequenceEqual(new[] { 1, 2 }));
            d1.Dispose();
            Assert.True(list.SequenceEqual(new[] { 2 }));
            d2.Dispose();
            Assert.Equal(0, list.Count);
            list.AddRange(new[] { 1, 2 });
            Assert.True(list.SequenceEqual(new[] { 1, 2 }));
            d1.Dispose();
            d2.Dispose();
            Assert.True(list.SequenceEqual(new[] { 1, 2 }));
        }
        public void UsingOk()
        {
            var method = EmitEx.CreateMethod <Func <IDisposable, int> >();
            var il     = method.GetILGenerator();

            il.EmitLdarg(0);
            var disp = il.DeclareLocal(typeof(IDisposable));

            il.EmitStloc(disp);
            il.EmitUsing(disp, () =>
            {
            });
            il.EmitLdcI4(42);
            il.Emit(OpCodes.Ret);

            var compiled = method.CreateDelegate <Func <IDisposable, int> >();
            var disposed = false;
            var dis      = DisposableEx.Action(() => disposed = true);

            Assert.Equal(42, compiled(dis));
            Assert.True(disposed);
        }