コード例 #1
0
        public static void LoadFromDirectory___WhiteSpace_directory___Throws()
        {
            // Arrange
            Action action = () => AssemblyLoader.CreateAndLoadFromDirectory('\t'.ToString());

            // Act
            var exception = Record.Exception(action);

            // Assert
            exception.Should().NotBeNull();
            exception.Should().BeOfType <ArgumentException>();
            exception.Message.Should().Be("Parameter 'directoryPath' is white space.  Parameter value is '\t'.");
        }
コード例 #2
0
        public static void LoadFromDirectory___Null_directory___Throws()
        {
            // Arrange
            Action action = () => AssemblyLoader.CreateAndLoadFromDirectory(null);

            // Act
            var exception = Record.Exception(action);

            // Assert
            exception.Should().NotBeNull();
            exception.Should().BeOfType <ArgumentNullException>();
            exception.Message.Should().Be("Parameter 'directoryPath' is null.");
        }
コード例 #3
0
        public static void LoadFromDirectory___Missing_directory___Throws()
        {
            // Arrange
            var    fakePath = Invariant($"C:\\{Guid.NewGuid()}\\");
            var    expectedExceptionMessage = Invariant($"Parameter 'directoryPathMustBeDirectoryAndExist-{fakePath}-DoesNotExist' is not true.  Parameter value is 'False'.");
            Action action = () => AssemblyLoader.CreateAndLoadFromDirectory(fakePath);

            // Act
            var exception = Record.Exception(action);

            // Assert
            exception.Should().NotBeNull();
            exception.Should().BeOfType <ArgumentException>();
            exception.Message.Should().Be(expectedExceptionMessage);
        }
コード例 #4
0
        public static void LoadFromDirectory___Packages_path___Works()
        {
            // Arrange
            var packagesPath = Path.Combine(
                Path.GetDirectoryName(typeof(AssemblyLoader).Assembly.GetCodeBaseAsPathInsteadOfUri() ?? string.Empty) ?? string.Empty,
                @"..\..\..\packages");

            // Act & Assert
            using (var assemblyLoader = AssemblyLoader.CreateAndLoadFromDirectory(packagesPath))
            {
                assemblyLoader.AssemblyFileExtensionsWithoutPeriodToLoad.Should().Equal(AssemblyLoader.DefaultAssemblyFileExtensionsWithoutPeriodToLoad);
                assemblyLoader.SymbolFileExtensionsWithoutPeriodToConsider.Should().Equal(AssemblyLoader.DefaultSymbolFileExtensionsWithoutPeriodToLoad);
                assemblyLoader.AssemblyFileNameRegexBlacklist.Should().Equal(AssemblyLoader.DefaultAssemblyFileNameRegexBlacklist);
                assemblyLoader.DirectoryPath.Should().Be(packagesPath);
                assemblyLoader.FilePathToAssemblyMap.Should().NotBeNull();
                assemblyLoader.FilePathToAssemblyMap.Count.Should().NotBe(0);
                assemblyLoader.LoadRecursively.Should().BeTrue();
                assemblyLoader.SymbolFilePaths.Should().NotBeNull();
                assemblyLoader.SymbolFilePaths.Count.Should().NotBe(0);
            }
        }
コード例 #5
0
        public static void LoadFromDirectory___Valid_path_with_no_files___Works_with_currently_loaded_assemblies()
        {
            // Arrange
            var fakePath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());

            Directory.CreateDirectory(fakePath);

            // Act
            AssemblyLoader assemblyLoader;

            try
            {
                assemblyLoader = AssemblyLoader.CreateAndLoadFromDirectory(fakePath);
            }
            finally
            {
                if (Directory.Exists(fakePath))
                {
                    Directory.Delete(fakePath);
                }
            }

            // Assert
            try
            {
                assemblyLoader.AssemblyFileExtensionsWithoutPeriodToLoad.Should().Equal(AssemblyLoader.DefaultAssemblyFileExtensionsWithoutPeriodToLoad);
                assemblyLoader.SymbolFileExtensionsWithoutPeriodToConsider.Should().Equal(AssemblyLoader.DefaultSymbolFileExtensionsWithoutPeriodToLoad);
                assemblyLoader.AssemblyFileNameRegexBlacklist.Should().Equal(AssemblyLoader.DefaultAssemblyFileNameRegexBlacklist);
                assemblyLoader.DirectoryPath.Should().Be(fakePath);
                assemblyLoader.FilePathToAssemblyMap.Should().NotBeNull();
                assemblyLoader.FilePathToAssemblyMap.Count.Should().Be(0);
                assemblyLoader.LoadRecursively.Should().BeTrue();
                assemblyLoader.SymbolFilePaths.Should().NotBeNull();
                assemblyLoader.SymbolFilePaths.Count.Should().Be(0);
            }
            finally
            {
                assemblyLoader?.Dispose();
            }
        }
コード例 #6
0
        public static void GenerateCodeForProject(
            string projectDirectory,
            string testProjectDirectory,
            string projectOutputDirectory,
            bool includeSerializationTesting,
            string recipeConditionalCompilationSymbol)
        {
            if (!Directory.Exists(projectDirectory))
            {
                throw new ArgumentException("Could not find project directory: " + projectDirectory);
            }

            if (!Directory.Exists(projectOutputDirectory))
            {
                throw new ArgumentException("Could not find project output directory: " + projectOutputDirectory);
            }

            var projectName = new DirectoryInfo(projectDirectory).Name;

            var runningDirectory = Path.GetDirectoryName(typeof(ProjectCodeGenerator).Assembly.GetCodeBaseAsPathInsteadOfUri());

            var hasTestProject = !string.IsNullOrEmpty(testProjectDirectory) && Directory.Exists(testProjectDirectory);

            var projectSourceFilePaths = Directory.GetFiles(projectDirectory, "*.cs", SearchOption.AllDirectories).Where(_ => !_.Contains(".recipes")).ToArray();

            var testProjectSourceFilePaths = hasTestProject
                ? Directory.GetFiles(testProjectDirectory, "*.cs", SearchOption.AllDirectories).Where(_ => !_.Contains(".recipes")).ToArray()
                : new string[0];

            var testNamespace = hasTestProject
                ? new DirectoryInfo(testProjectDirectory).Name
                : null;

            var dummyFactoryFilePath = testProjectSourceFilePaths.SingleOrDefault(_ => _.EndsWith("DummyFactory.cs", StringComparison.OrdinalIgnoreCase));

            var hasDummyFactory = dummyFactoryFilePath != null;

            var fileHeaderBuilder = GetFileHeaderBuilder(projectName, projectDirectory);

            CopyMissingAssembliesFromProjectOutputDirectoryToRunningDirectory(projectOutputDirectory, runningDirectory);

            using (AssemblyLoader.CreateAndLoadFromDirectory(runningDirectory))
            {
                var typesToCheck = AssemblyLoader
                                   .GetLoadedAssemblies()
                                   .Where(_ => (_.GetName().Name ?? string.Empty).StartsWith(projectName, StringComparison.Ordinal))
                                   .ToList()
                                   .GetTypesFromAssemblies()
                                   .ToList();

                var typesForDummyFactory = new List <Type>();

                var codeGeneratedForTypes = new List <Type>();

                foreach (var type in typesToCheck)
                {
                    Console.WriteLine("Checking type: " + type.ToStringReadable());

                    var shouldGenerateCode =
                        CodeGenerator.TypesThatIndicateCodeGenIsRequired.Any(_ => _.IsAssignableFrom(type)) &&
                        !type.IsInterface;

                    if (shouldGenerateCode)
                    {
                        if (typeof(IForsakeInheritedModelViaCodeGen).IsAssignableFrom(type))
                        {
                            Console.WriteLine("Forsaking generating code for type: " + type.ToStringReadable());
                        }
                        else
                        {
                            Console.WriteLine("Generating code for type: " + type.ToStringReadable());

                            WriteModelFile(type, projectSourceFilePaths);

                            if (hasTestProject)
                            {
                                WriteTestFiles(type, testProjectDirectory, testProjectSourceFilePaths, testNamespace, fileHeaderBuilder, includeSerializationTesting);
                            }

                            if (typeof(IModelViaCodeGen).IsAssignableFrom(type))
                            {
                                typesForDummyFactory.Add(type);
                            }

                            codeGeneratedForTypes.Add(type);
                        }
                    }
                }

                Console.WriteLine();

                Console.WriteLine("Generated code for these types: " + Environment.NewLine + codeGeneratedForTypes.Select(_ => " - " + _.ToStringReadable()).ToNewLineDelimited());

                typesForDummyFactory = typesForDummyFactory.OrderBy(_ => _.ToStringReadable()).ToList();

                if (hasDummyFactory)
                {
                    WriteDummyFactoryFile(typesForDummyFactory, dummyFactoryFilePath, testNamespace, testProjectDirectory, testProjectSourceFilePaths, fileHeaderBuilder, recipeConditionalCompilationSymbol);
                }
            }
        }