# Formatting # ---------- # TODO: maybe this file should be split up into their respective sections: # operators -> operators # array literals -> array literals # string literals -> string literals # function invocations -> function invocations # * Line Continuation # * Property Accesss # * Operators # * Array Literals # * Function Invocations # * String Literals doesNotThrow -> CoffeeScript.compile "a = then b" test "multiple semicolon-separated statements in parentheticals", -> nonce = {} eq nonce, (1; 2; nonce) eq nonce, (-> return (1; 2; nonce))() # Line Continuation # Property Access test "chained accesses split on period/newline, backwards and forwards", -> str = 'abc' result = str. split(''). reverse(). reverse(). reverse() arrayEq ['c','b','a'], result arrayEq ['c','b','a'], str. split(''). reverse(). reverse(). reverse() result = str .split('') .reverse() .reverse() .reverse() arrayEq ['c','b','a'], result arrayEq ['c','b','a'], str .split('') .reverse() .reverse() .reverse() arrayEq ['c','b','a'], str. split('') .reverse(). reverse() .reverse() # Operators test "newline suppression for operators", -> six = 1 + 2 + 3 eq 6, six test "`?.` and `::` should continue lines", -> ok not Date :: ?.foo #eq Object::toString, Date?. #prototype #:: #?.foo doesNotThrow -> CoffeeScript.compile """ oh. yes oh?. true oh:: return """ doesNotThrow -> CoffeeScript.compile """ a?[b..] a?[...b] a?[b..c] """ # Array Literals test "indented array literals don't trigger whitespace rewriting", -> getArgs = -> arguments result = getArgs( [[[[[], []], [[]]]], []]) eq 1, result.length # Function Invocations doesNotThrow -> CoffeeScript.compile """ obj = then fn 1, 1: 1 a: b: -> fn c, d: e f: 1 """ # String Literals test "indented heredoc", -> result = ((_) -> _)( """ abc """) eq "abc", result # Nested blocks caused by paren unwrapping test "#1492: Nested blocks don't cause double semicolons", -> js = CoffeeScript.compile '(0;0)' eq -1, js.indexOf ';;' test "#1195 Ignore trailing semicolons (before newlines or as the last char in a program)", -> preNewline = (numSemicolons) -> """ nonce = {}; nonce2 = {} f = -> nonce#{Array(numSemicolons+1).join(';')} nonce2 unless f() is nonce then throw new Error('; before linebreak should = newline') """ CoffeeScript.run(preNewline(n), bare: true) for n in [1,2,3] lastChar = '-> lastChar;' doesNotThrow -> CoffeeScript.compile lastChar, bare: true test "#1299: Disallow token misnesting", -> try CoffeeScript.compile ''' [{ ]} ''' ok no catch e eq 'unmatched ] on line 2', e.message