| suite('backspace', function() { | |
| var mq, rootBlock, controller, cursor; | |
| setup(function() { | |
| mq = MQ.MathField($('<span></span>').appendTo('#mock')[0]); | |
| rootBlock = mq.__controller.root; | |
| controller = mq.__controller; | |
| cursor = controller.cursor; | |
| }); | |
| teardown(function() { | |
| $(mq.el()).remove(); | |
| }); | |
| function prayWellFormedPoint(pt) { prayWellFormed(pt.parent, pt[L], pt[R]); } | |
| function assertLatex(latex) { | |
| prayWellFormedPoint(mq.__controller.cursor); | |
| assert.equal(mq.latex(), latex); | |
| } | |
| test('backspace through exponent', function() { | |
| controller.renderLatexMath('x^{nm}'); | |
| var exp = rootBlock.ends[R], | |
| expBlock = exp.ends[L]; | |
| assert.equal(exp.latex(), '^{nm}', 'right end el is exponent'); | |
| assert.equal(cursor.parent, rootBlock, 'cursor is in root block'); | |
| assert.equal(cursor[L], exp, 'cursor is at the end of root block'); | |
| mq.keystroke('Backspace'); | |
| assert.equal(cursor.parent, expBlock, 'cursor up goes into exponent on backspace'); | |
| assertLatex('x^{nm}'); | |
| mq.keystroke('Backspace'); | |
| assert.equal(cursor.parent, expBlock, 'cursor still in exponent'); | |
| assertLatex('x^n'); | |
| mq.keystroke('Backspace'); | |
| assert.equal(cursor.parent, expBlock, 'still in exponent, but it is empty'); | |
| assertLatex('x^{ }'); | |
| mq.keystroke('Backspace'); | |
| assert.equal(cursor.parent, rootBlock, 'backspace tears down exponent'); | |
| assertLatex('x'); | |
| }); | |
| test('backspace through complex fraction', function() { | |
| controller.renderLatexMath('1+\\frac{1}{\\frac{1}{2}+\\frac{2}{3}}'); | |
| //first backspace moves to denominator | |
| mq.keystroke('Backspace'); | |
| assertLatex('1+\\frac{1}{\\frac{1}{2}+\\frac{2}{3}}'); | |
| //first backspace moves to denominator in denominator | |
| mq.keystroke('Backspace'); | |
| assertLatex('1+\\frac{1}{\\frac{1}{2}+\\frac{2}{3}}'); | |
| //finally delete a character | |
| mq.keystroke('Backspace'); | |
| assertLatex('1+\\frac{1}{\\frac{1}{2}+\\frac{2}{ }}'); | |
| //destroy fraction | |
| mq.keystroke('Backspace'); | |
| assertLatex('1+\\frac{1}{\\frac{1}{2}+2}'); | |
| mq.keystroke('Backspace'); | |
| mq.keystroke('Backspace'); | |
| assertLatex('1+\\frac{1}{\\frac{1}{2}}'); | |
| mq.keystroke('Backspace'); | |
| mq.keystroke('Backspace'); | |
| assertLatex('1+\\frac{1}{\\frac{1}{ }}'); | |
| mq.keystroke('Backspace'); | |
| assertLatex('1+\\frac{1}{1}'); | |
| mq.keystroke('Backspace'); | |
| assertLatex('1+\\frac{1}{ }'); | |
| mq.keystroke('Backspace'); | |
| assertLatex('1+1'); | |
| }); | |
| test('backspace through compound subscript', function() { | |
| mq.latex('x_{2_2}'); | |
| //first backspace goes into the subscript | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'x_{2_2}'); | |
| //second one goes into the subscripts' subscript | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'x_{2_2}'); | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'x_{2_{ }}'); | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'x_2'); | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'x_{ }'); | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'x'); | |
| }); | |
| test('backspace through simple subscript', function() { | |
| mq.latex('x_{2+3}'); | |
| assert.equal(cursor.parent, rootBlock, 'start in the root block'); | |
| //backspace goes down | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'x_{2+3}'); | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'x_{2+}'); | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'x_2'); | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'x_{ }'); | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'x'); | |
| }); | |
| test('backspace through subscript & superscript', function() { | |
| mq.latex('x_2^{32}'); | |
| //first backspace takes us into the exponent | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'x_2^{32}'); | |
| //second backspace is within the exponent | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'x_2^3'); | |
| //clear out exponent | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'x_2^{ }'); | |
| //unpeel exponent | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'x_2'); | |
| //into subscript | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'x_2'); | |
| //clear out subscript | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'x_{ }'); | |
| //unpeel exponent | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'x'); | |
| //clear out math field | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),''); | |
| }); | |
| test('backspace through nthroot', function() { | |
| mq.latex('\\sqrt[3]{x}'); | |
| //first backspace takes us inside the nthroot | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'\\sqrt[3]{x}'); | |
| //second backspace removes the x | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'\\sqrt[3]{}'); | |
| //third one destroys the cube root, but leaves behind the 3 | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'3'); | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),''); | |
| }); | |
| test('backspace through large operator', function() { | |
| mq.latex('\\sum_{n=1}^3x'); | |
| //first backspace takes out the argument | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'\\sum_{n=1}^3'); | |
| //up into the superscript | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'\\sum_{n=1}^3'); | |
| //up into the superscript | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'\\sum_{n=1}^{ }'); | |
| //destroy the sum, preserve the subscript (a little surprising) | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(),'n=1'); | |
| }); | |
| test('backspace through text block', function() { | |
| mq.latex('\\text{x}'); | |
| mq.keystroke('Backspace'); | |
| var textBlock = rootBlock.ends[R]; | |
| assert.equal(cursor.parent, textBlock, 'cursor is in text block'); | |
| assert.equal(cursor[R], 0, 'cursor is at the end of text block'); | |
| assert.equal(cursor[L].text, 'x', 'cursor is rightward of the x'); | |
| assert.equal(mq.latex(), '\\text{x}', 'the x has been deleted'); | |
| mq.keystroke('Backspace'); | |
| assert.equal(cursor.parent, textBlock, 'cursor is still in text block'); | |
| assert.equal(cursor[R], 0, 'cursor is at the right end of the text block'); | |
| assert.equal(cursor[L], 0, 'cursor is at the left end of the text block'); | |
| assert.equal(mq.latex(), '', 'the x has been deleted'); | |
| mq.keystroke('Backspace'); | |
| assert.equal(cursor[R], 0, 'cursor is at the right end of the root block'); | |
| assert.equal(cursor[L], 0, 'cursor is at the left end of the root block'); | |
| assert.equal(mq.latex(), ''); | |
| }); | |
| suite('empties', function() { | |
| test('backspace empty exponent', function() { | |
| mq.latex('x^{}'); | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(), 'x'); | |
| }); | |
| test('backspace empty sqrt', function() { | |
| mq.latex('1+\\sqrt{}'); | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(), '1+'); | |
| }); | |
| test('backspace empty fraction', function() { | |
| mq.latex('1+\\frac{}{}'); | |
| mq.keystroke('Backspace'); | |
| assert.equal(mq.latex(), '1+'); | |
| }); | |
| }); | |
| }); |