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'."); }
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."); }
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); }
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); } }
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(); } }
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); } } }