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