private static void RunTest(string testCase, Assemblies.AssemblyDefinition asm, IEnumerable <TypeDefinition> types, IEnumerable <IGrouping <string, string> > matchingCode)
        {
            if (testCase == "Generics")
            {
                testCase.GetHashCode();
            }

            string decompiledText = Decompile(asm, types);

            IEnumerable <string> matchingFiles =
                matchingCode.FirstOrDefault(kv => string.Equals(kv.Key, testCase, StringComparison.OrdinalIgnoreCase));

            if (matchingFiles == null ||
                matchingFiles.Count() == 0)
            {
                throw new FileNotFoundException("No source code found for " + testCase + ".");
            }

            if (matchingFiles.Count() != 1)
            {
                throw new AmbiguousMatchException("More than one source code file found for " + testCase + ".");
            }

            string originalCode = matchingFiles.Single();


            string noComments = CodeSampleFileParser.ConcatLines(
                from line in SplitLines(originalCode)
                where !CodeSampleFileParser.IsIgnorableLine(line)
                select line);

            CodeAssert.AreEqual(noComments, decompiledText);
        }
        private static string Decompile(Assemblies.AssemblyDefinition asm, IEnumerable <TypeDefinition> types)
        {
            DecompilerSettings settings = new DecompilerSettings();

            settings.FullyQualifyAmbiguousTypeNames = false;
            var ctx = new DecompilerContext(asm.MainModule)
            {
                Settings = settings
            };
            var decompiler = new AstBuilder(ctx);

            foreach (var t in types)
            {
                decompiler.AddType(t);
            }
            new Helpers.RemoveCompilerAttribute().Run(decompiler.CompilationUnit);
            var output = new StringWriter();

            decompiler.GenerateCode(new PlainTextOutput(output));
            return(output.ToString().Trim());
        }