2010-12-29 14:06:57 -05:00
|
|
|
# Scope
|
|
|
|
# -----
|
|
|
|
|
|
|
|
# * Variable Safety
|
|
|
|
# * Variable Shadowing
|
|
|
|
# * Auto-closure (`do`)
|
|
|
|
# * Global Scope Leaks
|
|
|
|
|
|
|
|
test "reference `arguments` inside of functions", ->
|
|
|
|
sumOfArgs = ->
|
|
|
|
sum = (a,b) -> a + b
|
|
|
|
sum = 0
|
|
|
|
sum += num for num in arguments
|
|
|
|
sum
|
|
|
|
eq 10, sumOfArgs(0, 1, 2, 3, 4)
|
|
|
|
|
|
|
|
test "assignment to an Object.prototype-named variable should not leak to outer scope", ->
|
|
|
|
# FIXME: fails on IE
|
|
|
|
(->
|
|
|
|
constructor = 'word'
|
|
|
|
)()
|
|
|
|
ok constructor isnt 'word'
|
2011-05-07 19:55:27 -04:00
|
|
|
|
2011-08-01 17:28:52 -04:00
|
|
|
test "siblings of splat parameters shouldn't leak to surrounding scope", ->
|
2011-05-07 19:55:27 -04:00
|
|
|
x = 10
|
2011-08-01 17:28:52 -04:00
|
|
|
oops = (x, args...) ->
|
|
|
|
oops(20, 1, 2, 3)
|
2011-05-07 19:55:27 -04:00
|
|
|
eq x, 10
|
2011-06-25 10:34:52 -04:00
|
|
|
|
|
|
|
test "catch statements should introduce their argument to scope", ->
|
|
|
|
try throw ''
|
|
|
|
catch e
|
|
|
|
do -> e = 5
|
|
|
|
eq 5, e
|
2012-01-10 17:00:06 -05:00
|
|
|
|
|
|
|
class Array then slice: fail # needs to be global
|
|
|
|
class Object then hasOwnProperty: fail
|
|
|
|
test "#1973: redefining Array/Object constructors shouldn't confuse __X helpers", ->
|
|
|
|
arr = [1..4]
|
|
|
|
arrayEq [3, 4], arr[2..]
|
|
|
|
obj = {arr}
|
|
|
|
for own k of obj
|
|
|
|
eq arr, obj[k]
|
2012-04-12 23:46:28 -04:00
|
|
|
|
|
|
|
test "#2255: global leak with splatted @-params", ->
|
|
|
|
ok not x?
|
|
|
|
arrayEq [0], ((@x...) -> @x).call {}, 0
|
|
|
|
ok not x?
|
2012-04-24 17:23:37 -04:00
|
|
|
|
2012-04-11 18:22:52 -04:00
|
|
|
test "#1183: super + fat arrows", ->
|
2012-04-11 18:05:33 -04:00
|
|
|
dolater = (cb) -> cb()
|
|
|
|
|
|
|
|
class A
|
|
|
|
constructor: ->
|
|
|
|
@_i = 0
|
|
|
|
foo : (cb) ->
|
|
|
|
dolater =>
|
|
|
|
@_i += 1
|
|
|
|
cb()
|
|
|
|
|
|
|
|
class B extends A
|
|
|
|
constructor : ->
|
|
|
|
super
|
|
|
|
foo : (cb) ->
|
|
|
|
dolater =>
|
|
|
|
dolater =>
|
|
|
|
@_i += 2
|
|
|
|
super cb
|
|
|
|
|
2012-05-15 12:30:51 -04:00
|
|
|
b = new B
|
2012-04-11 18:05:33 -04:00
|
|
|
b.foo => eq b._i, 3
|
2012-04-11 18:22:52 -04:00
|
|
|
|
|
|
|
test "#1183: super + wrap", ->
|
|
|
|
class A
|
|
|
|
m : -> 10
|
2012-05-15 12:30:51 -04:00
|
|
|
|
2012-04-11 18:22:52 -04:00
|
|
|
class B extends A
|
|
|
|
constructor : -> super
|
2012-05-15 12:30:51 -04:00
|
|
|
|
2012-04-11 18:22:52 -04:00
|
|
|
B::m = -> r = try super()
|
2012-05-15 12:30:51 -04:00
|
|
|
|
|
|
|
eq (new B).m(), 10
|
2012-04-24 21:48:18 -04:00
|
|
|
|
|
|
|
test "#1183: super + closures", ->
|
|
|
|
class A
|
|
|
|
constructor: ->
|
|
|
|
@i = 10
|
|
|
|
foo : -> @i
|
2012-05-15 12:30:51 -04:00
|
|
|
|
2012-04-24 21:48:18 -04:00
|
|
|
class B extends A
|
|
|
|
foo : ->
|
|
|
|
ret = switch 1
|
|
|
|
when 0 then 0
|
|
|
|
when 1 then super()
|
|
|
|
ret
|
2012-05-15 12:30:51 -04:00
|
|
|
eq (new B).foo(), 10
|
2012-04-24 21:48:18 -04:00
|
|
|
|
2012-05-15 12:30:51 -04:00
|
|
|
test "#2331: bound super regression", ->
|
|
|
|
class A
|
|
|
|
@value = 'A'
|
|
|
|
method: -> @constructor.value
|
|
|
|
|
|
|
|
class B extends A
|
|
|
|
method: => super
|
2012-04-11 18:22:52 -04:00
|
|
|
|
2013-11-26 00:40:09 -05:00
|
|
|
eq (new B).method(), 'A'
|
|
|
|
|
|
|
|
test "#3259: leak with @-params within destructured parameters", ->
|
|
|
|
fn = ({@foo}, [@bar], [{@baz}]) ->
|
|
|
|
foo = bar = baz = false
|
|
|
|
|
|
|
|
fn.call {}, {foo: 'foo'}, ['bar'], [{baz: 'baz'}]
|
|
|
|
|
|
|
|
eq 'undefined', typeof foo
|
|
|
|
eq 'undefined', typeof bar
|
|
|
|
eq 'undefined', typeof baz
|