mirror of
https://github.com/jashkenas/coffeescript.git
synced 2026-01-13 16:57:54 -05:00
* Node comes with NPM nowadays, so there’s not really a reason to install CoffeeScript the non-NPM way * The cake documentation tasks should each have build and watch modes following the same form * Refactor the build tasks to be more foolproof, including the parser unless it’s explicitly excluded * Abstract out testing built code, to prepare for watching the build task * Cake task to cut a new release * cake build:watch, based on https://github.com/GeoffreyBooth/coffeescript-gulp * Coding style * Tests shouldn’t write files in a watched folder * Don’t crash if the REPL test history file is already gone by the time we try to delete it
115 lines
3.0 KiB
CoffeeScript
115 lines
3.0 KiB
CoffeeScript
return if global.testingBrowser
|
|
|
|
os = require 'os'
|
|
fs = require 'fs'
|
|
path = require 'path'
|
|
|
|
# REPL
|
|
# ----
|
|
Stream = require 'stream'
|
|
|
|
class MockInputStream extends Stream
|
|
constructor: ->
|
|
@readable = true
|
|
|
|
resume: ->
|
|
|
|
emitLine: (val) ->
|
|
@emit 'data', new Buffer("#{val}\n")
|
|
|
|
class MockOutputStream extends Stream
|
|
constructor: ->
|
|
@writable = true
|
|
@written = []
|
|
|
|
write: (data) ->
|
|
#console.log 'output write', arguments
|
|
@written.push data
|
|
|
|
lastWrite: (fromEnd = -1) ->
|
|
@written[@written.length - 1 + fromEnd].replace /\r?\n$/, ''
|
|
|
|
# Create a dummy history file
|
|
historyFile = path.join os.tmpdir(), '.coffee_history_test'
|
|
fs.writeFileSync historyFile, '1 + 2\n'
|
|
|
|
testRepl = (desc, fn) ->
|
|
input = new MockInputStream
|
|
output = new MockOutputStream
|
|
repl = Repl.start {input, output, historyFile}
|
|
test desc, -> fn input, output, repl
|
|
|
|
ctrlV = { ctrl: true, name: 'v'}
|
|
|
|
|
|
testRepl 'reads history file', (input, output, repl) ->
|
|
input.emitLine repl.rli.history[0]
|
|
eq '3', output.lastWrite()
|
|
|
|
testRepl "starts with coffee prompt", (input, output) ->
|
|
eq 'coffee> ', output.lastWrite(0)
|
|
|
|
testRepl "writes eval to output", (input, output) ->
|
|
input.emitLine '1+1'
|
|
eq '2', output.lastWrite()
|
|
|
|
testRepl "comments are ignored", (input, output) ->
|
|
input.emitLine '1 + 1 #foo'
|
|
eq '2', output.lastWrite()
|
|
|
|
testRepl "output in inspect mode", (input, output) ->
|
|
input.emitLine '"1 + 1\\n"'
|
|
eq "'1 + 1\\n'", output.lastWrite()
|
|
|
|
testRepl "variables are saved", (input, output) ->
|
|
input.emitLine "foo = 'foo'"
|
|
input.emitLine 'foobar = "#{foo}bar"'
|
|
eq "'foobar'", output.lastWrite()
|
|
|
|
testRepl "empty command evaluates to undefined", (input, output) ->
|
|
input.emitLine ''
|
|
eq 'undefined', output.lastWrite()
|
|
|
|
testRepl "ctrl-v toggles multiline prompt", (input, output) ->
|
|
input.emit 'keypress', null, ctrlV
|
|
eq '------> ', output.lastWrite(0)
|
|
input.emit 'keypress', null, ctrlV
|
|
eq 'coffee> ', output.lastWrite(0)
|
|
|
|
testRepl "multiline continuation changes prompt", (input, output) ->
|
|
input.emit 'keypress', null, ctrlV
|
|
input.emitLine ''
|
|
eq '....... ', output.lastWrite(0)
|
|
|
|
testRepl "evaluates multiline", (input, output) ->
|
|
# Stubs. Could assert on their use.
|
|
output.cursorTo = (pos) ->
|
|
output.clearLine = ->
|
|
|
|
input.emit 'keypress', null, ctrlV
|
|
input.emitLine 'do ->'
|
|
input.emitLine ' 1 + 1'
|
|
input.emit 'keypress', null, ctrlV
|
|
eq '2', output.lastWrite()
|
|
|
|
testRepl "variables in scope are preserved", (input, output) ->
|
|
input.emitLine 'a = 1'
|
|
input.emitLine 'do -> a = 2'
|
|
input.emitLine 'a'
|
|
eq '2', output.lastWrite()
|
|
|
|
testRepl "existential assignment of previously declared variable", (input, output) ->
|
|
input.emitLine 'a = null'
|
|
input.emitLine 'a ?= 42'
|
|
eq '42', output.lastWrite()
|
|
|
|
testRepl "keeps running after runtime error", (input, output) ->
|
|
input.emitLine 'a = b'
|
|
input.emitLine 'a'
|
|
eq 'undefined', output.lastWrite()
|
|
|
|
process.on 'exit', ->
|
|
try
|
|
fs.unlinkSync historyFile
|
|
catch exception # Already deleted, nothing else to do.
|