コード例 #1
0
        // 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));
        }
コード例 #2
0
        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);
        }
コード例 #3
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);
        }
コード例 #4
0
        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");
        }
コード例 #5
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);
        }
コード例 #6
0
        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));
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        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");
        }
コード例 #9
0
        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));
        }
コード例 #10
0
        /// <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);
        }
コード例 #11
0
        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);
        }
コード例 #12
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);
        }
コード例 #13
0
        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);
        }
コード例 #14
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;
        }