private CompileResult RunComparisonTest( string filename, string[] stubbedAssemblies = null, TypeInfoProvider typeInfo = null, Action <string, string> errorCheckPredicate = null, List <string> failureList = null, string commonFile = null, bool shouldRunJs = true, AssemblyCache asmCache = null, Func <Configuration> makeConfiguration = null, Action <Exception> onTranslationFailure = null, JSEvaluationConfig evaluationConfig = null, string compilerOptions = "", Action <AssemblyTranslator> initializeTranslator = null, Func <string> getTestRunnerQueryString = null, bool?scanForProxies = null ) { CompileResult result = null; Console.WriteLine("// {0} ... ", Path.GetFileName(filename)); filename = Portability.NormalizeDirectorySeparators(filename); try { var testFilenames = new List <string>() { filename }; if (commonFile != null) { testFilenames.Add(commonFile); } using (var test = new ComparisonTest( EvaluatorPool, testFilenames, Path.Combine( ComparisonTest.TestSourceFolder, ComparisonTest.MapSourceFileToTestFile(filename) ), stubbedAssemblies, typeInfo, asmCache, compilerOptions: compilerOptions )) { test.GetTestRunnerQueryString = getTestRunnerQueryString ?? test.GetTestRunnerQueryString; result = test.CompileResult; if (shouldRunJs) { test.Run( makeConfiguration: makeConfiguration, evaluationConfig: evaluationConfig, onTranslationFailure: onTranslationFailure, initializeTranslator: initializeTranslator, scanForProxies: scanForProxies ); } else { string js; long elapsed; try { var csOutput = test.RunCSharp(new string[0], out elapsed); test.GenerateJavascript( new string[0], out js, out elapsed, makeConfiguration, evaluationConfig == null || evaluationConfig.ThrowOnUnimplementedExternals, onTranslationFailure, initializeTranslator ); Console.WriteLine("generated"); if (errorCheckPredicate != null) { errorCheckPredicate(csOutput, js); } } catch (Exception) { Console.WriteLine("error"); throw; } } } } catch (Exception ex) { if (ex.Message == "JS test failed") { Debug.WriteLine(ex.InnerException); } else { Debug.WriteLine(ex); } if (failureList != null) { failureList.Add(Path.GetFileNameWithoutExtension(filename)); } else { throw; } } return(result); }
private IEnumerable <Metacomment> RunComparisonTest( string filename, string[] stubbedAssemblies = null, TypeInfoProvider typeInfo = null, Action <string, Func <string> > errorCheckPredicate = null, List <string> failureList = null, string commonFile = null, bool shouldRunJs = true, AssemblyCache asmCache = null, Func <Configuration> makeConfiguration = null, Action <Exception> onTranslationFailure = null, JSEvaluationConfig evaluationConfig = null, string compilerOptions = "", Action <AssemblyTranslator> initializeTranslator = null, Func <string> getTestRunnerQueryString = null, bool?scanForProxies = null, string[] extraDependencies = null, string testFolderNameOverride = null ) { IEnumerable <Metacomment> result = null; Console.WriteLine("// {0} ... ", Path.GetFileName(filename)); filename = Portability.NormalizeDirectorySeparators(filename); try { var testFilenames = new List <string>() { filename }; if (commonFile != null) { testFilenames.Add(commonFile); } var testDirectoryName = testFolderNameOverride ?? TestContext.CurrentContext.Test.FullName.Replace( "." + TestContext.CurrentContext.Test.Name, String.Empty); var testFileDirectory = Path.Combine( ComparisonTest.TestSourceFolder, Path.GetDirectoryName(filename)); var testDirectory = Path.Combine(testFileDirectory, testDirectoryName); Directory.CreateDirectory(testDirectory); using (var test = new ComparisonTest( EvaluatorPool, testFilenames, Path.Combine( testDirectory, ComparisonTest.MapSourceFileToTestFile(Path.GetFileName(filename)) ), stubbedAssemblies, typeInfo, asmCache, compilerOptions: compilerOptions )) { test.GetTestRunnerQueryString = getTestRunnerQueryString ?? test.GetTestRunnerQueryString; result = test.Metacomments; if (extraDependencies != null) { var destDir = Path.GetDirectoryName(test.AssemblyUtility.AssemblyLocation); foreach (var dependency in extraDependencies) { File.Copy(dependency, Path.Combine(destDir, Path.GetFileName(dependency)), true); } } if (shouldRunJs) { test.Run( makeConfiguration: makeConfiguration, evaluationConfig: evaluationConfig, onTranslationFailure: onTranslationFailure, initializeTranslator: initializeTranslator, scanForProxies: scanForProxies ); } else { Func <string> getJs; long elapsed; try { var csOutput = test.RunCSharp(new string[0], out elapsed); test.GenerateJavascript( new string[0], out getJs, out elapsed, makeConfiguration, evaluationConfig == null || evaluationConfig.ThrowOnUnimplementedExternals, onTranslationFailure, initializeTranslator, shouldWritePrologue: false ); Console.WriteLine("generated"); if (errorCheckPredicate != null) { errorCheckPredicate(csOutput, getJs); } } catch (Exception) { Console.WriteLine("error"); throw; } } } } catch (Exception ex) { if (ex.Message == "JS test failed") { Debug.WriteLine(ex.InnerException); } else { Debug.WriteLine(ex); } if (failureList != null) { failureList.Add(Path.GetFileNameWithoutExtension(filename)); } else { throw; } } return(result); }
private void RunComparisonTest( string filename, string[] stubbedAssemblies = null, TypeInfoProvider typeInfo = null, Action <string, string> errorCheckPredicate = null, List <string> failureList = null, string commonFile = null, bool shouldRunJs = true, AssemblyCache asmCache = null, Func <Configuration> makeConfiguration = null ) { Console.WriteLine("// {0} ... ", Path.GetFileName(filename)); try { var testFilenames = new List <string>() { filename }; if (commonFile != null) { testFilenames.Add(commonFile); } using (var test = new ComparisonTest( EvaluatorPool, testFilenames, Path.Combine( ComparisonTest.TestSourceFolder, ComparisonTest.MapSourceFileToTestFile(filename) ), stubbedAssemblies, typeInfo, asmCache) ) { if (shouldRunJs) { test.Run(); } else { string js; long elapsed; try { var csOutput = test.RunCSharp(new string[0], out elapsed); test.GenerateJavascript(new string[0], out js, out elapsed, makeConfiguration); Console.WriteLine("generated"); if (errorCheckPredicate != null) { errorCheckPredicate(csOutput, js); } } catch (Exception _exc) { Console.WriteLine("error"); throw; } } } } catch (Exception ex) { if (ex.Message == "JS test failed") { Debug.WriteLine(ex.InnerException); } else { Debug.WriteLine(ex); } if (failureList != null) { failureList.Add(Path.GetFileNameWithoutExtension(filename)); } else { throw; } } }
/// <summary> /// Runs one or more comparison tests by compiling the source C# or VB.net file, /// running the compiled test method, translating the compiled test method to JS, /// then running the translated JS and comparing the outputs. /// </summary> /// <param name="filenames">The path to one or more test files. If a test file is named 'Common.cs' it will be linked into all tests.</param> /// <param name="stubbedAssemblies">The paths of assemblies to stub during translation, if any.</param> /// <param name="typeInfo">A TypeInfoProvider to use for type info. Using this parameter is not advised if you use proxies or JSIL.Meta attributes in your tests.</param> /// <param name="testPredicate">A predicate to invoke before running each test. If the predicate returns false, the JS version of the test will not be run (though it will be translated).</param> protected void RunComparisonTests( string[] filenames, string[] stubbedAssemblies = null, TypeInfoProvider typeInfo = null, Func <string, bool> testPredicate = null, Action <string, string> errorCheckPredicate = null ) { var started = DateTime.UtcNow.Ticks; string commonFile = null; for (var i = 0; i < filenames.Length; i++) { if (filenames[i].Contains("\\Common.")) { commonFile = filenames[i]; break; } } const string keyName = @"Software\Squared\JSIL\Tests\PreviousFailures"; StackFrame callingTest = null; for (int i = 1; i < 10; i++) { callingTest = new StackFrame(i); var method = callingTest.GetMethod(); if ((method != null) && method.GetCustomAttributes(true).Any( (ca) => ca.GetType().FullName == "NUnit.Framework.TestAttribute" )) { break; } else { callingTest = null; } } var previousFailures = new HashSet <string>(); MethodBase callingMethod = null; if ((callingTest != null) && ((callingMethod = callingTest.GetMethod()) != null)) { try { using (var rk = Registry.CurrentUser.CreateSubKey(keyName)) { var names = rk.GetValue(callingMethod.Name) as string; if (names != null) { foreach (var name in names.Split(',')) { previousFailures.Add(name); } } } } catch (Exception ex) { Console.WriteLine("Warning: Could not open registry key: {0}", ex); } } var failureList = new List <string>(); var sortedFilenames = new List <string>(filenames); sortedFilenames.Sort( (lhs, rhs) => { var lhsShort = Path.GetFileNameWithoutExtension(lhs); var rhsShort = Path.GetFileNameWithoutExtension(rhs); int result = (previousFailures.Contains(lhsShort) ? 0 : 1).CompareTo( previousFailures.Contains(rhsShort) ? 0 : 1 ); if (result == 0) { result = lhsShort.CompareTo(rhsShort); } return(result); } ); var asmCache = new AssemblyCache(); foreach (var filename in sortedFilenames) { if (filename == commonFile) { continue; } bool shouldRunJs = true; if (testPredicate != null) { shouldRunJs = testPredicate(filename); } Console.WriteLine("// {0} ... ", Path.GetFileName(filename)); try { var testFilenames = new List <string>() { filename }; if (commonFile != null) { testFilenames.Add(commonFile); } using (var test = new ComparisonTest( EvaluatorPool, testFilenames, Path.Combine( ComparisonTest.TestSourceFolder, ComparisonTest.MapSourceFileToTestFile(filename) ), stubbedAssemblies, typeInfo, asmCache) ) { if (shouldRunJs) { test.Run(); } else { string js; long elapsed; try { var csOutput = test.RunCSharp(new string[0], out elapsed); test.GenerateJavascript(new string[0], out js, out elapsed); Console.WriteLine("ok"); if (errorCheckPredicate != null) { errorCheckPredicate(csOutput, js); } } catch (Exception _exc) { Console.WriteLine("error"); throw; } } } } catch (Exception ex) { failureList.Add(Path.GetFileNameWithoutExtension(filename)); if (ex.Message == "JS test failed") { Debug.WriteLine(ex.InnerException); } else { Debug.WriteLine(ex); } } } if (callingMethod != null) { try { using (var rk = Registry.CurrentUser.CreateSubKey(keyName)) rk.SetValue(callingMethod.Name, String.Join(",", failureList.ToArray())); } catch (Exception ex) { Console.WriteLine("Warning: Could not open registry key: {0}", ex); } } var ended = DateTime.UtcNow.Ticks; var elapsedTotalSeconds = TimeSpan.FromTicks(ended - started).TotalSeconds; Console.WriteLine("// Ran {0} test(s) in {1:000.00}s.", sortedFilenames.Count, elapsedTotalSeconds); Assert.AreEqual(0, failureList.Count, String.Format("{0} test(s) failed:\r\n{1}", failureList.Count, String.Join("\r\n", failureList.ToArray())) ); }