|
1 /* |
|
2 * Most of these test cases are adapted from: |
|
3 * http://johnjbarton.github.com/nonymous/index.html |
|
4 */ |
|
5 |
|
6 function assertName(fn, name) { |
|
7 assertEq(displayName(fn), name) |
|
8 } |
|
9 |
|
10 /* simple names */ |
|
11 var a = function b() {}; |
|
12 function c() {}; |
|
13 assertName(a, 'b'); |
|
14 assertName(c, 'c'); |
|
15 |
|
16 var a = function(){}, |
|
17 b = function(){}; |
|
18 assertName(a, 'a'); |
|
19 assertName(b, 'b'); |
|
20 |
|
21 /* nested names */ |
|
22 var main = function() { |
|
23 function Foo(a) { assertName(a, 'main/foo<') } |
|
24 var foo = new Foo(function() {}); |
|
25 }; |
|
26 assertName(main, 'main') |
|
27 main(); |
|
28 |
|
29 /* duplicated */ |
|
30 var Baz = Bar = function(){} |
|
31 assertName(Baz, 'Bar'); |
|
32 assertName(Bar, 'Bar'); |
|
33 |
|
34 /* returned from an immediate function */ |
|
35 var Foo = function (){ |
|
36 assertName(arguments.callee, 'Foo<') |
|
37 return function(){}; |
|
38 }(); |
|
39 assertName(Foo, 'Foo</<'); |
|
40 |
|
41 /* various properties and such */ |
|
42 var x = {fox: { bax: function(){} } }; |
|
43 assertName(x.fox.bax, 'x.fox.bax'); |
|
44 var foo = {foo: {foo: {}}}; |
|
45 foo.foo.foo = function(){}; |
|
46 assertName(foo.foo.foo, 'foo.foo.foo'); |
|
47 var z = { |
|
48 foz: function() { |
|
49 var baz = function() { |
|
50 var y = {bay: function() {}}; |
|
51 assertName(y.bay, 'z.foz/baz/y.bay'); |
|
52 }; |
|
53 assertName(baz, 'z.foz/baz'); |
|
54 baz(); |
|
55 } |
|
56 }; |
|
57 assertName(z.foz, 'z.foz'); |
|
58 z.foz(); |
|
59 |
|
60 var outer = function() { |
|
61 x.fox.bax.nx = function(){}; |
|
62 var w = {fow: { baw: function(){} } }; |
|
63 assertName(x.fox.bax.nx, 'outer/x.fox.bax.nx') |
|
64 assertName(w.fow.baw, 'outer/w.fow.baw'); |
|
65 }; |
|
66 assertName(outer, 'outer'); |
|
67 outer(); |
|
68 function Fuz(){}; |
|
69 Fuz.prototype = { |
|
70 add: function() {} |
|
71 } |
|
72 assertName(Fuz.prototype.add, 'Fuz.prototype.add'); |
|
73 |
|
74 var x = 1; |
|
75 x = function(){}; |
|
76 assertName(x, 'x'); |
|
77 |
|
78 var a = {b: {}}; |
|
79 a.b.c = (function() { |
|
80 assertName(arguments.callee, 'a.b.c<') |
|
81 }()); |
|
82 |
|
83 a.b = function() { |
|
84 function foo(f) { assertName(f, 'a.b/<'); }; |
|
85 return foo(function(){}); |
|
86 } |
|
87 a.b(); |
|
88 |
|
89 var bar = 'bar'; |
|
90 a.b[bar] = function(){}; |
|
91 assertName(a.b.bar, 'a.b[bar]'); |
|
92 |
|
93 a.b = function() { |
|
94 assertName(arguments.callee, 'a.b<'); |
|
95 return { a: function() {} } |
|
96 }(); |
|
97 assertName(a.b.a, 'a.b</<.a'); |
|
98 |
|
99 a = { |
|
100 b: function(a) { |
|
101 if (a) |
|
102 return function() {}; |
|
103 else |
|
104 return function() {}; |
|
105 } |
|
106 }; |
|
107 assertName(a.b, 'a.b'); |
|
108 assertName(a.b(true), 'a.b/<') |
|
109 assertName(a.b(false), 'a.b/<') |
|
110 |
|
111 function f(g) { |
|
112 assertName(g, 'x<'); |
|
113 return g(); |
|
114 } |
|
115 var x = f(function () { return function() {}; }); |
|
116 assertName(x, 'x</<'); |
|
117 |
|
118 var a = {'b': function(){}}; |
|
119 assertName(a.b, 'a.b'); |
|
120 |
|
121 function g(f) { |
|
122 assertName(f, ''); |
|
123 } |
|
124 label: g(function () {}); |
|
125 |
|
126 var z = [function() {}]; |
|
127 assertName(z[0], 'z<'); |
|
128 |
|
129 /* fuzz bug from 785089 */ |
|
130 odeURIL:(function(){}) |
|
131 |
|
132 a = { 1: function () {} }; |
|
133 assertName(a[1], 'a[1]'); |
|
134 |
|
135 a = { |
|
136 "embedded spaces": function(){}, |
|
137 "dots.look.like.property.references": function(){}, |
|
138 "\"\'quotes\'\"": function(){}, |
|
139 "!@#$%": function(){} |
|
140 }; |
|
141 assertName(a["embedded spaces"], 'a["embedded spaces"]'); |
|
142 assertName(a["dots.look.like.property.references"], 'a["dots.look.like.property.references"]'); |
|
143 assertName(a["\"\'quotes\'\""], 'a["\\\"\'quotes\'\\\""]'); |
|
144 assertName(a["!@#$%"], 'a["!@#$%"]'); |
|
145 |
|
146 a.b = {}; |
|
147 a.b.c = {}; |
|
148 a.b["c"]["d e"] = { f: { 1: { "g": { "h i": function() {} } } } }; |
|
149 assertName(a.b.c["d e"].f[1].g["h i"], 'a.b.c["d e"].f[1].g["h i"]'); |
|
150 |
|
151 this.m = function () {}; |
|
152 assertName(m, "this.m"); |
|
153 |
|
154 function N() { |
|
155 this.o = function () {} |
|
156 } |
|
157 let n = new N() |
|
158 assertName(n.o, "N/this.o"); |