(function() { QUnit.module('fabric.IText'); var ITEXT_OBJECT = { 'type': 'text', 'originX': 'left', 'originY': 'top', 'left': 0, 'top': 0, 'width': 20, 'height': 52, 'fill': 'rgb(0,0,0)', 'stroke': null, 'strokeWidth': 1, 'strokeDashArray': null, 'strokeLineCap': 'butt', 'strokeLineJoin': 'miter', 'strokeMiterLimit': 10, 'scaleX': 1, 'scaleY': 1, 'angle': 0, 'flipX': false, 'flipY': false, 'opacity': 1, 'shadow': null, 'visible': true, 'clipTo': null, 'text': 'x', 'fontSize': 40, 'fontWeight': 'normal', 'fontFamily': 'Times New Roman', 'fontStyle': '', 'lineHeight': 1.3, 'textDecoration': '', 'textAlign': 'left', 'path': null, 'backgroundColor': '', 'textBackgroundColor': '', 'useNative': true, styles: { } }; test('constructor', function() { var iText = new fabric.IText('test'); ok(iText instanceof fabric.IText); ok(iText instanceof fabric.Text); }); test('initial properties', function() { var iText = new fabric.IText('test'); ok(iText instanceof fabric.IText); equal(iText.text, 'test'); equal(iText.type, 'i-text'); deepEqual(iText.styles, { }); }); test('instances', function() { var iText = new fabric.IText('test'); var lastInstance = fabric.IText.instances[fabric.IText.instances.length - 1]; equal(lastInstance, iText); }); test('fromObject', function() { ok(typeof fabric.IText.fromObject == 'function'); var iText = fabric.IText.fromObject(ITEXT_OBJECT); ok(iText instanceof fabric.IText); deepEqual(ITEXT_OBJECT, iText.toObject()); }); test('toObject', function() { var styles = { 0: { 0: { fill: 'red' }, 1: { textDecoration: 'underline' } } }; var iText = new fabric.IText('test', { styles: styles }); equal(typeof iText.toObject, 'function'); var obj = iText.toObject(); deepEqual(obj.styles, styles); }); test('setSelectionStart', function() { var iText = new fabric.IText('test'); equal(typeof iText.setSelectionStart, 'function'); equal(iText.selectionStart, 0); iText.setSelectionStart(3); equal(iText.selectionStart, 3); equal(iText.selectionEnd, 0); }); test('setSelectionEnd', function() { var iText = new fabric.IText('test'); equal(typeof iText.setSelectionEnd, 'function'); equal(iText.selectionEnd, 0); iText.setSelectionEnd(3); equal(iText.selectionEnd, 3); equal(iText.selectionStart, 0); }); test('get2DCursorLocation', function() { var iText = new fabric.IText('test\nfoo\nbarbaz'); var loc = iText.get2DCursorLocation(); equal(loc.lineIndex, 0); equal(loc.charIndex, 0); // 'tes|t' iText.selectionStart = iText.selectionEnd = 3; var loc = iText.get2DCursorLocation(); equal(loc.lineIndex, 0); equal(loc.charIndex, 3); // test // fo|o iText.selectionStart = iText.selectionEnd = 7; var loc = iText.get2DCursorLocation(); equal(loc.lineIndex, 1); equal(loc.charIndex, 2); // test // foo // barba|z iText.selectionStart = iText.selectionEnd = 14; var loc = iText.get2DCursorLocation(); equal(loc.lineIndex, 2); equal(loc.charIndex, 5); }); test('isEmptyStyles', function() { var iText = new fabric.IText('test'); ok(iText.isEmptyStyles()); var iText = new fabric.IText('test', { styles: { 0: { 0: { } }, 1: { 0: { }, 1: { } } } }); ok(iText.isEmptyStyles()); var iText = new fabric.IText('test', { styles: { 0: { 0: { } }, 1: { 0: { fill: 'red' }, 1: { } } } }); ok(!iText.isEmptyStyles()); }); test('selectAll', function() { var iText = new fabric.IText('test'); iText.selectAll(); equal(iText.selectionStart, 0); equal(iText.selectionEnd, 4); iText.selectionStart = 1; iText.selectionEnd = 2; iText.selectAll(); equal(iText.selectionStart, 0); equal(iText.selectionEnd, 4); }); test('getSelectedText', function() { var iText = new fabric.IText('test\nfoobarbaz'); iText.selectionStart = 1; iText.selectionEnd = 10; equal(iText.getSelectedText(), 'est\nfooba'); iText.selectionStart = iText.selectionEnd = 3; equal(iText.getSelectedText(), ''); }); test('enterEditing, exitEditing', function() { var iText = new fabric.IText('test'); equal(typeof iText.enterEditing, 'function'); equal(typeof iText.exitEditing, 'function'); ok(!iText.isEditing); iText.enterEditing(); ok(iText.isEditing); iText.exitEditing(); ok(!iText.isEditing); }); test('insertChars', function() { var iText = new fabric.IText('test'); equal(typeof iText.insertChars, 'function'); iText.insertChars('foo_'); equal(iText.text, 'foo_test'); iText.text = 'test'; iText.selectionStart = iText.selectionEnd = 2; iText.insertChars('_foo_'); equal(iText.text, 'te_foo_st'); iText.text = 'test'; iText.selectionStart = 1; iText.selectionEnd = 3; iText.insertChars('_foo_'); equal(iText.text, 't_foo_t'); }); test('insertNewline', function() { var iText = new fabric.IText('test'); equal(typeof iText.insertNewline, 'function'); iText.selectionStart = iText.selectionEnd = 2; iText.insertNewline(); equal(iText.text, 'te\nst'); iText.text = 'test'; iText.selectionStart = 1; iText.selectionEnd = 3; iText.insertNewline(); equal(iText.text, 't\nt'); }); test('selectWord', function() { var iText = new fabric.IText('test foo bar-baz\nqux'); equal(typeof iText.selectWord, 'function'); iText.selectWord(1); equal(iText.selectionStart, 0); // |test| equal(iText.selectionEnd, 4); iText.selectWord(7); equal(iText.selectionStart, 5); // |foo| equal(iText.selectionEnd, 8); }); test('selectLine', function() { var iText = new fabric.IText('test foo bar-baz\nqux'); equal(typeof iText.selectLine, 'function'); iText.selectLine(6); equal(iText.selectionStart, 0); // |test foo bar-baz| equal(iText.selectionEnd, 16); iText.selectLine(18); equal(iText.selectionStart, 17); // |qux| equal(iText.selectionEnd, 20); }); test('findWordBoundaryLeft', function() { var iText = new fabric.IText('test foo bar-baz\nqux'); equal(typeof iText.findWordBoundaryLeft, 'function'); equal(iText.findWordBoundaryLeft(3), 0); // 'tes|t' equal(iText.findWordBoundaryLeft(20), 17); // 'qux|' equal(iText.findWordBoundaryLeft(6), 5); // 'f|oo' equal(iText.findWordBoundaryLeft(11), 9); // 'ba|r-baz' }); test('findWordBoundaryRight', function() { var iText = new fabric.IText('test foo bar-baz\nqux'); equal(typeof iText.findWordBoundaryRight, 'function'); equal(iText.findWordBoundaryRight(3), 4); // 'tes|t' equal(iText.findWordBoundaryRight(17), 20); // '|qux' equal(iText.findWordBoundaryRight(6), 8); // 'f|oo' equal(iText.findWordBoundaryRight(11), 16); // 'ba|r-baz' }); test('findLineBoundaryLeft', function() { var iText = new fabric.IText('test foo bar-baz\nqux'); equal(typeof iText.findLineBoundaryLeft, 'function'); equal(iText.findLineBoundaryLeft(3), 0); // 'tes|t' equal(iText.findLineBoundaryLeft(20), 17); // 'qux|' }); test('findLineBoundaryRight', function() { var iText = new fabric.IText('test foo bar-baz\nqux'); equal(typeof iText.findLineBoundaryRight, 'function'); equal(iText.findLineBoundaryRight(3), 16); // 'tes|t' equal(iText.findLineBoundaryRight(17), 20); // '|qux' }); test('getNumNewLinesInSelectedText', function() { var iText = new fabric.IText('test foo bar-baz\nqux'); equal(typeof iText.getNumNewLinesInSelectedText, 'function'); equal(iText.getNumNewLinesInSelectedText(), 0); iText.selectionStart = 0; iText.selectionEnd = 20; equal(iText.getNumNewLinesInSelectedText(), 1); }); test('getSelectionStyles with no arguments', function() { var iText = new fabric.IText('test foo bar-baz\nqux', { styles: { 0: { 0: { textDecoration: 'underline' }, 2: { textDecoration: 'overline' }, 4: { textBackgroundColor: '#ffc' } }, 1: { 0: { fill: 'red' }, 1: { fill: 'green' }, 2: { fill: 'blue' } } } }); equal(typeof iText.getSelectionStyles, 'function'); iText.selectionStart = 0; iText.selectionEnd = 0; deepEqual(iText.getSelectionStyles(), { textDecoration: 'underline' }); iText.selectionStart = 2; iText.selectionEnd = 2; deepEqual(iText.getSelectionStyles(), { textDecoration: 'overline' }); iText.selectionStart = 17; iText.selectionStart = 17; deepEqual(iText.getSelectionStyles(), { fill: 'red' }); }); test('getSelectionStyles with 1 arg', function() { var iText = new fabric.IText('test foo bar-baz\nqux', { styles: { 0: { 0: { textDecoration: 'underline' }, 2: { textDecoration: 'overline' }, 4: { textBackgroundColor: '#ffc' } }, 1: { 0: { fill: 'red' }, 1: { fill: 'green' }, 2: { fill: 'blue' } } } }); iText.selectionStart = 17; iText.selectionStart = 17; deepEqual(iText.getSelectionStyles(2), { textDecoration: 'overline' }); }); test('getSelectionStyles with 2 args', function() { var iText = new fabric.IText('test foo bar-baz\nqux', { styles: { 0: { 0: { textDecoration: 'underline' }, 2: { textDecoration: 'overline' }, 4: { textBackgroundColor: '#ffc' } }, 1: { 0: { fill: 'red' }, 1: { fill: 'green' }, 2: { fill: 'blue' } } } }); deepEqual(iText.getSelectionStyles(0, 2), [ { textDecoration: 'underline' }, { } ]); }); test('setSelectionStyles', function() { var iText = new fabric.IText('test foo bar-baz\nqux', { styles: { 0: { 0: { fill: '#112233' }, 2: { stroke: '#223344' } } } }); equal(typeof iText.setSelectionStyles, 'function'); iText.setSelectionStyles({ fill: 'red', stroke: 'yellow' }); deepEqual(iText.styles[0][0], { fill: 'red', stroke: 'yellow' }); iText.selectionStart = 2; iText.selectionEnd = 2; iText.setSelectionStyles({ fill: '#998877', stroke: 'yellow' }); deepEqual(iText.styles[0][2], { fill: '#998877', stroke: 'yellow' }); }); test('getCurrentCharFontSize', function() { var iText = new fabric.IText('test foo bar-baz\nqux', { styles: { 0: { 0: { fontSize: 20 }, 1: { fontSize: 60 } } } }); equal(typeof iText.getCurrentCharFontSize, 'function'); equal(iText.getCurrentCharFontSize(0, 0), 20); equal(iText.getCurrentCharFontSize(0, 1), 20); equal(iText.getCurrentCharFontSize(0, 2), 60); equal(iText.getCurrentCharFontSize(1, 0), 40); }); test('getCurrentCharColor', function() { var iText = new fabric.IText('test foo bar-baz\nqux', { styles: { 0: { 0: { fill: 'red' }, 1: { fill: 'green' } } } }); equal(typeof iText.getCurrentCharColor, 'function'); equal(iText.getCurrentCharColor(0, 0), 'red'); equal(iText.getCurrentCharColor(0, 1), 'red'); equal(iText.getCurrentCharColor(0, 2), 'green'); // or cursor color equal(iText.getCurrentCharColor(1, 0), '#333'); }); test('toSVG', function() { var iText = new fabric.IText('test foo bar-baz\nqux', { styles: { 0: { 0: { fill: '#112233' }, 2: { stroke: '#223344' } } } }); equal(typeof iText.toSVG, 'function'); // because translate values differ if (!fabric.isLikelyNode) { equal(iText.toSVG(), 'test foo bar-bazqux'); } // TODO: more SVG tests here? }); })();