/// <summary>
        /// Creates a factory based on a given configuration.
        /// If the factory provides invalid information, an error is logged through
        /// the internal logger, and a <see cref="NOPLoggerFactory"/> returned.
        /// </summary>
        /// <param name="factoryConfiguration">The configuration that provides type
        /// information for the <see cref="ILoggerFactory"/> that is being created.</param>
        /// <returns>Factory instance.</returns>
        private ILoggerFactory CreateFactoryInstance(FactoryConfigurationElement factoryConfiguration)
        {
            ILoggerFactory factory = ActivatorUtils.Instantiate<ILoggerFactory>(factoryConfiguration.Type);
            IConfigurableLoggerFactory cf = factory as IConfigurableLoggerFactory;

            // If the factory is configurable, invoke its Init method
            if (cf != null)
            {
                cf.Init(factoryConfiguration.FactoryData);
            }
            else
            {
                if (!string.IsNullOrEmpty(factoryConfiguration.FactoryData))
                {
                    throw new ConfigurationErrorsException("Factory " + factoryConfiguration.Type + " does not implement IConfigurableLoggerFactory.");
                }
            }

            return factory;
        }
        public void Configuration_SlfConfigurationSection_ValidFactoryTest()
        {
            Assert.IsNotNull(_configuration);
            var section = _configuration.GetSection("slf4net-valid-factory") as SlfConfigurationSection;

            Assert.IsNotNull(section);
            Assert.IsNotNull(section.Factory);

            Assert.IsFalse(string.IsNullOrEmpty(section.Factory.Type));
            Assert.AreEqual("slf4net.Factories.SimpleLoggerFactory, slf4net.Simple", section.Factory.Type);
            Assert.IsTrue(string.IsNullOrEmpty(section.Factory.FactoryData));

            string expected = "test.factory.type";
            string actual;

            section.Factory.Type = expected;
            actual = section.Factory.Type;
            Assert.AreEqual(expected, actual);

            FactoryConfigurationElement expectedFactory = new FactoryConfigurationElement();
            FactoryConfigurationElement actualFactory;

            actualFactory = section.Factory;
            Assert.AreNotEqual(expectedFactory, actualFactory);

            section.Factory = expectedFactory;
            actualFactory = section.Factory;
            Assert.AreEqual(expectedFactory, actualFactory);
        }