public void AllNamespacesStartWithGetcuReoneTestCase()
        {
            string beginNamespace     = "GetcuReone";
            string partNameAssemblies = _projectName;

            string[] excludeAssemblies = new string[]
            {
            };

            Given("Get all file", () => InfrastructureHelper.GetAllFiles(_solutionFolder))
            .And("Get all assemblies", files => files.Where(file => file.Name.Contains(".dll")))
            .And($"Includ only {partNameAssemblies} assemblies", files => files.Where(file => file.Name.Contains(partNameAssemblies)))
            .And($"Include only library assemlies",
                 files => files
                 .Where(file => file.FullName.Contains("Tests") &&
                        !file.Name.Contains("Tests.dll") &&
                        !file.Name.Contains("TestAdapter.dll") &&
                        !file.FullName.Contains("obj") &&
                        (file.Directory.Parent.Name.Contains(_buildConfiguration) || file.Directory.Name.Contains(_buildConfiguration)) &&
                        excludeAssemblies.All(ass => ass != file.Name)))
            .And($"Exclude duplicate",
                 files => files
                 .DistinctByFunc((x, y) => x.Name == y.Name)
                 .ToList())
            .And("Get assembly infos",
                 files =>
                 files.Select(file =>
            {
                LoggingHelper.ConsoleInfo($"test assembly {file.FullName}");
                return(Assembly.LoadFrom(file.FullName));
            }).ToList())

            .When("Get types", assemblies => assemblies.SelectMany(assembly => assembly.GetTypes()))
            .Then("Check types", types =>
            {
                var invalidTypes = new List <Type>();

                foreach (Type type in types)
                {
                    if (type.FullName.Length <= beginNamespace.Length)
                    {
                        invalidTypes.Add(type);
                    }
                    else if (!type.FullName.Substring(0, beginNamespace.Length).Equals(beginNamespace, StringComparison.Ordinal))
                    {
                        invalidTypes.Add(type);
                    }
                }

                if (invalidTypes.Count != 0)
                {
                    Assert.Fail($"Invalid types: \n{string.Join("\n", invalidTypes.ConvertAll(type => type.FullName))}");
                }
            })
            .Run();
        }
        public void AssembliesHaveMajorVersionTestCase()
        {
            string[] includeAssemblies = new string[]
            {
                Path.Combine("NugetProject", "bin", _buildConfiguration, "netstandard2.0", "NugetProject.dll"),
                Path.Combine("JwtTestAdapter", "bin", _buildConfiguration, "netstandard2.0", "JwtTestAdapter.dll"),
            };
            string majorVersion             = Environment.GetEnvironmentVariable("majorVersion");
            string excpectedAssemblyVersion = majorVersion != null
                ? $"{majorVersion}.0.0.0"
                : "1.0.0.0";

            string partNameAssemblies = "FactFactory";

            Given("Get all file", () => InfrastructureHelper.GetAllFiles(new DirectoryInfo(Environment.CurrentDirectory).Parent.Parent.Parent.Parent.Parent))
            .And("Get all assemblies", files => files.Where(file => file.Name.Contains(".dll")))
            .And($"Includ only {partNameAssemblies} assemblies", files => files.Where(file => file.Name.Contains(partNameAssemblies) || includeAssemblies.Any(inAss => file.FullName.Contains(inAss))))
            .And($"Include only library assemlies",
                 files => files
                 .Where(file => !file.FullName.Contains("TestAdapter.dll") &&
                        !file.FullName.Contains("obj") &&
                        file.FullName.Contains(_buildConfiguration)))
            .And($"Exclude duplicate",
                 files => files
                 .DistinctByFunc((x, y) => x.Name == y.Name)
                 .ToList())
            .When("Get assembly infos",
                  files =>
                  files.Select(file =>
            {
                LoggingHelper.Info($"test assembly {file.FullName}");
                return(Assembly.LoadFrom(file.FullName));
            }).ToList())
            .Then("Checke assembly version", assemblies =>
            {
                var invalidAssemblies = new List <Assembly>();

                foreach (Assembly assembly in assemblies)
                {
                    if (!assembly.FullName.Contains($"Version={excpectedAssemblyVersion}"))
                    {
                        invalidAssemblies.Add(assembly);
                    }

                    CustomAttributeData attr = assembly.CustomAttributes.SingleOrDefault(attr => attr.AttributeType.Name.Equals(nameof(AssemblyFileVersionAttribute), StringComparison.Ordinal));

                    if (attr == null || attr.ConstructorArguments.Count == 0 || attr.ConstructorArguments[0].Value == null)
                    {
                        invalidAssemblies.Add(assembly);
                    }
                    else if (!(attr.ConstructorArguments[0].Value is string attrStr))
                    {
                        invalidAssemblies.Add(assembly);
                    }
        public void AllHaveTimeoutTestCase()
        {
            string partNameAssemblies = "MvvmFrame.Wpf";

            Given("Get all file", () => InfrastructureHelper.GetAllFiles(_solutionFolder))
            .And("Get all assemblies", files => files.Where(file => file.Name.Contains(".dll")))
            .And($"Includ only {partNameAssemblies} assemblies", files => files.Where(file => file.Name.Contains(partNameAssemblies)))
            .And($"Include only tests assemlies",
                 files => files
                 .Where(file => file.Name.Contains("Tests.dll") &&
                        !file.FullName.Contains("TestAdapter.dll") &&
                        !file.FullName.Contains("obj") &&
                        file.FullName.Contains(_buildConfiguration))
                 .ToList())
            .And("Get assembly infos", files =>
                 files.Select(file =>
            {
                LoggingHelper.Info($"test assembly {file.FullName}");
                return(Assembly.LoadFrom(file.FullName));
            }).ToList())
            .And("Get types", assemblies => assemblies.SelectMany(assembly => assembly.GetTypes()))
            .And("Get test classes", types => types.Where(type => type.GetCustomAttribute(typeof(TestClassAttribute)) != null))
            .When("Get test methods", typeClasses =>
            {
                var result = new List <MemberInfo>();

                foreach (var cl in typeClasses)
                {
                    foreach (var method in cl.GetMethods().Where(method => method.GetCustomAttribute(typeof(TestMethodAttribute)) != null))
                    {
                        result.Add(method);
                        LoggingHelper.Info($"test method {cl.FullName}.{method.Name}()");
                    }
                }

                return(result);
            })
            .Then("Check timeouts", methods =>
            {
                List <MemberInfo> invalidMethods = methods.Where(method => method.GetCustomAttribute(typeof(TestMethodAttribute)) == null).ToList();

                if (invalidMethods.Count != 0)
                {
                    Assert.Fail("Methods dont have TestMethodAttribute:\n" + string.Join("\n", invalidMethods.Select(method => $"{method.DeclaringType.FullName}.{method.Name}")));
                }
            });
        }