blob: 5e433c543646a9f2f1716cb621927cc79e29688c [file] [log] [blame]
suite('up/down', 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();
});
test('up/down in out of 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('Up');
assert.equal(cursor.parent, expBlock, 'cursor up goes into exponent');
mq.keystroke('Down');
assert.equal(cursor.parent, rootBlock, 'cursor down leaves exponent');
assert.equal(cursor[L], exp, 'down when cursor at end of exponent puts cursor after exponent');
mq.keystroke('Up Left Left');
assert.equal(cursor.parent, expBlock, 'cursor up left stays in exponent');
assert.equal(cursor[L], 0, 'cursor is at the beginning of exponent');
mq.keystroke('Down');
assert.equal(cursor.parent, rootBlock, 'cursor down leaves exponent');
assert.equal(cursor[R], exp, 'cursor down in beginning of exponent puts cursor before exponent');
mq.keystroke('Up Right');
assert.equal(cursor.parent, expBlock, 'cursor up left stays in exponent');
assert.equal(cursor[L].latex(), 'n', 'cursor is in the middle of exponent');
assert.equal(cursor[R].latex(), 'm', 'cursor is in the middle of exponent');
mq.keystroke('Down');
assert.equal(cursor.parent, rootBlock, 'cursor down leaves exponent');
assert.equal(cursor[R], exp, 'cursor down in middle of exponent puts cursor before exponent');
});
// literally just swapped up and down, exponent with subscript, nm with 12
test('up/down in out of subscript', function() {
controller.renderLatexMath('a_{12}');
var sub = rootBlock.ends[R],
subBlock = sub.ends[L];
assert.equal(sub.latex(), '_{12}', 'right end el is subscript');
assert.equal(cursor.parent, rootBlock, 'cursor is in root block');
assert.equal(cursor[L], sub, 'cursor is at the end of root block');
mq.keystroke('Down');
assert.equal(cursor.parent, subBlock, 'cursor down goes into subscript');
mq.keystroke('Up');
assert.equal(cursor.parent, rootBlock, 'cursor up leaves subscript');
assert.equal(cursor[L], sub, 'up when cursor at end of subscript puts cursor after subscript');
mq.keystroke('Down Left Left');
assert.equal(cursor.parent, subBlock, 'cursor down left stays in subscript');
assert.equal(cursor[L], 0, 'cursor is at the beginning of subscript');
mq.keystroke('Up');
assert.equal(cursor.parent, rootBlock, 'cursor up leaves subscript');
assert.equal(cursor[R], sub, 'cursor up in beginning of subscript puts cursor before subscript');
mq.keystroke('Down Right');
assert.equal(cursor.parent, subBlock, 'cursor down left stays in subscript');
assert.equal(cursor[L].latex(), '1', 'cursor is in the middle of subscript');
assert.equal(cursor[R].latex(), '2', 'cursor is in the middle of subscript');
mq.keystroke('Up');
assert.equal(cursor.parent, rootBlock, 'cursor up leaves subscript');
assert.equal(cursor[R], sub, 'cursor up in middle of subscript puts cursor before subscript');
});
test('up/down into and within fraction', function() {
controller.renderLatexMath('\\frac{12}{34}');
var frac = rootBlock.ends[L],
numer = frac.ends[L],
denom = frac.ends[R];
assert.equal(frac.latex(), '\\frac{12}{34}', 'fraction is in root block');
assert.equal(frac, rootBlock.ends[R], 'fraction is sole child of root block');
assert.equal(numer.latex(), '12', 'numerator is left end child of fraction');
assert.equal(denom.latex(), '34', 'denominator is right end child of fraction');
mq.keystroke('Up');
assert.equal(cursor.parent, numer, 'cursor up goes into numerator');
assert.equal(cursor[R], 0, 'cursor up from right of fraction inserts at right end of numerator');
mq.keystroke('Down');
assert.equal(cursor.parent, denom, 'cursor down goes into denominator');
assert.equal(cursor[R], 0, 'cursor down from numerator inserts at right end of denominator');
mq.keystroke('Up');
assert.equal(cursor.parent, numer, 'cursor up goes into numerator');
assert.equal(cursor[R], 0, 'cursor up from denominator inserts at right end of numerator');
mq.keystroke('Left Left Left');
assert.equal(cursor.parent, rootBlock, 'cursor outside fraction');
assert.equal(cursor[R], frac, 'cursor before fraction');
mq.keystroke('Up');
assert.equal(cursor.parent, numer, 'cursor up goes into numerator');
assert.equal(cursor[L], 0, 'cursor up from left of fraction inserts at left end of numerator');
mq.keystroke('Left');
assert.equal(cursor.parent, rootBlock, 'cursor outside fraction');
assert.equal(cursor[R], frac, 'cursor before fraction');
mq.keystroke('Down');
assert.equal(cursor.parent, denom, 'cursor down goes into denominator');
assert.equal(cursor[L], 0, 'cursor down from left of fraction inserts at left end of denominator');
});
test('nested subscripts and fractions', function() {
controller.renderLatexMath('\\frac{d}{dx_{\\frac{24}{36}0}}\\sqrt{x}=x^{\\frac{1}{2}}');
var exp = rootBlock.ends[R],
expBlock = exp.ends[L],
half = expBlock.ends[L],
halfNumer = half.ends[L],
halfDenom = half.ends[R];
mq.keystroke('Left');
assert.equal(cursor.parent, expBlock, 'cursor left goes into exponent');
mq.keystroke('Down');
assert.equal(cursor.parent, halfDenom, 'cursor down goes into denominator of half');
mq.keystroke('Down');
assert.equal(cursor.parent, rootBlock, 'down again puts cursor back in root block');
assert.equal(cursor[L], exp, 'down from end of half puts cursor after exponent');
var derivative = rootBlock.ends[L],
dBlock = derivative.ends[L],
dxBlock = derivative.ends[R],
sub = dxBlock.ends[R],
subBlock = sub.ends[L],
subFrac = subBlock.ends[L],
subFracNumer = subFrac.ends[L],
subFracDenom = subFrac.ends[R];
cursor.insAtLeftEnd(rootBlock);
mq.keystroke('Down Right Right Down');
assert.equal(cursor.parent, subBlock, 'cursor in subscript');
mq.keystroke('Up');
assert.equal(cursor.parent, subFracNumer, 'cursor up from beginning of subscript goes into subscript fraction numerator');
mq.keystroke('Up');
assert.equal(cursor.parent, dxBlock, 'cursor up from subscript fraction numerator goes out of subscript');
assert.equal(cursor[R], sub, 'cursor up from subscript fraction numerator goes before subscript');
mq.keystroke('Down Down');
assert.equal(cursor.parent, subFracDenom, 'cursor in subscript fraction denominator');
mq.keystroke('Up Up');
assert.equal(cursor.parent, dxBlock, 'cursor up up from subscript fraction denominator that\s not at right end goes out of subscript');
assert.equal(cursor[R], sub, 'cursor up up from subscript fraction denominator that\s not at right end goes before subscript');
cursor.insAtRightEnd(subBlock);
controller.backspace();
assert.equal(subFrac[R], 0, 'subscript fraction is at right end');
assert.equal(cursor[L], subFrac, 'cursor after subscript fraction');
mq.keystroke('Down');
assert.equal(cursor.parent, subFracDenom, 'cursor in subscript fraction denominator');
mq.keystroke('Up Up');
assert.equal(cursor.parent, dxBlock, 'cursor up up from subscript fraction denominator that is at right end goes out of subscript');
assert.equal(cursor[L], sub, 'cursor up up from subscript fraction denominator that is at right end goes after subscript');
});
test('\\MathQuillMathField{} in a fraction', function() {
var outer = MQ.MathField(
$('<span>\\frac{\\MathQuillMathField{n}}{2}</span>').appendTo('#mock')[0]
);
var inner = MQ($(outer.el()).find('.mq-editable-field')[0]);
assert.equal(inner.__controller.cursor.parent, inner.__controller.root);
inner.keystroke('Down');
assert.equal(inner.__controller.cursor.parent, inner.__controller.root);
$(outer.el()).remove();
});
});