public void LockForWritingWithReadLocks()
        {
            using (var datasetLock = new DatasetLock())
            {
                Assert.IsFalse(datasetLock.IsLockedForReading);
                Assert.IsFalse(datasetLock.IsLockedForWriting);

                var readLockEventRaised   = false;
                var readUnlockEventRaised = false;
                var writeLockEventRaised  = false;
                datasetLock.OnLockForReading    += (s, e) => { readLockEventRaised = true; };
                datasetLock.OnUnlockFromReading += (s, e) => { readUnlockEventRaised = true; };
                datasetLock.OnLockForWriting    += (s, e) => { writeLockEventRaised = true; };
                var key1 = datasetLock.LockForReading();

                var task = Task <DatasetLockKey> .Factory.StartNew(datasetLock.LockForWriting);

                Assert.IsTrue(readLockEventRaised);
                Assert.IsFalse(readUnlockEventRaised);
                Assert.IsFalse(writeLockEventRaised);

                var key2 = datasetLock.LockForReading();
                Assert.IsNotNull(key2);
                Assert.IsTrue(readLockEventRaised);
                Assert.IsFalse(readUnlockEventRaised);
                Assert.IsFalse(writeLockEventRaised);

                datasetLock.RemoveReadLock(key1);
                Assert.IsTrue(readLockEventRaised);
                Assert.IsFalse(readUnlockEventRaised);
                Assert.IsFalse(writeLockEventRaised);

                datasetLock.RemoveReadLock(key2);
                var key3 = task.Result;

                Assert.IsNotNull(key3);
                Assert.IsTrue(readLockEventRaised);
                Assert.IsTrue(readUnlockEventRaised);
                Assert.IsTrue(writeLockEventRaised);
            }
        }
        public void LockForReadingWithNoLocks()
        {
            using (var datasetLock = new DatasetLock())
            {
                Assert.IsFalse(datasetLock.IsLockedForReading);
                Assert.IsFalse(datasetLock.IsLockedForWriting);

                var eventWasRaised = false;
                datasetLock.OnLockForReading += (s, e) => { eventWasRaised = true; };
                var key = datasetLock.LockForReading();

                Assert.IsNotNull(key);
                Assert.IsTrue(eventWasRaised);
                Assert.IsTrue(datasetLock.IsLockedForReading);
                Assert.IsFalse(datasetLock.IsLockedForWriting);
            }
        }
        public void LockForReadingWithNoLocks()
        {
            using (var datasetLock = new DatasetLock())
            {
                Assert.IsFalse(datasetLock.IsLockedForReading);
                Assert.IsFalse(datasetLock.IsLockedForWriting);

                var eventWasRaised = false;
                datasetLock.OnLockForReading += (s, e) => { eventWasRaised = true; };
                var key = datasetLock.LockForReading();

                Assert.IsNotNull(key);
                Assert.IsTrue(eventWasRaised);
                Assert.IsTrue(datasetLock.IsLockedForReading);
                Assert.IsFalse(datasetLock.IsLockedForWriting);
            }
        }
        public void LockForWritingWithReadLocks()
        {
            using (var datasetLock = new DatasetLock())
            {
                Assert.IsFalse(datasetLock.IsLockedForReading);
                Assert.IsFalse(datasetLock.IsLockedForWriting);

                var readLockEventRaised = false;
                var readUnlockEventRaised = false;
                var writeLockEventRaised = false;
                datasetLock.OnLockForReading += (s, e) => { readLockEventRaised = true; };
                datasetLock.OnUnlockFromReading += (s, e) => { readUnlockEventRaised = true; };
                datasetLock.OnLockForWriting += (s, e) => { writeLockEventRaised = true; };
                var key1 = datasetLock.LockForReading();

                var task = Task<DatasetLockKey>.Factory.StartNew(datasetLock.LockForWriting);

                Assert.IsTrue(readLockEventRaised);
                Assert.IsFalse(readUnlockEventRaised);
                Assert.IsFalse(writeLockEventRaised);

                var key2 = datasetLock.LockForReading();
                Assert.IsNotNull(key2);
                Assert.IsTrue(readLockEventRaised);
                Assert.IsFalse(readUnlockEventRaised);
                Assert.IsFalse(writeLockEventRaised);

                datasetLock.RemoveReadLock(key1);
                Assert.IsTrue(readLockEventRaised);
                Assert.IsFalse(readUnlockEventRaised);
                Assert.IsFalse(writeLockEventRaised);

                datasetLock.RemoveReadLock(key2);
                var key3 = task.Result;

                Assert.IsNotNull(key3);
                Assert.IsTrue(readLockEventRaised);
                Assert.IsTrue(readUnlockEventRaised);
                Assert.IsTrue(writeLockEventRaised);
            }
        }