Beispiel #1
0
        public void OutputEffectsIsSync()
        {
            //
            // This test sets codegen to generate its output to some temporary
            // files, and then diffs the temporary files with what's checked in.
            //
            // This allows us to detect if the output files were manually
            // edited, or someone changed codegen without re-running it.
            //
            // The tests are executed from a deployed directory that contains
            // the test executable / dependent assemblies and the
            // DeploymentItems listed above.  The codegen outputs under this
            // directory as well.  The test runner cleans up the entire deploy
            // directory on exit.
            //
            string inputDir    = "codegen/effects/in";
            string expectedDir = "codegen/effects/expected";
            string actualDir   = "codegen/effects/actual";

            // Create directory for actual output
            Directory.CreateDirectory(actualDir);

            // Run codegen
            CodeGen.Program.ProcessedInputFiles input = CodeGen.Program.ProcessInputFiles(inputDir);
            CodeGen.Program.GenerateEffectsCode(inputDir, input.TypeDictionary, actualDir);

            // Verify the output from the codegen matches what was expected
            var expectedDirectoryInfo = new DirectoryInfo(expectedDir);
            var actualDirectoryInfo   = new DirectoryInfo(actualDir);

            FileInfo[] expectedGeneratedFiles = expectedDirectoryInfo.GetFiles();
            FileInfo[] actualGeneratedFiles   = actualDirectoryInfo.GetFiles();

            // Ensure the correct number of files was generated.
            const int expectedEffectCount = 37;

            Assert.AreEqual(expectedEffectCount * 3 + 1, expectedGeneratedFiles.Length);
            Assert.AreEqual(expectedGeneratedFiles.Length, actualGeneratedFiles.Length);

            // For each codegenned file in the tree, ensure it was output to the test folder.
            CheckFilesMatch(expectedGeneratedFiles, actualDir);
        }
Beispiel #2
0
        static void OutputMock(string name, string inputDir, string outputDir)
        {
            CodeGen.Program.ProcessedInputFiles processedInputFiles = CodeGen.Program.ProcessInputFiles(inputDir);

            List <CodeGen.Interface> inheritanceHierarchy = new List <CodeGen.Interface>();

            GetInheritanceHierarchy("D2D1::I" + name, processedInputFiles, inheritanceHierarchy);

            // Strip the revision number out of the mock name.
            string mockTypeName = "MockD2D" + name;

            if (mockTypeName.EndsWith("1") || mockTypeName.EndsWith("2") || mockTypeName.EndsWith("3"))
            {
                mockTypeName = mockTypeName.Remove(mockTypeName.Length - 1);
            }

            string outputFileName = mockTypeName + ".h";

            string outputPath = Path.Combine(outputDir, outputFileName);

            using (CodeGen.Formatter output = new CodeGen.Formatter(outputPath))
            {
                CodeGen.OutputDataTypes.OutputLeadingComment(output);

                output.WriteLine("#pragma once");
                output.WriteLine();

                output.WriteLine("namespace canvas");
                output.WriteLine("{");
                output.Indent();

                output.WriteLine("class " + mockTypeName + " : public RuntimeClass<");
                output.Indent();
                output.WriteLine("RuntimeClassFlags<ClassicCom>,");

                output.WriteIndent();
                if (inheritanceHierarchy.Count > 1)
                {
                    output.Write("ChainInterfaces<");
                }
                for (int i = 0; i < inheritanceHierarchy.Count; i++)
                {
                    output.Write(inheritanceHierarchy[i].NativeName);
                    if (i < inheritanceHierarchy.Count - 1)
                    {
                        output.Write(", ");
                    }
                }
                if (inheritanceHierarchy.Count > 1)
                {
                    output.Write(">");
                }
                output.Write(">");
                output.WriteLine();
                output.Unindent();
                output.WriteLine("{");
                output.WriteLine("public:");
                output.Indent();

                foreach (CodeGen.Interface classData in inheritanceHierarchy)
                {
                    OutputClassMethodMockDeclarations(output, classData, processedInputFiles.TypeDictionary);
                }
                foreach (CodeGen.Interface classData in inheritanceHierarchy)
                {
                    OutputClassMethodDefinitions(output, classData, processedInputFiles.TypeDictionary);
                }

                output.Unindent();
                output.WriteLine("};");

                output.Unindent();
                output.WriteLine("}");
            }
        }