Best JavaScript code snippet using puppeteer
parse.tag.doctrine.js
Source:parse.tag.doctrine.js
...42 });43 });44 describe('parse', () => {45 it('alias', () => {46 let res = comments.parseComment('/** @alias */', {47 unwrap: true48 });49 assert.equal(res.tags.length, 0);50 });51 it('alias with name', () => {52 let res = comments.parseComment('/** @alias aliasName */', {53 unwrap: true54 });55 assert.equal(res.tags.length, 1);56 assert(hasProperty(res.tags[0], 'title', 'alias'));57 assert(hasProperty(res.tags[0], 'name', 'aliasName'));58 });59 it('alias with namepath', () => {60 let res = comments.parseComment('/** @alias aliasName.OK */', {61 unwrap: true62 });63 assert.equal(res.tags.length, 1);64 assert(hasProperty(res.tags[0], 'title', 'alias'));65 assert(hasProperty(res.tags[0], 'name', 'aliasName.OK'));66 });67 it('alias with namepath', () => {68 let res = comments.parseComment('/** @alias module:mymodule/mymodule.init */', {69 unwrap: true70 });71 assert.equal(res.tags.length, 1);72 assert(hasProperty(res.tags[0], 'title', 'alias'));73 assert(hasProperty(res.tags[0], 'name', 'module:mymodule/mymodule.init'));74 });75 it('alias with namepath with hyphen in it', () => {76 let res = comments.parseComment('/** @alias module:mymodule/my-module */', {77 unwrap: true78 });79 assert.equal(res.tags.length, 1);80 assert(hasProperty(res.tags[0], 'title', 'alias'));81 assert(hasProperty(res.tags[0], 'name', 'module:mymodule/my-module'));82 });83 it('const', () => {84 let res = comments.parseComment('/** @const */', {85 unwrap: true86 });87 assert.equal(res.tags.length, 1);88 assert(hasProperty(res.tags[0], 'title', 'const'));89 });90 it('const with name', () => {91 let res = comments.parseComment('/** @const constname */', {92 unwrap: true93 });94 assert.equal(res.tags.length, 1);95 assert(hasProperty(res.tags[0], 'title', 'const'));96 assert(hasProperty(res.tags[0], 'name', 'constname'));97 });98 it('constant with name', () => {99 let res = comments.parseComment('/** @constant constname */', {100 unwrap: true101 });102 assert.equal(res.tags.length, 1);103 assert(hasProperty(res.tags[0], 'title', 'constant'));104 assert(hasProperty(res.tags[0], 'name', 'constname'));105 });106 it('const with type and name', () => {107 let res = comments.parseComment('/** @const {String} constname */', {108 unwrap: true109 });110 assert.equal(res.tags.length, 1);111 assert(hasProperty(res.tags[0], 'title', 'const'));112 assert(hasProperty(res.tags[0], 'name', 'constname'));113 assert(hasProperty(res.tags[0], 'type'));114 assert.deepEqual(res.tags[0].type, {115 type: 'NameExpression',116 name: 'String'117 });118 });119 it('Const with type and name', () => {120 let res = comments.parseComment('/** @Const {String} constname */', {121 unwrap: true122 });123 assert.equal(res.tags.length, 1);124 assert(hasProperty(res.tags[0], 'title', 'Const'));125 assert(hasProperty(res.tags[0], 'name', 'constname'));126 assert(hasProperty(res.tags[0], 'type'));127 assert.deepEqual(res.tags[0].type, {128 type: 'NameExpression',129 name: 'String'130 });131 });132 it('constant with type and name', () => {133 let res = comments.parseComment('/** @constant {String} constname */', {134 unwrap: true135 });136 assert.equal(res.tags.length, 1);137 assert(hasProperty(res.tags[0], 'title', 'constant'));138 assert(hasProperty(res.tags[0], 'name', 'constname'));139 assert(hasProperty(res.tags[0], 'type'));140 assert.deepEqual(res.tags[0].type, {141 type: 'NameExpression',142 name: 'String'143 });144 });145 it('const multiple', () => {146 let res = comments.parseComment('/**@const\n @const*/', {147 unwrap: true148 });149 assert.equal(res.tags.length, 2);150 assert(hasProperty(res.tags[0], 'title', 'const'));151 assert(hasProperty(res.tags[1], 'title', 'const'));152 });153 it('const double', () => {154 let res = comments.parseComment('/**@const\n @const*/', {155 unwrap: true156 });157 assert.equal(res.tags.length, 2);158 assert(hasProperty(res.tags[0], 'title', 'const'));159 assert(hasProperty(res.tags[1], 'title', 'const'));160 });161 it('const triple', () => {162 let res = comments.parseComment(163 ['/**', ' * @const @const', ' * @const @const', ' * @const @const', ' */'].join('\n'),164 {165 unwrap: true166 }167 );168 assert.equal(res.tags.length, 3);169 assert(hasProperty(res.tags[0], 'title', 'const'));170 assert(hasProperty(res.tags[1], 'title', 'const'));171 assert(hasProperty(res.tags[2], 'title', 'const'));172 });173 it('constructor', () => {174 let res = comments.parseComment('/** @constructor */', {175 unwrap: true176 });177 assert.equal(res.tags.length, 1);178 assert(hasProperty(res.tags[0], 'title', 'constructor'));179 });180 it('constructor with type', () => {181 let res = comments.parseComment('/** @constructor {Object} */', {182 unwrap: true183 });184 assert.equal(res.tags.length, 1);185 assert(hasProperty(res.tags[0], 'title', 'constructor'));186 assert.deepEqual(res.tags[0].type, {187 type: 'NameExpression',188 name: 'Object'189 });190 });191 it('constructor with type and name', () => {192 let res = comments.parseComment('/** @constructor {Object} objName */', {193 unwrap: true194 });195 assert.equal(res.tags.length, 1);196 assert(hasProperty(res.tags[0], 'title', 'constructor'));197 assert(hasProperty(res.tags[0], 'name', 'objName'));198 assert.deepEqual(res.tags[0].type, {199 type: 'NameExpression',200 name: 'Object'201 });202 });203 it('class', () => {204 let res = comments.parseComment('/** @class */', {205 unwrap: true206 });207 assert.equal(res.tags.length, 1);208 assert(hasProperty(res.tags[0], 'title', 'class'));209 });210 it('class with type', () => {211 let res = comments.parseComment('/** @class {Object} */', {212 unwrap: true213 });214 assert.equal(res.tags.length, 1);215 assert(hasProperty(res.tags[0], 'title', 'class'));216 assert.deepEqual(res.tags[0].type, {217 type: 'NameExpression',218 name: 'Object'219 });220 });221 it('class with type and name', () => {222 let res = comments.parseComment('/** @class {Object} objName */', {223 unwrap: true224 });225 assert.equal(res.tags.length, 1);226 assert(hasProperty(res.tags[0], 'title', 'class'));227 assert(hasProperty(res.tags[0], 'name', 'objName'));228 assert.deepEqual(res.tags[0].type, {229 type: 'NameExpression',230 name: 'Object'231 });232 });233 it('deprecated', () => {234 let res = comments.parseComment('/** @deprecated */', {235 unwrap: true236 });237 assert.equal(res.tags.length, 1);238 assert(hasProperty(res.tags[0], 'title', 'deprecated'));239 });240 it('deprecated', () => {241 let res = comments.parseComment('/** @deprecated some text here describing why it is deprecated */', {242 unwrap: true243 });244 assert.equal(res.tags.length, 1);245 assert(hasProperty(res.tags[0], 'title', 'deprecated'));246 assert(hasProperty(res.tags[0], 'description', 'some text here describing why it is deprecated'));247 });248 it('func', () => {249 let res = comments.parseComment('/** @func */', {250 unwrap: true251 });252 assert.equal(res.tags.length, 1);253 assert(hasProperty(res.tags[0], 'title', 'func'));254 });255 it('func with name', () => {256 let res = comments.parseComment('/** @func thingName.func */', {257 unwrap: true258 });259 assert.equal(res.tags.length, 1);260 assert(hasProperty(res.tags[0], 'title', 'func'));261 assert(hasProperty(res.tags[0], 'name', 'thingName.func'));262 });263 it('func with type', () => {264 let res = comments.parseComment('/** @func {Object} thingName.func */', {265 unwrap: true266 });267 assert.equal(res.tags.length, 0);268 // func does not accept type269 });270 it('function', () => {271 let res = comments.parseComment('/** @function */', {272 unwrap: true273 });274 assert.equal(res.tags.length, 1);275 assert(hasProperty(res.tags[0], 'title', 'function'));276 });277 it('function with name', () => {278 let res = comments.parseComment('/** @function thingName.function */', {279 unwrap: true280 });281 assert.equal(res.tags.length, 1);282 assert(hasProperty(res.tags[0], 'title', 'function'));283 assert(hasProperty(res.tags[0], 'name', 'thingName.function'));284 });285 it('function with type', () => {286 let res = comments.parseComment('/** @function {Object} thingName.function */', {287 unwrap: true288 });289 assert.equal(res.tags.length, 0);290 // function does not accept type291 });292 it('member', () => {293 let res = comments.parseComment('/** @member */', {294 unwrap: true295 });296 assert.equal(res.tags.length, 1);297 assert(hasProperty(res.tags[0], 'title', 'member'));298 });299 it('member with name', () => {300 let res = comments.parseComment('/** @member thingName.name */', {301 unwrap: true302 });303 assert.equal(res.tags.length, 1);304 assert(hasProperty(res.tags[0], 'title', 'member'));305 assert(hasProperty(res.tags[0], 'name', 'thingName.name'));306 });307 it('member with type', () => {308 let res = comments.parseComment('/** @member {Object} thingName.name */', {309 unwrap: true310 });311 assert.equal(res.tags.length, 1);312 assert(hasProperty(res.tags[0], 'title', 'member'));313 assert(hasProperty(res.tags[0], 'name', 'thingName.name'));314 assert(hasProperty(res.tags[0], 'type'));315 assert.deepEqual(res.tags[0].type, {316 type: 'NameExpression',317 name: 'Object'318 });319 });320 it('method', () => {321 let res = comments.parseComment('/** @method */', {322 unwrap: true323 });324 assert.equal(res.tags.length, 1);325 assert(hasProperty(res.tags[0], 'title', 'method'));326 });327 it('method with name', () => {328 let res = comments.parseComment('/** @method thingName.function */', {329 unwrap: true330 });331 assert.equal(res.tags.length, 1);332 assert(hasProperty(res.tags[0], 'title', 'method'));333 assert(hasProperty(res.tags[0], 'name', 'thingName.function'));334 });335 it('method with type', () => {336 let res = comments.parseComment('/** @method {Object} thingName.function */', {337 unwrap: true338 });339 assert.equal(res.tags.length, 0);340 // method does not accept type341 });342 it('mixes', () => {343 let res = comments.parseComment('/** @mixes */', {344 unwrap: true345 });346 assert.equal(res.tags.length, 0);347 });348 it('mixes with name', () => {349 let res = comments.parseComment('/** @mixes thingName */', {350 unwrap: true351 });352 assert.equal(res.tags.length, 1);353 assert(hasProperty(res.tags[0], 'title', 'mixes'));354 assert(hasProperty(res.tags[0], 'name', 'thingName'));355 });356 it('mixes with namepath', () => {357 let res = comments.parseComment('/** @mixes thingName.name */', {358 unwrap: true359 });360 assert.equal(res.tags.length, 1);361 assert(hasProperty(res.tags[0], 'title', 'mixes'));362 assert(hasProperty(res.tags[0], 'name', 'thingName.name'));363 });364 it('mixin', () => {365 let res = comments.parseComment('/** @mixin */', {366 unwrap: true367 });368 assert.equal(res.tags.length, 1);369 assert(hasProperty(res.tags[0], 'title', 'mixin'));370 });371 it('mixin with name', () => {372 let res = comments.parseComment('/** @mixin thingName */', {373 unwrap: true374 });375 assert.equal(res.tags.length, 1);376 assert(hasProperty(res.tags[0], 'title', 'mixin'));377 assert(hasProperty(res.tags[0], 'name', 'thingName'));378 });379 it('mixin with namepath', () => {380 let res = comments.parseComment('/** @mixin thingName.name */', {381 unwrap: true382 });383 assert.equal(res.tags.length, 1);384 assert(hasProperty(res.tags[0], 'title', 'mixin'));385 assert(hasProperty(res.tags[0], 'name', 'thingName.name'));386 });387 it('module', () => {388 let res = comments.parseComment('/** @module */', {389 unwrap: true390 });391 assert.equal(res.tags.length, 1);392 assert(hasProperty(res.tags[0], 'title', 'module'));393 });394 it('module with name', () => {395 let res = comments.parseComment('/** @module thingName.name */', {396 unwrap: true397 });398 assert.equal(res.tags.length, 1);399 assert(hasProperty(res.tags[0], 'title', 'module'));400 assert(hasProperty(res.tags[0], 'name', 'thingName.name'));401 });402 it('module with name that has a hyphen in it', () => {403 let res = comments.parseComment('/** @module thingName-name */', {404 unwrap: true405 });406 assert.equal(res.tags.length, 1);407 assert(hasProperty(res.tags[0], 'title', 'module'));408 assert(hasProperty(res.tags[0], 'name', 'thingName-name'));409 });410 it('module with type', () => {411 let res = comments.parseComment('/** @module {Object} thingName.name */', {412 unwrap: true413 });414 assert.equal(res.tags.length, 1);415 assert(hasProperty(res.tags[0], 'title', 'module'));416 assert(hasProperty(res.tags[0], 'name', 'thingName.name'));417 assert(hasProperty(res.tags[0], 'type'));418 assert.deepEqual(res.tags[0].type, {419 type: 'NameExpression',420 name: 'Object'421 });422 });423 it('module with path', () => {424 let res = comments.parseComment('/** @module path/to/thingName.name */', {425 unwrap: true426 });427 assert.equal(res.tags.length, 1);428 assert(hasProperty(res.tags[0], 'title', 'module'));429 assert(hasProperty(res.tags[0], 'name', 'path/to/thingName.name'));430 });431 it('name', () => {432 let res = comments.parseComment('/** @name thingName.name */', {433 unwrap: true434 });435 assert.equal(res.tags.length, 1);436 assert(hasProperty(res.tags[0], 'title', 'name'));437 assert(hasProperty(res.tags[0], 'name', 'thingName.name'));438 });439 it('name', () => {440 let res = comments.parseComment('/** @name thingName#name */', {441 unwrap: true442 });443 assert.equal(res.tags.length, 1);444 assert(hasProperty(res.tags[0], 'title', 'name'));445 assert(hasProperty(res.tags[0], 'name', 'thingName#name'));446 });447 it('name', () => {448 let res = comments.parseComment('/** @name thingName~name */', {449 unwrap: true450 });451 assert.equal(res.tags.length, 1);452 assert(hasProperty(res.tags[0], 'title', 'name'));453 assert(hasProperty(res.tags[0], 'name', 'thingName~name'));454 });455 it('name', () => {456 let res = comments.parseComment('/** @name {thing} thingName.name */', {457 unwrap: true458 });459 // name does not accept type460 assert.equal(res.tags.length, 0);461 });462 it('namespace', () => {463 let res = comments.parseComment('/** @namespace */', {464 unwrap: true465 });466 assert.equal(res.tags.length, 1);467 assert(hasProperty(res.tags[0], 'title', 'namespace'));468 });469 it('namespace with name', () => {470 let res = comments.parseComment('/** @namespace thingName.name */', {471 unwrap: true472 });473 assert.equal(res.tags.length, 1);474 assert(hasProperty(res.tags[0], 'title', 'namespace'));475 assert(hasProperty(res.tags[0], 'name', 'thingName.name'));476 });477 it('namespace with type', () => {478 let res = comments.parseComment('/** @namespace {Object} thingName.name */', {479 unwrap: true480 });481 assert.equal(res.tags.length, 1);482 assert(hasProperty(res.tags[0], 'title', 'namespace'));483 assert(hasProperty(res.tags[0], 'name', 'thingName.name'));484 assert(hasProperty(res.tags[0], 'type'));485 assert.deepEqual(res.tags[0].type, {486 type: 'NameExpression',487 name: 'Object'488 });489 });490 it('param', () => {491 let res = comments.parseComment(['/**', ' * @param {String} userName', '*/'].join('\n'), {492 unwrap: true493 });494 assert.equal(res.tags.length, 1);495 assert(hasProperty(res.tags[0], 'title', 'param'));496 assert(hasProperty(res.tags[0], 'name', 'userName'));497 assert(hasProperty(res.tags[0], 'type'));498 assert.deepEqual(res.tags[0].type, {499 type: 'NameExpression',500 name: 'String'501 });502 });503 it('param with properties', () => {504 let res = comments.parseComment(['/**', ' * @param {String} user.name', '*/'].join('\n'), {505 unwrap: true506 });507 assert.equal(res.tags.length, 1);508 assert(hasProperty(res.tags[0], 'title', 'param'));509 assert(hasProperty(res.tags[0], 'name', 'user.name'));510 assert(hasProperty(res.tags[0], 'type'));511 assert.deepEqual(res.tags[0].type, {512 type: 'NameExpression',513 name: 'String'514 });515 });516 it('param with properties with description', () => {517 let res = comments.parseComment(['/**', ' * @param {String} user.name - hi', '*/'].join('\n'), {518 unwrap: true519 });520 assert.equal(res.tags.length, 1);521 assert(hasProperty(res.tags[0], 'title', 'param'));522 assert(hasProperty(res.tags[0], 'name', 'user.name'));523 assert(hasProperty(res.tags[0], 'description', 'hi'));524 assert(hasProperty(res.tags[0], 'type'));525 assert.deepEqual(res.tags[0].type, {526 type: 'NameExpression',527 name: 'String'528 });529 });530 it('param with array properties with description', () => {531 let res = comments.parseComment(['/**', ' * @param {string} employee[].name - hi', ' */'].join('\n'), {532 unwrap: true533 });534 assert.equal(res.tags.length, 1);535 assert(hasProperty(res.tags[0], 'title', 'param'));536 assert(hasProperty(res.tags[0], 'name', 'employee[].name'));537 assert(hasProperty(res.tags[0], 'description', 'hi'));538 assert(hasProperty(res.tags[0], 'type'));539 assert.deepEqual(res.tags[0].type, {540 type: 'NameExpression',541 name: 'string'542 });543 });544 it('param with array properties without description', () => {545 let res = comments.parseComment(['/**', ' * @param {string} employee[].name', ' */'].join('\n'), {546 unwrap: true547 });548 assert.equal(res.tags.length, 1);549 assert(hasProperty(res.tags[0], 'title', 'param'));550 assert(hasProperty(res.tags[0], 'name', 'employee[].name'));551 assert(hasProperty(res.tags[0], 'description', null));552 assert(hasProperty(res.tags[0], 'type'));553 assert.deepEqual(res.tags[0].type, {554 type: 'NameExpression',555 name: 'string'556 });557 });558 it('arg with properties', () => {559 let res = comments.parseComment(['/**', ' * @arg {String} user.name', '*/'].join('\n'), {560 unwrap: true561 });562 assert.equal(res.tags.length, 1);563 assert(hasProperty(res.tags[0], 'title', 'arg'));564 assert(hasProperty(res.tags[0], 'name', 'user.name'));565 assert(hasProperty(res.tags[0], 'type'));566 assert.deepEqual(res.tags[0].type, {567 type: 'NameExpression',568 name: 'String'569 });570 });571 it('argument with properties', () => {572 let res = comments.parseComment(['/**', ' * @argument {String} user.name', '*/'].join('\n'), {573 unwrap: true574 });575 assert.equal(res.tags.length, 1);576 assert(hasProperty(res.tags[0], 'title', 'argument'));577 assert(hasProperty(res.tags[0], 'name', 'user.name'));578 assert(hasProperty(res.tags[0], 'type'));579 assert.deepEqual(res.tags[0].type, {580 type: 'NameExpression',581 name: 'String'582 });583 });584 it('param typeless', () => {585 let res = comments.parseComment(['/**', ' * @param something [bye] hi', '*/'].join('\n'), {586 unwrap: true,587 sloppy: true588 });589 assert.equal(res.tags.length, 1);590 assert.deepEqual(res.tags[0], {591 title: 'param',592 type: undefined,593 name: 'something',594 description: '[bye] hi'595 });596 res = comments.parseComment(['/**', ' * @param userName', '*/'].join('\n'), {597 unwrap: true598 });599 assert.equal(res.tags.length, 1);600 assert.deepEqual(res.tags[0], {601 title: 'param',602 type: null,603 name: 'userName',604 description: null605 });606 res = comments.parseComment(['/**', ' * @param userName Something descriptive', '*/'].join('\n'), {607 unwrap: true608 });609 assert.equal(res.tags.length, 1);610 assert.deepEqual(res.tags[0], {611 title: 'param',612 type: null,613 name: 'userName',614 description: 'Something descriptive'615 });616 res = comments.parseComment(['/**', ' * @param user.name Something descriptive', '*/'].join('\n'), {617 unwrap: true618 });619 assert.equal(res.tags.length, 1);620 assert.deepEqual(res.tags[0], {621 title: 'param',622 type: null,623 name: 'user.name',624 description: 'Something descriptive'625 });626 });627 it('param broken', () => {628 let res = comments.parseComment(629 ['/**', ' * @param {String} userName', ' * @param {String userName', '*/'].join('\n'),630 {631 unwrap: true632 }633 );634 assert.equal(res.tags.length, 1);635 assert(hasProperty(res.tags[0], 'title', 'param'));636 assert(hasProperty(res.tags[0], 'name', 'userName'));637 assert(hasProperty(res.tags[0], 'type'));638 assert.deepEqual(res.tags[0].type, {639 type: 'NameExpression',640 name: 'String'641 });642 });643 it('param record', () => {644 let res = comments.parseComment(['/**', ' * @param {{ok:String}} userName', '*/'].join('\n'), {645 unwrap: true646 });647 assert.equal(res.tags.length, 1);648 assert(hasProperty(res.tags[0], 'title', 'param'));649 assert(hasProperty(res.tags[0], 'name', 'userName'));650 assert(hasProperty(res.tags[0], 'type'));651 assert.deepEqual(res.tags[0].type, {652 type: 'RecordType',653 fields: [654 {655 type: 'FieldType',656 key: 'ok',657 value: {658 type: 'NameExpression',659 name: 'String'660 }661 }662 ]663 });664 });665 it('param record broken', () => {666 let res = comments.parseComment(['/**', ' * @param {{ok:String} userName', '*/'].join('\n'), {667 unwrap: true668 });669 assert.equal(res.tags.length, 0);670 });671 it('param multiple lines', () => {672 let res = comments.parseComment(673 ['/**', ' * @param {string|', ' * number} userName', ' * }}', '*/'].join('\n'),674 {675 unwrap: true676 }677 );678 assert.equal(res.tags.length, 1);679 assert(hasProperty(res.tags[0], 'title', 'param'));680 assert(hasProperty(res.tags[0], 'name', 'userName'));681 assert(hasProperty(res.tags[0], 'type'));682 assert.deepEqual(res.tags[0].type, {683 type: 'UnionType',684 elements: [685 {686 type: 'NameExpression',687 name: 'string'688 },689 {690 type: 'NameExpression',691 name: 'number'692 }693 ]694 });695 });696 it('param without braces', () => {697 let res = comments.parseComment(['/**', ' * @param string name description', '*/'].join('\n'), {698 unwrap: true699 });700 assert.equal(res.tags.length, 1);701 assert(hasProperty(res.tags[0], 'title', 'param'));702 assert(hasProperty(res.tags[0], 'name', 'string'));703 assert(hasProperty(res.tags[0], 'type', null));704 assert(hasProperty(res.tags[0], 'description', 'name description'));705 });706 it('param w/ hyphen before description', () => {707 let res = comments.parseComment(['/**', ' * @param {string} name - description', '*/'].join('\n'), {708 unwrap: true709 });710 assert.equal(res.tags.length, 1);711 assert.deepEqual(res.tags[0], {712 title: 'param',713 type: {714 type: 'NameExpression',715 name: 'string'716 },717 name: 'name',718 description: 'description'719 });720 });721 it('param w/ hyphen + leading space before description', () => {722 let res = comments.parseComment(['/**', ' * @param {string} name - description', '*/'].join('\n'), {723 unwrap: true724 });725 assert.equal(res.tags.length, 1);726 assert.deepEqual(res.tags[0], {727 title: 'param',728 type: {729 type: 'NameExpression',730 name: 'string'731 },732 name: 'name',733 description: ' description'734 });735 });736 it('description and param separated by blank line', () => {737 let res = comments.parseComment(738 ['/**', ' * Description', ' * blah blah blah', ' *', ' * @param {string} name description', '*/'].join('\n'),739 {740 unwrap: true741 }742 );743 assert.deepEqual(res.description, 'Description\nblah blah blah');744 assert.equal(res.tags.length, 1);745 assert(hasProperty(res.tags[0], 'title', 'param'));746 assert(hasProperty(res.tags[0], 'name', 'name'));747 assert(hasProperty(res.tags[0], 'type'));748 assert.deepEqual(res.tags[0].type, {749 type: 'NameExpression',750 name: 'string'751 });752 assert(hasProperty(res.tags[0], 'description', 'description'));753 });754 it('regular block comment instead of jsdoc-style block comment', () => {755 let res = comments.parseComment(['/*', ' * Description', ' * blah blah blah', '*/'].join('\n'), {756 unwrap: true757 });758 assert.deepEqual(res.description, 'Description\nblah blah blah');759 });760 it('augments', () => {761 let res = comments.parseComment('/** @augments */', {762 unwrap: true763 });764 assert.equal(res.tags.length, 1);765 });766 it('augments with name', () => {767 let res = comments.parseComment('/** @augments ClassName */', {768 unwrap: true769 });770 assert.equal(res.tags.length, 1);771 assert(hasProperty(res.tags[0], 'title', 'augments'));772 assert(hasProperty(res.tags[0], 'name', 'ClassName'));773 });774 it('augments with type', () => {775 let res = comments.parseComment('/** @augments {ClassName} */', {776 unwrap: true777 });778 assert.equal(res.tags.length, 1);779 assert(hasProperty(res.tags[0], 'title', 'augments'));780 assert(hasProperty(res.tags[0], 'type', {781 type: 'NameExpression',782 name: 'ClassName'783 }));784 });785 it('augments with name', () => {786 let res = comments.parseComment('/** @augments ClassName.OK */', {787 unwrap: true788 });789 assert.equal(res.tags.length, 1);790 assert(hasProperty(res.tags[0], 'title', 'augments'));791 assert(hasProperty(res.tags[0], 'name', 'ClassName.OK'));792 });793 it('extends', () => {794 let res = comments.parseComment('/** @extends */', {795 unwrap: true796 });797 assert.equal(res.tags.length, 1);798 });799 it('extends with name', () => {800 let res = comments.parseComment('/** @extends ClassName */', {801 unwrap: true802 });803 assert.equal(res.tags.length, 1);804 assert(hasProperty(res.tags[0], 'title', 'extends'));805 assert(hasProperty(res.tags[0], 'name', 'ClassName'));806 });807 it('extends with type', () => {808 let res = comments.parseComment('/** @extends {ClassName} */', {809 unwrap: true810 });811 assert.equal(res.tags.length, 1);812 assert(hasProperty(res.tags[0], 'title', 'extends'));813 assert(hasProperty(res.tags[0], 'type', {814 type: 'NameExpression',815 name: 'ClassName'816 }));817 });818 it('extends with namepath', () => {819 let res = comments.parseComment('/** @extends ClassName.OK */', {820 unwrap: true821 });822 assert.equal(res.tags.length, 1);823 assert(hasProperty(res.tags[0], 'title', 'extends'));824 assert(hasProperty(res.tags[0], 'name', 'ClassName.OK'));825 });826 it('extends with namepath', () => {827 let res = comments.parseComment('/** @extends module:path/ClassName~OK */', {828 unwrap: true829 });830 assert.equal(res.tags.length, 1);831 assert(hasProperty(res.tags[0], 'title', 'extends'));832 assert(hasProperty(res.tags[0], 'name', 'module:path/ClassName~OK'));833 });834 it('prop', () => {835 let res = comments.parseComment(['/**', ' * @prop {string} thingName - does some stuff', '*/'].join('\n'), {836 unwrap: true837 });838 assert.equal(res.tags.length, 1);839 assert(hasProperty(res.tags[0], 'title', 'prop'));840 assert(hasProperty(res.tags[0], 'description', 'does some stuff'));841 assert(hasProperty(res.tags[0].type, 'name', 'string'));842 assert(hasProperty(res.tags[0], 'name', 'thingName'));843 });844 it('prop without type', () => {845 let res = comments.parseComment(['/**', ' * @prop thingName - does some stuff', '*/'].join('\n'), {846 unwrap: true847 });848 assert.equal(res.tags.length, 0);849 });850 it('property', () => {851 let res = comments.parseComment(['/**', ' * @property {string} thingName - does some stuff', '*/'].join('\n'), {852 unwrap: true853 });854 assert.equal(res.tags.length, 1);855 assert(hasProperty(res.tags[0], 'title', 'property'));856 assert(hasProperty(res.tags[0], 'description', 'does some stuff'));857 assert(hasProperty(res.tags[0].type, 'name', 'string'));858 assert(hasProperty(res.tags[0], 'name', 'thingName'));859 });860 it('property without type', () => {861 let res = comments.parseComment(['/**', ' * @property thingName - does some stuff', '*/'].join('\n'), {862 unwrap: true863 });864 assert.equal(res.tags.length, 0);865 });866 it('property with optional type', () => {867 let res = comments.parseComment(868 ['/**', '* testtypedef', '* @typedef {object} abc', '* @property {String} [val] value description', '*/'].join(869 '\n'870 ),871 {872 unwrap: true,873 sloppy: true874 }875 );876 assert(hasProperty(res.tags[1], 'title', 'property'));877 assert(hasProperty(res.tags[1], 'type'));878 assert(hasProperty(res.tags[1]['type'], 'type', 'OptionalType'));879 });880 it('property with nested name', () => {881 let res = comments.parseComment(882 ['/**', ' * @property {string} thingName.name - does some stuff', '*/'].join('\n'),883 {884 unwrap: true885 }886 );887 assert.equal(res.tags.length, 1);888 assert(hasProperty(res.tags[0], 'title', 'property'));889 assert(hasProperty(res.tags[0], 'description', 'does some stuff'));890 assert(hasProperty(res.tags[0].type, 'name', 'string'));891 assert(hasProperty(res.tags[0], 'name', 'thingName.name'));892 });893 it('throws', () => {894 let res = comments.parseComment(['/**', ' * @throws {Error} if something goes wrong', ' */'].join('\n'), {895 unwrap: true896 });897 assert.equal(res.tags.length, 1);898 assert(hasProperty(res.tags[0], 'title', 'throws'));899 assert(hasProperty(res.tags[0], 'description', 'if something goes wrong'));900 assert(hasProperty(res.tags[0].type, 'name', 'Error'));901 });902 it('throws without type', () => {903 let res = comments.parseComment(['/**', ' * @throws if something goes wrong', ' */'].join('\n'), {904 unwrap: true905 });906 assert.equal(res.tags.length, 1);907 assert(hasProperty(res.tags[0], 'title', 'throws'));908 assert(hasProperty(res.tags[0], 'description', 'if something goes wrong'));909 });910 it('kind', () => {911 let res = comments.parseComment('/** @kind class */', {912 unwrap: true913 });914 assert.equal(res.tags.length, 1);915 assert(hasProperty(res.tags[0], 'title', 'kind'));916 assert(hasProperty(res.tags[0], 'kind', 'class'));917 });918 it('kind error', () => {919 let res = comments.parseComment('/** @kind ng */', {920 unwrap: true,921 recoverable: true922 });923 assert.equal(res.tags.length, 1);924 assert(hasProperty(res.tags[0], 'errors'));925 assert.equal(res.tags[0].errors.length, 1);926 assert.equal(res.tags[0].errors[0], "Invalid kind name 'ng'");927 });928 it('todo', () => {929 let res = comments.parseComment('/** @todo Write the documentation */', {930 unwrap: true931 });932 assert.equal(res.tags.length, 1);933 assert(hasProperty(res.tags[0], 'title', 'todo'));934 assert(hasProperty(res.tags[0], 'description', 'Write the documentation'));935 });936 it('typedef', () => {937 let res = comments.parseComment('/** @typedef {Object} NumberLike */', {938 unwrap: true939 });940 assert.equal(res.tags.length, 1);941 assert(hasProperty(res.tags[0], 'type'));942 assert.deepEqual(res.tags[0].type, {943 type: 'NameExpression',944 name: 'Object'945 });946 assert(hasProperty(res.tags[0], 'name', 'NumberLike'));947 });948 it('summary', () => {949 // japanese lang950 let res = comments.parseComment('/** @summary ãããã3æããã§ã¨ã¼ */', {951 unwrap: true952 });953 assert.equal(res.tags.length, 1);954 assert(hasProperty(res.tags[0], 'title', 'summary'));955 assert(hasProperty(res.tags[0], 'description', 'ãããã3æããã§ã¨ã¼'));956 });957 it('variation', () => {958 let res = comments.parseComment('/** @variation 42 */', {959 unwrap: true960 });961 assert.equal(res.tags.length, 1);962 assert(hasProperty(res.tags[0], 'title', 'variation'));963 assert(hasProperty(res.tags[0], 'variation', 42));964 });965 it('variation error', () => {966 let res = comments.parseComment('/** @variation Animation */', {967 unwrap: true,968 recoverable: true969 });970 assert.equal(res.tags.length, 1);971 assert(hasProperty(res.tags[0], 'errors'));972 assert.equal(res.tags[0].errors.length, 1);973 assert.equal(res.tags[0].errors[0], "Invalid variation 'Animation'");974 });975 it('access', () => {976 let res = comments.parseComment('/** @access public */', {977 unwrap: true978 });979 assert.equal(res.tags.length, 1);980 assert(hasProperty(res.tags[0], 'title', 'access'));981 assert(hasProperty(res.tags[0], 'access', 'public'));982 });983 it('access error', () => {984 let res = comments.parseComment('/** @access ng */', {985 unwrap: true,986 recoverable: true987 });988 assert.equal(res.tags.length, 1);989 assert(hasProperty(res.tags[0], 'errors'));990 assert.equal(res.tags[0].errors.length, 1);991 assert.equal(res.tags[0].errors[0], "Invalid access name 'ng'");992 });993 it('public', () => {994 let res = comments.parseComment('/** @public */', {995 unwrap: true996 });997 assert.equal(res.tags.length, 1);998 assert(hasProperty(res.tags[0], 'title', 'public'));999 });1000 it('public type and description', () => {1001 let res = comments.parseComment('/** @public {number} ok */', {1002 unwrap: true,1003 recoverable: true1004 });1005 assert.equal(res.tags.length, 1);1006 assert(hasProperty(res.tags[0], 'title', 'public'));1007 assert(hasProperty(res.tags[0], 'description', 'ok'));1008 assert(hasProperty(res.tags[0], 'type'));1009 assert.deepEqual(res.tags[0].type, {1010 type: 'NameExpression',1011 name: 'number'1012 });1013 });1014 it('protected', () => {1015 let res = comments.parseComment('/** @protected */', {1016 unwrap: true1017 });1018 assert.equal(res.tags.length, 1);1019 assert(hasProperty(res.tags[0], 'title', 'protected'));1020 });1021 it('protected type and description', () => {1022 let res = comments.parseComment('/** @protected {number} ok */', {1023 unwrap: true,1024 recoverable: true1025 });1026 assert.equal(res.tags.length, 1);1027 assert(hasProperty(res.tags[0], 'title', 'protected'));1028 assert(hasProperty(res.tags[0], 'description', 'ok'));1029 assert(hasProperty(res.tags[0], 'type'));1030 assert.deepEqual(res.tags[0].type, {1031 type: 'NameExpression',1032 name: 'number'1033 });1034 });1035 it('private', () => {1036 let res = comments.parseComment('/** @private */', {1037 unwrap: true1038 });1039 assert.equal(res.tags.length, 1);1040 assert(hasProperty(res.tags[0], 'title', 'private'));1041 });1042 it('private type and description', () => {1043 let res = comments.parseComment('/** @private {number} ok */', {1044 unwrap: true,1045 recoverable: true1046 });1047 assert.equal(res.tags.length, 1);1048 assert(hasProperty(res.tags[0], 'title', 'private'));1049 assert(hasProperty(res.tags[0], 'description', 'ok'));1050 assert(hasProperty(res.tags[0], 'type'));1051 assert.deepEqual(res.tags[0].type, {1052 type: 'NameExpression',1053 name: 'number'1054 });1055 });1056 it('readonly', () => {1057 let res = comments.parseComment('/** @readonly */', {1058 unwrap: true1059 });1060 assert.equal(res.tags.length, 1);1061 assert(hasProperty(res.tags[0], 'title', 'readonly'));1062 });1063 it('readonly error', () => {1064 let res = comments.parseComment('/** @readonly ng */', {1065 unwrap: true,1066 recoverable: true1067 });1068 assert.equal(res.tags.length, 1);1069 assert(hasProperty(res.tags[0], 'errors'));1070 assert.equal(res.tags[0].errors.length, 1);1071 assert.equal(res.tags[0].errors[0], "Unknown content 'ng'");1072 });1073 it('requires', () => {1074 let res = comments.parseComment('/** @requires */', {1075 unwrap: true1076 });1077 assert.equal(res.tags.length, 0);1078 });1079 it('requires with module name', () => {1080 let res = comments.parseComment('/** @requires name.path */', {1081 unwrap: true1082 });1083 assert.equal(res.tags.length, 1);1084 assert(hasProperty(res.tags[0], 'title', 'requires'));1085 assert(hasProperty(res.tags[0], 'name', 'name.path'));1086 });1087 it('global', () => {1088 let res = comments.parseComment('/** @global */', {1089 unwrap: true1090 });1091 assert.equal(res.tags.length, 1);1092 assert(hasProperty(res.tags[0], 'title', 'global'));1093 });1094 it('global error', () => {1095 let res = comments.parseComment('/** @global ng */', {1096 unwrap: true,1097 recoverable: true1098 });1099 assert.equal(res.tags.length, 1);1100 assert(hasProperty(res.tags[0], 'errors'));1101 assert.equal(res.tags[0].errors.length, 1);1102 assert.equal(res.tags[0].errors[0], "Unknown content 'ng'");1103 });1104 it('inner', () => {1105 let res = comments.parseComment('/** @inner */', {1106 unwrap: true1107 });1108 assert.equal(res.tags.length, 1);1109 assert(hasProperty(res.tags[0], 'title', 'inner'));1110 });1111 it('inner error', () => {1112 let res = comments.parseComment('/** @inner ng */', {1113 unwrap: true,1114 recoverable: true1115 });1116 assert.equal(res.tags.length, 1);1117 assert(hasProperty(res.tags[0], 'errors'));1118 assert.equal(res.tags[0].errors.length, 1);1119 assert.equal(res.tags[0].errors[0], "Unknown content 'ng'");1120 });1121 it('instance', () => {1122 let res = comments.parseComment('/** @instance */', {1123 unwrap: true1124 });1125 assert.equal(res.tags.length, 1);1126 assert(hasProperty(res.tags[0], 'title', 'instance'));1127 });1128 it('instance error', () => {1129 let res = comments.parseComment('/** @instance ng */', {1130 unwrap: true,1131 recoverable: true1132 });1133 assert.equal(res.tags.length, 1);1134 assert(hasProperty(res.tags[0], 'errors'));1135 assert.equal(res.tags[0].errors.length, 1);1136 assert.equal(res.tags[0].errors[0], "Unknown content 'ng'");1137 });1138 it('since', () => {1139 let res = comments.parseComment('/** @since 1.2.1 */', {1140 unwrap: true1141 });1142 assert.equal(res.tags.length, 1);1143 assert(hasProperty(res.tags[0], 'title', 'since'));1144 assert(hasProperty(res.tags[0], 'description', '1.2.1'));1145 });1146 it('static', () => {1147 let res = comments.parseComment('/** @static */', {1148 unwrap: true1149 });1150 assert.equal(res.tags.length, 1);1151 assert(hasProperty(res.tags[0], 'title', 'static'));1152 });1153 it('static error', () => {1154 let res = comments.parseComment('/** @static ng */', {1155 unwrap: true,1156 recoverable: true1157 });1158 assert.equal(res.tags.length, 1);1159 assert(hasProperty(res.tags[0], 'errors'));1160 assert.equal(res.tags[0].errors.length, 1);1161 assert.equal(res.tags[0].errors[0], "Unknown content 'ng'");1162 });1163 it('this', () => {1164 let res = comments.parseComment(['/**', ' * @this thingName', '*/'].join('\n'), {1165 unwrap: true1166 });1167 assert.equal(res.tags.length, 1);1168 assert(hasProperty(res.tags[0], 'title', 'this'));1169 assert(hasProperty(res.tags[0], 'name', 'thingName'));1170 });1171 it('this with namepath', () => {1172 let res = comments.parseComment(['/**', ' * @this thingName.name', '*/'].join('\n'), {1173 unwrap: true1174 });1175 assert.equal(res.tags.length, 1);1176 assert(hasProperty(res.tags[0], 'title', 'this'));1177 assert(hasProperty(res.tags[0], 'name', 'thingName.name'));1178 });1179 it('this with name expression', () => {1180 let res = comments.parseComment(['/**', ' * @this {thingName.name}', '*/'].join('\n'), {1181 unwrap: true1182 });1183 assert.equal(res.tags.length, 1);1184 assert(hasProperty(res.tags[0], 'title', 'this'));1185 assert(hasProperty(res.tags[0], 'name', 'thingName.name'));1186 });1187 it('this error with type application', () => {1188 let res = comments.parseComment(['/**', ' * @this {Array<string>}', '*/'].join('\n'), {1189 unwrap: true,1190 recoverable: true1191 });1192 assert.equal(res.tags.length, 1);1193 assert(hasProperty(res.tags[0], 'title', 'this'));1194 assert(hasProperty(res.tags[0], 'errors'));1195 assert.equal(res.tags[0].errors.length, 1);1196 assert.equal(res.tags[0].errors[0], 'Invalid name for this');1197 });1198 it('this error', () => {1199 let res = comments.parseComment(['/**', ' * @this', '*/'].join('\n'), {1200 unwrap: true,1201 recoverable: true1202 });1203 assert.equal(res.tags.length, 1);1204 assert(hasProperty(res.tags[0], 'title', 'this'));1205 assert(hasProperty(res.tags[0], 'errors'));1206 assert.equal(res.tags[0].errors.length, 1);1207 assert.equal(res.tags[0].errors[0], 'Missing or invalid tag name');1208 });1209 it('var', () => {1210 let res = comments.parseComment('/** @var */', {1211 unwrap: true1212 });1213 assert.equal(res.tags.length, 1);1214 assert(hasProperty(res.tags[0], 'title', 'var'));1215 });1216 it('var with name', () => {1217 let res = comments.parseComment('/** @var thingName.name */', {1218 unwrap: true1219 });1220 assert.equal(res.tags.length, 1);1221 assert(hasProperty(res.tags[0], 'title', 'var'));1222 assert(hasProperty(res.tags[0], 'name', 'thingName.name'));1223 });1224 it('var with type', () => {1225 let res = comments.parseComment('/** @var {Object} thingName.name */', {1226 unwrap: true1227 });1228 assert.equal(res.tags.length, 1);1229 assert(hasProperty(res.tags[0], 'title', 'var'));1230 assert(hasProperty(res.tags[0], 'name', 'thingName.name'));1231 assert(hasProperty(res.tags[0], 'type'));1232 assert.deepEqual(res.tags[0].type, {1233 type: 'NameExpression',1234 name: 'Object'1235 });1236 });1237 it('version', () => {1238 let res = comments.parseComment('/** @version 1.2.1 */', {1239 unwrap: true1240 });1241 assert.equal(res.tags.length, 1);1242 assert(hasProperty(res.tags[0], 'title', 'version'));1243 assert(hasProperty(res.tags[0], 'description', '1.2.1'));1244 });1245 it('incorrect name', () => {1246 let res = comments.parseComment('/** @name thingName#%name */', {1247 unwrap: true1248 });1249 // name does not accept type1250 assert.equal(res.tags.length, 0);1251 assert.deepEqual(res, {1252 description: '',1253 tags: []1254 });1255 });1256 it('string literal property', () => {1257 let res = comments.parseComment(1258 ['/**', ' * @typedef {Object} comment', " * @property {('public'|'protected'|'private')} access", '*/'].join(1259 '\n'1260 ),1261 {1262 unwrap: true1263 }1264 );1265 assert.equal(res.tags.length, 2);1266 assert(hasProperty(res.tags[1], 'title', 'property'));1267 assert(hasProperty(res.tags[1], 'name', 'access'));1268 assert(hasProperty(res.tags[1].type, 'type', 'UnionType'));1269 assert.equal(res.tags[1].type.elements.length, 3);1270 containEqual(res.tags[1].type.elements, {1271 type: 'StringLiteralType',1272 value: 'public'1273 });1274 containEqual(res.tags[1].type.elements, {1275 type: 'StringLiteralType',1276 value: 'private'1277 });1278 containEqual(res.tags[1].type.elements, {1279 type: 'StringLiteralType',1280 value: 'protected'1281 });1282 });1283 it('numeric literal property', () => {1284 let res = comments.parseComment(1285 ['/**', ' * @typedef {Object} comment', ' * @property {(-42|1.5|0)} access', '*/'].join('\n'),1286 {1287 unwrap: true1288 }1289 );1290 assert.equal(res.tags.length, 2);1291 assert(hasProperty(res.tags[1], 'title', 'property'));1292 assert(hasProperty(res.tags[1], 'name', 'access'));1293 assert(hasProperty(res.tags[1].type, 'type', 'UnionType'));1294 assert.equal(res.tags[1].type.elements.length, 3);1295 containEqual(res.tags[1].type.elements, {1296 type: 'NumericLiteralType',1297 value: -421298 });1299 containEqual(res.tags[1].type.elements, {1300 type: 'NumericLiteralType',1301 value: 1.51302 });1303 containEqual(res.tags[1].type.elements, {1304 type: 'NumericLiteralType',1305 value: 01306 });1307 });1308 it('boolean literal property', () => {1309 let res = comments.parseComment(1310 ['/**', ' * @typedef {Object} comment', ' * @property {(true|false)} access', '*/'].join('\n'),1311 {1312 unwrap: true1313 }1314 );1315 assert.equal(res.tags.length, 2);1316 assert(hasProperty(res.tags[1], 'title', 'property'));1317 assert(hasProperty(res.tags[1], 'name', 'access'));1318 assert(hasProperty(res.tags[1].type, 'type', 'UnionType'));1319 assert.equal(res.tags[1].type.elements.length, 2);1320 containEqual(res.tags[1].type.elements, {1321 type: 'BooleanLiteralType',1322 value: true1323 });1324 containEqual(res.tags[1].type.elements, {1325 type: 'BooleanLiteralType',1326 value: false1327 });1328 });1329 it('complex union with literal types', () => {1330 let res = comments.parseComment(1331 ['/**', ' * @typedef {({ok: true, data: string} | {ok: false, error: Error})} Result', '*/'].join('\n'),1332 {1333 unwrap: true1334 }1335 );1336 assert.equal(res.tags.length, 1);1337 assert(hasProperty(res.tags[0], 'title', 'typedef'));1338 assert(hasProperty(res.tags[0], 'name', 'Result'));1339 assert(hasProperty(res.tags[0].type, 'type', 'UnionType'));1340 assert.equal(res.tags[0].type.elements.length, 2);1341 var e0 = res.tags[0].type.elements[0];1342 assert(hasProperty(e0, 'type', 'RecordType'));1343 assert.equal(e0.fields.length, 2);1344 containEqual(e0.fields, {1345 type: 'FieldType',1346 key: 'ok',1347 value: {1348 type: 'BooleanLiteralType',1349 value: true1350 }1351 });1352 containEqual(e0.fields, {1353 type: 'FieldType',1354 key: 'data',1355 value: {1356 type: 'NameExpression',1357 name: 'string'1358 }1359 });1360 var e1 = res.tags[0].type.elements[1];1361 assert(hasProperty(e1, 'type', 'RecordType'));1362 assert.equal(e1.fields.length, 2);1363 containEqual(e1.fields, {1364 type: 'FieldType',1365 key: 'ok',1366 value: {1367 type: 'BooleanLiteralType',1368 value: false1369 }1370 });1371 containEqual(e1.fields, {1372 type: 'FieldType',1373 key: 'error',1374 value: {1375 type: 'NameExpression',1376 name: 'Error'1377 }1378 });1379 });1380 });1381 describe('parseType', () => {1382 it('union type closure-compiler extended', () => {1383 var type = comments.parseType('string|number');1384 assert.deepEqual(type, {1385 type: 'UnionType',1386 elements: [1387 {1388 type: 'NameExpression',1389 name: 'string'1390 },1391 {1392 type: 'NameExpression',1393 name: 'number'1394 }1395 ]1396 });1397 });1398 it('empty union type', () => {1399 var type = comments.parseType('()');1400 assert.deepEqual(type, {1401 type: 'UnionType',1402 elements: []1403 });1404 });1405 it('comma last array type', () => {1406 var type = comments.parseType('[string,]');1407 assert.deepEqual(type, {1408 type: 'ArrayType',1409 elements: [1410 {1411 type: 'NameExpression',1412 name: 'string'1413 }1414 ]1415 });1416 });1417 it('array type of all literal', () => {1418 var type = comments.parseType('[*]');1419 assert.deepEqual(type, {1420 type: 'ArrayType',1421 elements: [1422 {1423 type: 'AllLiteral'1424 }1425 ]1426 });1427 });1428 it('array type of nullable literal', () => {1429 var type = comments.parseType('[?]');1430 assert.deepEqual(type, {1431 type: 'ArrayType',1432 elements: [1433 {1434 type: 'NullableLiteral'1435 }1436 ]1437 });1438 });1439 it('comma last record type', () => {1440 var type = comments.parseType('{,}');1441 assert.deepEqual(type, {1442 type: 'RecordType',1443 fields: []1444 });1445 });1446 it('type application', () => {1447 var type = comments.parseType('Array.<String>');1448 assert.deepEqual(type, {1449 type: 'TypeApplication',1450 expression: {1451 type: 'NameExpression',1452 name: 'Array'1453 },1454 applications: [1455 {1456 type: 'NameExpression',1457 name: 'String'1458 }1459 ]1460 });1461 });1462 it('type application with NullableLiteral', () => {1463 var type = comments.parseType('Array<?>');1464 assert.deepEqual(type, {1465 type: 'TypeApplication',1466 expression: {1467 type: 'NameExpression',1468 name: 'Array'1469 },1470 applications: [1471 {1472 type: 'NullableLiteral'1473 }1474 ]1475 });1476 });1477 it('type application with multiple patterns', () => {1478 var type = comments.parseType('Array.<String, Number>');1479 assert.deepEqual(type, {1480 type: 'TypeApplication',1481 expression: {1482 type: 'NameExpression',1483 name: 'Array'1484 },1485 applications: [1486 {1487 type: 'NameExpression',1488 name: 'String'1489 },1490 {1491 type: 'NameExpression',1492 name: 'Number'1493 }1494 ]1495 });1496 });1497 it('type application without dot', () => {1498 var type = comments.parseType('Array<String>');1499 assert.deepEqual(type, {1500 type: 'TypeApplication',1501 expression: {1502 type: 'NameExpression',1503 name: 'Array'1504 },1505 applications: [1506 {1507 type: 'NameExpression',1508 name: 'String'1509 }1510 ]1511 });1512 });1513 it('array-style type application', () => {1514 var type = comments.parseType('String[]');1515 assert.deepEqual(type, {1516 type: 'TypeApplication',1517 expression: {1518 type: 'NameExpression',1519 name: 'Array'1520 },1521 applications: [1522 {1523 type: 'NameExpression',1524 name: 'String'1525 }1526 ]1527 });1528 });1529 it('function type simple', () => {1530 var type = comments.parseType('function()');1531 assert.deepEqual(type, {1532 type: 'FunctionType',1533 params: [],1534 result: null1535 });1536 });1537 it('function type with name', () => {1538 var type = comments.parseType('function(a)');1539 assert.deepEqual(type, {1540 type: 'FunctionType',1541 params: [1542 {1543 type: 'NameExpression',1544 name: 'a'1545 }1546 ],1547 result: null1548 });1549 });1550 it('function type with name and type', () => {1551 var type = comments.parseType('function(a:b)');1552 assert.deepEqual(type, {1553 type: 'FunctionType',1554 params: [1555 {1556 type: 'ParameterType',1557 name: 'a',1558 expression: {1559 type: 'NameExpression',1560 name: 'b'1561 }1562 }1563 ],1564 result: null1565 });1566 });1567 it('function type with optional param', () => {1568 var type = comments.parseType('function(a=)');1569 assert.deepEqual(type, {1570 type: 'FunctionType',1571 params: [1572 {1573 type: 'OptionalType',1574 expression: {1575 type: 'NameExpression',1576 name: 'a'1577 }1578 }1579 ],1580 result: null1581 });1582 });1583 it('function type with optional param name and type', () => {1584 var type = comments.parseType('function(a:b=)');1585 assert.deepEqual(type, {1586 type: 'FunctionType',1587 params: [1588 {1589 type: 'OptionalType',1590 expression: {1591 type: 'ParameterType',1592 name: 'a',1593 expression: {1594 type: 'NameExpression',1595 name: 'b'1596 }1597 }1598 }1599 ],1600 result: null1601 });1602 });1603 it('function type with rest param', () => {1604 var type = comments.parseType('function(...a)');1605 assert.deepEqual(type, {1606 type: 'FunctionType',1607 params: [1608 {1609 type: 'RestType',1610 expression: {1611 type: 'NameExpression',1612 name: 'a'1613 }1614 }1615 ],1616 result: null1617 });1618 });1619 it('function type with rest param name and type', () => {1620 var type = comments.parseType('function(...a:b)');1621 assert.deepEqual(type, {1622 type: 'FunctionType',1623 params: [1624 {1625 type: 'RestType',1626 expression: {1627 type: 'ParameterType',1628 name: 'a',1629 expression: {1630 type: 'NameExpression',1631 name: 'b'1632 }1633 }1634 }1635 ],1636 result: null1637 });1638 });1639 it('function type with optional rest param', () => {1640 var type = comments.parseType('function(...a=)');1641 assert.deepEqual(type, {1642 type: 'FunctionType',1643 params: [1644 {1645 type: 'RestType',1646 expression: {1647 type: 'OptionalType',1648 expression: {1649 type: 'NameExpression',1650 name: 'a'1651 }1652 }1653 }1654 ],1655 result: null1656 });1657 });1658 it('function type with optional rest param name and type', () => {1659 var type = comments.parseType('function(...a:b=)');1660 assert.deepEqual(type, {1661 type: 'FunctionType',1662 params: [1663 {1664 type: 'RestType',1665 expression: {1666 type: 'OptionalType',1667 expression: {1668 type: 'ParameterType',1669 name: 'a',1670 expression: {1671 type: 'NameExpression',1672 name: 'b'1673 }1674 }1675 }1676 }1677 ],1678 result: null1679 });1680 });1681 it('string value in type', () => {1682 var type;1683 type = comments.parseType("{'ok':String}");1684 assert.deepEqual(type, {1685 fields: [1686 {1687 key: 'ok',1688 type: 'FieldType',1689 value: {1690 name: 'String',1691 type: 'NameExpression'1692 }1693 }1694 ],1695 type: 'RecordType'1696 });1697 type = comments.parseType('{"\\r\\n\\t\\u2028\\x20\\u20\\b\\f\\v\\\r\n\\\n\\0\\07\\012\\o":String}');1698 assert.deepEqual(type, {1699 fields: [1700 {1701 key: '\r\n\t\u2028\x20u20\b\f\v\0\u0007\u000ao',1702 type: 'FieldType',1703 value: {1704 name: 'String',1705 type: 'NameExpression'1706 }1707 }1708 ],1709 type: 'RecordType'1710 });1711 assert.throws(() => comments.parseType('{\'ok":String}'), /unexpected quote/);1712 assert.throws(() => comments.parseType("{'o\n':String}"), /unexpected quote/);1713 });1714 it('number value in type', () => {1715 var type;1716 type = comments.parseType('{20:String}');1717 assert.deepEqual(type, {1718 fields: [1719 {1720 key: '20',1721 type: 'FieldType',1722 value: {1723 name: 'String',1724 type: 'NameExpression'1725 }1726 }1727 ],1728 type: 'RecordType'1729 });1730 type = comments.parseType('{.2:String, 30:Number, 0x20:String}');1731 assert.deepEqual(type, {1732 fields: [1733 {1734 key: '0.2',1735 type: 'FieldType',1736 value: {1737 name: 'String',1738 type: 'NameExpression'1739 }1740 },1741 {1742 key: '30',1743 type: 'FieldType',1744 value: {1745 name: 'Number',1746 type: 'NameExpression'1747 }1748 },1749 {1750 key: '32',1751 type: 'FieldType',1752 value: {1753 name: 'String',1754 type: 'NameExpression'1755 }1756 }1757 ],1758 type: 'RecordType'1759 });1760 type = comments.parseType('{0X2:String, 0:Number, 100e200:String, 10e-20:Number}');1761 assert.deepEqual(type, {1762 fields: [1763 {1764 key: '2',1765 type: 'FieldType',1766 value: {1767 name: 'String',1768 type: 'NameExpression'1769 }1770 },1771 {1772 key: '0',1773 type: 'FieldType',1774 value: {1775 name: 'Number',1776 type: 'NameExpression'1777 }1778 },1779 {1780 key: '1e+202',1781 type: 'FieldType',1782 value: {1783 name: 'String',1784 type: 'NameExpression'1785 }1786 },1787 {1788 key: '1e-19',1789 type: 'FieldType',1790 value: {1791 name: 'Number',1792 type: 'NameExpression'1793 }1794 }1795 ],1796 type: 'RecordType'1797 });1798 assert.throws(() => comments.parseType('{0x:String}'), /unexpected token/);1799 assert.throws(() => comments.parseType('{0x'), /unexpected token/);1800 assert.throws(() => comments.parseType('{0xd'), /unexpected token/);1801 assert.throws(() => comments.parseType('{0x2_:'), /unexpected token/);1802 assert.throws(() => comments.parseType('{021:'), /unexpected token/);1803 assert.throws(() => comments.parseType('{021_:'), /unexpected token/);1804 assert.throws(() => comments.parseType('{021'), /unexpected token/);1805 assert.throws(() => comments.parseType('{08'), /unexpected token/);1806 assert.throws(() => comments.parseType('{0y'), /unexpected token/);1807 assert.throws(() => comments.parseType('{0'), /unexpected token/);1808 assert.throws(() => comments.parseType('{100e2'), /unexpected token/);1809 assert.throws(() => comments.parseType('{100e-2'), /unexpected token/);1810 assert.throws(() => comments.parseType('{100e-200:'), /unexpected token/);1811 assert.throws(() => comments.parseType('{100e:'), /unexpected token/);1812 assert.throws(() => comments.parseType('function(number=, string)'), /not reach to EOF/);1813 });1814 it('dotted type', () => {1815 var type;1816 type = comments.parseType('Cocoa.Cappuccino');1817 assert.deepEqual(type, {1818 name: 'Cocoa.Cappuccino',1819 type: 'NameExpression'1820 });1821 });1822 it('rest array type', () => {1823 var type;1824 type = comments.parseType('[string,...string]');1825 assert.deepEqual(type, {1826 elements: [1827 {1828 name: 'string',1829 type: 'NameExpression'1830 },1831 {1832 expression: {1833 name: 'string',1834 type: 'NameExpression'1835 },1836 type: 'RestType'1837 }1838 ],1839 type: 'ArrayType'1840 });1841 });1842 it('nullable type', () => {1843 var type;1844 type = comments.parseType('string?');1845 assert.deepEqual(type, {1846 expression: {1847 name: 'string',1848 type: 'NameExpression'1849 },1850 prefix: false,1851 type: 'NullableType'1852 });1853 });1854 it('non-nullable type', () => {1855 var type;1856 type = comments.parseType('string!');1857 assert.deepEqual(type, {1858 expression: {1859 name: 'string',1860 type: 'NameExpression'1861 },1862 prefix: false,1863 type: 'NonNullableType'1864 });1865 });1866 it('toplevel multiple pipe type', () => {1867 var type;1868 type = comments.parseType('string|number|Test');1869 assert.deepEqual(type, {1870 elements: [1871 {1872 name: 'string',1873 type: 'NameExpression'1874 },1875 {1876 name: 'number',1877 type: 'NameExpression'1878 },1879 {1880 name: 'Test',1881 type: 'NameExpression'1882 }1883 ],1884 type: 'UnionType'1885 });1886 });1887 it('string literal type', () => {1888 var type;1889 type = comments.parseType('"Hello, World"');1890 assert.deepEqual(type, {1891 type: 'StringLiteralType',1892 value: 'Hello, World'1893 });1894 });1895 it('numeric literal type', () => {1896 var type;1897 type = comments.parseType('32');1898 assert.deepEqual(type, {1899 type: 'NumericLiteralType',1900 value: 321901 });1902 type = comments.parseType('-142.42');1903 assert.deepEqual(type, {1904 type: 'NumericLiteralType',1905 value: -142.421906 });1907 });1908 it('boolean literal type', () => {1909 var type;1910 type = comments.parseType('true');1911 assert.deepEqual(type, {1912 type: 'BooleanLiteralType',1913 value: true1914 });1915 type = comments.parseType('false');1916 assert.deepEqual(type, {1917 type: 'BooleanLiteralType',1918 value: false1919 });1920 });1921 it('illegal tokens', () => {1922 assert.throws(() => comments.parseType('.'), /unexpected token/);1923 assert.throws(() => comments.parseType('.d'), /unexpected token/);1924 assert.throws(() => comments.parseType('('), /unexpected token/);1925 assert.throws(() => comments.parseType('Test.'), /unexpected token/);1926 });1927 });1928 describe('parseParamType', () => {1929 it('question', () => {1930 var type = comments.parseParamType('?');1931 assert.deepEqual(type, {1932 type: 'NullableLiteral'1933 });1934 });1935 it('question option', () => {1936 var type = comments.parseParamType('?=');1937 assert.deepEqual(type, {1938 type: 'OptionalType',1939 expression: {1940 type: 'NullableLiteral'1941 }1942 });1943 });1944 it('function option parameters former', () => {1945 var type = comments.parseParamType('function(?, number)');1946 assert.deepEqual(type, {1947 type: 'FunctionType',1948 params: [1949 {1950 type: 'NullableLiteral'1951 },1952 {1953 type: 'NameExpression',1954 name: 'number'1955 }1956 ],1957 result: null1958 });1959 });1960 it('function option parameters latter', () => {1961 var type = comments.parseParamType('function(number, ?)');1962 assert.deepEqual(type, {1963 type: 'FunctionType',1964 params: [1965 {1966 type: 'NameExpression',1967 name: 'number'1968 },1969 {1970 type: 'NullableLiteral'1971 }1972 ],1973 result: null1974 });1975 });1976 it('function type union', () => {1977 var type = comments.parseParamType('function(): ?|number');1978 assert.deepEqual(type, {1979 type: 'UnionType',1980 elements: [1981 {1982 type: 'FunctionType',1983 params: [],1984 result: {1985 type: 'NullableLiteral'1986 }1987 },1988 {1989 type: 'NameExpression',1990 name: 'number'1991 }1992 ]1993 });1994 });1995 });1996 describe('invalid', () => {1997 it('empty union pipe', () => {1998 assert.throws(() => {1999 comments.parseType('(|)').should.throw();2000 });2001 assert.throws(() => {2002 comments.parseType('(string|)').should.throw();2003 });2004 assert.throws(() => {2005 comments.parseType('(string||)').should.throw();2006 });2007 });2008 it('comma only array type', () => {2009 assert.throws(() => {2010 comments.parseType('[,]').should.throw();2011 });2012 });2013 it('comma only record type', () => {2014 assert.throws(() => {2015 comments.parseType('{,,}').should.throw();2016 });2017 });2018 it('incorrect bracket', () => {2019 assert.throws(() => {2020 comments.parseParamType('int[').should.throw();2021 });2022 });2023 });2024 describe('tags option', () => {2025 it('only param', () => {2026 let res = comments.parseComment(['/**', ' * @const @const', ' * @param {String} y', ' */'].join('\n'), {2027 tags: ['param'],2028 unwrap: true2029 });2030 assert.equal(res.tags.length, 1);2031 assert(hasProperty(res.tags[0], 'title', 'param'));2032 assert(hasProperty(res.tags[0], 'name', 'y'));2033 });2034 it('param and type', () => {2035 let res = comments.parseComment(2036 ['/**', ' * @const x', ' * @param {String} y', ' * @type {String} ', ' */'].join('\n'),2037 {2038 tags: ['param', 'type'],2039 unwrap: true2040 }2041 );2042 assert.equal(res.tags.length, 2);2043 assert(hasProperty(res.tags[0], 'title', 'param'));2044 assert(hasProperty(res.tags[0], 'name', 'y'));2045 assert(hasProperty(res.tags[1], 'title', 'type'));2046 assert(hasProperty(res.tags[1], 'type'));2047 assert(hasProperty(res.tags[1].type, 'name', 'String'));2048 });2049 });2050 describe('invalid tags', () => {2051 it('bad tag 1', () => {2052 assert.throws(() => {2053 comments.parse(['/**', ' * @param {String} hucairz', ' */'].join('\n'), {2054 tags: 1,2055 unwrap: true2056 });2057 });2058 });2059 it('bad tag 2', () => {2060 assert.throws(() => {2061 comments.parse(['/**', ' * @param {String} hucairz', ' */'].join('\n'), {2062 tags: ['a', 1],2063 unwrap: true2064 });2065 });2066 });2067 });2068 describe('optional params', () => {2069 // should fail since sloppy option not set2070 it('failure 0', () => {2071 assert.deepEqual(comments.parseComment(['/**', ' * @param {String} [val]', ' */'].join('\n'), {2072 unwrap: true2073 }), {2074 description: '',2075 tags: []2076 });2077 });2078 it('failure 1', () => {2079 assert.deepEqual(comments2080 .parseComment(['/**', ' * @param [val', ' */'].join('\n'), {2081 unwrap: true,2082 sloppy: true2083 })2084 , {2085 description: '',2086 tags: []2087 });2088 });2089 it('success 1', () => {2090 assert.deepEqual(comments2091 .parseComment(['/**', ' * @param {String} [val]', ' */'].join('\n'), {2092 unwrap: true,2093 sloppy: true2094 })2095 , {2096 description: '',2097 tags: [2098 {2099 title: 'param',2100 description: null,2101 type: {2102 type: 'OptionalType',2103 expression: {2104 type: 'NameExpression',2105 name: 'String'2106 }2107 },2108 name: 'val'2109 }2110 ]2111 });2112 });2113 it('success 2', () => {2114 assert.deepEqual(comments2115 .parseComment(['/**', ' * @param {String=} val', ' */'].join('\n'), {2116 unwrap: true,2117 sloppy: true2118 })2119 , {2120 description: '',2121 tags: [2122 {2123 title: 'param',2124 description: null,2125 type: {2126 type: 'OptionalType',2127 expression: {2128 type: 'NameExpression',2129 name: 'String'2130 }2131 },2132 name: 'val'2133 }2134 ]2135 });2136 });2137 it('success 3', () => {2138 assert.deepEqual(comments2139 .parseComment(['/**', ' * @param {String=} [val=abc] some description', ' */'].join('\n'), {2140 unwrap: true,2141 sloppy: true2142 })2143 , {2144 description: '',2145 tags: [2146 {2147 title: 'param',2148 description: 'some description',2149 type: {2150 type: 'OptionalType',2151 expression: {2152 type: 'NameExpression',2153 name: 'String'2154 }2155 },2156 name: 'val',2157 default: 'abc'2158 }2159 ]2160 });2161 });2162 it('success 4', () => {2163 assert.deepEqual(comments2164 .parseComment(['/**', ' * @param {String=} [val = abc] some description', ' */'].join('\n'), {2165 unwrap: true,2166 sloppy: true2167 })2168 , {2169 description: '',2170 tags: [2171 {2172 title: 'param',2173 description: 'some description',2174 type: {2175 type: 'OptionalType',2176 expression: {2177 type: 'NameExpression',2178 name: 'String'2179 }2180 },2181 name: 'val',2182 default: 'abc'2183 }2184 ]2185 });2186 });2187 it('default string', () => {2188 assert.deepEqual(comments2189 .parseComment(['/**', ' * @param {String} [val="foo"] some description', ' */'].join('\n'), {2190 unwrap: true,2191 sloppy: true2192 })2193 , {2194 description: '',2195 tags: [2196 {2197 title: 'param',2198 description: 'some description',2199 type: {2200 type: 'OptionalType',2201 expression: {2202 type: 'NameExpression',2203 name: 'String'2204 }2205 },2206 name: 'val',2207 default: '"foo"'2208 }2209 ]2210 });2211 });2212 it('default string surrounded by whitespace', () => {2213 assert.deepEqual(comments2214 .parseComment(['/**', " * @param {String} [val= 'foo' ] some description", ' */'].join('\n'), {2215 unwrap: true,2216 sloppy: true2217 })2218 , {2219 description: '',2220 tags: [2221 {2222 title: 'param',2223 description: 'some description',2224 type: {2225 type: 'OptionalType',2226 expression: {2227 type: 'NameExpression',2228 name: 'String'2229 }2230 },2231 name: 'val',2232 default: "'foo'"2233 }2234 ]2235 });2236 });2237 it('should preserve whitespace in default string', () => {2238 assert.deepEqual(comments2239 .parseComment(['/**', ' * @param {String} [val= " foo" ] some description', ' */'].join('\n'), {2240 unwrap: true,2241 sloppy: true2242 })2243 , {2244 description: '',2245 tags: [2246 {2247 title: 'param',2248 description: 'some description',2249 type: {2250 type: 'OptionalType',2251 expression: {2252 type: 'NameExpression',2253 name: 'String'2254 }2255 },2256 name: 'val',2257 default: '" foo"'2258 }2259 ]2260 });2261 });2262 it('default array', () => {2263 assert.deepEqual(comments2264 .parseComment(['/**', " * @param {String} [val=['foo']] some description", ' */'].join('\n'), {2265 unwrap: true,2266 sloppy: true2267 })2268 , {2269 description: '',2270 tags: [2271 {2272 title: 'param',2273 description: 'some description',2274 type: {2275 type: 'OptionalType',2276 expression: {2277 type: 'NameExpression',2278 name: 'String'2279 }2280 },2281 name: 'val',2282 default: "['foo']"2283 }2284 ]2285 });2286 });2287 it('default array', () => {2288 assert.deepEqual(comments2289 .parseComment(['/**', " * @param {String} [val=['foo']] some description", ' */'].join('\n'), {2290 unwrap: true,2291 sloppy: true2292 })2293 , {2294 description: '',2295 tags: [2296 {2297 title: 'param',2298 description: 'some description',2299 type: {2300 type: 'OptionalType',2301 expression: {2302 type: 'NameExpression',2303 name: 'String'2304 }2305 },2306 name: 'val',2307 default: "['foo']"2308 }2309 ]2310 });2311 });2312 it('default array within white spaces', () => {2313 assert.deepEqual(comments2314 .parseComment(['/**', " * @param {String} [val = [ 'foo' ]] some description", ' */'].join('\n'), {2315 unwrap: true,2316 sloppy: true2317 })2318 , {2319 description: '',2320 tags: [2321 {2322 title: 'param',2323 description: 'some description',2324 type: {2325 type: 'OptionalType',2326 expression: {2327 type: 'NameExpression',2328 name: 'String'2329 }2330 },2331 name: 'val',2332 default: "['foo']"2333 }2334 ]2335 });2336 });2337 it('line numbers', () => {2338 let res = comments.parseComment(2339 [2340 '/**',2341 ' * @constructor',2342 ' * @param {string} foo',2343 ' * @returns {string}',2344 ' *',2345 ' * @example',2346 " * f('blah'); // => undefined",2347 ' */'2348 ].join('\n'),2349 {2350 unwrap: true,2351 lineNumbers: true2352 }2353 );2354 assert(hasProperty(res.tags[0], 'lineNumber', 1));2355 assert(hasProperty(res.tags[1], 'lineNumber', 2));2356 assert(hasProperty(res.tags[2], 'lineNumber', 3));2357 assert(hasProperty(res.tags[3], 'lineNumber', 5));2358 });2359 it('example caption', () => {2360 let res = comments.parseComment(2361 ['/**', ' * @example <caption>hi</caption>', " * f('blah'); // => undefined", ' */'].join('\n'),2362 {2363 unwrap: true,2364 lineNumbers: true2365 }2366 );2367 assert.deepEqual(res.tags[0].description, "f('blah'); // => undefined");2368 assert.deepEqual(res.tags[0].caption, 'hi');2369 });2370 it('should handle \\r\\n line endings correctly', () => {2371 let res = comments.parseComment(2372 [2373 '/**',2374 ' * @param {string} foo',2375 ' * @returns {string}',2376 ' *',2377 ' * @example',2378 " * f('blah'); // => undefined",2379 ' */'2380 ].join('\r\n'),2381 {2382 unwrap: true,2383 lineNumbers: true2384 }2385 );2386 assert(hasProperty(res.tags[0], 'lineNumber', 1));2387 assert(hasProperty(res.tags[1], 'lineNumber', 2));2388 assert(hasProperty(res.tags[2], 'lineNumber', 4));2389 });2390 });2391 describe('optional properties', () => {2392 // should fail since sloppy option not set2393 it('failure 0', () => {2394 assert.deepEqual(comments2395 .parseComment(['/**', ' * @property {String} [val] some description', ' */'].join('\n'), {2396 unwrap: true2397 })2398 , {2399 description: '',2400 tags: []2401 });2402 });2403 it('failure 1', () => {2404 assert.deepEqual(comments2405 .parseComment(['/**', ' * @property [val', ' */'].join('\n'), {2406 unwrap: true,2407 sloppy: true2408 })2409 , {2410 description: '',2411 tags: []2412 });2413 });2414 it('success 1', () => {2415 assert.deepEqual(comments2416 .parseComment(['/**', ' * @property {String} [val]', ' */'].join('\n'), {2417 unwrap: true,2418 sloppy: true2419 })2420 , {2421 description: '',2422 tags: [2423 {2424 title: 'property',2425 description: null,2426 type: {2427 type: 'OptionalType',2428 expression: {2429 type: 'NameExpression',2430 name: 'String'2431 }2432 },2433 name: 'val'2434 }2435 ]2436 });2437 });2438 it('success 2', () => {2439 assert.deepEqual(comments2440 .parseComment(['/**', ' * @property {String=} val', ' */'].join('\n'), {2441 unwrap: true,2442 sloppy: true2443 })2444 , {2445 description: '',2446 tags: [2447 {2448 title: 'property',2449 description: null,2450 type: {2451 type: 'OptionalType',2452 expression: {2453 type: 'NameExpression',2454 name: 'String'2455 }2456 },2457 name: 'val'2458 }2459 ]2460 });2461 });2462 it('success 3', () => {2463 assert.deepEqual(comments2464 .parseComment(['/**', ' * @property {String=} [val=abc] some description', ' */'].join('\n'), {2465 unwrap: true,2466 sloppy: true2467 })2468 , {2469 description: '',2470 tags: [2471 {2472 title: 'property',2473 description: 'some description',2474 type: {2475 type: 'OptionalType',2476 expression: {2477 type: 'NameExpression',2478 name: 'String'2479 }2480 },2481 name: 'val',2482 default: 'abc'2483 }2484 ]2485 });2486 });2487 it('success 4', () => {2488 assert.deepEqual(comments2489 .parseComment(['/**', ' * @property {String=} [val = abc] some description', ' */'].join('\n'), {2490 unwrap: true,2491 sloppy: true2492 })2493 , {2494 description: '',2495 tags: [2496 {2497 title: 'property',2498 description: 'some description',2499 type: {2500 type: 'OptionalType',2501 expression: {2502 type: 'NameExpression',2503 name: 'String'2504 }2505 },2506 name: 'val',2507 default: 'abc'2508 }2509 ]2510 });2511 });2512 it('default string', () => {2513 assert.deepEqual(comments2514 .parseComment(['/**', ' * @property {String} [val="foo"] some description', ' */'].join('\n'), {2515 unwrap: true,2516 sloppy: true2517 })2518 , {2519 description: '',2520 tags: [2521 {2522 title: 'property',2523 description: 'some description',2524 type: {2525 type: 'OptionalType',2526 expression: {2527 type: 'NameExpression',2528 name: 'String'2529 }2530 },2531 name: 'val',2532 default: '"foo"'2533 }2534 ]2535 });2536 });2537 it('default string surrounded by whitespace', () => {2538 assert.deepEqual(comments2539 .parseComment(['/**', " * @property {String} [val= 'foo' ] some description", ' */'].join('\n'), {2540 unwrap: true,2541 sloppy: true2542 })2543 , {2544 description: '',2545 tags: [2546 {2547 title: 'property',2548 description: 'some description',2549 type: {2550 type: 'OptionalType',2551 expression: {2552 type: 'NameExpression',2553 name: 'String'2554 }2555 },2556 name: 'val',2557 default: "'foo'"2558 }2559 ]2560 });2561 });2562 it('should preserve whitespace in default string', () => {2563 assert.deepEqual(comments2564 .parseComment(['/**', ' * @property {String} [val= " foo" ] some description', ' */'].join('\n'), {2565 unwrap: true,2566 sloppy: true2567 })2568 , {2569 description: '',2570 tags: [2571 {2572 title: 'property',2573 description: 'some description',2574 type: {2575 type: 'OptionalType',2576 expression: {2577 type: 'NameExpression',2578 name: 'String'2579 }2580 },2581 name: 'val',2582 default: '" foo"'2583 }2584 ]2585 });2586 });2587 it('default array', () => {2588 assert.deepEqual(comments2589 .parseComment(['/**', " * @property {String} [val=['foo']] some description", ' */'].join('\n'), {2590 unwrap: true,2591 sloppy: true2592 })2593 , {2594 description: '',2595 tags: [2596 {2597 title: 'property',2598 description: 'some description',2599 type: {2600 type: 'OptionalType',2601 expression: {2602 type: 'NameExpression',2603 name: 'String'2604 }2605 },2606 name: 'val',2607 default: "['foo']"2608 }2609 ]2610 });2611 });2612 it('default array within white spaces', () => {2613 assert.deepEqual(comments2614 .parseComment(['/**', " * @property {String} [val = [ 'foo' ]] some description", ' */'].join('\n'), {2615 unwrap: true,2616 sloppy: true2617 })2618 , {2619 description: '',2620 tags: [2621 {2622 title: 'property',2623 description: 'some description',2624 type: {2625 type: 'OptionalType',2626 expression: {2627 type: 'NameExpression',2628 name: 'String'2629 }2630 },2631 name: 'val',2632 default: "['foo']"2633 }2634 ]2635 });2636 });2637 });2638 describe('recovery tests', () => {2639 it('params 2', () => {2640 let res = comments.parseComment(['@param f', '@param {string} f2'].join('\n'), {2641 recoverable: true2642 });2643 // ensure both parameters are OK2644 assert.equal(res.tags.length, 2);2645 assert(hasProperty(res.tags[0], 'title', 'param'));2646 assert(hasProperty(res.tags[0], 'type', null));2647 assert(hasProperty(res.tags[0], 'name', 'f'));2648 assert(hasProperty(res.tags[1], 'title', 'param'));2649 assert(hasProperty(res.tags[1], 'type'));2650 assert(hasProperty(res.tags[1].type, 'name', 'string'));2651 assert(hasProperty(res.tags[1].type, 'type', 'NameExpression'));2652 assert(hasProperty(res.tags[1], 'name', 'f2'));2653 });2654 it('params 2', () => {2655 let res = comments.parseComment(['@param string f', '@param {string} f2'].join('\n'), {2656 recoverable: true2657 });2658 // ensure first parameter is OK even with invalid type name2659 assert.equal(res.tags.length, 2);2660 assert(hasProperty(res.tags[0], 'title', 'param'));2661 assert(hasProperty(res.tags[0], 'type', null));2662 assert(hasProperty(res.tags[0], 'name', 'string'));2663 assert(hasProperty(res.tags[0], 'description', 'f'));2664 assert(hasProperty(res.tags[1], 'title', 'param'));2665 assert(hasProperty(res.tags[1], 'type'));2666 assert(hasProperty(res.tags[1].type, 'name', 'string'));2667 assert(hasProperty(res.tags[1].type, 'type', 'NameExpression'));2668 assert(hasProperty(res.tags[1], 'name', 'f2'));2669 });2670 it('return 1', () => {2671 let res = comments.parseComment(['@returns'].join('\n'), {2672 recoverable: true2673 });2674 // return tag should exist2675 assert.equal(res.tags.length, 1);2676 assert(hasProperty(res.tags[0], 'title', 'returns'));2677 assert(hasProperty(res.tags[0], 'type', null));2678 });2679 it('return 2', () => {2680 let res = comments.parseComment(['@returns', '@param {string} f2'].join('\n'), {2681 recoverable: true2682 });2683 // return tag should exist as well as next tag2684 assert.equal(res.tags.length, 2);2685 assert(hasProperty(res.tags[0], 'title', 'returns'));2686 assert(hasProperty(res.tags[0], 'type', null));2687 assert(hasProperty(res.tags[1], 'title', 'param'));2688 assert(hasProperty(res.tags[1], 'type'));2689 assert(hasProperty(res.tags[1].type, 'name', 'string'));2690 assert(hasProperty(res.tags[1].type, 'type', 'NameExpression'));2691 assert(hasProperty(res.tags[1], 'name', 'f2'));2692 });2693 it('return no type', () => {2694 let res = comments.parseComment(['@return a value'].join('\n'));2695 // return tag should exist2696 assert.equal(res.tags.length, 1);2697 assert(hasProperty(res.tags[0], 'title', 'return'));2698 assert(hasProperty(res.tags[0], 'type', null));2699 assert(hasProperty(res.tags[0], 'description', 'a value'));2700 });2701 it('extra @ 1', () => {2702 let res = comments.parseComment(['@', '@returns', '@param {string} f2'].join('\n'), {2703 recoverable: true2704 });2705 // empty tag name shouldn't affect subsequent tags2706 assert.equal(res.tags.length, 3);2707 assert(hasProperty(res.tags[0], 'title', ''));2708 assert(!res.tags[0].hasOwnProperty('type'));2709 assert(hasProperty(res.tags[1], 'title', 'returns'));2710 assert(hasProperty(res.tags[1], 'type', null));2711 assert(hasProperty(res.tags[2], 'title', 'param'));2712 assert(hasProperty(res.tags[2], 'type'));2713 assert(hasProperty(res.tags[2].type, 'name', 'string'));2714 assert(hasProperty(res.tags[2].type, 'type', 'NameExpression'));2715 assert(hasProperty(res.tags[2], 'name', 'f2'));2716 });2717 it('extra @ 2', () => {2718 let res = comments.parseComment(['@ invalid name', '@param {string} f2'].join('\n'), {2719 recoverable: true2720 });2721 // empty tag name shouldn't affect subsequent tags2722 assert.equal(res.tags.length, 2);2723 assert(hasProperty(res.tags[0], 'title', ''));2724 assert(!res.tags[0].hasOwnProperty('type'));2725 assert(!res.tags[0].hasOwnProperty('name'));2726 assert(hasProperty(res.tags[0], 'description', 'invalid name'));2727 assert(hasProperty(res.tags[1], 'title', 'param'));2728 assert(hasProperty(res.tags[1], 'type'));2729 assert(hasProperty(res.tags[1].type, 'name', 'string'));2730 assert(hasProperty(res.tags[1].type, 'type', 'NameExpression'));2731 assert(hasProperty(res.tags[1], 'name', 'f2'));2732 });2733 it('invalid tag 1', () => {2734 let res = comments.parseComment(['@111 invalid name', '@param {string} f2'].join('\n'), {2735 recoverable: true2736 });2737 // invalid tag name shouldn't affect subsequent tags2738 assert.equal(res.tags.length, 2);2739 assert(hasProperty(res.tags[0], 'title', '111'));2740 assert(!res.tags[0].hasOwnProperty('type'));2741 assert(!res.tags[0].hasOwnProperty('name'));2742 assert(hasProperty(res.tags[0], 'description', 'invalid name'));2743 assert(hasProperty(res.tags[1], 'title', 'param'));2744 assert(hasProperty(res.tags[1], 'type'));2745 assert(hasProperty(res.tags[1].type, 'name', 'string'));2746 assert(hasProperty(res.tags[1].type, 'type', 'NameExpression'));2747 assert(hasProperty(res.tags[1], 'name', 'f2'));2748 });2749 it('invalid tag 1', () => {2750 let res = comments.parseComment(['@111', '@param {string} f2'].join('\n'), {2751 recoverable: true2752 });2753 // invalid tag name shouldn't affect subsequent tags2754 assert.equal(res.tags.length, 2);2755 assert(hasProperty(res.tags[0], 'title', '111'));2756 assert(!res.tags[0].hasOwnProperty('type'));2757 assert(!res.tags[0].hasOwnProperty('name'));2758 assert(hasProperty(res.tags[0], 'description', null));2759 assert(hasProperty(res.tags[1], 'title', 'param'));2760 assert(hasProperty(res.tags[1], 'type'));2761 assert(hasProperty(res.tags[1].type, 'name', 'string'));2762 assert(hasProperty(res.tags[1].type, 'type', 'NameExpression'));2763 assert(hasProperty(res.tags[1], 'name', 'f2'));2764 });2765 it('should not crash on bad type in @param without name', () => {2766 let res = comments.parseComment('@param {Function(DOMNode)}', {2767 recoverable: true2768 });2769 assert.equal(res.tags.length, 1);2770 assert.deepEqual(res.tags[0], {2771 description: null,2772 errors: ['not reach to EOF', 'Missing or invalid tag name'],2773 name: null,2774 title: 'param',2775 type: null2776 });2777 });2778 it('should not crash on bad type in @param in sloppy mode', () => {2779 let res = comments.parseComment('@param {int[} [x]', {2780 sloppy: true,2781 recoverable: true2782 });2783 assert.equal(res.tags.length, 1);2784 assert.deepEqual(res.tags[0], {2785 description: null,2786 errors: ['expected an array-style type declaration (int[])'],2787 name: 'x',2788 title: 'param',2789 type: null2790 });2791 });2792 });2793 describe('@ mark contained descriptions', () => {2794 it('comment description #10', () => {2795 let res = comments.parseComment(2796 [2797 '/**',2798 ' * Prevents the default action. It is equivalent to',2799 ' * {@code e.preventDefault()}, but can be used as the callback argument of',2800 ' * {@link goog.events.listen} without declaring another function.',2801 ' * @param {!goog.events.Event} e An event.',2802 ' */'2803 ].join('\n'),2804 {2805 unwrap: true,2806 sloppy: true2807 }2808 );2809 assert.equal(2810 res.description,2811 'Prevents the default action. It is equivalent to\n{@code e.preventDefault()}, but can be used as the callback argument of\n{@link goog.events.listen} without declaring another function.'2812 );2813 assert.deepEqual(res.tags, [2814 {2815 title: 'param',2816 description: 'An event.',2817 type: {2818 type: 'NonNullableType',2819 expression: {2820 type: 'NameExpression',2821 name: 'goog.events.Event'2822 },2823 prefix: true2824 },2825 name: 'e'2826 }2827 ]);2828 });2829 it('tag description', () => {2830 assert.deepEqual(comments.parseComment(2831 [2832 '/**',2833 ' * Prevents the default action. It is equivalent to',2834 ' * @param {!goog.events.Event} e An event.',2835 ' * {@code e.preventDefault()}, but can be used as the callback argument of',2836 ' * {@link goog.events.listen} without declaring another function.',2837 ' */'2838 ].join('\n'),2839 {2840 unwrap: true,2841 sloppy: true2842 })2843 , {2844 description: 'Prevents the default action. It is equivalent to',2845 inlineTags: [],2846 tags: [2847 {2848 title: 'param',2849 description:2850 'An event.\n{@code e.preventDefault()}, but can be used as the callback argument of\n{@link goog.events.listen} without declaring another function.',2851 type: {2852 type: 'NonNullableType',2853 expression: {2854 type: 'NameExpression',2855 name: 'goog.events.Event'2856 },2857 prefix: true2858 },2859 name: 'e'2860 }2861 ]2862 });2863 });2864 });2865 describe('function', () => {2866 it('recognize "function" type', () => {2867 let res = comments.parseComment('@param {function} foo description', {});2868 assert.equal(res.tags.length, 1);2869 assert(hasProperty(res.tags[0], 'title', 'param'));2870 assert(hasProperty(res.tags[0], 'type'));2871 assert.deepEqual(res.tags[0].type, {2872 name: 'function',2873 type: 'NameExpression'2874 });2875 assert(hasProperty(res.tags[0], 'name', 'foo'));2876 assert(hasProperty(res.tags[0], 'description', 'description'));2877 });2878 });2879 describe('tagged namepaths', () => {2880 it('recognize module:', () => {2881 let res = comments.parseComment(['@alias module:Foo.bar'].join('\n'), {});2882 assert.equal(res.tags.length, 1);2883 assert(hasProperty(res.tags[0], 'title', 'alias'));2884 assert(hasProperty(res.tags[0], 'name', 'module:Foo.bar'));2885 assert(hasProperty(res.tags[0], 'description', null));2886 });2887 it('recognize external:', () => {2888 let res = comments.parseComment(['@param {external:Foo.bar} baz description'].join('\n'), {});2889 assert.equal(res.tags.length, 1);2890 assert(hasProperty(res.tags[0], 'title', 'param'));2891 assert.deepEqual(res.tags[0].type, {2892 name: 'external:Foo.bar',2893 type: 'NameExpression'2894 });2895 assert(hasProperty(res.tags[0], 'name', 'baz'));2896 assert(hasProperty(res.tags[0], 'description', 'description'));2897 });2898 it('recognize event:', () => {2899 let res = comments.parseComment(['@function event:Foo.bar'].join('\n'), {});2900 assert.equal(res.tags.length, 1);2901 assert(hasProperty(res.tags[0], 'title', 'function'));2902 assert(hasProperty(res.tags[0], 'name', 'event:Foo.bar'));2903 assert(hasProperty(res.tags[0], 'description', null));2904 });2905 it('invalid bogus:', () => {2906 let res = comments.parseComment(['@method bogus:Foo.bar'].join('\n'), {});2907 assert.equal(res.tags.length, 0);2908 });2909 });...
parse.optional.js
Source:parse.optional.js
...17 });18 describe('optional params', () => {19 // should fail since sloppy option not set20 it('failure 0', () => {21 let res = comments.parseComment('/** * @param {String} [val] */', {22 unwrap: true,23 strict: true24 });25 assert.equal(res.tags.length, 0);26 assert.equal(res.description, '');27 });28 it('failure 1', () => {29 let res = comments.parseComment('/** * @param [val */', {30 unwrap: true,31 strict: false32 });33 assert.deepEqual(pick(res, ['tags', 'description']), {34 'description': '',35 'tags': []36 });37 });38 it('success 1', () => {39 let res = comments.parseComment(['/**', ' * @param {String} [val]', ' */'].join('\n'), {40 unwrap: true,41 strict: false42 });43 assert.deepEqual(pick(res, ['tags', 'description']), {44 'description': '',45 'tags': [{46 'title': 'param',47 'description': '',48 'type': {49 'type': 'OptionalType',50 'expression': {51 'type': 'NameExpression',52 'name': 'String'53 }54 },55 'name': 'val'56 }]57 });58 });59 it('success 2', () => {60 let res = comments.parseComment(['/**', ' * @param {String=} val', ' */'].join('\n'), {61 unwrap: true,62 strict: false63 });64 assert.deepEqual(pick(res, ['tags', 'description']), {65 'description': '',66 'tags': [{67 'title': 'param',68 'description': '',69 'type': {70 'type': 'OptionalType',71 'expression': {72 'type': 'NameExpression',73 'name': 'String'74 }75 },76 'name': 'val'77 }]78 });79 });80 it('success 3', () => {81 let res = comments.parseComment('/** * @param {String=} [val=abc] some description */', {82 unwrap: true,83 strict: false84 });85 assert.deepEqual(pick(res, ['tags', 'description']), {86 description: '',87 tags: [88 {89 title: 'param',90 description: 'some description',91 inlineTags: [],92 type: {93 type: 'OptionalType',94 expression: {95 type: 'NameExpression',96 name: 'String'97 }98 },99 name: 'val',100 default: 'abc'101 }102 ]103 });104 });105 it('success 4', () => {106 let res = comments.parseComment(['/**', ' * @param {String=} [val = abc] some description', ' */'].join('\n'), {107 unwrap: true,108 strict: false109 });110 assert.deepEqual(pick(res, ['tags', 'description']), {111 description: '',112 tags: [113 {114 title: 'param',115 description: 'some description',116 inlineTags: [],117 type: {118 type: 'OptionalType',119 expression: {120 type: 'NameExpression',121 name: 'String'122 }123 },124 name: 'val',125 default: 'abc'126 }127 ]128 });129 });130 it('default string', () => {131 let res = comments.parseComment(['/**', ' * @param {String} [val="foo"] some description', ' */'].join('\n'), {132 unwrap: true,133 strict: false134 });135 assert.deepEqual(pick(res, ['tags', 'description']), {136 description: '',137 tags: [138 {139 title: 'param',140 description: 'some description',141 inlineTags: [],142 type: {143 type: 'OptionalType',144 expression: {145 type: 'NameExpression',146 name: 'String'147 }148 },149 name: 'val',150 default: '"foo"'151 }152 ]153 });154 });155 it('default string surrounded by whitespace', () => {156 let res = comments.parseComment(['/**', " * @param {String} [val= 'foo' ] some description", ' */'].join('\n'), {157 unwrap: true,158 strict: false159 });160 assert.deepEqual(pick(res, ['tags', 'description']), {161 description: '',162 tags: [163 {164 title: 'param',165 description: 'some description',166 inlineTags: [],167 type: {168 type: 'OptionalType',169 expression: {170 type: 'NameExpression',171 name: 'String'172 }173 },174 name: 'val',175 default: "'foo'"176 }177 ]178 });179 });180 it('should preserve whitespace in default string', () => {181 let res = comments.parseComment(['/**', ' * @param {String} [val= " foo" ] some description', ' */'].join('\n'), {182 unwrap: true,183 strict: false184 });185 assert.deepEqual(pick(res, ['tags', 'description']), {186 description: '',187 tags: [188 {189 title: 'param',190 description: 'some description',191 inlineTags: [],192 type: {193 type: 'OptionalType',194 expression: {195 type: 'NameExpression',196 name: 'String'197 }198 },199 name: 'val',200 default: '" foo"'201 }202 ]203 });204 });205 it('default array', () => {206 let res = comments.parseComment(['/**', " * @param {String} [val=['foo']] some description", ' */'].join('\n'), {207 unwrap: true,208 strict: false209 });210 assert.deepEqual(pick(res, ['tags', 'description']), {211 description: '',212 tags: [213 {214 title: 'param',215 description: 'some description',216 inlineTags: [],217 type: {218 type: 'OptionalType',219 expression: {220 type: 'NameExpression',221 name: 'String'222 }223 },224 name: 'val',225 default: "['foo']"226 }227 ]228 });229 });230 it('default array', () => {231 let res = comments.parseComment(['/**', " * @param {String} [val=['foo']] some description", ' */'].join('\n'), {232 unwrap: true,233 strict: false234 });235 assert.deepEqual(pick(res, ['tags', 'description']), {236 description: '',237 tags: [238 {239 title: 'param',240 description: 'some description',241 inlineTags: [],242 type: {243 type: 'OptionalType',244 expression: {245 type: 'NameExpression',246 name: 'String'247 }248 },249 name: 'val',250 default: "['foo']"251 }252 ]253 });254 });255 it('default array within white spaces', () => {256 let res = comments.parseComment(['/**', " * @param {String} [val = [ 'foo' ]] some description", ' */'].join('\n'), {257 unwrap: true,258 strict: false259 });260 assert.deepEqual(pick(res, ['tags', 'description']), {261 description: '',262 tags: [263 {264 title: 'param',265 description: 'some description',266 inlineTags: [],267 type: {268 type: 'OptionalType',269 expression: {270 type: 'NameExpression',271 name: 'String'272 }273 },274 name: 'val',275 default: "[ 'foo' ]"276 }277 ]278 });279 });280 it('example caption', () => {281 let res = comments.parseComment([282 '/**',283 ' * @example <caption>hi</caption>',284 " * f('blah'); // => undefined",285 ' */'286 ].join('\n'), {287 unwrap: true,288 jsdoc: true289 });290 assert.equal(res.tags[0].description, "f('blah'); // => undefined");291 assert.equal(res.tags[0].caption, 'hi');292 });293 it('should handle \\r\\n line endings correctly', () => {294 let res = comments.parseComment([295 '/**',296 ' * @param {string} foo',297 ' * @returns {string}',298 ' *',299 ' * @example',300 " * f('blah'); // => undefined",301 ' */'302 ].join('\r\n'), {303 unwrap: true,304 jsdoc: true305 });306 assert.equal(res.tags[2].description, "f('blah'); // => undefined");307 });308 });309 describe('optional properties', () => {310 // should fail since sloppy option not set311 it('failure 0', () => {312 let res = comments.parseComment(['/**',313 ' * @property {String} [val] some description',314 ' */'315 ].join('\n'), {316 unwrap: true,317 strict: true318 });319 assert.deepEqual(pick(res, ['tags', 'description']), {320 'description': '',321 'tags': []322 });323 });324 it('failure 1', () => {325 let res = comments.parseComment(['/**', ' * @property [val', ' */'].join('\n'), {326 unwrap: true,327 strict: false328 });329 assert.deepEqual(pick(res, ['tags', 'description']), {330 'description': '',331 'tags': []332 });333 });334 it('success 1', () => {335 let res = comments.parseComment(['/**', ' * @property {String} [val]', ' */'].join('\n'), {336 unwrap: true,337 strict: false338 });339 assert.deepEqual(pick(res, ['tags', 'description']), {340 description: '',341 tags: [342 {343 title: 'property',344 description: '',345 type: {346 type: 'OptionalType',347 expression: {348 type: 'NameExpression',349 name: 'String'350 }351 },352 name: 'val'353 }354 ]355 });356 });357 it('success 2', () => {358 let res = comments.parseComment(['/**', ' * @property {String=} val', ' */'].join('\n'), {359 unwrap: true,360 strict: false361 });362 assert.deepEqual(pick(res, ['tags', 'description']), {363 description: '',364 tags: [365 {366 title: 'property',367 description: '',368 type: {369 type: 'OptionalType',370 expression: {371 type: 'NameExpression',372 name: 'String'373 }374 },375 name: 'val'376 }377 ]378 });379 });380 it('success 3', () => {381 let res = comments.parseComment(['/**', ' * @property {String=} [val=abc] some description', ' */'].join('\n'), {382 unwrap: true,383 strict: false384 });385 assert.deepEqual(pick(res, ['tags', 'description']), {386 description: '',387 tags: [388 {389 title: 'property',390 description: 'some description',391 inlineTags: [],392 type: {393 type: 'OptionalType',394 expression: {395 type: 'NameExpression',396 name: 'String'397 }398 },399 name: 'val',400 default: 'abc'401 }402 ]403 });404 });405 it('success 4', () => {406 let res = comments.parseComment(['/**', ' * @property {String=} [val = abc] some description', ' */'].join('\n'), {407 unwrap: true,408 strict: false409 });410 assert.deepEqual(pick(res, ['tags', 'description']), {411 description: '',412 tags: [413 {414 title: 'property',415 description: 'some description',416 inlineTags: [],417 type: {418 type: 'OptionalType',419 expression: {420 type: 'NameExpression',421 name: 'String'422 }423 },424 name: 'val',425 default: 'abc'426 }427 ]428 });429 });430 it('default string', () => {431 let res = comments.parseComment(['/**', ' * @property {String} [val="foo"] some description', ' */'].join('\n'), {432 unwrap: true,433 strict: false434 });435 assert.deepEqual(pick(res, ['tags', 'description']), {436 description: '',437 tags: [438 {439 title: 'property',440 description: 'some description',441 inlineTags: [],442 type: {443 type: 'OptionalType',444 expression: {445 type: 'NameExpression',446 name: 'String'447 }448 },449 name: 'val',450 default: '"foo"'451 }452 ]453 });454 });455 it('default string surrounded by whitespace', () => {456 let res = comments.parseComment(['/**', " * @property {String} [val= 'foo' ] some description", ' */'].join('\n'), {457 unwrap: true,458 strict: false459 });460 assert.deepEqual(pick(res, ['tags', 'description']), {461 description: '',462 tags: [463 {464 title: 'property',465 description: 'some description',466 inlineTags: [],467 type: {468 type: 'OptionalType',469 expression: {470 type: 'NameExpression',471 name: 'String'472 }473 },474 name: 'val',475 default: "'foo'"476 }477 ]478 });479 });480 it('should preserve whitespace in default string', () => {481 let res = comments.parseComment(['/**', ' * @property {String} [val= " foo" ] some description', ' */'].join('\n'), {482 unwrap: true,483 strict: false484 });485 assert.deepEqual(pick(res, ['tags', 'description']), {486 description: '',487 tags: [488 {489 title: 'property',490 description: 'some description',491 inlineTags: [],492 type: {493 type: 'OptionalType',494 expression: {495 type: 'NameExpression',496 name: 'String'497 }498 },499 name: 'val',500 default: '" foo"'501 }502 ]503 });504 });505 it('default array', () => {506 let res = comments.parseComment(['/**', " * @property {String} [val=['foo']] some description", ' */'].join('\n'), {507 unwrap: true,508 strict: false509 });510 assert.deepEqual(pick(res, ['tags', 'description']), {511 description: '',512 tags: [513 {514 title: 'property',515 description: 'some description',516 inlineTags: [],517 type: {518 type: 'OptionalType',519 expression: {520 type: 'NameExpression',521 name: 'String'522 }523 },524 name: 'val',525 default: "['foo']"526 }527 ]528 });529 });530 it('default array within white spaces', () => {531 let res = comments.parseComment(['/**', " * @property {String} [val = [ 'foo' ]] some description", ' */'].join('\n'), {532 unwrap: true,533 strict: false534 });535 assert.deepEqual(pick(res, ['tags', 'description']), {536 description: '',537 tags: [538 {539 title: 'property',540 description: 'some description',541 inlineTags: [],542 type: {543 type: 'OptionalType',544 expression: {545 type: 'NameExpression',...
Parser.js
Source:Parser.js
...21 constructor22 *************23 */24 `;25 var test = qx.tool.compiler.jsdoc.Parser.parseComment(text);26 this.assert(qx.lang.Object.equals(test, {}));27 },28 29 testCheckParams: function() {30 let text = `*31 @param {String} json jsdoc style32 @param json {String} qooxdoo style33 `; 34 var test = qx.tool.compiler.jsdoc.Parser.parseComment(text);35 qx.tool.compiler.jsdoc.Parser.parseJsDoc(test, "test", null);36 console.log(test["@description"][0].body);37 this.assert(test["@description"][0].body === "");38 this.assert(test["@param"].length === 2);39 },40 41 testCheckIssue633: function() {42 {43 let text = `*44 // [Constructor]45 `; 46 var test = qx.tool.compiler.jsdoc.Parser.parseComment(text);47 console.log(test["@description"][0].body);48 this.assert(test["@description"][0].body === "");49 }50 {51 let text = `52 *53 * Create an editor instance54 * 55 * [Constructor]56 * 57 * @return {Object}58 *59 `; 60 test = qx.tool.compiler.jsdoc.Parser.parseComment(text);61 console.log(test["@description"][0].body);62 this.assert(test["@description"][0].body !== "");63 }64 },65 66 testCheckRpc: function() {67 let text = `68 * <p>This namespace provides an API implementing the69 * <a href="https://www.jsonrpc.org/specification">JSON Remote Procedure Call (JSON-RPC) version 2 specification</a>70 * </p>71 * <p>JSON-RPC v2 is transport-agnostic. We provide a high-level72 * API interface (qx.io.jsonrpc.Client), a transport interface73 * (qx.io.jsonrpc.transport.ITransport) and an HTTP transport implementation.74 * Other transports based on websockets or other mechanisms can be added later.75 * </p>76 * Here is an example:77 *78 * <pre class="javascript">79 * (async()=>{80 * const client = new qx.io.jsonrpc.Client("https://domain.com/endpoint");81 * let result;82 * try {83 * client.sendNotification("other_method", [1,2,3]); // notifications are "fire & forget"84 * result = await client.sendRequest("other_method", [1,2,3]);85 * } catch(e) {86 * // handle exceptions87 * }88 * })();89 * </pre>90 *91 * or using a batch:92 *93 * <pre class="javascript">94 * (async()=>{95 * const client = new qx.io.jsonrpc.Client("https://domain.com/endpoint");96 * const batch = new qx.io.jsonrpc.protocol.Batch()97 * .add(new qx.io.jsonrpc.protocol.Request("method3", [1,2,3]))98 * .addNotification("method4") // or shorthand method99 * .addRequest("method5",["foo", "bar"]) // positional parameters100 * .addRequest("method6", {foo:"bar"}); // named parameters101 * let results;102 * try {103 * results = await client.sendBatch(batch);104 * // results will be an array with three items, the result of the requests105 * } catch(e) {106 * // handle exceptions107 * }108 * })();109 * </pre>110 *111 * The high-level Client API does not handle transport-specific issues like112 * authentication - this needs to be done in the transport layer. For example,113 * to use HTTP Bearer authentication, do this:114 * <pre class="javascript">115 * const client = new qx.io.jsonrpc.Client("https://domain.com/endpoint");116 * const auth = new qx.io.request.authentication.Bearer("TOKEN");117 * client.getTransportImpl().setAuthentication(auth);118 * client.sendRequest("method-needing-authentication", [1,2,3]);119 * </pre>120 *121 * If you need a client with a customized transport often, we recommend122 * to create a class that inherits from the client class, override123 * the methods which are needed to produce that custom behavior (such124 * as {@link qx.io.jsonrpc.transport.Http#_createTransportImpl},125 * and provide a <pre class="javascript">defer</pre> section which registers126 * the behavior for your particular class of URIs:127 *128 * <pre class="javascript">129 * defer() {130 * qx.io.jsonrpc.Client.registerTransport(/^http/, my.custom.Transport);131 * }132 * </pre>133 *134 * The client will always use the transport that was last registered for135 * a certain endpoint pattern, i.e. from then on, all clients created136 * with urls that start with "http" will use that custom behavior.137 *138 */139 `; 140 var test = qx.tool.compiler.jsdoc.Parser.parseComment(text);141 console.log(test["@description"][0].body);142 this.assert(test["@description"][0].body !== "");143 },144 145 testCheckInlineMarkdown: function() {146 let text = `147 * *strong*148 * __emphasis__149 * {@link Resource} -> link?150 * @ignore(qx.*)151 `; 152 var test = qx.tool.compiler.jsdoc.Parser.parseComment(text);153 console.log(test["@description"][0].body);154 this.assert(test["@description"][0].body !== "");155 this.assert(test["@description"][0].body.includes("<strong>"));156 this.assert(test["@description"][0].body.includes("<em>"));157 this.assert(test["@ignore"].length === 1);158 },159 160 testHiResSyntax() {161 let data = qx.tool.compiler.jsdoc.Parser.parseComment(162 " *\n" + 163 " * @asset(qx/test/webfonts/fontawesome-webfont.*)\n" + 164 " * @asset(qx/icon/Tango/48/places/folder.png)\n" + 165 " * @asset(qx/icon/Tango/32/places/folder.png)\n" +166 " * @asset(qx/static/blank.gif)\n" +167 " * @asset(qx/static/drawer.png)\n" +168 " * @asset(qx/static/drawer@2x.png)");169 this.assert(Boolean(data["@asset"] && data["@asset"].length == 6));170 },171 172 testIgnore: function() {173 let text = `*174 @ignore(process.*)175 @ignore(global.*)176 @ignore(Symbol.*)177 @ignore(chrome.*)178 179 */ 180 `;181 var test = qx.tool.compiler.jsdoc.Parser.parseComment(text);182 console.log(test["@description"][0].body);183 this.assert(test["@description"][0].body === "");184 this.assert(test["@ignore"].length === 4);185 },186 187 testCheckMarkdown: function() {188 let text = `189 *190 * The \`qx.bom.rest\` package consists of only one class: {@link Resource}.191 *192 * {@link Resource} allows to encapsulate the specifics of a REST interface.193 * Rather than requesting URLs with a specific HTTP method manually, a resource194 * representing the remote resource is instantiated and actions are invoked on this resource.195 * A resource with its actions can be configured declaratively or programmatically.196 *197 * There is also {@link qx.io.rest.Resource} which uses {@link Resource} under the hood.198 * The main differences between them are:199 *200 * * The event object available in the listeners (e.g. \`success()\`, \`getSuccess()\` and \`getError()\`) is201 * a native JavaScript object instead of a qooxdoo object ({@link qx.event.type.Rest}):202 * ** See {@link qx.io.rest.Resource} vs. {@link Resource}203 * ** \`event.getId()\` => \`event.id\`204 * ** \`event.getRequest()\` => \`event.request\`205 * ** \`event.getAction()\` => \`event.action\`206 * ** \`event.getData()\` => \`event.response\`207 * ** \`event.getPhase()\` => @---@ (see below)208 * * Methods which allow request manipulation (e.g. \`configureRequest()\`) will operate on an209 * instance of {@link qx.bom.request.SimpleXhr} instead of {@link qx.io.request.Xhr}210 * (their API is similar but not identical)211 * * The method \`poll()\` returns no {@link qx.event.Timer} object. There are two new methods212 * (\`stopPollByAction()\` and \`restartPollByAction()\`) available at {@link Resource}213 * which replace the functionality provided by the Timer object.214 * * The phase support, which is a more elaborate version of readyState, is not available.215 * So use readyState instead.216 * ** Phases (available only in {@link qx.io.rest.Resource}):217 * *** \`unsent\`, \`opened\`, \`sent\`, \`loading\`, \`load\`, \`success\`218 * *** \`abort\`, \`timeout\`, \`statusError\`219 * ** readyState (available in {@link Resource} and {@link qx.io.rest.Resource}):220 * *** \`UNSENT\`221 * *** \`OPENED\`222 * *** \`HEADERS_RECEIVED\`223 * *** \`LOADING\`224 * *** \`DONE\` 225 `;226 var test = qx.tool.compiler.jsdoc.Parser.parseComment(text);227 console.log(test["@description"][0].body);228 this.assert(test["@description"][0].body !== "");229 this.assert(test["@description"][0].body.includes("<code>"));230 this.assert(test["@description"][0].body.includes("<ul>"));231 this.assert(test["@description"][0].body.includes("<li>"));232 },233 234 testCheckInlineCode: function() {235 let text = `236 * // Start a 5-second recurrent timer.237 * @require(qx.event.type.Pointer) TEST // load-time dependency for early native events238 `;239 var test = qx.tool.compiler.jsdoc.Parser.parseComment(text);240 console.log(test["@description"][0].body);241 this.assert(test["@description"][0].body === "");242 console.log(test["@require"][0].body);243 this.assert(test["@require"][0].body !== "");244 console.log(test["@require"][0].docComment);245 this.assert(test["@require"][0].docComment !== "");246 },247 248 249 testChecksJsdocParamParser: function() {250 var parser = new qx.tool.compiler.jsdoc.ParamParser();251 var pdoc = { name: "@param", body: "value {Boolean}, the new value of the widget" };252 parser.parseCommand(pdoc, "abc.def.Ghi", null);253 delete pdoc.name;254 delete pdoc.body;255 this.assert(qx.lang.Object.equals(pdoc, {256 "paramName": "value",257 "type": "Boolean",258 "description": ", the new value of the widget"259 }));260 261 pdoc = { name: "@param", body: "cellInfo {Map}\nInformation about the cell being renderered, including:\n<ul>\n<li>state</li>\n<li>rowDiv</li>\n<li>stylesheet</li>\n<li>element</li>\n<li>dataIndex</li>\n<li>cellData</li>\n<li>height</li>\n</ul>" };262 parser.parseCommand(pdoc, "abc.def.Ghi", null);263 delete pdoc.name;264 delete pdoc.body;265 this.assert(qx.lang.Object.equals(pdoc, {266 "paramName": "cellInfo",267 "type": "Map",268 "description": "\nInformation about the cell being renderered, including:\n<ul>\n<li>state</li>\n<li>rowDiv</li>\n<li>stylesheet</li>\n<li>element</li>\n<li>dataIndex</li>\n<li>cellData</li>\n<li>height</li>\n</ul>"269 }));270 },271 272 testChecksJsdocInlineCommentsAndUrls: function() {273 let result;274 275 result = qx.tool.compiler.jsdoc.Parser.parseComment(276 `277 * @ignore(abc,278 * def,279 * ghi)280 `);281 this.assert(qx.lang.Object.equals(result, {282 "@description": [283 {284 "name": "@description",285 "body": ""286 }287 ],288 "@ignore": [289 {290 "name": "@ignore",291 "body": "abc,\n def,\n ghi"292 }293 ]294 }));295 296 result = qx.tool.compiler.jsdoc.Parser.parseComment(297 `298 * @ignore(abc, // abc comment299 * def, // def comment300 * ghi)301 `);302 this.assert(qx.lang.Object.equals(result, {303 "@description": [304 {305 "name": "@description",306 "body": ""307 }308 ],309 "@ignore": [310 {311 "name": "@ignore",312 "body": "abc,\n def,\n ghi"313 }314 ]315 }));316 317 result = qx.tool.compiler.jsdoc.Parser.parseComment(`318 * @ignore(stuff) // comment about ignore stuff319 * http://abc.com // comment about url320 * http://dev.com 321 * 322 `);323 this.assert(qx.lang.Object.equals(result, {324 "@description": [325 {326 "name": "@description",327 "body": ""328 }329 ],330 "@ignore": [331 {...
parse-comment.test.js
Source:parse-comment.test.js
1const parseComment = require("../../lib/parse-comment");2describe("parseComment", () => {3 test("Basic intent to add", () => {4 expect(5 parseComment(6 `@all-contributors please add jakebolam for doc, infra and code`7 )8 ).toEqual({9 action: "add",10 who: "jakebolam",11 contributions: ["doc", "infra", "code"],12 });13 });14 test("Basic intent to add - ignore case (for action and contributions, NOT for user)", () => {15 expect(16 parseComment(17 `@all-contributors please Add jakeBolam for DOC, inFra and coDe`18 )19 ).toEqual({20 action: "add",21 who: "jakeBolam",22 contributions: ["doc", "infra", "code"],23 });24 });25 test("Basic intent to add - non name username", () => {26 expect(27 parseComment(`@all-contributors please add tbenning for design`)28 ).toEqual({29 action: "add",30 who: "tbenning",31 contributions: ["design"],32 });33 });34 test("Basic intent to add - capitalized username", () => {35 expect(36 parseComment(`@all-contributors please add Rbot25_RULES for tool`)37 ).toEqual({38 action: "add",39 who: "Rbot25_RULES",40 contributions: ["tool"],41 });42 });43 test("Basic intent to add - with plurals", () => {44 expect(parseComment(`@all-contributors please add dat2 for docs`)).toEqual({45 action: "add",46 who: "dat2",47 contributions: ["doc"],48 });49 });50 test("Support full words (like infrastructure)", () => {51 expect(52 parseComment(53 `@all-contributors please add jakebolam for infrastructure, documentation`54 )55 ).toEqual({56 action: "add",57 who: "jakebolam",58 contributions: ["infra", "doc"],59 });60 });61 test("Support adding people with mentions", () => {62 expect(63 parseComment(`@all-contributors please add @sinchang for infrastructure`)64 ).toEqual({65 action: "add",66 who: "sinchang",67 contributions: ["infra"],68 });69 });70 test("Support alternative sentences", () => {71 expect(72 parseComment(`@all-contributors add @sinchang for infrastructure`)73 ).toEqual({74 action: "add",75 who: "sinchang",76 contributions: ["infra"],77 });78 expect(79 parseComment(80 `Jane you are crushing it in documentation and your infrastructure work has been great too. Let's add jane.doe23 for her contributions. cc @all-contributors-bot`81 )82 ).toEqual({83 action: "add",84 who: "jane.doe23",85 contributions: ["doc", "infra"],86 });87 });88 test("Support split words (like user testing)", () => {89 expect(90 parseComment(91 `@all-contributors please add jakebolam for infrastructure, fund finding`92 )93 ).toEqual({94 action: "add",95 who: "jakebolam",96 contributions: ["infra", "fundingFinding"],97 });98 expect(99 parseComment(100 `@all-contributors please add jakebolam for infrastructure, user testing and testing`101 )102 ).toEqual({103 action: "add",104 who: "jakebolam",105 contributions: ["infra", "userTesting", "test"],106 });107 });108 test("Support split words types that are referenced via other terms (e.g. a plural split word)", () => {109 expect(110 parseComment(111 `@all-contributors please add @jakebolam for infrastructure, funds`112 )113 ).toEqual({114 action: "add",115 who: "jakebolam",116 contributions: ["infra", "fundingFinding"],117 });118 });119 test("Intent unknown", () => {120 expect(parseComment(`@all-contributors please lollmate for tool`)).toEqual({121 action: false,122 });123 });124 test("Ensure (trailing) hyphens are not discarded", () => {125 expect(126 parseComment(`@all-contributors please add @jakebolam- for testing`)127 ).toEqual({128 action: "add",129 who: "jakebolam-",130 contributions: ["test"],131 });132 expect(133 parseComment(134 `@all-contributors please add @jakebolam-jakebolam for bugs, ideas`135 )136 ).toEqual({137 action: "add",138 who: "jakebolam-jakebolam",139 contributions: ["bug", "ideas"],140 });141 });142 test("Contribution unknown", () => {143 expect(144 parseComment(`@all-contributors please add @octocat for unknown`)145 ).toEqual({146 action: "add",147 who: "octocat",148 contributions: [],149 });150 });...
messageCommentsSrv.js
Source:messageCommentsSrv.js
1committeeApp.factory("messageCommentsSrv", function ($q) {2 class Comment {3 constructor(parseComment) {4 this.text = parseComment.get("text");5 this.username = parseComment.get("userId").get("name");6 this.date = parseComment.get("createdAt");7 this.commentId = parseComment.id;8 }9 }10 function getMessageComments(message) {11 var async = $q.defer();12 var comments = [];13 const MessageComment = Parse.Object.extend('MessageComment');14 const query = new Parse.Query(MessageComment);15 query.equalTo("messageId", message.parseMessage);16 query.find().then((results) => {17 results.forEach(parseComment => {18 var comment = new Comment(parseComment);19 comments.push(comment)20 });21 comments.sort(function (a, b) {22 return b.date - a.date;23 });24 async.resolve(comments);25 }, (error) => {26 async.reject(error);27 });28 return async.promise;29 }30 function createComment(text, message) {31 var async = $q.defer();32 const MessageComment = Parse.Object.extend('MessageComment');33 const myNewComment = new MessageComment();34 myNewComment.set('text', text);35 myNewComment.set('messageId', message.parseMessage);36 myNewComment.set('userId', Parse.User.current());37 myNewComment.save().then(38 (result) => {39 var comment = new Comment(result);40 async.resolve(comment);41 },42 (error) => {43 async.reject(error);44 console.error('Error while creating MessageComment: ', error);45 }46 );47 return async.promise;48 }49 function deleteMessageComments(comments) {50 var async = $q.defer();51 var commentPromises = []52 comments.forEach((comment) =>53 commentPromises.push(deleteComment(comment.commentId))54 );55 // neutralize rejected deletetions56 commentPromises = commentPromises.map(57 promise => promise.catch(() => null)58 );59 // wait for all promises, while the neutrailized promises (which rejected...) 60 $q.all(commentPromises).then(results => {61 var successCounter = 0;62 var failCounter = 0;63 for (let index = 0; index < results.length; index++) {64 if (results[index] == null || !results[index])65 failCounter++;66 else67 successCounter++;68 }69 async.resolve([successCounter, failCounter]);70 });71 return async.promise;72 }73 function deleteComment(commentId) {74 var async = $q.defer();75 const MessageComment = Parse.Object.extend('MessageComment');76 const query = new Parse.Query(MessageComment);77 // here you put the objectId that you want to delete78 query.get(commentId).then((object) => {79 object.destroy().then((response) => {80 // console.log('Deleted MessageComment', response);81 async.resolve(commentId);82 }, (error) => {83 console.error('Error while deleting MessageComment', error);84 (error) => async.reject(error);85 });86 }, (error) => {87 console.error('Error while getting MessageComment', error);88 async.reject(error);89 });90 return async.promise;91 }92 return {93 getMessageComments: getMessageComments,94 createComment: createComment,95 deleteMessageComments: deleteMessageComments96 }...
issueCommentsSrv.js
Source:issueCommentsSrv.js
1committeeApp.factory("issueCommentsSrv", function ($q) {2 class Comment {3 constructor(parseComment) {4 this.text = parseComment.get("text");5 this.username = parseComment.get("userId").get("name");6 this.date = parseComment.get("createdAt");7 this.commentId = parseComment.id;8 }9 }10 function getIssueComments(issue) {11 var async = $q.defer();12 var comments = [];13 const IssueComment = Parse.Object.extend('IssueComment');14 const query = new Parse.Query(IssueComment);15 query.equalTo("issueId", issue.parseIssue);16 query.find().then((results) => {17 results.forEach(parseComment => {18 var comment = new Comment(parseComment);19 comments.push(comment)20 });21 comments.sort(function (a, b) {22 return b.date - a.date;23 });24 async.resolve(comments);25 }, (error) => {26 async.reject(error);27 });28 return async.promise;29 }30 function createComment(text, issue) {31 var async = $q.defer();32 const IssueComment = Parse.Object.extend('IssueComment');33 const myNewComment = new IssueComment();34 myNewComment.set('text', text);35 myNewComment.set('issueId', issue.parseIssue);36 myNewComment.set('userId', Parse.User.current());37 myNewComment.save().then(38 (result) => {39 var comment = new Comment(result);40 async.resolve(comment);41 },42 (error) => {43 async.reject(error);44 console.error('Error while creating IssueComment: ', error);45 }46 );47 return async.promise;48 }49 function deleteIssueComments(comments) {50 var async = $q.defer();51 var commentPromises = []52 comments.forEach((comment) =>53 commentPromises.push(deleteComment(comment.commentId))54 );55 // neutralize rejected deletetions56 commentPromises = commentPromises.map(57 promise => promise.catch(() => null)58 );59 // wait for all promises, while the neutrailized promises (which rejected...) 60 $q.all(commentPromises).then(results => {61 var successCounter = 0;62 var failCounter = 0;63 for (let index = 0; index < results.length; index++) {64 if (results[index] == null || !results[index])65 failCounter++;66 else67 successCounter++;68 }69 async.resolve([successCounter, failCounter]);70 });71 return async.promise;72 }73 function deleteComment(commentId) {74 var async = $q.defer();75 const IssueComment = Parse.Object.extend('IssueComment');76 const query = new Parse.Query(IssueComment);77 // here you put the objectId that you want to delete78 query.get(commentId).then((object) => {79 object.destroy().then((response) => {80 // console.log('Deleted IssueComment', response);81 async.resolve(commentId);82 }, (error) => {83 console.error('Error while deleting IssueComment', error);84 (error) => async.reject(error);85 });86 }, (error) => {87 console.error('Error while getting IssueComment', error);88 async.reject(error);89 });90 return async.promise;91 }92 return {93 getIssueComments: getIssueComments,94 createComment: createComment,95 deleteIssueComments: deleteIssueComments96 }...
parseComment.js
Source:parseComment.js
2let parseComment = require('../../src/parseComment');3let assert = require('assert');4describe('parseComment', () => {5 it('base', () => {6 assert.deepEqual(parseComment('/**/'), [{7 content: '/**/',8 next: '',9 paraBlocks: [['']]10 }]);11 });12 it('base2', () => {13 assert.deepEqual(parseComment('/**/abc/**/'), [{14 content: '/**/',15 next: 'abc',16 paraBlocks: [['']]17 }, {18 content: '/**/',19 next: '',20 paraBlocks: [['']]21 }]);22 });23 it('base3', () => {24 assert.deepEqual(parseComment('/*#test*/'), [{25 content: '/*#test*/',26 next: '',27 paraBlocks: [28 ['#test']29 ]30 }]);31 });32 it('wipe *', () => {33 assert.deepEqual(parseComment('/*****#test*****/'), [{34 content: '/*****#test*****/',35 next: '',36 paraBlocks: [37 ['#test****']38 ]39 }]);40 });41 it('seperate by #', () => {42 assert.deepEqual(parseComment('/*#test1\n#test2*/'), [{43 content: '/*#test1\n#test2*/',44 next: '',45 paraBlocks: [46 ['#test1'],47 ['#test2']48 ]49 }]);50 });51 it('seperate by # with lines', () => {52 assert.deepEqual(parseComment('/**\n#test1\n*abc\n#test2\n*def\n*lkl\n*/'), [{53 content: '/**\n#test1\n*abc\n#test2\n*def\n*lkl\n*/',54 next: '',55 paraBlocks: [56 [''],57 ['#test1', 'abc'],58 ['#test2', 'def', 'lkl', '']59 ]60 }]);61 });...
testParser.js
Source:testParser.js
...3let testParser = require('../../src/testParser');4let assert = require('assert');5describe('index', () => {6 it('base', () => {7 assert.deepEqual(testParser(parseComment('/*## test\n[[1, 2], 3]*/\n let a = () => {}')).tests, [{8 sample: '[[1, 2], 3]',9 testVar: 'a',10 testVariables: {11 test: '',12 tar: 'function'13 }14 }]);15 });16 it('end line', () => {17 assert.deepEqual(testParser(parseComment('/*## test\n[[1, 2], 3]\n<!--testEnd-->other things*/\n let a = () => {}')).tests, [{18 sample: '[[1, 2], 3]',19 testVar: 'a',20 testVariables: {21 test: '',22 tar: 'function'23 }24 }]);25 });26 it('missing variable name', (done) => {27 try {28 testParser(parseComment('/*## test\n[[1, 2], 3]*/\n() => {}')).tests;29 } catch (err) {30 assert.equal(err.toString().indexOf('could not find function name') !== -1, true);31 done();32 }33 });34 it('test title', () => {35 assert.deepEqual(testParser(parseComment('/*## test a=b c=d\n[[1, 2], 3]*/\n let a = () => {}')).tests, [{36 sample: '[[1, 2], 3]',37 testVar: 'a',38 testVariables: {39 test: '',40 a: 'b',41 c: 'd',42 tar: 'function'43 }44 }]);45 });46 it('test title2', () => {47 assert.deepEqual(testParser(parseComment('/*## testenv=bash\n[[1, 2], 3]*/\n let a = () => {}')).tests, []);48 });...
Using AI Code Generation
1const puppeteer = require('puppeteer');2const fs = require('fs');3(async () => {4 const browser = await puppeteer.launch();5 const page = await browser.newPage();6 await page.goto('
Using AI Code Generation
1const puppeteer = require('puppeteer');2const fs = require('fs');3const path = require('path');4(async () => {5 const browser = await puppeteer.launch();6 const page = await browser.newPage();7 await page.waitForSelector('h1');8 const html = await page.content();9 await browser.close();10 const comments = parseComment(html);11 console.log(comments);12})();13function parseComment(html) {14 const $ = cheerio.load(html);15 const comments = [];16 $('comment').each((i, elem) => {17 comments.push({18 id: $(elem).attr('id'),
Using AI Code Generation
1const puppeteer = require('puppeteer');2const fs = require('fs');3const path = require('path');4(async () => {5 const browser = await puppeteer.launch();6 const page = await browser.newPage();7 const comments = await page.$$eval('#content-text', comments => comments.map(comment => comment.innerText));8 const comment = comments[0];9 const commentObject = await page.evaluate((comment) => {10 const commentElement = document.createElement('div');11 commentElement.innerHTML = comment;12 return window.ytInitialData.contents.twoColumnWatchNextResults.results.results.contents[1].itemSectionRenderer.contents[0].commentThreadRenderer.comment.commentRenderer;13 }, comment);14 console.log(commentObject);15 await browser.close();16})();17const puppeteer = require('puppeteer');18const fs = require('fs');19const path = require('path');20(async () => {21 const browser = await puppeteer.launch();22 const page = await browser.newPage();23 const comments = await page.$$eval('#content-text', comments => comments.map(comment => comment.innerText));24 const comment = comments[0];25 const commentObject = await page.evaluate((comment) => {26 const commentElement = document.createElement('div');27 commentElement.innerHTML = comment;28 return window.ytInitialData.contents.twoColumnWatchNextResults.results.results.contents[1].itemSectionRenderer.contents[0].commentThreadRenderer.comment.commentRenderer;29 }, comment);30 console.log(commentObject);31 await browser.close();32})();33const puppeteer = require('puppeteer');34const fs = require('fs');35const path = require('path');36(async () => {37 const browser = await puppeteer.launch();38 const page = await browser.newPage();39 const comments = await page.$$eval('#content-text', comments => comments.map(comment => comment.innerText));40 const comment = comments[0];41 const commentObject = await page.evaluate((comment) => {
Using AI Code Generation
1const puppeteer = require('puppeteer');2(async () => {3 const browser = await puppeteer.launch();4 const page = await browser.newPage();5 const html = await page.content();6 const comment = await page.evaluate(() => {7 return document.createComment('This is a comment');8 });9 const commentData = await page.evaluateHandle(comment => {10 return comment.data;11 }, comment);12 console.log(commentData);13 await browser.close();14})();15const puppeteer = require('puppeteer');16(async () => {17 const browser = await puppeteer.launch();18 const page = await browser.newPage();19 const html = await page.content();20 const comment = await page.evaluate(() => {21 return document.createComment('This is a comment');22 });23 const commentData = await page.evaluateHandle(comment => {24 return comment.data;25 }, comment);26 console.log(commentData);27 await browser.close();28})();29const puppeteer = require('puppeteer');30(async () => {31 const browser = await puppeteer.launch();32 const page = await browser.newPage();33 const html = await page.content();34 const comment = await page.evaluate(() => {35 return document.createComment('This is a comment');36 });37 const commentData = await page.evaluateHandle(comment => {38 return comment.data;39 }, comment);40 console.log(commentData);41 await browser.close();42})();43const puppeteer = require('puppeteer');44(async () => {45 const browser = await puppeteer.launch();46 const page = await browser.newPage();47 const html = await page.content();48 const comment = await page.evaluate(() => {49 return document.createComment('This is a comment');50 });51 const commentData = await page.evaluateHandle(comment => {52 return comment.data;53 }, comment);54 console.log(commentData);55 await browser.close();56})();
Using AI Code Generation
1const puppeteer = require('puppeteer');2(async () => {3 const browser = await puppeteer.launch();4 const page = await browser.newPage();5 const comment = await page.evaluate(() => {6 return document.querySelector('input').parseComment;7 });8 console.log('Viewport size:', comment);9 await browser.close();10})();11const puppeteer = require('puppeteer');12(async () => {13 const browser = await puppeteer.launch();14 const page = await browser.newPage();15 const comment = await page.evaluate(() => {16 return document.querySelector('input').parseComment();17 });18 console.log('Viewport size:', comment);19 await browser.close();20})();
Using AI Code Generation
1const puppeteer = require('puppeteer');2const fs = require('fs');3const path = require('path');4const { parseComment } = require('comment-parser');5(async () => {6 const browser = await puppeteer.launch();7 const page = await browser.newPage();8 await page.goto('
Using AI Code Generation
1const puppeteer = require('puppeteer');2const { parseComment } = require('puppeteer/lib/ExecutionContext');3(async () => {4 const browser = await puppeteer.launch({ headless: false });5 const page = await browser.newPage();6 await page.waitForSelector('div#contents');7 const comments = await page.evaluate(() => {8 const commentNodes = document.querySelectorAll('yt-formatted-string#content-text');9 const commentList = Array.from(commentNodes);10 return commentList.map(commentNode => commentNode.textContent);11 });12 console.log(comments);13 await browser.close();14})();
Using AI Code Generation
1const puppeteer = require('puppeteer');2const Puppeteer = require('puppeteer');3const puppeteer = new Puppeteer();4console.log(comment);5const puppeteer = require('puppeteer');6const Comment = require('puppeteer');7console.log(comment);8const puppeteer = require('puppeteer');9const Comment = require('puppeteer');10console.log(comment);11const puppeteer = require('puppeteer');12const Comment = require('puppeteer');13console.log(comment);14const puppeteer = require('puppeteer');15const Comment = require('puppeteer');16console.log(comment);17const puppeteer = require('puppeteer');18const Comment = require('puppeteer');19console.log(comment);20const puppeteer = require('puppeteer');21const Comment = require('puppeteer');22console.log(comment);23const puppeteer = require('puppeteer');24const Comment = require('puppeteer');25console.log(comment);26const puppeteer = require('puppeteer');27const Comment = require('puppeteer');28console.log(comment);29const puppeteer = require('puppeteer');30const Comment = require('puppeteer');31console.log(comment);32const puppeteer = require('puppeteer');33const Comment = require('puppeteer');34console.log(comment);35const puppeteer = require('puppeteer');
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!