UNPKG

sku-pg

Version:

Skulpt is a Javascript implementation of Python 2.x. Python that runs in your browser!

328 lines (278 loc) 13.3 kB
<!DOCTYPE html> <html> <!-- Copyright 2009 The Closure Library Authors. All Rights Reserved. Use of this source code is governed by the Apache License, Version 2.0. See the COPYING file for details. --> <!-- --> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Closure Unit Tests - goog.testing.stacktrace</title> <script src="../base.js"></script> <script> goog.require('goog.string'); goog.require('goog.testing.ExpectedFailures'); goog.require('goog.testing.PropertyReplacer'); goog.require('goog.testing.StrictMock'); goog.require('goog.testing.asserts'); goog.require('goog.testing.jsunit'); goog.require('goog.testing.stacktrace'); goog.require('goog.userAgent'); </script> </head> <body> <script> var stubs = new goog.testing.PropertyReplacer(); var expectedFailures = new goog.testing.ExpectedFailures(); function setUp() { stubs.set(goog.testing.stacktrace, 'isClosureInspectorActive_', function() { return false; }); } function tearDown() { stubs.reset(); expectedFailures.handleTearDown(); } function testParseStackFrameInChrome() { var frameString = ' at Error (unknown source)'; var frame = goog.testing.stacktrace.parseStackFrame_(frameString); var expected = new goog.testing.stacktrace.Frame('', 'Error', '', '', ''); assertObjectEquals('exception name only', expected, frame); frameString = ' at Object.assert (file:///.../asserts.js:29:10)'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame('Object', 'assert', '', '', 'file:///.../asserts.js:29:10'); assertObjectEquals('context object + function name + url', expected, frame); frameString = ' at http://www.example.com/jsunit.js:117:13'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame('', '', '', '', 'http://www.example.com/jsunit.js:117:13'); assertObjectEquals('url only', expected, frame); frameString = ' at [object Object].exec [as execute] (file:///foo)'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame('[object Object]', 'exec', 'execute', '', 'file:///foo'); assertObjectEquals('function alias', expected, frame); frameString = ' at new Class (file:///foo)'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame('', 'new Class', '', '', 'file:///foo'); assertObjectEquals('constructor call', expected, frame); frameString = ' at new <anonymous> (file:///foo)'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame('', 'new <anonymous>', '', '', 'file:///foo'); assertObjectEquals('anonymous constructor call', expected, frame); frameString = ' at Array.forEach (native)'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame('Array', 'forEach', '', '', ''); assertObjectEquals('native function call', expected, frame); frameString = ' at foo (eval at file://bar)'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame('', 'foo', '', '', 'file://bar'); assertObjectEquals('eval', expected, frame); } function testParseStackFrameInOpera() { var frameString = '@'; var frame = goog.testing.stacktrace.parseStackFrame_(frameString); var expected = new goog.testing.stacktrace.Frame('', '', '', '', ''); assertObjectEquals('empty frame', expected, frame); frameString = '@javascript:console.log(Error().stack):1'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame('', '', '', '', 'javascript:console.log(Error().stack):1'); assertObjectEquals('javascript path only', expected, frame); frameString = '@file:///foo:42'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame('', '', '', '', 'file:///foo:42'); assertObjectEquals('path only', expected, frame); // (function go() { throw Error() })() // var c = go; c() frameString = 'go([arguments not available])@'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame('', 'go', '', '([arguments not available])', ''); assertObjectEquals('name and empty path', expected, frame); frameString = 'go([arguments not available])@file:///foo:42'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame('', 'go', '', '([arguments not available])', 'file:///foo:42'); assertObjectEquals('name and path', expected, frame); // (function() { throw Error() })() frameString = '<anonymous function>([arguments not available])@file:///foo:42'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame('', '', '', '([arguments not available])', 'file:///foo:42'); assertObjectEquals('anonymous function', expected, frame); // var b = {foo: function() { throw Error() }} frameString = '<anonymous function: foo>()@file:///foo:42'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame( '', 'foo', '', '()', 'file:///foo:42'); assertObjectEquals('object literal function', expected, frame); // var c = {}; c.foo = function() { throw Error() } frameString = '<anonymous function: c.foo>()@file:///foo:42'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame( 'c', 'foo', '', '()', 'file:///foo:42'); assertObjectEquals('named object literal function', expected, frame); frameString = '<anonymous function: Foo.prototype.bar>()@'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame( 'Foo.prototype', 'bar', '', '()', ''); assertObjectEquals('prototype function', expected, frame); frameString = '<anonymous function: goog.Foo.prototype.bar>()@'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame( 'goog.Foo.prototype', 'bar', '', '()', ''); assertObjectEquals('namespaced prototype function', expected, frame); } // All test strings are parsed with the conventional and long // frame algorithms. function testParseStackFrameInFirefox() { var frameString = 'Error("Assertion failed")@:0'; var frame = goog.testing.stacktrace.parseStackFrame_(frameString); var expected = new goog.testing.stacktrace.Frame('', 'Error', '', '("Assertion failed")', ''); assertObjectEquals('function name + arguments', expected, frame); frame = goog.testing.stacktrace.parseLongFirefoxFrame_(frameString); assertObjectEquals('function name + arguments', expected, frame); frameString = '()@file:///foo:42'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame('', '', '', '()', 'file:///foo:42'); assertObjectEquals('anonymous function', expected, frame); frame = goog.testing.stacktrace.parseLongFirefoxFrame_(frameString); assertObjectEquals('anonymous function', expected, frame); frameString = '@javascript:alert(0)'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame('', '', '', '', 'javascript:alert(0)'); assertObjectEquals('anonymous function', expected, frame); frame = goog.testing.stacktrace.parseLongFirefoxFrame_(frameString); assertObjectEquals('anonymous function', expected, frame); } function testCanonicalizeFrame() { var frame = new goog.testing.stacktrace.Frame('<window>', 'foo', 'bar', '("<a>\'&amp;")', 'http://x?a=1&b=2:1'); assertEquals('canonical stack frame, everything is escaped', '&lt;window&gt;.foo(&quot;&lt;a&gt;\'&amp;amp;&quot;) ' + '[as bar] at http://x?a=1&amp;b=2:1', frame.toCanonicalString()); } function testCanonicalizeFrameWithClosureInspector() { stubs.set(goog.testing.stacktrace, 'isClosureInspectorActive_', function() { return true; }); var frame = new goog.testing.stacktrace.Frame('', 'foo', '', '()', 'http://x?a=1&b=2:1'); assertEquals('canonical stack frame with closure inspector link', 'foo() at <a href="" onclick="CLOSURE_INSPECTOR___.showLine(' + '\'http://x?a=1&amp;b=2:1\', \'1\'); return false">' + 'http://x?a=1&amp;b=2:1<' + '/a>', frame.toCanonicalString()); } function testDeobfuscateFunctionName() { goog.testing.stacktrace.setDeobfuscateFunctionName(function(name) { return name.replace(/\$/g, '.'); }); var frame = new goog.testing.stacktrace.Frame('', 'a$b$c', 'd$e', '', ''); assertEquals('deobfuscated function name', 'a.b.c [as d.e]', frame.toCanonicalString()); } function testFramesToString() { var normalFrame = new goog.testing.stacktrace.Frame('', 'foo', '', '', ''); var anonFrame = new goog.testing.stacktrace.Frame('', '', '', '', ''); var frames = [normalFrame, anonFrame, null, anonFrame]; var stack = goog.testing.stacktrace.framesToString_(frames); assertEquals('framesToString', '> foo\n> anonymous\n> (unknown)\n', stack); } function testFollowCallChain() { var func = function(var_args) { return goog.testing.stacktrace.followCallChain_(); }; // Created a fake type with a toString method. function LocalType() {}; LocalType.prototype.toString = function() { return 'sg'; }; // Create a mock with no expectations. var mock = new goog.testing.StrictMock(LocalType); mock.$replay(); var frames = func(undefined, null, false, 0, '', {}, goog.nullFunction, mock, new LocalType); // Opera before version 10 doesn't support the caller attribute. In that // browser followCallChain_() returns empty stack trace. expectedFailures.expectFailureFor(goog.userAgent.OPERA && !goog.userAgent.isVersionOrHigher('10')); try { assertTrue('The stack trace consists of >=2 frames', frames.length >= 2); } catch (e) { expectedFailures.handleException(e); } if (frames.length >= 2) { assertEquals('innermost function is anonymous', '', frames[0].getName()); // There are white space differences how browsers convert functions to // strings. var expected = '(undefined,null,false,0,"",[objectObject],function(){},' + 'goog.testing.Mock,sg)'; assertEquals('arguments of the innermost function (ignoring whitespaces)', expected, frames[0].args_.replace(/\s/g, '')); assertEquals('test function name', 'testFollowCallChain', frames[1].getName()); } mock.$verify(); } // Create a stack trace string with one modest record and one long record, // Verify that all frames are parsed. The length of the long arg is set // to blow Firefox 3x's stack if put through a RegExp. function testParsingLongStackTrace() { var longArg = goog.string.buildString( '(', goog.string.repeat('x', 1000000), ')'); var stackTrace = goog.string.buildString( 'shortFrame()@:0\n', 'longFrame', longArg, '@http://google.com/somescript:0\n'); var frames = goog.testing.stacktrace.parse_(stackTrace); assertEquals('number of returned frames', 2, frames.length); var expected = new goog.testing.stacktrace.Frame( '', 'shortFrame', '', '()', ''); assertObjectEquals('short frame', expected, frames[0]); expected = new goog.testing.stacktrace.Frame( '', 'longFrame', '', longArg, 'http://google.com/somescript:0'); assertObjectEquals('exception name only', expected, frames[1]); } function testParseStackFrameInIE10() { var frameString = ' at foo (http://bar:4000/bar.js:150:3)'; var frame = goog.testing.stacktrace.parseStackFrame_(frameString); var expected = new goog.testing.stacktrace.Frame('', 'foo', '', '', 'http://bar:4000/bar.js:150:3'); assertObjectEquals('name and path', expected, frame); frameString = ' at Anonymous function (http://bar:4000/bar.js:150:3)'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame('', 'Anonymous function', '', '', 'http://bar:4000/bar.js:150:3'); assertObjectEquals('Anonymous function', expected, frame); frameString = ' at Global code (http://bar:4000/bar.js:150:3)'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame('', 'Global code', '', '', 'http://bar:4000/bar.js:150:3'); assertObjectEquals('Global code', expected, frame); frameString = ' at foo (eval code:150:3)'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame('', 'foo', '', '', 'eval code:150:3'); assertObjectEquals('eval code', expected, frame); frameString = ' at eval code (eval code:150:3)'; frame = goog.testing.stacktrace.parseStackFrame_(frameString); expected = new goog.testing.stacktrace.Frame('', 'eval code', '', '', 'eval code:150:3'); assertObjectEquals('nested eval', expected, frame); } </script> </body> </html>