public static SmartLogPerTypeByLevel <T> Log <T>(this SmartLoggerPerType <T> smartLoggerPerType,
                                                         SmartLogLevel smartLogLevel,
                                                         string line)
        {
            SmartLogPerTypeByLevel <T> smartLogPerTypeByLevel = smartLoggerPerType.GetOrAdd(typeof(T),
                                                                                            new SmartLogPerTypeByLevel <T>());

            smartLogPerTypeByLevel.Log(smartLogLevel,
                                       line);
            return(smartLogPerTypeByLevel);
        }
        public static SmartLogPerTypeByLevel <T> Log <T>(this SmartLoggerPerType <T> smartLoggerPerType,
                                                         string action,
                                                         SmartLogLevel smartLogLevel,
                                                         string message)
        {
            string line = SmartLogLine.GetLine(action,
                                               smartLogLevel.ToLine(),
                                               message);
            SmartLogPerTypeByLevel <T> smartLogPerTypeByLevel = smartLoggerPerType.Log(smartLogLevel,
                                                                                       line);

            return(smartLogPerTypeByLevel);
        }
        private SmartLogPerTypeByLevel <SmartLoggerTests> AssertGetSmartLog(string action,
                                                                            SmartLogLevel smartLogLevel,
                                                                            SmartLogPerTypeByLevel <SmartLoggerTests> expectedSmartLogPerTypeByLevel)
        {
            Assert.NotNull(expectedSmartLogPerTypeByLevel);
            SmartLogPerTypeByLevel <SmartLoggerTests> smartLogPerTypeByLevel = SmartLoggerPerType.Log(action,
                                                                                                      smartLogLevel,
                                                                                                      SmartLogGeneratorName);

            Assert.NotNull(smartLogPerTypeByLevel);
            Assert.AreEqual(expectedSmartLogPerTypeByLevel,
                            smartLogPerTypeByLevel);
            LogSize(smartLogLevel);
            return(smartLogPerTypeByLevel);
        }
        private void AssertGetSmartLog(SmartLogLevel smartLogLevel,
                                       SmartLogLevel logLevel)
        {
            SmartLoggerPerType.TryGetValue(typeof(SmartLoggerTests),
                                           out SmartLogPerTypeByLevel <SmartLoggerTests> expectedSmartLogPerTypeByLevel);
            SmartLogPerTypeByLevel <SmartLoggerTests> smartLogPerTypeByLevel = AssertGetSmartLog(Getting,
                                                                                                 smartLogLevel,
                                                                                                 expectedSmartLogPerTypeByLevel);

            Thread.Sleep(100);
            LogSize(smartLogLevel);
            string line = SmartLogLine.GetLine(logLevel.ToLine(),
                                               SmartLogGeneratorName,
                                               smartLogLevel.ToLine());

            smartLogPerTypeByLevel.Log(logLevel,
                                       line);
            Thread.Sleep(100);
        }