static void CompileSourcesAndRun(string[] sources, string extension, CompiledResultDelegate resultDelegate) {
      TemporaryFile[] compiledAssemblyPaths = CompileSources(sources, extension);

      using (var host = new PeReader.DefaultHost()) {

        IAssembly[] loadedAssemblies = compiledAssemblyPaths.Select(pathToAssembly => {
          var assembly = host.LoadUnitFrom(pathToAssembly.Path) as IAssembly;
          Assert.IsNotNull(assembly);
          return assembly;
        }).ToArray();

        IAssembly mainAssembly = loadedAssemblies.Last();
        IAssembly[] referencedAssemblies = loadedAssemblies.Take(loadedAssemblies.Length - 1).ToArray();

        TestCompilerResults results = new TestCompilerResults(mainAssembly, referencedAssemblies, host);

        resultDelegate(results);
      }

      foreach (var tempFile in compiledAssemblyPaths) {
        tempFile.Dispose();
      }
    }
    static bool ImplementationOfMethodForClassMayBeMethods(TestCompilerResults compiledResults, string methodToImplementName,
    string lookupClassName,
    string uptoClassName,
    params string[] expectedImplementationNames) {

      IMethodDefinition methodToImplement = compiledResults.FindMethodWithName(methodToImplementName);
      Assert.IsNotNull(methodToImplement, "Couldn't find method {0}", methodToImplementName);

      ITypeDefinition lookupClass = compiledResults.FindTypeWithName(lookupClassName);
      Assert.IsNotNull(lookupClass, "Couldn't find class {0}", lookupClassName);

      ITypeDefinition uptoClass = compiledResults.FindTypeWithName(uptoClassName);
      Assert.IsNotNull(uptoClass, "Couldn't find class {0}", uptoClassName);


      IMethodDefinition[] expectedImplementations = expectedImplementationNames.Select(name => {
        IMethodDefinition expectedImplementation = compiledResults.FindMethodWithName(name);
        Assert.IsNotNull(expectedImplementation, "Couldn't find method {0}", name);
        return expectedImplementation;
      }).ToArray();


      IMethodDefinition[] actualImplementations = ((IEnumerable<IMethodDefinition>)GarbageCollectHelper.Implements(lookupClass, uptoClass, methodToImplement)).ToArray();

      if (expectedImplementations.Count() == actualImplementations.Count()) {
        foreach (IMethodDefinition expectedImplementation in expectedImplementations) {
          if (!actualImplementations.Contains(expectedImplementation)) {
            return false;
          }
        }
      }
      else {
        return false;
      }

      return true;
    }
    static bool ClassIsSubClassOfClass(TestCompilerResults compilerResults, ClassHierarchy hierarchy, String subClassName, String superClassName) {
      ITypeDefinition subClassDefinition = compilerResults.FindTypeWithName(subClassName);
      ITypeDefinition superClassDefinition = compilerResults.FindTypeWithName(superClassName);

      return hierarchy.AllSubClassesOfClass(superClassDefinition).Contains(subClassDefinition);
    }
    static bool ImplementationOfMethodForClassIsMethod(TestCompilerResults compiledResults, string methodToImplementName,
        string lookupClassName,
        string uptoClassName,
        string expectedImplementationName) {

      return ImplementationOfMethodForClassMayBeMethods(compiledResults, methodToImplementName, lookupClassName, uptoClassName, expectedImplementationName);
    }
    static bool ClassDirectlySubclassesClass(TestCompilerResults compilerResults, ClassHierarchy hierarchy, String subClassName, String superClassName) {
      ITypeDefinition subClassDefinition = compilerResults.FindTypeWithName(subClassName);
      Assert.AreNotEqual(null, subClassDefinition, "Couldn't find definition for {0}", subClassName);

      ITypeDefinition superClassDefinition = compilerResults.FindTypeWithName(superClassName);
      Assert.AreNotEqual(null, superClassDefinition, "Couldn't find definition for {0}", superClassName);

      return hierarchy.DirectSubClassesOfClass(superClassDefinition).Contains(subClassDefinition);
    }