suite 'Splices', ->

  test "basic splicing", ->
    ary = [0..9]
    ary[5..9] = [0, 0, 0]
    arrayEq [0, 1, 2, 3, 4, 0, 0, 0], ary

    ary = [0..9]
    ary[2...8] = []
    arrayEq [0, 1, 8, 9], ary

  test "unbounded splicing", ->
    ary = [0..9]
    ary[3..] = [9, 8, 7]
    arrayEq [0, 1, 2, 9, 8, 7]. ary

    ary[...3] = [7, 8, 9]
    arrayEq [7, 8, 9, 9, 8, 7], ary

    ary[..] = [1, 2, 3]
    arrayEq [1, 2, 3], ary

  test "splicing with variables as endpoints", ->
    [a, b] = [1, 8]

    ary = [0..9]
    ary[a..b] = [2, 3]
    arrayEq [0, 2, 3, 9], ary

    ary = [0..9]
    ary[a...b] = [5]
    arrayEq [0, 5, 8, 9], ary

  test "splicing with expressions as endpoints", ->
    [a, b] = [1, 3]

    ary = [0..9]
    ary[ a+1 .. 2*b+1 ] = [4]
    arrayEq [0, 1, 4, 8, 9], ary

    ary = [0..9]
    ary[a+1...2*b+1] = [4]
    arrayEq [0, 1, 4, 7, 8, 9], ary

  test "splicing to the end, against a one-time function", ->
    ary = null
    fn = ->
      if ary
        throw 'err'
      else
        ary = [1, 2, 3]

    fn()[0..] = 1

    arrayEq ary, [1]

  test "the return value of a splice literal should be the RHS", ->
    ary = [0, 0, 0]
    eq (ary[0..1] = 2), 2

    ary = [0, 0, 0]
    eq (ary[0..] = 3), 3

    arrayEq [ary[0..0] = 0], [0]

  test "#1723: operator precedence in unbounded splice compilation", ->
    n = 4 # some truthy number in `list`

    list = [0..9]
    list[..n] = n
    arrayEq [n..9], list

    list = [0..9]
    list[..n or 0] = n
    arrayEq [n..9], list

    list = [0..9]
    list[..if n then n else 0] = n
    arrayEq [n..9], list
