const Changeset = require('../../../src/static/js/Changeset'); const contentcollector = require('../../../src/static/js/contentcollector'); const AttributePool = require('../../../src/static/js/AttributePool'); const cheerio = require('../../../src/node_modules/cheerio'); const util = require('util'); const tests = { nestedLi: { description: 'Complex nested Li', html: '
  1. one
    1. 1.1
  2. two
', expectedLineAttribs: [ '*0*1*2*3+1+3', '*0*4*2*5+1+3', '*0*1*2*5+1+3', ], expectedText: [ '*one', '*1.1', '*two', ], }, complexNest: { description: 'Complex list of different types', html: '
  1. item
    1. item1
    2. item2
', expectedLineAttribs: [ '*0*1*2+1+3', '*0*1*2+1+3', '*0*1*2+1+1', '*0*1*2+1+1', '*0*1*2+1+1', '*0*3*2+1+1', '*0*3*2+1+1', '*0*4*2*5+1+4', '*0*6*2*7+1+5', '*0*6*2*7+1+5', ], expectedText: [ '*one', '*two', '*0', '*1', '*2', '*3', '*4', '*item', '*item1', '*item2', ], }, ul: { description: 'Tests if uls properly get attributes', html: '
div

foo

', expectedLineAttribs: ['*0*1*2+1+1', '*0*1*2+1+1', '+3', '+3'], expectedText: ['*a', '*b', 'div', 'foo'], }, ulIndented: { description: 'Tests if indented uls properly get attributes', html: '

foo

', expectedLineAttribs: ['*0*1*2+1+1', '*0*3*2+1+1', '*0*1*2+1+1', '+3'], expectedText: ['*a', '*b', '*a', 'foo'], }, ol: { description: 'Tests if ols properly get line numbers when in a normal OL', html: '
  1. a
  2. b
  3. c

test

', expectedLineAttribs: ['*0*1*2*3+1+1', '*0*1*2*3+1+1', '*0*1*2*3+1+1', '+4'], expectedText: ['*a', '*b', '*c', 'test'], noteToSelf: 'Ensure empty P does not induce line attribute marker, wont this break the editor?', }, lineDoBreakInOl: { description: 'A single completely empty line break within an ol should reset count if OL is closed off..', html: '
  1. should be 1

hello

  1. should be 1
  2. should be 2

', expectedLineAttribs: ['*0*1*2*3+1+b', '+5', '*0*1*2*4+1+b', '*0*1*2*4+1+b', ''], expectedText: ['*should be 1', 'hello', '*should be 1', '*should be 2', ''], noteToSelf: "Shouldn't include attribute marker in the

line", }, bulletListInOL: { description: 'A bullet within an OL should not change numbering..', html: '

  1. should be 1
  2. should be 2

', expectedLineAttribs: ['*0*1*2*3+1+b', '*0*4*2*3+1+i', '*0*1*2*5+1+b', ''], expectedText: ['*should be 1', '*should be a bullet', '*should be 2', ''], }, testP: { description: 'A single

should create a new line', html: '

', expectedLineAttribs: ['', ''], expectedText: ['', ''], noteToSelf: '

should create a line break but not break numbering', }, nestedOl: { description: 'Tests if ols properly get line numbers when in a normal OL', html: 'a
  1. b
    1. c
notlist

foo

', expectedLineAttribs: ['+1', '*0*1*2*3+1+1', '*0*4*2*5+1+1', '+7', '+3'], expectedText: ['a', '*b', '*c', 'notlist', 'foo'], noteToSelf: 'Ensure empty P does not induce line attribute marker, wont this break the editor?', }, nestedOl: { description: 'First item being an UL then subsequent being OL will fail', html: '', expectedLineAttribs: ['+1', '*0*1*2*3+1+1', '*0*4*2*5+1+1'], expectedText: ['a', '*b', '*c'], noteToSelf: 'Ensure empty P does not induce line attribute marker, wont this break the editor?', disabled: true, }, lineDontBreakOL: { description: 'A single completely empty line break within an ol should NOT reset count', html: '
  1. should be 1
  2. should be 2
  3. should be 3

', expectedLineAttribs: [], expectedText: ['*should be 1', '*should be 2', '*should be 3'], noteToSelf: "

should create a line break but not break numbering -- This is what I can't get working!", disabled: true, }, }; describe(__filename, function () { for (const test in tests) { const testObj = tests[test]; describe(test, function () { if (testObj.disabled) { return xit('DISABLED:', test, function (done) { done(); }); } it(testObj.description, function (done) { const $ = cheerio.load(testObj.html); // Load HTML into Cheerio const doc = $('html')[0]; // Creates a dom-like representation of HTML // Create an empty attribute pool const apool = new AttributePool(); // Convert a dom tree into a list of lines and attribute liens // using the content collector object const cc = contentcollector.makeContentCollector(true, null, apool); cc.collectContent(doc); const result = cc.finish(); const recievedAttributes = result.lineAttribs; const expectedAttributes = testObj.expectedLineAttribs; const recievedText = new Array(result.lines); const expectedText = testObj.expectedText; // Check recieved text matches the expected text if (arraysEqual(recievedText[0], expectedText)) { // console.log("PASS: Recieved Text did match Expected Text\nRecieved:", recievedText[0], "\nExpected:", testObj.expectedText) } else { console.error('FAIL: Recieved Text did not match Expected Text\nRecieved:', recievedText[0], '\nExpected:', testObj.expectedText); throw new Error(); } // Check recieved attributes matches the expected attributes if (arraysEqual(recievedAttributes, expectedAttributes)) { // console.log("PASS: Recieved Attributes matched Expected Attributes"); done(); } else { console.error('FAIL', test, testObj.description); console.error('FAIL: Recieved Attributes did not match Expected Attributes\nRecieved: ', recievedAttributes, '\nExpected: ', expectedAttributes); console.error('FAILING HTML', testObj.html); throw new Error(); } }); }); } }); function arraysEqual(a, b) { if (a === b) return true; if (a == null || b == null) return false; if (a.length != b.length) return false; // If you don't care about the order of the elements inside // the array, you should sort both arrays here. // Please note that calling sort on an array will modify that array. // you might want to clone your array first. for (let i = 0; i < a.length; ++i) { if (a[i] !== b[i]) return false; } return true; }