Dashboard sipadu mbip
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

test-events.js 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = testEvents;
  6. var _parse = _interopRequireDefault(require("./cst/parse"));
  7. var _Document = _interopRequireDefault(require("./Document"));
  8. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  9. // test harness for yaml-test-suite event tests
  10. function testEvents(src, options) {
  11. const opt = Object.assign({
  12. keepCstNodes: true,
  13. keepNodeTypes: true,
  14. version: '1.2'
  15. }, options);
  16. const docs = (0, _parse.default)(src).map(cstDoc => new _Document.default(opt).parse(cstDoc));
  17. const errDoc = docs.find(doc => doc.errors.length > 0);
  18. const error = errDoc ? errDoc.errors[0].message : null;
  19. const events = ['+STR'];
  20. try {
  21. for (let i = 0; i < docs.length; ++i) {
  22. const doc = docs[i];
  23. let root = doc.contents;
  24. if (Array.isArray(root)) root = root[0];
  25. const [rootStart, rootEnd] = doc.range || [0, 0];
  26. let e = doc.errors[0] && doc.errors[0].source;
  27. if (e && e.type === 'SEQ_ITEM') e = e.node;
  28. if (e && (e.type === 'DOCUMENT' || e.range.start < rootStart)) throw new Error();
  29. let docStart = '+DOC';
  30. const pre = src.slice(0, rootStart);
  31. const explicitDoc = /---\s*$/.test(pre);
  32. if (explicitDoc) docStart += ' ---';else if (!doc.contents) continue;
  33. events.push(docStart);
  34. addEvents(events, doc, e, root);
  35. if (doc.contents && doc.contents.length > 1) throw new Error();
  36. let docEnd = '-DOC';
  37. if (rootEnd) {
  38. const post = src.slice(rootEnd);
  39. if (/^\.\.\./.test(post)) docEnd += ' ...';
  40. }
  41. events.push(docEnd);
  42. }
  43. } catch (e) {
  44. return {
  45. events,
  46. error: error || e
  47. };
  48. }
  49. events.push('-STR');
  50. return {
  51. events,
  52. error
  53. };
  54. }
  55. function addEvents(events, doc, e, node) {
  56. if (!node) {
  57. events.push('=VAL :');
  58. return;
  59. }
  60. if (e && node.cstNode === e) throw new Error();
  61. let props = '';
  62. let anchor = doc.anchors.getName(node);
  63. if (anchor) {
  64. if (/\d$/.test(anchor)) {
  65. const alt = anchor.replace(/\d$/, '');
  66. if (doc.anchors.getNode(alt)) anchor = alt;
  67. }
  68. props = ` &${anchor}`;
  69. }
  70. if (node.cstNode && node.cstNode.tag) {
  71. const {
  72. handle,
  73. suffix
  74. } = node.cstNode.tag;
  75. props += handle === '!' && !suffix ? ' <!>' : ` <${node.tag}>`;
  76. }
  77. let scalar = null;
  78. switch (node.type) {
  79. case 'ALIAS':
  80. {
  81. let alias = doc.anchors.getName(node.source);
  82. if (/\d$/.test(alias)) {
  83. const alt = alias.replace(/\d$/, '');
  84. if (doc.anchors.getNode(alt)) alias = alt;
  85. }
  86. events.push(`=ALI${props} *${alias}`);
  87. }
  88. break;
  89. case 'BLOCK_FOLDED':
  90. scalar = '>';
  91. break;
  92. case 'BLOCK_LITERAL':
  93. scalar = '|';
  94. break;
  95. case 'PLAIN':
  96. scalar = ':';
  97. break;
  98. case 'QUOTE_DOUBLE':
  99. scalar = '"';
  100. break;
  101. case 'QUOTE_SINGLE':
  102. scalar = "'";
  103. break;
  104. case 'PAIR':
  105. events.push(`+MAP${props}`);
  106. addEvents(events, doc, e, node.key);
  107. addEvents(events, doc, e, node.value);
  108. events.push('-MAP');
  109. break;
  110. case 'FLOW_SEQ':
  111. case 'SEQ':
  112. events.push(`+SEQ${props}`);
  113. node.items.forEach(item => {
  114. addEvents(events, doc, e, item);
  115. });
  116. events.push('-SEQ');
  117. break;
  118. case 'FLOW_MAP':
  119. case 'MAP':
  120. events.push(`+MAP${props}`);
  121. node.items.forEach(({
  122. key,
  123. value
  124. }) => {
  125. addEvents(events, doc, e, key);
  126. addEvents(events, doc, e, value);
  127. });
  128. events.push('-MAP');
  129. break;
  130. default:
  131. throw new Error(`Unexpected node type ${node.type}`);
  132. }
  133. if (scalar) {
  134. const value = node.cstNode.strValue.replace(/\\/g, '\\\\').replace(/\0/g, '\\0').replace(/\x07/g, '\\a').replace(/\x08/g, '\\b').replace(/\t/g, '\\t').replace(/\n/g, '\\n').replace(/\v/g, '\\v').replace(/\f/g, '\\f').replace(/\r/g, '\\r').replace(/\x1b/g, '\\e');
  135. events.push(`=VAL${props} ${scalar}${value}`);
  136. }
  137. }