PageRenderTime 31ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/test/test_stitch.coffee

https://github.com/brandonbloom/stitch
CoffeeScript | 314 lines | 255 code | 59 blank | 0 comment | 3 complexity | 18072c57acfc00aaf554511622c2a142 MD5 | raw file
  1. sys = require "sys"
  2. fs = require "fs"
  3. stitch = require "stitch"
  4. fixtureRoot = __dirname + "/fixtures"
  5. fixtures = fixtureRoot + "/default"
  6. altFixtures = fixtureRoot + "/alternate"
  7. addlFixtures = fixtureRoot + "/additional"
  8. ecoFixtures = fixtureRoot + "/eco"
  9. linkFixtures = fixtureRoot + "/link"
  10. fixtureCount = 15
  11. defaultOptions =
  12. identifier: "testRequire"
  13. paths: [fixtures]
  14. defaultPackage = stitch.createPackage defaultOptions
  15. additionalOptions =
  16. identifier: "testRequire"
  17. paths: [addlFixtures]
  18. additionalPackage = stitch.createPackage additionalOptions
  19. alternateOptions =
  20. paths: [altFixtures]
  21. alternatePackage = stitch.createPackage alternateOptions
  22. ecoOptions =
  23. identifier: "testRequire"
  24. paths: [ecoFixtures]
  25. ecoPackage = stitch.createPackage ecoOptions
  26. dependencyOptions =
  27. identifier: "testRequire"
  28. paths: [fixtures]
  29. dependencies: [
  30. fixtureRoot + "/dependencies/zepto.js"
  31. fixtureRoot + "/dependencies/underscore.js"
  32. fixtureRoot + "/dependencies/backbone.js"
  33. ]
  34. dependencyPackage = stitch.createPackage dependencyOptions
  35. linkOptions =
  36. identifier: "testRequire"
  37. paths: [linkFixtures]
  38. linkPackage = stitch.createPackage linkOptions
  39. load = (source, callback) ->
  40. (-> eval source).call module = {}
  41. callback? (source) -> (-> eval source).call module
  42. module.testRequire
  43. rescue = (callback) ->
  44. rescued = false
  45. try
  46. callback()
  47. catch err
  48. rescued = true
  49. rescued
  50. module.exports =
  51. "walk tree": (test) ->
  52. test.expect fixtureCount
  53. defaultPackage.walkTree fixtures, (err, file) ->
  54. if file
  55. test.ok file
  56. else
  57. test.done()
  58. "get files in tree": (test) ->
  59. test.expect 2
  60. defaultPackage.getFilesInTree fixtures, (err, files) ->
  61. test.ok !err
  62. test.same fixtureCount, files.length
  63. test.done()
  64. "get files in tree that does not exist": (test) ->
  65. test.expect 1
  66. defaultPackage.getFilesInTree fixtures + "/missing", (err, files) ->
  67. test.ok err
  68. test.done()
  69. "get files in empty directory": (test) ->
  70. test.expect 1
  71. dirname = fixtures + "/empty"
  72. fs.mkdirSync dirname, 0755
  73. defaultPackage.getFilesInTree dirname, (err, files) ->
  74. test.ok !err
  75. fs.rmdirSync dirname
  76. test.done()
  77. "compile file": (test) ->
  78. test.expect 2
  79. defaultPackage.compileFile __filename, (err, source) ->
  80. test.ok !err
  81. test.ok source.match(/\(function\(\) \{/)
  82. test.done()
  83. "compile file does not exist": (test) ->
  84. test.expect 1
  85. defaultPackage.compileFile "nosuchthing.coffee", (err, source) ->
  86. test.ok err
  87. test.done()
  88. "compile file with syntax error": (test) ->
  89. test.expect 1
  90. alternatePackage.compileFile altFixtures + "/nonsense.coffee", (err, source) ->
  91. test.ok err.toString().match(/SyntaxError/)
  92. test.done()
  93. "compile file with custom compiler": (test) ->
  94. test.expect 1
  95. options = Object.create alternateOptions
  96. options.compilers =
  97. alert: (module, filename) ->
  98. source = require('fs').readFileSync filename, 'utf8'
  99. source = "alert(#{sys.inspect source});"
  100. module._compile source, filename
  101. package = stitch.createPackage options
  102. package.compileFile altFixtures + "/hello.alert", (err, source) ->
  103. test.same "alert('hello world\\n');", source
  104. test.done()
  105. "compile file with unknown extension": (test) ->
  106. test.expect 1
  107. alternatePackage.compileFile altFixtures + "/hello.alert", (err, source) ->
  108. test.ok err.toString().match(/no compiler/)
  109. test.done()
  110. "get relative path": (test) ->
  111. test.expect 2
  112. defaultPackage.getRelativePath fixtures + "/foo/bar.coffee", (err, path) ->
  113. test.ok !err
  114. test.same 'foo/bar.coffee', path
  115. test.done()
  116. "compile generates valid javascript": (test) ->
  117. test.expect 2
  118. defaultPackage.compile (err, sources) ->
  119. test.ok !err
  120. testRequire = load sources
  121. test.ok typeof testRequire is "function"
  122. test.done()
  123. "compile module with custom exports": (test) ->
  124. test.expect 3
  125. defaultPackage.compile (err, sources) ->
  126. test.ok !err
  127. testRequire = load sources
  128. result = testRequire("custom_exports")
  129. test.ok typeof result is "function"
  130. test.same "foo", result()
  131. test.done()
  132. "compile module with exported property": (test) ->
  133. test.expect 2
  134. defaultPackage.compile (err, sources) ->
  135. test.ok !err
  136. testRequire = load sources
  137. test.same "bar", testRequire("exported_property").foo
  138. test.done()
  139. "compile module with requires": (test) ->
  140. test.expect 4
  141. defaultPackage.compile (err, sources) ->
  142. test.ok !err
  143. testRequire = load sources
  144. module = testRequire("module")
  145. test.same "bar", module.foo
  146. test.same "foo", module.bar()
  147. test.same "biz", module.baz
  148. test.done()
  149. "runtime require only loads files once": (test) ->
  150. test.expect 3
  151. defaultPackage.compile (err, sources) ->
  152. test.ok !err
  153. testRequire = load sources
  154. module = testRequire("module")
  155. test.ok !module.x
  156. module.x = "foo"
  157. test.same "foo", testRequire("module").x
  158. test.done()
  159. "look for module index if necessary": (test) ->
  160. test.expect 2
  161. defaultPackage.compile (err, sources) ->
  162. test.ok !err
  163. testRequire = load sources
  164. buz = testRequire("foo/buz").buz
  165. test.same buz, "BUZ"
  166. test.done()
  167. "modules can be defined at runtime": (test) ->
  168. test.expect 3
  169. defaultPackage.compile (err, sources) ->
  170. test.ok !err
  171. testRequire = load sources
  172. test.ok rescue -> testRequire("frob")
  173. testRequire.define
  174. "frob": (exports, require, module) ->
  175. exports.frob = require("foo/buz").buz
  176. test.same "BUZ", testRequire("frob").frob
  177. test.done()
  178. "multiple packages may share the same require namespace": (test) ->
  179. test.expect 5
  180. defaultPackage.compile (err, sources) ->
  181. test.ok !err
  182. testRequire = load sources, (load) ->
  183. additionalPackage.compile (err, sources) ->
  184. test.ok !err
  185. load sources
  186. test.same "hello", testRequire("hello").hello
  187. test.same "additional/foo/bar.js", testRequire("foo/bar").filename
  188. test.same "biz", testRequire("foo/bar/baz").baz;
  189. test.done()
  190. "relative require": (test) ->
  191. test.expect 6
  192. defaultPackage.compile (err, sources) ->
  193. test.ok !err
  194. testRequire = load sources
  195. relative = testRequire("relative")
  196. test.same "a", relative.a.a
  197. test.same "b", relative.a.b
  198. test.same "foo", relative.custom()
  199. test.same "biz", relative.baz
  200. test.same "BUZ", relative.buz
  201. test.done()
  202. "circular require": (test) ->
  203. test.expect 4
  204. defaultPackage.compile (err, sources) ->
  205. test.ok !err
  206. testRequire = load sources
  207. circular = testRequire("circular")
  208. test.same "a", circular.a.a()
  209. test.same "a", circular.b.b()
  210. test.same "a", circular.a.b()
  211. test.done()
  212. "errors at require time don't leave behind a partially loaded cache": (test) ->
  213. test.expect 3
  214. defaultPackage.compile (err, sources) ->
  215. test.ok !err
  216. testRequire = load sources
  217. test.ok rescue -> testRequire("circular/error")
  218. test.ok rescue -> testRequire("circular/error")
  219. test.done()
  220. "dependencies option concatenates files in order": (test) ->
  221. test.expect 5
  222. dependencyPackage.compile (err, sources) ->
  223. test.ok !err
  224. lines = sources.split("\n").slice(0, 5)
  225. test.same "// Zepto", lines[0]
  226. test.same "// Underscore", lines[2]
  227. test.same "// Backbone", lines[4]
  228. testRequire = load sources
  229. test.ok testRequire("foo/bar/baz")
  230. test.done()
  231. "paths may be symlinks": (test) ->
  232. test.expect 2
  233. linkPackage.compile (err, sources) ->
  234. test.ok !err
  235. testRequire = load sources
  236. test.ok testRequire("foo/bar/baz")
  237. test.done()
  238. if stitch.compilers.eco
  239. module.exports["eco compiler"] = (test) ->
  240. test.expect 2
  241. ecoPackage.compile (err, sources) ->
  242. test.ok !err
  243. testRequire = load sources
  244. html = testRequire("hello.html")(name: "Sam").trim()
  245. test.same "hello Sam!", html.split("\n").pop()
  246. test.done()