var ngdoc = require('ngdoc.js'); var DOM = require('dom.js').DOM; describe('ngdoc', function(){ var Doc = ngdoc.Doc; describe('Doc', function(){ describe('metadata', function(){ it('should find keywords', function(){ expect(new Doc('\nHello: World! @ignore.').keywords()).toEqual('hello world'); expect(new Doc('The `ng:class-odd` and').keywords()).toEqual('and ng:class-odd the'); }); }); describe('parse', function(){ it('should convert @names into properties', function(){ var doc = new Doc('\n@name name\n@desc\ndesc\ndesc2\n@dep\n'); doc.parse(); expect(doc.name).toEqual('name'); expect(doc.desc).toEqual('desc\ndesc2'); expect(doc.dep).toEqual(''); }); it('should parse parameters', function(){ var doc = new Doc( '@param {*} a short\n' + '@param {Type} b med\n' + '@param {Class=} [c=2] long\nline'); doc.parse(); expect(doc.param).toEqual([ {name:'a', description:'short', type:'*', optional:false, 'default':undefined}, {name:'b', description:'med', type:'Type', optional:false, 'default':undefined}, {name:'c', description:'long\nline', type:'Class', optional:true, 'default':'2'} ]); }); it('should parse return', function(){ var doc = new Doc('@returns {Type} text *bold*.'); doc.parse(); expect(doc.returns).toEqual({ type: 'Type', description: 'text bold.' }); }); it('should not remove extra line breaks', function(){ var doc = new Doc('@example\nA\n\nB'); doc.parse(); expect(doc.example).toEqual('A\n\nB'); }); }); }); describe('markdown', function(){ var markdown = ngdoc.markdown; it('should replace angular in markdown', function(){ expect(markdown('')). toEqual('

<angular/>

'); }); it('should not replace anything in
', function(){
      expect(markdown('bah x\n
\nangular.k\n
\n asdf x')). toEqual( '

bah x

' + '
\n' +
            'angular.k\n' +
            '
' + '

asdf x

'); }); it('should replace text between two
 tags', function() {
      expect(markdown('
x
# One
b
')). toMatch('

One

tion'}); }); it('should support multiline content', function() { var doc = new Doc("@returns {string} description\n new line\n another line"); doc.parse(); expect(doc.returns). toEqual({type: 'string', description: 'description\n new line\n another line'}); }); }); describe('@description', function(){ it('should support pre blocks', function(){ var doc = new Doc("@description
abc
"); doc.parse(); expect(doc.description). toBe('
abc
'); }); it('should support multiple pre blocks', function() { var doc = new Doc("@description foo \n
abc
\n#bah\nfoo \n
cba
"); doc.parse(); expect(doc.description). toBe('

foo

' + '
abc
' + '

bah

\n\n' + '

foo

' + '
cba
'); }); it('should support nested @link annotations with or without description', function() { var doc = new Doc("@description " + 'foo {@link angular.foo}\n\n da {@link angular.foo bar foo bar } \n\n' + 'dad{@link angular.foo}\n\n' + '{@link angular.directive.ng:foo ng:foo}'); doc.parse(); expect(doc.description). toBe('

foo angular.foo

\n\n' + '

da bar foo bar

\n\n' + '

dadangular.foo

\n\n' + '

ng:foo

'); }); it('should increment all headings by two', function() { var doc = new Doc('@description # foo\nabc\n## bar \n xyz'); doc.parse(); expect(doc.description). toBe('

foo

\n\n

abc

\n\n

bar

\n\n

xyz

'); }); }); describe('@example', function(){ it('should not remove {{}}', function(){ var doc = new Doc('@example text {{ abc }}'); doc.parse(); expect(doc.example).toEqual('text {{ abc }}'); }); }); describe('@deprecated', function() { it('should parse @deprecated', function() { var doc = new Doc('@deprecated Replaced with foo.'); doc.parse(); expect(doc.deprecated).toBe('Replaced with foo.'); }); }); }); describe('usage', function(){ var dom; beforeEach(function(){ dom = new DOM(); this.addMatchers({ toContain: function(text) { this.actual = this.actual.toString(); return this.actual.indexOf(text) > -1; } }); }); describe('filter', function(){ it('should format', function(){ var doc = new Doc({ ngdoc:'formatter', shortName:'myFilter', param: [ {name:'a'}, {name:'b'} ] }); doc.html_usage_filter(dom); expect(dom).toContain('myFilter_expression | myFilter:b'); expect(dom).toContain('angular.filter.myFilter(a, b)'); }); }); describe('validator', function(){ it('should format', function(){ var doc = new Doc({ ngdoc:'validator', shortName:'myValidator', param: [ {name:'a'}, {name:'b'} ] }); doc.html_usage_validator(dom); expect(dom).toContain('ng:validate="myValidator:b"'); expect(dom).toContain('angular.validator.myValidator(a, b)'); }); }); describe('formatter', function(){ it('should format', function(){ var doc = new Doc({ ngdoc:'formatter', shortName:'myFormatter', param: [ {name:'a'}, ] }); doc.html_usage_formatter(dom); expect(dom).toContain('ng:format="myFormatter:a"'); expect(dom).toContain('var userInputString = angular.formatter.myFormatter.format(modelValue, a);'); expect(dom).toContain('var modelValue = angular.formatter.myFormatter.parse(userInputString, a);'); }); }); }); });