public void PropertyNamesAreMaskedWhenDestructuring()
        {
            LogEvent evt = null;

            var log = new LoggerConfiguration()
                      .Destructure.ByMaskingProperties("password", "secret")
                      .WriteTo.Sink(new DelegatingSink(e => evt = e))
                      .CreateLogger();

            DestructureMe.StaticProp = 1337;

            var ignored = new DestructureMe
            {
                Id       = 2,
                Name     = "Name",
                Password = "******",
                Secret   = 25673433
            };

            log.Information("Here is {@Ignored}", ignored);

            var props = GetPropsFromEvent("Ignored", evt);

            Assert.AreEqual(2, props[nameof(DestructureMe.Id)].LiteralValue());
            Assert.AreEqual("Name", props[nameof(DestructureMe.Name)].LiteralValue());
            Assert.AreEqual("******", props[nameof(DestructureMe.Password)].LiteralValue());
            Assert.AreEqual("******", props[nameof(DestructureMe.Secret)].LiteralValue());
            Assert.AreEqual(1337, props[nameof(DestructureMe.StaticProp)].LiteralValue());
        }
        public void PropertyNamesInExpressionsAreIgnoredWhenDestructuring()
        {
            LogEvent evt = null;

            Expression <Func <DestructureMe, object> > valueTypeProperty     = dm => dm.Id;
            Expression <Func <DestructureMe, object> > referenceTypeProperty = dm => dm.Password;

            var log = new LoggerConfiguration()
                      .Destructure.ByIgnoringProperties(valueTypeProperty, referenceTypeProperty)
                      .WriteTo.Sink(new DelegatingSink(e => evt = e))
                      .CreateLogger();

            var ignored = new DestructureMe
            {
                Id       = 2,
                Name     = "Name",
                Password = "******"
            };

            log.Information("Here is {@Ignored}", ignored);

            var sv    = (StructureValue)evt.Properties["Ignored"];
            var props = sv.Properties.ToDictionary(p => p.Name, p => p.Value);

            Assert.IsFalse(props.ContainsKey("Id"), "Id property should have been ignored");
            Assert.IsFalse(props.ContainsKey("Password"), "Password property should have been ignored.");
            Assert.AreEqual("Name", props["Name"].LiteralValue());
        }
        public void ValuesOfStaticPropertiesAreNotIncluded()
        {
            LogEvent evt = null;

            var log = new LoggerConfiguration()
                      .Destructure.ByMaskingProperties(opts =>
            {
                opts.ExcludeStaticProperties = true;
                opts.PropertyNames.AddRange(new[] { "password", "secret" });
            })
                      .WriteTo.Sink(new DelegatingSink(e => evt = e))
                      .CreateLogger();

            DestructureMe.StaticProp = 1337;

            var ignored = new DestructureMe
            {
                Id       = 2,
                Name     = "Name",
                Password = "******",
                Secret   = 25673433
            };

            log.Information("Here is {@Ignored}", ignored);

            var props = GetPropsFromEvent("Ignored", evt);

            Assert.AreEqual(2, props[nameof(DestructureMe.Id)].LiteralValue());
            Assert.AreEqual("Name", props[nameof(DestructureMe.Name)].LiteralValue());
            Assert.AreEqual("******", props[nameof(DestructureMe.Password)].LiteralValue());
            Assert.AreEqual("******", props[nameof(DestructureMe.Secret)].LiteralValue());
            Assert.IsFalse(props.ContainsKey(nameof(DestructureMe.StaticProp)), $"{nameof(props)} contains the key {nameof(DestructureMe.StaticProp)}.");
        }