コード例 #1
0
        public string RunJavascript(
            string[] args, out Func <string> generateJavascript, out long elapsedTranslation, out long elapsedJs, out string stderr, out string trailingOutput,
            Func <Configuration> makeConfiguration           = null,
            JSEvaluationConfig evaluationConfig              = null,
            Action <Exception> onTranslationFailure          = null,
            Action <AssemblyTranslator> initializeTranslator = null,
            bool?scanForProxies = null,
            IEnumerable <IAnalyzer> analyzers = null
            )
        {
            var tempFilename = GenerateJavascript(
                args, out generateJavascript, out elapsedTranslation,
                makeConfiguration,
                throwOnUnimplementedExternals:
                evaluationConfig == null || evaluationConfig.ThrowOnUnimplementedExternals,
                onTranslationFailure: onTranslationFailure,
                initializeTranslator: initializeTranslator,
                scanForProxies: scanForProxies,
                analyzers: analyzers
                );

            using (Evaluator = EvaluatorPool.Get()) {
                var startedJs     = DateTime.UtcNow.Ticks;
                var sentinelStart = "// Test output begins here //";
                var sentinelEnd   = "// Test output ends here //";
                var elapsedPrefix = "// elapsed: ";

                var manifest = String.Format(
                    "['Script', {0}]", Util.EscapeString(tempFilename)
                    );

                if (evaluationConfig != null && evaluationConfig.AdditionalFilesToLoad != null)
                {
                    foreach (var file in evaluationConfig.AdditionalFilesToLoad)
                    {
                        manifest += "," + Environment.NewLine + String.Format("['Script', {0}]", Util.EscapeString(file));
                    }
                }

                var dlls = Directory.GetFiles(SourceDirectory, "*.emjs");
                foreach (var dll in dlls)
                {
                    manifest += "," + Environment.NewLine +
                                String.Format("['NativeLibrary', {0}]", Util.EscapeString(Path.GetFullPath(dll)));
                }

                StartupPrologue =
                    String.Format("contentManifest['Test'] = [{0}]; ", manifest);

                StartupPrologue += String.Format("function runMain () {{ " +
                                                 "print({0}); try {{ var elapsedTime = runTestCase(Date.now); }} catch (exc) {{ reportException(exc); }} print({1}); print({2} + elapsedTime);" +
                                                 "}}; shellStartup();",
                                                 Util.EscapeString(sentinelStart),
                                                 Util.EscapeString(sentinelEnd),
                                                 Util.EscapeString(elapsedPrefix)
                                                 );

                Evaluator.WriteInput(StartupPrologue);

                Evaluator.Join();

                long endedJs = DateTime.UtcNow.Ticks;
                elapsedJs = endedJs - startedJs;

                if (Evaluator.ExitCode != 0)
                {
                    var _stdout = (Evaluator.StandardOutput ?? "").Trim();
                    var _stderr = (Evaluator.StandardError ?? "").Trim();

                    var exceptions = new List <JavaScriptException>();

                    var exceptionMatches = ExceptionRegex.Matches(_stdout);
                    foreach (Match match in exceptionMatches)
                    {
                        var    errorText = match.Groups["errorText"].Value;
                        string stackText = null;

                        if (match.Groups["stack"].Success)
                        {
                            stackText = match.Groups["stack"].Value;
                        }

                        var exception = new JavaScriptException(errorText, stackText);
                        exceptions.Add(exception);
                    }

                    throw new JavaScriptEvaluatorException(
                              Evaluator.ExitCode, _stdout, _stderr, exceptions.ToArray()
                              );
                }

                var stdout = Evaluator.StandardOutput;

                if (stdout != null)
                {
                    var m = ElapsedRegex.Match(stdout);
                    if (m.Success)
                    {
                        elapsedJs = TimeSpan.FromMilliseconds(
                            double.Parse(m.Groups["elapsed"].Value, CultureInfo.InvariantCulture)
                            ).Ticks;
                        stdout = stdout.Replace(m.Value, "");
                    }
                }

                // Strip spurious output from the JS.exe REPL and from the standard libraries
                trailingOutput = null;
                if (stdout != null)
                {
                    var startOffset = stdout.LastIndexOf(sentinelStart);

                    if (startOffset >= 0)
                    {
                        startOffset += sentinelStart.Length;

                        // End sentinel might not be there if the test case calls quit().
                        var endOffset = stdout.IndexOf(sentinelEnd, startOffset);
                        if (endOffset >= 0)
                        {
                            trailingOutput = stdout.Substring(endOffset + sentinelEnd.Length);
                            stdout         = stdout.Substring(startOffset, endOffset - startOffset);
                        }
                        else
                        {
                            stdout = stdout.Substring(startOffset);
                        }
                    }
                }

                stderr = Evaluator.StandardError;

                return(stdout ?? "");
            }
        }
コード例 #2
0
ファイル: ComparisonTest.cs プロジェクト: thompsonbill/JSIL
        public string RunJavascript(
            string[] args, out string generatedJavascript, out long elapsedTranslation, out long elapsedJs, out string stderr, out string trailingOutput,
            Func <Configuration> makeConfiguration  = null,
            Action <Exception> onTranslationFailure = null
            )
        {
            var tempFilename = GenerateJavascript(args, out generatedJavascript, out elapsedTranslation, makeConfiguration, onTranslationFailure);

            using (var evaluator = EvaluatorPool.Get()) {
                var startedJs     = DateTime.UtcNow.Ticks;
                var sentinelStart = "// Test output begins here //";
                var sentinelEnd   = "// Test output ends here //";
                var elapsedPrefix = "// elapsed: ";

                StartupPrologue = String.Format("contentManifest['Test'] = [['Script', {0}]]; " +
                                                "function runMain () {{ " +
                                                "print({1}); try {{ var elapsedTime = runTestCase(timeout, dateNow); }} catch (exc) {{ reportException(exc); }} print({2}); print({3} + elapsedTime);" +
                                                "}}; shellStartup();",
                                                Util.EscapeString(tempFilename),
                                                Util.EscapeString(sentinelStart),
                                                Util.EscapeString(sentinelEnd),
                                                Util.EscapeString(elapsedPrefix)
                                                );

                evaluator.WriteInput(StartupPrologue);

                evaluator.Join();

                long endedJs = DateTime.UtcNow.Ticks;
                elapsedJs = endedJs - startedJs;

                if (evaluator.ExitCode != 0)
                {
                    var _stdout = (evaluator.StandardOutput ?? "").Trim();
                    var _stderr = (evaluator.StandardError ?? "").Trim();

                    var exceptions = new List <JavaScriptException>();

                    var exceptionMatches = ExceptionRegex.Matches(_stdout);
                    foreach (Match match in exceptionMatches)
                    {
                        var    errorText = match.Groups["errorText"].Value;
                        string stackText = null;

                        if (match.Groups["stack"].Success)
                        {
                            stackText = match.Groups["stack"].Value;
                        }

                        var exception = new JavaScriptException(errorText, stackText);
                        exceptions.Add(exception);
                    }

                    throw new JavaScriptEvaluatorException(
                              evaluator.ExitCode, _stdout, _stderr, exceptions.ToArray()
                              );
                }

                var stdout = evaluator.StandardOutput;

                if (stdout != null)
                {
                    var m = ElapsedRegex.Match(stdout);
                    if (m.Success)
                    {
                        elapsedJs = TimeSpan.FromMilliseconds(
                            double.Parse(m.Groups["elapsed"].Value, CultureInfo.InvariantCulture)
                            ).Ticks;
                        stdout = stdout.Replace(m.Value, "");
                    }
                }

                // Strip spurious output from the JS.exe REPL and from the standard libraries
                trailingOutput = null;
                if (stdout != null)
                {
                    var startOffset = stdout.IndexOf(sentinelStart);

                    if (startOffset >= 0)
                    {
                        startOffset += sentinelStart.Length;

                        // End sentinel might not be there if the test case calls quit().
                        var endOffset = stdout.IndexOf(sentinelEnd, startOffset);
                        if (endOffset >= 0)
                        {
                            trailingOutput = stdout.Substring(endOffset + sentinelEnd.Length);
                            stdout         = stdout.Substring(startOffset, endOffset - startOffset);
                        }
                        else
                        {
                            stdout = stdout.Substring(startOffset);
                        }
                    }
                }

                stderr = evaluator.StandardError;

                return(stdout ?? "");
            }
        }