コード例 #1
0
        public void Properties_CrossReferencingCarriersAcrossScopes_WhenOnePropertyRemainsAlive_AreNotCollected()
        {
            var(carrierRef1, valueRef1, carrierRef2, valueRef2, value1) = Create();
            GC.Collect();
            Assert.True(carrierRef1.IsAlive);
            Assert.True(valueRef1.IsAlive);
            Assert.True(carrierRef2.IsAlive);
            Assert.True(valueRef2.IsAlive);
            GC.KeepAlive(value1);

            (WeakReference, WeakReference, WeakReference, WeakReference, Func <int>) Create()
            {
                var        name        = Guid.NewGuid().ToString("N");
                var        other       = new ConnectedPropertyScope();
                var        carrier1    = new object();
                var        carrierRef1 = new WeakReference(carrier1);
                var        carrier2    = new object();
                var        carrierRef2 = new WeakReference(carrier1);
                Func <int> value1      = carrier2.GetHashCode;
                var        valueRef1   = new WeakReference(value1);
                Func <int> value2      = carrier1.GetHashCode;
                var        valueRef2   = new WeakReference(value2);

                ConnectedProperty.GetConnectedProperty(carrier1, name).Set(value1);
                other.GetConnectedProperty(carrier2, name).Set(value2);
                return(carrierRef1, valueRef1, carrierRef2, valueRef2, value1);
            }
        }
コード例 #2
0
        public void Properties_CrossReferencingCarriers_WhenCarriersAreCollected_AreCollected()
        {
            var(carrierRef1, valueRef1, carrierRef2, valueRef2) = Create();
            GC.Collect();
            Assert.False(carrierRef1.IsAlive);
            Assert.False(valueRef1.IsAlive);
            Assert.False(carrierRef2.IsAlive);
            Assert.False(valueRef2.IsAlive);

            (WeakReference, WeakReference, WeakReference, WeakReference) Create()
            {
                var        name        = Guid.NewGuid().ToString("N");
                var        carrier1    = new object();
                var        carrierRef1 = new WeakReference(carrier1);
                var        carrier2    = new object();
                var        carrierRef2 = new WeakReference(carrier1);
                Func <int> value1      = carrier2.GetHashCode;
                var        valueRef1   = new WeakReference(value1);
                Func <int> value2      = carrier1.GetHashCode;
                var        valueRef2   = new WeakReference(value2);

                ConnectedProperty.GetConnectedProperty(carrier1, name).Set(value1);
                ConnectedProperty.GetConnectedProperty(carrier2, name).Set(value2);
                return(carrierRef1, valueRef1, carrierRef2, valueRef2);
            }
        }
コード例 #3
0
        public void TryDisconnect_WhenDisconnected_ReturnsFalse()
        {
            var carrier = new object();
            var name    = Guid.NewGuid().ToString("N");

            Assert.False(ConnectedProperty.GetConnectedProperty(carrier, name).TryDisconnect());
        }
コード例 #4
0
        public void TryConnect_WhenDisconnected_ReturnsTrueAndSetsValue()
        {
            var carrier = new object();
            var name    = Guid.NewGuid().ToString("N");

            Assert.True(ConnectedProperty.GetConnectedProperty(carrier, name).TryConnect(17));
            Assert.Equal(17, ConnectedProperty.GetConnectedProperty(carrier, name).Get());
        }
コード例 #5
0
        public void Disconnect_WhenDisconnected_Throws()
        {
            var carrier  = new object();
            var name     = Guid.NewGuid().ToString("N");
            var property = ConnectedProperty.GetConnectedProperty(carrier, name);

            Assert.Throws <InvalidOperationException>(() => property.Disconnect());
        }
コード例 #6
0
        public void SimpleUsage()
        {
            var obj = new object();

            ConnectedProperty.Set(obj, "Name", "Bob");

            Assert.Equal("Bob", ReadName(obj));
        }
コード例 #7
0
        public void Connect_WhenDisconnected_SetsValue()
        {
            var carrier = new object();
            var name    = Guid.NewGuid().ToString("N");

            ConnectedProperty.GetConnectedProperty(carrier, name).Connect(13);
            Assert.Equal(13, ConnectedProperty.GetConnectedProperty(carrier, name).Get());
        }
コード例 #8
0
        public void Set_WhenConnected_OverwritesExistingValue()
        {
            var carrier = new object();
            var name    = Guid.NewGuid().ToString("N");

            ConnectedProperty.GetConnectedProperty(carrier, name).Set(17);
            ConnectedProperty.GetConnectedProperty(carrier, name).Set(13);
            Assert.Equal(13, ConnectedProperty.GetConnectedProperty(carrier, name).Get());
        }
コード例 #9
0
        public void TryUpdate_WhenDisconnected_ReturnsFalseAndDoesNotSetValue()
        {
            var carrier = new object();
            var name    = Guid.NewGuid().ToString("N");
            var result  = ConnectedProperty.GetConnectedProperty(carrier, name).TryUpdate(19, 17);

            Assert.False(result);
            Assert.False(ConnectedProperty.GetConnectedProperty(carrier, name).TryDisconnect());
        }
コード例 #10
0
        public void CreateOrUpdate_WhenDisconnected_SetsAndReturnsValue()
        {
            var carrier = new object();
            var name    = Guid.NewGuid().ToString("N");
            var result  = ConnectedProperty.GetConnectedProperty(carrier, name).CreateOrUpdate(() => 13, x => x + 2);

            Assert.Equal(13, result);
            Assert.Equal(13, ConnectedProperty.GetConnectedProperty(carrier, name).Get());
        }
コード例 #11
0
        public void Disconnect_WhenConnected_Disconnects()
        {
            var carrier = new object();
            var name    = Guid.NewGuid().ToString("N");

            ConnectedProperty.GetConnectedProperty(carrier, name).Set(13);
            ConnectedProperty.GetConnectedProperty(carrier, name).Disconnect();
            Assert.False(ConnectedProperty.GetConnectedProperty(carrier, name).TryDisconnect());
        }
コード例 #12
0
        public void TryConnect_WhenConnected_ReturnsFalseAndDoesNotSetValue()
        {
            var carrier = new object();
            var name    = Guid.NewGuid().ToString("N");

            ConnectedProperty.GetConnectedProperty(carrier, name).Set(13);
            Assert.False(ConnectedProperty.GetConnectedProperty(carrier, name).TryConnect(17));
            Assert.Equal(13, ConnectedProperty.GetConnectedProperty(carrier, name).Get());
        }
コード例 #13
0
        public void Properties_WithDifferentNames_HaveIndependentValues()
        {
            var carrier = new object();
            var name1   = Guid.NewGuid().ToString("N");
            var name2   = Guid.NewGuid().ToString("N");

            ConnectedProperty.GetConnectedProperty(carrier, name1).Set(17);
            ConnectedProperty.GetConnectedProperty(carrier, name2).Set(13);
            Assert.Equal(17, ConnectedProperty.GetConnectedProperty(carrier, name1).Get());
            Assert.Equal(13, ConnectedProperty.GetConnectedProperty(carrier, name2).Get());
        }
コード例 #14
0
        public void Properties_WithSameNameButDifferentScopes_HaveIndependentValues()
        {
            var carrier = new object();
            var name    = Guid.NewGuid().ToString("N");
            var other   = new ConnectedPropertyScope();

            ConnectedProperty.GetConnectedProperty(carrier, name).Set(17);
            other.GetConnectedProperty(carrier, name).Set(13);
            Assert.Equal(17, ConnectedProperty.GetConnectedProperty(carrier, name).Get());
            Assert.Equal(13, other.GetConnectedProperty(carrier, name).Get());
        }
コード例 #15
0
        public void GetOrConnect_WhenConnected_ReturnsExistingValueAndDoesNotModifyValue()
        {
            var carrier = new object();
            var name    = Guid.NewGuid().ToString("N");

            ConnectedProperty.GetConnectedProperty(carrier, name).Set(17);
            var result = ConnectedProperty.GetConnectedProperty(carrier, name).GetOrConnect(13);

            Assert.Equal(17, result);
            Assert.Equal(17, ConnectedProperty.GetConnectedProperty(carrier, name).Get());
        }
コード例 #16
0
        public void GetOrCreate_WhenConnected_GetsValueAndDoesNotSetValue()
        {
            var carrier = new object();
            var name    = Guid.NewGuid().ToString("N");

            ConnectedProperty.GetConnectedProperty(carrier, name).Set(13);
            var result = ConnectedProperty.GetConnectedProperty(carrier, name).GetOrCreate(() => 17);

            Assert.Equal(13, result);
            Assert.Equal(13, ConnectedProperty.GetConnectedProperty(carrier, name).Get());
        }
コード例 #17
0
        public void TryUpdate_WhenConnectedWithMatchingValue_ReturnsTrueAndSetsValue()
        {
            var carrier = new object();
            var name    = Guid.NewGuid().ToString("N");

            ConnectedProperty.GetConnectedProperty(carrier, name).Set(13);
            var result = ConnectedProperty.GetConnectedProperty(carrier, name).TryUpdate(19, 13);

            Assert.True(result);
            Assert.Equal(19, ConnectedProperty.GetConnectedProperty(carrier, name).Get());
        }
コード例 #18
0
        public void TryUpdate_WhenConnectedWithNonmatchingValue_ReturnsFalseAndDoesNotSetValue()
        {
            var carrier = new object();
            var name    = Guid.NewGuid().ToString("N");

            ConnectedProperty.GetConnectedProperty(carrier, name).Set(13);
            var result = ConnectedProperty.GetConnectedProperty(carrier, name).TryUpdate(19, 17);

            Assert.False(result);
            Assert.Equal(13, ConnectedProperty.GetConnectedProperty(carrier, name).Get());
        }
コード例 #19
0
        public void ConnectOrUpdate_WhenConnected_UpdatesAndReturnsValue()
        {
            var carrier = new object();
            var name    = Guid.NewGuid().ToString("N");

            ConnectedProperty.GetConnectedProperty(carrier, name).Set(13);
            var result = ConnectedProperty.GetConnectedProperty(carrier, name).ConnectOrUpdate(13, x => x + 2);

            Assert.Equal(15, result);
            Assert.Equal(15, ConnectedProperty.GetConnectedProperty(carrier, name).Get());
        }
コード例 #20
0
 private static dynamic TryGetConnectedProperty(object obj, string name)
 {
     try
     {
         return(ConnectedProperty.Get(obj, name));
     }
     catch (InvalidOperationException)
     {
         return(null);
     }
 }
コード例 #21
0
        public void Connect_WhenConnected_ThrowsAndDoesNotModifyValue()
        {
            var carrier = new object();
            var name    = Guid.NewGuid().ToString("N");

            ConnectedProperty.GetConnectedProperty(carrier, name).Connect(13);
            var property = ConnectedProperty.GetConnectedProperty(carrier, name);

            Assert.Throws <InvalidOperationException>(() => property.Connect(17));
            Assert.Equal(13, ConnectedProperty.GetConnectedProperty(carrier, name).Get());
        }
コード例 #22
0
        public void TryGet_WhenConnected_ReturnsTrueAndValue()
        {
            var carrier = new object();
            var name    = Guid.NewGuid().ToString("N");

            ConnectedProperty.GetConnectedProperty(carrier, name).Set(13);
            dynamic value;

            Assert.True(ConnectedProperty.GetConnectedProperty(carrier, name).TryGet(out value));
            Assert.Equal(13, value);
        }
コード例 #23
0
        public void Property_WhenCarrierIsAlive_IsNotCollected()
        {
            // A "dictionary mapping" with weak value references will not pass this test.
            var name     = Guid.NewGuid().ToString("N");
            var carrier  = new object();
            var value    = new object();
            var valueRef = new WeakReference(value);

            ConnectedProperty.GetConnectedProperty(carrier, name).Set(value);
            GC.Collect();
            Assert.True(valueRef.IsAlive);
            GC.KeepAlive(carrier);
        }
コード例 #24
0
        public void Property_WhenCarrierIsCollected_IsCollected()
        {
            var name       = Guid.NewGuid().ToString("N");
            var carrier    = new object();
            var carrierRef = new WeakReference(carrier);
            var value      = new object();
            var valueRef   = new WeakReference(value);

            ConnectedProperty.GetConnectedProperty(carrier, name).Set(value);
            GC.Collect();
            Assert.False(carrierRef.IsAlive);
            Assert.False(valueRef.IsAlive);
        }
コード例 #25
0
        /// <summary>
        /// Attempts to get the logging scopes for an exception. Returns <c>null</c> if there are no logging scopes for this exception.
        /// </summary>
        public static ImmutableStack <ILoggingScope>?TryGetLoggingScopes(this Exception exception)
        {
            var prop = ConnectedProperty.GetConnectedProperty(exception, LoggingScopesName, bypassValidation: true);

            if (prop == null)
            {
                return(null);
            }
            if (!prop.TryGet(out var value))
            {
                return(null);
            }
            return(value as ImmutableStack <ILoggingScope>);
        }
コード例 #26
0
        public void Property_ReferencingCarrier_WhenCarrierIsCollected_IsCollected()
        {
            // A "dictionary mapping" with strong value references will not pass this test.
            var        name       = Guid.NewGuid().ToString("N");
            var        carrier    = new object();
            var        carrierRef = new WeakReference(carrier);
            Func <int> value      = carrier.GetHashCode;
            var        valueRef   = new WeakReference(value);

            ConnectedProperty.GetConnectedProperty(carrier, name).Set(value);
            GC.Collect();
            Assert.False(carrierRef.IsAlive);
            Assert.False(valueRef.IsAlive);
        }
コード例 #27
0
        public void Properties_CrossReferencingCarriersAcrossScopes_WhenCarriersAreCollected_AreCollected()
        {
            var        name        = Guid.NewGuid().ToString("N");
            var        other       = new ConnectedPropertyScope();
            var        carrier1    = new object();
            var        carrierRef1 = new WeakReference(carrier1);
            var        carrier2    = new object();
            var        carrierRef2 = new WeakReference(carrier1);
            Func <int> value1      = carrier2.GetHashCode;
            var        valueRef1   = new WeakReference(value1);
            Func <int> value2      = carrier1.GetHashCode;
            var        valueRef2   = new WeakReference(value2);

            ConnectedProperty.GetConnectedProperty(carrier1, name).Set(value1);
            other.GetConnectedProperty(carrier2, name).Set(value2);
            GC.Collect();
            Assert.False(carrierRef1.IsAlive);
            Assert.False(valueRef1.IsAlive);
            Assert.False(carrierRef2.IsAlive);
            Assert.False(valueRef2.IsAlive);
        }
コード例 #28
0
ファイル: ExitPin.xaml.cs プロジェクト: time4vps/vpn-win-app
 set => SetValue(ConnectedProperty, value);
コード例 #29
0
 /// <summary>
 /// Sets the logging scopes for an exception.
 /// </summary>
 public static void SetLoggingScopes(this Exception exception, ImmutableStack <ILoggingScope> loggingScopes)
 {
     ConnectedProperty.GetConnectedProperty(exception, LoggingScopesName, bypassValidation: true).Set(loggingScopes);
 }
コード例 #30
0
 private static string ReadName(object obj) => ConnectedProperty.Get(obj, "Name");