// Invokes the code generator discovered via the host and options internal static string GenerateCode(ICodeGenerationHost host, ClientCodeGenerationOptions options, IEnumerable <Type> domainServiceTypes) { IDomainServiceClientCodeGenerator generator = CreateCodeGenerator(host, options); DomainServiceCatalog catalog = new DomainServiceCatalog(domainServiceTypes, host as ILogger); return(generator.GenerateCode(host, catalog.DomainServiceDescriptions, options)); }
public void DomainServiceCatalog_Message_FileNotFound_Continues() { string assemblyFileName = @"c:\Nowhere\DontExist.dll"; ConsoleLogger logger = new ConsoleLogger(); IEnumerable <string> assemblies = new string[] { assemblyFileName, this.GetType().Assembly.Location }; DomainServiceCatalog dsc = new DomainServiceCatalog(assemblies, logger); ICollection <DomainServiceDescription> descriptions = dsc.DomainServiceDescriptions; Assert.IsNotNull(descriptions); // Need to synthesize exactly the same message we'd expect from failed assembly load string exceptionMessage = null; try { AssemblyName.GetAssemblyName(assemblyFileName); } catch (FileNotFoundException fnfe) { exceptionMessage = fnfe.Message; } string expectedMessage = string.Format(CultureInfo.CurrentCulture, Resource.ClientCodeGen_Assembly_Load_Error, assemblyFileName, exceptionMessage); TestHelper.AssertContainsMessages(logger, expectedMessage); Assert.IsTrue(descriptions.Count > 0); }
public void DomainServiceCatalog_Message_BadImageFormat() { // Create fake DLL with bad image string assemblyFileName = Path.Combine(Path.GetTempPath(), (Guid.NewGuid().ToString() + ".dll")); File.WriteAllText(assemblyFileName, "neener neener neener"); ConsoleLogger logger = new ConsoleLogger(); DomainServiceCatalog dsc = new DomainServiceCatalog(new string[] { assemblyFileName }, logger); ICollection <DomainServiceDescription> descriptions = dsc.DomainServiceDescriptions; Assert.IsNotNull(descriptions); Assert.AreEqual(0, descriptions.Count); Assert.AreEqual(0, logger.ErrorMessages.Count); Assert.AreEqual(0, logger.WarningMessages.Count); // Need to synthesize exactly the same message we'd expect from failed assembly load string exceptionMessage = null; try { AssemblyName.GetAssemblyName(assemblyFileName); } catch (BadImageFormatException bife) { exceptionMessage = bife.Message; } finally { File.Delete(assemblyFileName); } string expectedMessage = string.Format(CultureInfo.CurrentCulture, Resource.ClientCodeGen_Assembly_Load_Error, assemblyFileName, exceptionMessage); TestHelper.AssertContainsMessages(logger, expectedMessage); }
public void DomainServiceCatalog_Ctors() { IEnumerable<string> empty = new string[0]; ConsoleLogger logger = new ConsoleLogger(); // Ctor taking assemblies -- null arg tests ExceptionHelper.ExpectArgumentNullExceptionStandard(() => new DomainServiceCatalog((IEnumerable<string>)null, logger), "assembliesToLoad"); ExceptionHelper.ExpectArgumentNullExceptionStandard(() => new DomainServiceCatalog(empty, null), "logger"); // Ctor taking one type -- null arg tests ExceptionHelper.ExpectArgumentNullExceptionStandard(() => new DomainServiceCatalog((Type) null, logger), "domainServiceType"); ExceptionHelper.ExpectArgumentNullExceptionStandard(() => new DomainServiceCatalog(typeof(DSC_DomainServiceType), null), "logger"); // Ctor taking multiple types -- null arg tests ExceptionHelper.ExpectArgumentNullExceptionStandard(() => new DomainServiceCatalog((IEnumerable<Type>)null, logger), "domainServiceTypes"); ExceptionHelper.ExpectArgumentNullExceptionStandard(() => new DomainServiceCatalog(new Type[] {typeof(DSC_DomainServiceType)}, null), "logger"); // Ctor taking assemblies -- legit string[] realAssemblies = new string[] { this.GetType().Assembly.Location, typeof(string).Assembly.Location }; // Assembly based ctors are tested more deeply in other test methods // Ctor taking one type -- legit DomainServiceCatalog dsc = new DomainServiceCatalog(typeof(DSC_DomainServiceType), logger); IEnumerable<DomainServiceDescription> descriptions = dsc.DomainServiceDescriptions; Assert.IsNotNull(descriptions, "Did not expect null descriptions"); Assert.AreEqual(1, descriptions.Count(), "Expected exactly one domain service description"); // Ctor taking multiple type -- legit dsc = new DomainServiceCatalog(new Type[] {typeof(DSC_DomainServiceType)}, logger); descriptions = dsc.DomainServiceDescriptions; Assert.IsNotNull(descriptions, "Did not expect null descriptions"); Assert.AreEqual(1, descriptions.Count(), "Expected exactly one domain service description"); }
private string GenerateCode() { ClientCodeGenerationOptions options = new ClientCodeGenerationOptions() { Language = this._isCSharp ? "C#" : "VisualBasic", ClientProjectPath = "MockProject.proj", ClientRootNamespace = "TestRootNS", UseFullTypeNames = this._useFullTypeNames }; MockCodeGenerationHost host = TestHelper.CreateMockCodeGenerationHost(this.ConsoleLogger, this.MockSharedCodeService); ClientCodeGenerator generator = (ClientCodeGenerator) new CSharpClientCodeGenerator(); this._domainServiceCatalog = new DomainServiceCatalog(this._domainServiceTypes, this.ConsoleLogger); string generatedCode = generator.GenerateCode(host, this._domainServiceCatalog.DomainServiceDescriptions, options); return(generatedCode); }
public void T4CodeGenTest_VBCodeGenTest() { Type[] domainServiceTypes = new Type[] {}; ClientCodeGenerationOptions options = new ClientCodeGenerationOptions() { Language = "VB", ClientProjectPath = "MockProject.proj", ClientRootNamespace = "TestRootNS", UseFullTypeNames = false }; ConsoleLogger consoleLogger = new ConsoleLogger(); MockSharedCodeService mockSharedCodeService = new MockSharedCodeService(Array.Empty <Type>(), Array.Empty <MethodBase>(), Array.Empty <string>()); MockCodeGenerationHost host = TestHelper.CreateMockCodeGenerationHost(consoleLogger, mockSharedCodeService); ClientCodeGenerator generator = (ClientCodeGenerator) new VBTestClientCodeGenerator(); DomainServiceCatalog domainServiceCatalog = new DomainServiceCatalog(domainServiceTypes, consoleLogger); string generatedCode = generator.GenerateCode(host, domainServiceCatalog.DomainServiceDescriptions, options); Assert.IsTrue(string.IsNullOrEmpty(generatedCode)); Assert.IsTrue(string.IsNullOrEmpty(consoleLogger.Errors)); }
public void DomainServiceCatalog_Finds_All_DomainServices() { ConsoleLogger logger = new ConsoleLogger(); List <string> assemblies = new List <string>(); // Add our current unit test assembly to those to load assemblies.Add(this.GetType().Assembly.Location); int expectedDomainServices = 0; foreach (Type t in this.GetType().Assembly.GetExportedTypes()) { if (IsDomainService(t)) { ++expectedDomainServices; } } // Add all our assy references and also count any DomainServices there (don't expect any) foreach (AssemblyName an in this.GetType().Assembly.GetReferencedAssemblies()) { Assembly a = Assembly.Load(an); assemblies.Add(a.Location); foreach (Type t in a.GetExportedTypes()) { if (IsDomainService(t)) { ++expectedDomainServices; } } } DomainServiceCatalog dsc = new DomainServiceCatalog(assemblies, logger); ICollection <DomainServiceDescription> descriptions = dsc.DomainServiceDescriptions; Assert.IsNotNull(descriptions); Assert.IsTrue(descriptions.Count >= expectedDomainServices); }
public void DomainServiceCatalog_Ctors() { IEnumerable <string> empty = new string[0]; ConsoleLogger logger = new ConsoleLogger(); // Ctor taking assemblies -- null arg tests ExceptionHelper.ExpectArgumentNullExceptionStandard(() => new DomainServiceCatalog((IEnumerable <string>)null, logger), "assembliesToLoad"); ExceptionHelper.ExpectArgumentNullExceptionStandard(() => new DomainServiceCatalog(empty, null), "logger"); // Ctor taking one type -- null arg tests ExceptionHelper.ExpectArgumentNullExceptionStandard(() => new DomainServiceCatalog((Type)null, logger), "domainServiceType"); ExceptionHelper.ExpectArgumentNullExceptionStandard(() => new DomainServiceCatalog(typeof(DSC_DomainServiceType), null), "logger"); // Ctor taking multiple types -- null arg tests ExceptionHelper.ExpectArgumentNullExceptionStandard(() => new DomainServiceCatalog((IEnumerable <Type>)null, logger), "domainServiceTypes"); ExceptionHelper.ExpectArgumentNullExceptionStandard(() => new DomainServiceCatalog(new Type[] { typeof(DSC_DomainServiceType) }, null), "logger"); // Ctor taking assemblies -- legit string[] realAssemblies = new string[] { this.GetType().Assembly.Location, typeof(string).Assembly.Location }; // Assembly based ctors are tested more deeply in other test methods // Ctor taking one type -- legit DomainServiceCatalog dsc = new DomainServiceCatalog(typeof(DSC_DomainServiceType), logger); IEnumerable <DomainServiceDescription> descriptions = dsc.DomainServiceDescriptions; Assert.IsNotNull(descriptions, "Did not expect null descriptions"); Assert.AreEqual(1, descriptions.Count(), "Expected exactly one domain service description"); // Ctor taking multiple type -- legit dsc = new DomainServiceCatalog(new Type[] { typeof(DSC_DomainServiceType) }, logger); descriptions = dsc.DomainServiceDescriptions; Assert.IsNotNull(descriptions, "Did not expect null descriptions"); Assert.AreEqual(1, descriptions.Count(), "Expected exactly one domain service description"); }
public void T4CodeGenTest_VBCodeGenTest() { Type[] domainServiceTypes = new Type[] {}; ClientCodeGenerationOptions options = new ClientCodeGenerationOptions() { Language = "VB", ClientProjectPath = "MockProject.proj", ClientRootNamespace = "TestRootNS", UseFullTypeNames = false }; ConsoleLogger consoleLogger = new ConsoleLogger(); MockSharedCodeService mockSharedCodeService = new MockSharedCodeService(new Type[0], new MethodBase[0], new string[0]); MockCodeGenerationHost host = TestHelper.CreateMockCodeGenerationHost(consoleLogger, mockSharedCodeService); ClientCodeGenerator generator = (ClientCodeGenerator)new VBTestClientCodeGenerator(); DomainServiceCatalog domainServiceCatalog = new DomainServiceCatalog(domainServiceTypes, consoleLogger); string generatedCode = generator.GenerateCode(host, domainServiceCatalog.DomainServiceDescriptions, options); Assert.IsTrue(string.IsNullOrEmpty(generatedCode)); Assert.IsTrue(string.IsNullOrEmpty(consoleLogger.Errors)); }
/// <summary> /// Validates code gen for a specific language by comparing it against a file containing the expected output. /// </summary> /// <param name="codeGenOptions">The options specifying the type of validation to perform</param> /// <returns>A command that updates the comparison file</returns> internal static string ValidateLanguageCodeGen(CodeGenValidationOptions codeGenOptions) { Assert.IsFalse(string.IsNullOrEmpty(codeGenOptions.Language)); string outDataDir = TestHelper.GetOutputTestDataDir(codeGenOptions.RelativeDeployDir); string extension = TestHelper.ExtensionFromLanguage(codeGenOptions.Language); string diffMessage = string.Empty; // Compose the abs path to where the test file got deployed by MSTest string referenceFileName = TestHelper.GetTestFileName(codeGenOptions.RelativeDeployDir, codeGenOptions.BaseReferenceFileName + extension); Assert.IsTrue(File.Exists(referenceFileName), "Cannot find reference file " + referenceFileName); string generatedCode = string.Empty; ClientCodeGenerationOptions options = new ClientCodeGenerationOptions() { Language = codeGenOptions.Language, ClientRootNamespace = codeGenOptions.RootNamespace, ClientProjectPath = "MockProject.proj", IsApplicationContextGenerationEnabled = codeGenOptions.GenerateApplicationContexts, UseFullTypeNames = codeGenOptions.UseFullTypeNames, ClientProjectTargetPlatform = TargetPlatform.Silverlight }; MockCodeGenerationHost host = TestHelper.CreateMockCodeGenerationHost(codeGenOptions.Logger, codeGenOptions.SharedCodeService); ILogger logger = host as ILogger; DomainServiceCatalog catalog = new DomainServiceCatalog(codeGenOptions.DomainServiceTypes, logger); IDomainServiceClientCodeGenerator generator; using (ClientCodeGenerationDispatcher dispatcher = new ClientCodeGenerationDispatcher()) { generator = dispatcher.FindCodeGenerator(host, options, /*compositionAssemblies*/ null, /*codeGeneratorName*/ null); } Assert.IsNotNull(generator, "Failed to find a code generator"); generatedCode = generator.GenerateCode(host, catalog.DomainServiceDescriptions, options); ConsoleLogger consoleLogger = logger as ConsoleLogger; string errors = consoleLogger == null ? "" : consoleLogger.Errors; Assert.IsTrue(generatedCode.Length > 0, "No code was generated: " + errors); // Dump the generated code into a file for comparison bool isCSharp = options.Language.Equals("C#", StringComparison.InvariantCultureIgnoreCase); string generatedFileName = Path.Combine(outDataDir, Path.GetFileName(referenceFileName) + ".testgen"); File.WriteAllText(generatedFileName, generatedCode); // TODO: (ron M3) Solve inability to get right MSBuild after checkin // First see if we compile List <string> referenceAssemblies = CompilerHelper.GetSilverlightClientAssemblies(codeGenOptions.RelativeDeployDir); List <string> files = new List <string>(); files.Add(generatedFileName); // Unconditionally force generation of Xml doc comments to catch errors string documentationFile = Path.GetTempFileName(); try { if (isCSharp) { files.AddRange(codeGenOptions.SharedFiles.Where(sharedFile => Path.GetExtension(sharedFile).Equals(".cs"))); CompilerHelper.CompileCSharpSourceFromFiles(files, referenceAssemblies, documentationFile); } else { files.AddRange(codeGenOptions.SharedFiles.Where(sharedFile => Path.GetExtension(sharedFile).Equals(".vb"))); CompilerHelper.CompileVisualBasicSourceFromFiles(files, referenceAssemblies, options.ClientRootNamespace, documentationFile); } } finally { File.Delete(documentationFile); } // Do the diff if (codeGenOptions.FailOnDiff) { TestHelper.ValidateFilesEqual(codeGenOptions.RelativeTestDir, codeGenOptions.RelativeDeployDir, generatedFileName, referenceFileName, codeGenOptions.Language); } else { TestHelper.FilesMatch(codeGenOptions.RelativeTestDir, codeGenOptions.RelativeDeployDir, generatedFileName, referenceFileName, codeGenOptions.Language, out diffMessage); } return(diffMessage); }
public void DomainServiceCatalog_Finds_All_DomainServices() { ConsoleLogger logger = new ConsoleLogger(); List<string> assemblies = new List<string>(); // Add our current unit test assembly to those to load assemblies.Add(this.GetType().Assembly.Location); int expectedDomainServices = 0; foreach (Type t in this.GetType().Assembly.GetExportedTypes()) { if (IsDomainService(t)) { ++expectedDomainServices; } } // Add all our assy references and also count any DomainServices there (don't expect any) foreach (AssemblyName an in this.GetType().Assembly.GetReferencedAssemblies()) { Assembly a = Assembly.Load(an); assemblies.Add(a.Location); foreach (Type t in a.GetExportedTypes()) { if (IsDomainService(t)) { ++expectedDomainServices; } } } DomainServiceCatalog dsc = new DomainServiceCatalog(assemblies, logger); ICollection<DomainServiceDescription> descriptions = dsc.DomainServiceDescriptions; Assert.IsNotNull(descriptions); Assert.IsTrue(descriptions.Count >= expectedDomainServices); }
public void DomainServiceCatalog_Message_BadImageFormat() { // Create fake DLL with bad image string assemblyFileName = Path.Combine(Path.GetTempPath(), (Guid.NewGuid().ToString() + ".dll")); File.WriteAllText(assemblyFileName, "neener neener neener"); ConsoleLogger logger = new ConsoleLogger(); DomainServiceCatalog dsc = new DomainServiceCatalog(new string[] { assemblyFileName }, logger); ICollection<DomainServiceDescription> descriptions = dsc.DomainServiceDescriptions; Assert.IsNotNull(descriptions); Assert.AreEqual(0, descriptions.Count); Assert.AreEqual(0, logger.ErrorMessages.Count); Assert.AreEqual(0, logger.WarningMessages.Count); // Need to synthesize exactly the same message we'd expect from failed assembly load string exceptionMessage = null; try { AssemblyName.GetAssemblyName(assemblyFileName); } catch (BadImageFormatException bife) { exceptionMessage = bife.Message; } finally { File.Delete(assemblyFileName); } string expectedMessage = string.Format(CultureInfo.CurrentCulture, Resource.ClientCodeGen_Assembly_Load_Error, assemblyFileName, exceptionMessage); TestHelper.AssertContainsMessages(logger, expectedMessage); }
public void DomainServiceCatalog_Message_FileNotFound_Continues() { string assemblyFileName = @"c:\Nowhere\DontExist.dll"; ConsoleLogger logger = new ConsoleLogger(); IEnumerable<string> assemblies = new string[] { assemblyFileName, this.GetType().Assembly.Location }; DomainServiceCatalog dsc = new DomainServiceCatalog(assemblies, logger); ICollection<DomainServiceDescription> descriptions = dsc.DomainServiceDescriptions; Assert.IsNotNull(descriptions); // Need to synthesize exactly the same message we'd expect from failed assembly load string exceptionMessage = null; try { AssemblyName.GetAssemblyName(assemblyFileName); } catch (FileNotFoundException fnfe) { exceptionMessage = fnfe.Message; } string expectedMessage = string.Format(CultureInfo.CurrentCulture, Resource.ClientCodeGen_Assembly_Load_Error, assemblyFileName, exceptionMessage); TestHelper.AssertContainsMessages(logger, expectedMessage); Assert.IsTrue(descriptions.Count > 0); }
private string GenerateCode() { ClientCodeGenerationOptions options = new ClientCodeGenerationOptions() { Language = this._isCSharp ? "C#" : "VisualBasic", ClientProjectPath = "MockProject.proj", ClientRootNamespace = "TestRootNS", UseFullTypeNames = this._useFullTypeNames }; MockCodeGenerationHost host = TestHelper.CreateMockCodeGenerationHost(this.ConsoleLogger, this.MockSharedCodeService); ClientCodeGenerator generator = (ClientCodeGenerator)new CSharpClientCodeGenerator(); this._domainServiceCatalog = new DomainServiceCatalog(this._domainServiceTypes, this.ConsoleLogger); string generatedCode = generator.GenerateCode(host, this._domainServiceCatalog.DomainServiceDescriptions, options); return generatedCode; }