func = (first, second, rest...) ->
  rest.join ' '

result = func 1, 2, 3, 4, 5

ok result is "3 4 5"


gold = silver = bronze = theField = last = null

medalists = (first, second, third, rest..., unlucky) ->
  gold     = first
  silver   = second
  bronze   = third
  theField = rest.concat([last])
  last     = unlucky

contenders = [
  "Michael Phelps"
  "Liu Xiang"
  "Yao Ming"
  "Allyson Felix"
  "Shawn Johnson"
  "Roman Sebrle"
  "Guo Jingjing"
  "Tyson Gay"
  "Asafa Powell"
  "Usain Bolt"
]

medalists "Mighty Mouse", contenders...

ok gold is "Mighty Mouse"
ok silver is "Michael Phelps"
ok bronze is "Liu Xiang"
ok last is "Usain Bolt"
ok theField.length is 8

contenders.reverse()
medalists contenders.slice(0, 2)..., "Mighty Mouse", contenders.slice(2)...

ok gold is "Usain Bolt"
ok silver is "Asafa Powell"
ok bronze is "Mighty Mouse"
ok last is "Michael Phelps"
ok theField.length is 8

medalists contenders..., 'Tim', 'Moe', 'Jim'
ok last is 'Jim'


obj =
  name: 'moe'
  accessor: (args...) ->
    [@name].concat(args).join(' ')
  getNames: ->
    args = ['jane', 'ted']
    @accessor(args...)
  index: 0
  0: {method: -> this is obj[0]}

ok obj.getNames() is 'moe jane ted'
ok obj[obj.index++].method([]...), 'should cache base value'

crowd = [
  contenders...
  "Mighty Mouse"
]

bests = [
  "Mighty Mouse"
  contenders.slice(0, 4)...
]

ok crowd[0] is contenders[0]
ok crowd[10] is "Mighty Mouse"

ok bests[1] is contenders[0]
ok bests[4] is contenders[3]


# Finally, splats with super() within classes.

class Parent
  meth: (args...) ->
    args

class Child extends Parent
  meth: ->
    nums = [3, 2, 1]
    super nums...

ok (new Child).meth().join(' ') is '3 2 1'


# Functions with splats being called with too few arguments.
pen = null
method = (first, variable..., penultimate, ultimate) ->
  pen = penultimate

method 1, 2, 3, 4, 5, 6, 7, 8, 9
ok pen is 8

method 1, 2, 3
ok pen is 2

method 1, 2
ok pen is 2


# Array splat expansions with assigns.
nums = [1, 2, 3]
list = [a = 0, nums..., b = 4]
ok a is 0
ok b is 4
ok list.join(' ') is '0 1 2 3 4'


# Splat on a line by itself is invalid.
failed = true
try
  CoffeeScript.compile "x 'a'\n...\n"
  failed = false
catch err
ok failed
