/* * Most of these test cases are adapted from: * http://johnjbarton.github.com/nonymous/index.html */ function assertName(fn, name) { assertEq(displayName(fn), name) } /* simple names */ var a = function b() {}; function c() {}; assertName(a, 'b'); assertName(c, 'c'); var a = function(){}, b = function(){}; assertName(a, 'a'); assertName(b, 'b'); /* nested names */ var main = function() { function Foo(a) { assertName(a, 'main/foo<') } var foo = new Foo(function() {}); }; assertName(main, 'main') main(); /* duplicated */ var Baz = Bar = function(){} assertName(Baz, 'Bar'); assertName(Bar, 'Bar'); /* returned from an immediate function */ var Foo = function (){ assertName(arguments.callee, 'Foo<') return function(){}; }(); assertName(Foo, 'Foo</<'); /* various properties and such */ var x = {fox: { bax: function(){} } }; assertName(x.fox.bax, 'x.fox.bax'); var foo = {foo: {foo: {}}}; foo.foo.foo = function(){}; assertName(foo.foo.foo, 'foo.foo.foo'); var z = { foz: function() { var baz = function() { var y = {bay: function() {}}; assertName(y.bay, 'z.foz/baz/y.bay'); }; assertName(baz, 'z.foz/baz'); baz(); } }; assertName(z.foz, 'z.foz'); z.foz(); var outer = function() { x.fox.bax.nx = function(){}; var w = {fow: { baw: function(){} } }; assertName(x.fox.bax.nx, 'outer/x.fox.bax.nx') assertName(w.fow.baw, 'outer/w.fow.baw'); }; assertName(outer, 'outer'); outer(); function Fuz(){}; Fuz.prototype = { add: function() {} } assertName(Fuz.prototype.add, 'Fuz.prototype.add'); var x = 1; x = function(){}; assertName(x, 'x'); var a = {b: {}}; a.b.c = (function() { assertName(arguments.callee, 'a.b.c<') }()); a.b = function() { function foo(f) { assertName(f, 'a.b/<'); }; return foo(function(){}); } a.b(); var bar = 'bar'; a.b[bar] = function(){}; assertName(a.b.bar, 'a.b[bar]'); a.b = function() { assertName(arguments.callee, 'a.b<'); return { a: function() {} } }(); assertName(a.b.a, 'a.b</<.a'); a = { b: function(a) { if (a) return function() {}; else return function() {}; } }; assertName(a.b, 'a.b'); assertName(a.b(true), 'a.b/<') assertName(a.b(false), 'a.b/<') function f(g) { assertName(g, 'x<'); return g(); } var x = f(function () { return function() {}; }); assertName(x, 'x</<'); var a = {'b': function(){}}; assertName(a.b, 'a.b'); function g(f) { assertName(f, ''); } label: g(function () {}); var z = [function() {}]; assertName(z[0], 'z<'); /* fuzz bug from 785089 */ odeURIL:(function(){}) a = { 1: function () {} }; assertName(a[1], 'a[1]'); a = { "embedded spaces": function(){}, "dots.look.like.property.references": function(){}, "\"\'quotes\'\"": function(){}, "!@#$%": function(){} }; assertName(a["embedded spaces"], 'a["embedded spaces"]'); assertName(a["dots.look.like.property.references"], 'a["dots.look.like.property.references"]'); assertName(a["\"\'quotes\'\""], 'a["\\\"\'quotes\'\\\""]'); assertName(a["!@#$%"], 'a["!@#$%"]'); a.b = {}; a.b.c = {}; a.b["c"]["d e"] = { f: { 1: { "g": { "h i": function() {} } } } }; assertName(a.b.c["d e"].f[1].g["h i"], 'a.b.c["d e"].f[1].g["h i"]'); this.m = function () {}; assertName(m, "this.m"); function N() { this.o = function () {} } let n = new N() assertName(n.o, "N/this.o");