Skip to content

Commit

Permalink
parse_render_src: add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
jedahu committed Feb 18, 2013
1 parent 778146f commit de4f7c9
Show file tree
Hide file tree
Showing 10 changed files with 151 additions and 80 deletions.
2 changes: 1 addition & 1 deletion npm-shrinkwrap.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "docshop",
"version": "0.1.53",
"version": "0.1.54",
"dependencies": {
"grunt-contrib-copy": "~0.4.0rc7",
"grunt-contrib-watch": "~0.1.4",
Expand Down
2 changes: 2 additions & 0 deletions www/js/app/browse.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
; import srcParserService from 'browse/service/src_parser.js'
; import createRepoService from 'browse/service/create_repo.js'
; import exceptionHandlerService from 'browse/service/exception_handler.js'
; import readFileService from 'browse/service/read_file.js'
; import httpRepoType from 'browse/repo_type/http.js'
; import githubRepoType from 'browse/repo_type/github.js'
; import repoController from 'browse/repo_controller.js'
Expand All @@ -25,6 +26,7 @@
.factory('tick', tickService)
.factory('nextTick', nextTickService)
.factory('srcParser', srcParserService)
.factory('readFile', readFileService)
.factory('$exceptionHandler', exceptionHandlerService)
.factory('markdownRenderer', markdownRenderer)
.factory('textRenderer', textRenderer)
Expand Down
21 changes: 13 additions & 8 deletions www/js/app/browse/repo_controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
, createRepoObj
, parseRenderSrc
, scrollToHash
, readFile
)
=>
{ $scope.repo = null
Expand All @@ -27,9 +28,6 @@
}
}

; const fileFromPath = (repo, path) =>
repo.manifest.fileMap[path]

; const parseRepoString = (str) =>
{ const match = str && str.match(/([^@]+)(?:@([^:]+):?(.*))?/)
; return match
Expand Down Expand Up @@ -78,10 +76,9 @@
}

; const changePath = () =>
{ parseRenderSrc
( $scope.repo
, fileFromPath($scope.repo, $scope.repo.path)
)
{ readFile($scope.repo, path).then((args) =>
{ $scope.$apply(() => parseRenderSrc($scope.repo, ...args))
})
; setPath()
; $scope.repoForm.updateHack = new Date().getTime()
}
Expand Down Expand Up @@ -148,4 +145,12 @@

}

; repoController.$inject = ['$scope', '$q', '$location', 'createRepoObj', 'parseRenderSrc', 'scrollToHash']
; repoController.$inject =
[ '$scope'
, '$q'
, '$location'
, 'createRepoObj'
, 'parseRenderSrc'
, 'scrollToHash'
, 'readFile'
]
6 changes: 6 additions & 0 deletions www/js/app/browse/service/exception_handler_mock.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
; export const exceptionHandlerMockService = () =>
(err, cause) => {if (ehCallback) ehCallback(err, cause)}

; export var ehCallback = null

; export const setEhCallback = (fn) => {ehCallback = fn}
120 changes: 59 additions & 61 deletions www/js/app/browse/service/parse_render_src.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@

; export const parseRenderSrcService =
($q, $http, $rootScope, $timeout, $injector, srcParser) =>
(repo, file) =>
parseRenderSrc($q, $http, $rootScope, $timeout, $injector, srcParser, repo, file)
(file, text, meta) =>
parseRenderSrc
( $q, $http, $rootScope, $timeout, $injector, srcParser
, file, text, meta
)

; const processResult = (html, meta) =>
{ const wrapper = angular.element('<div>')
Expand Down Expand Up @@ -60,75 +63,70 @@
; return meta
}

; const readFile = (repo, file) =>
repo.readFile(file.path).then((text) =>
{ const meta = parseMeta(text)
; if (meta)
{ file.meta = meta
; file = Object.create(file)
; if (meta.lang) meta.lang.name = meta.lang.name || file.lang.name
; file.lang = meta.lang || file.lang
; file.markup = file.markup || meta.markup
}
; file.text = text
; return file
})

; const jobs = []

; const cancelJobs = ($rootScope) =>
{ while (jobs.length > 0)
{ let job = jobs.pop()
; job.parser.events.offAll()
; $rootScope.$broadcast('renderer-cancel', file)
}
}

; const parseRenderSrc =
($q, $http, $rootScope, $timeout, $injector, srcParser, repo, file) =>
readFile(repo, file).then((file) =>
{ const parser = srcParser(file.lang, file.text)
; let html = ''
; const renderer = $injector.get(file.markup + 'Renderer')
; const render = (...args) =>
{ try
{ return renderer(...args)
}
catch(e)
{ parser.events.offAll()
; $rootScope.$broadcast('renderer-error', file, e)
}
}
; const handle = (evt, ...args) =>
{ switch (evt)
{ case 'html'
: html += args[0]
; break
case 'comment'
: html += render(...args)
; break
case 'end'
: parser.events.offAll()
; $rootScope.$broadcast
( 'renderer-result'
, file
, processResult(html, file.meta)
)
; break
}
( $q, $http, $rootScope, $timeout, $injector, srcParser
, file, text, meta
)
=>
{ const parser = srcParser(file.lang, text)
; let html = ''
; const render = $injector.get(file.markup + 'Renderer')
; const handle = (evt, ...args) =>
{ switch (evt)
{ case 'html'
: html += args[0]
; break
case 'comment'
: try
{ html += render(...args)
}
catch (err)
{ parser.events.offAll()
; throw (
{ name: 'renderer-error'
, error: err
, file: file
})
}
; break
case 'end'
: parser.events.offAll()
; $rootScope.$broadcast
( 'renderer-result'
, file
, processResult(html, meta)
)
; break
}
; while (jobs.length > 0)
{ let job = jobs.pop()
; job.parser.events.offAll()
; $rootScope.$broadcast('renderer-cancel', file)
}
; jobs.push({parser, file})
; parser.events.onAll(handle)
; $timeout
( () => $rootScope.$broadcast('renderer-timeout', file)
, 10000 // TODO parameterise
)
; parser.parse().then(null, (err) =>
{ $rootScope.$broadcast('parser-error', file, err)
})
}
; cancelJobs($rootScope)
; jobs.push({parser, file})
; parser.events.onAll(handle)
; $timeout
( () => $rootScope.$broadcast('renderer-timeout', file)
, 10000 // TODO parameterise
)
; parser.parse().then(null, (err) =>
{ throw {name: 'parser-error', error: err}
})
}

; parseRenderSrcService.$inject = ['$q', '$http', '$rootScope', '$timeout', '$injector', 'srcParser']

; export module _test
{ export processResult
; export parseMeta
; export readFile
; export jobs
; export cancelJobs
}
43 changes: 41 additions & 2 deletions www/js/app/browse/service/parse_render_src_test.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,22 @@
; import browse from '/browse.js'
; import _test from 'parse_render_src.js'
; import ngIt from '/test/util.js'
; import {exceptionHandlerMockService, setEhCallback}
from 'exception_handler_mock.js'

; const assert = chai.assert
; const $injector = angular.injector(['ng', 'BrowseModule'])
; const testModule = angular.module('TestModule', ['BrowseModule'])
.factory('$exceptionHandler', exceptionHandlerMockService)
; const $injector = angular.injector(['ng', 'TestModule'])
; const $it = ngIt($injector)

; let parseRenderSrc
; let $rootScope

; beforeEach(() =>
{
{ parseRenderSrc = $injector.get('parseRenderSrc')
; $rootScope = $injector.get('$rootScope')
; setEhCallback(null)
})

; describe('parse_render_src', () =>
Expand Down Expand Up @@ -104,4 +113,34 @@
)
})
})
; describe('parseRenderSrc', () =>
{ $it('should fire result event', (done) =>
{ parseRenderSrc
( { name: 'foo'
, path: 'foo.js'
, markup: 'text'
, lang: {open: '/*', middle: '', close: '*/', name: 'js'}
}
, '"A single line of code."'
, {}
)
; $rootScope.$on('renderer-result', (_evt, file, result) =>
{ done()
})
})
; $it('should fire error events', (done) =>
{ setEhCallback((err, cause) =>
{ if (err.name === 'parser-error') done()
})
; $rootScope.$apply(() => parseRenderSrc
( { name: 'foo'
, path: 'foo.js'
, markup: 'text'
, lang: {open: '/*', middle: '', close: '*/', name: 'js'}
}
, ['Not', 'a', 'string']
, {}
))
})
})
})
14 changes: 14 additions & 0 deletions www/js/app/browse/service/read_file.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
; export const readFileService = () =>
(repo, path) =>
{ const file = repo.manifest.fileMap[path]
; return repo.readFile(file.path).then((text) =>
{ const meta = parseMeta(text)
; if (meta)
{ file = Object.create(file)
; if (meta.lang) meta.lang.name = meta.lang.name || file.lang.name
; file.lang = meta.lang || file.lang
; file.markup = file.markup || meta.markup
}
; return [file, text, meta]
})
}
18 changes: 13 additions & 5 deletions www/js/app/browse/service/src_parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,19 @@ All of the heavy lifting happens in the `parser` object which exposes a
*/
; const parser =
{ init(tick, lang, text)
{ this.lines = text.split('\n').reverse()
; this.events = Object.create(microEmitter)
; this.lang = lang
; this.tick = tick
; this.metaData = {}
{ try
{ this.lines = text.split('\n').reverse()
; this.events = Object.create(microEmitter)
; this.lang = lang
; this.tick = tick
; this.metaData = {}
}
catch (err)
{ throw (
{ name: 'parser-error'
, error: err
})
}
; return this
}

Expand Down
3 changes: 1 addition & 2 deletions www/js/app/browse/service/src_parser_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@
})

; describe('src_parser', function()
{ this.timeout(100000)
; $it('should parse meta data', (done) =>
{ $it('should parse meta data', (done) =>
{ const parser = srcParser
( pyLang
, '""" !meta\n'
Expand Down

0 comments on commit de4f7c9

Please sign in to comment.