335 lines
11 KiB
JavaScript
335 lines
11 KiB
JavaScript
/*
|
|
* (c) Copyright Ascensio System SIA 2010-2024
|
|
*
|
|
* This program is a free software product. You can redistribute it and/or
|
|
* modify it under the terms of the GNU Affero General Public License (AGPL)
|
|
* version 3 as published by the Free Software Foundation. In accordance with
|
|
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
|
|
* that Ascensio System SIA expressly excludes the warranty of non-infringement
|
|
* of any third-party rights.
|
|
*
|
|
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
|
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
|
|
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
|
*
|
|
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
|
|
* street, Riga, Latvia, EU, LV-1050.
|
|
*
|
|
* The interactive user interfaces in modified source and object code versions
|
|
* of the Program must display Appropriate Legal Notices, as required under
|
|
* Section 5 of the GNU AGPL version 3.
|
|
*
|
|
* Pursuant to Section 7(b) of the License you must retain the original Product
|
|
* logo when distributing the program. Pursuant to Section 7(e) we decline to
|
|
* grant you any rights under trademark law for use of our trademarks.
|
|
*
|
|
* All the Product's GUI elements, including illustrations and icon sets, as
|
|
* well as technical writing content are licensed under the terms of the
|
|
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
|
|
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
|
*
|
|
*/
|
|
|
|
$(function () {
|
|
|
|
let logicDocument = AscTest.CreateLogicDocument();
|
|
|
|
function addShape(x, y, h, w)
|
|
{
|
|
const drawing = new ParaDrawing(w, h, null, logicDocument.GetDrawingDocument(), logicDocument, null);
|
|
const shapeTrack = new AscFormat.NewShapeTrack('rect', x, y, logicDocument.theme, null, null, null, 0);
|
|
shapeTrack.track({}, x+ w, y + h);
|
|
const shape = shapeTrack.getShape(true, logicDocument.GetDrawingDocument(), null);
|
|
shape.setBDeleted(false);
|
|
|
|
shape.setParent(drawing);
|
|
drawing.Set_GraphicObject(shape);
|
|
drawing.Set_DrawingType(drawing_Anchor);
|
|
drawing.Set_WrappingType(WRAPPING_TYPE_NONE);
|
|
drawing.Set_Distance(0, 0, 0, 0);
|
|
logicDocument.AddToParagraph(drawing);
|
|
return drawing;
|
|
}
|
|
function createTextBoxContent(drawing)
|
|
{
|
|
let shape = drawing.GraphicObj;
|
|
shape.createTextBoxContent();
|
|
return shape.getDocContent();
|
|
|
|
}
|
|
|
|
|
|
QUnit.module("Check text input in the document editor");
|
|
|
|
let GetParagraphText = AscTest.GetParagraphText;
|
|
|
|
QUnit.test("EnterText/CorrectEnterText/CompositeInput", function (assert)
|
|
{
|
|
AscTest.ClearDocument();
|
|
|
|
let p = new AscWord.Paragraph();
|
|
logicDocument.AddToContent(0, p);
|
|
|
|
logicDocument.SelectAll();
|
|
assert.strictEqual(logicDocument.GetSelectedText(), "\r\n", "Check empty selection");
|
|
|
|
logicDocument.AddTextWithPr("Hello World!");
|
|
|
|
logicDocument.SelectAll();
|
|
assert.strictEqual(logicDocument.GetSelectedText(false), "Hello World!\r\n", "Add text 'Hello World!'");
|
|
|
|
logicDocument.MoveCursorToStartPos();
|
|
logicDocument.MoveCursorRight();
|
|
logicDocument.MoveCursorRight();
|
|
|
|
AscTest.EnterText("123");
|
|
assert.strictEqual(GetParagraphText(p), "He123llo World!", "Add text '123'");
|
|
|
|
AscTest.EnterText("AA");
|
|
assert.strictEqual(GetParagraphText(p), "He123AAllo World!", "Add text 'AA'");
|
|
|
|
AscTest.CorrectEnterText("AB", "ABC");
|
|
assert.strictEqual(GetParagraphText(p), "He123AAllo World!", "Check wrong correction AB to ABC");
|
|
|
|
AscTest.CorrectEnterText("AA", "ABC");
|
|
assert.strictEqual(GetParagraphText(p), "He123ABCllo World!", "Check correction AA to ABC");
|
|
|
|
AscTest.EnterText("DD");
|
|
logicDocument.MoveCursorLeft();
|
|
AscTest.CorrectEnterText("DD", "CC");
|
|
assert.strictEqual(GetParagraphText(p), "He123ABCDDllo World!", "Add text DD move left and check wrong correction");
|
|
|
|
logicDocument.MoveCursorToEndPos();
|
|
AscTest.EnterText("qq");
|
|
AscTest.CorrectEnterText("!qq", "!?");
|
|
assert.strictEqual(GetParagraphText(p), "He123ABCDDllo World!?", "Move to the end, add qq and correct !qq to !?");
|
|
|
|
AscTest.BeginCompositeInput();
|
|
AscTest.ReplaceCompositeInput("WWW");
|
|
AscTest.ReplaceCompositeInput("123");
|
|
AscTest.EndCompositeInput();
|
|
assert.strictEqual(GetParagraphText(p), "He123ABCDDllo World!?123", "Add text '123' with composite input");
|
|
|
|
AscTest.EnterTextCompositeInput("Zzz");
|
|
AscTest.CorrectEnterText("3Zzz", "$");
|
|
assert.strictEqual(GetParagraphText(p), "He123ABCDDllo World!?12$", "Add text 'Zzz' with composite input and correct it from '3Zzz' to '$'");
|
|
|
|
AscTest.ClearParagraph(p);
|
|
AscTest.EnterTextCompositeInput("x");
|
|
AscTest.EnterTextCompositeInput("yz");
|
|
AscTest.CorrectEnterText("yz", "x");
|
|
assert.strictEqual(GetParagraphText(p), "xx", "Test special case, when added symbols collect to a single grapheme with previous symbols");
|
|
|
|
// Вводим на сингальском 1ෑඒ (1-e-e-t)
|
|
p = new AscWord.Paragraph();
|
|
logicDocument.PushToContent(p);
|
|
AscTest.MoveCursorToParagraph(p);
|
|
AscTest.EnterText("1");
|
|
AscTest.BeginCompositeInput();
|
|
AscTest.ReplaceCompositeInput([]);
|
|
AscTest.ReplaceCompositeInput([3536]);
|
|
AscTest.ReplaceCompositeInput([3537]);
|
|
AscTest.ReplaceCompositeInput([3537, 3474]);
|
|
AscTest.EndCompositeInput();
|
|
assert.strictEqual(GetParagraphText(p), "1ෑඒ", "Add text '1ෑඒ'");
|
|
assert.strictEqual(p.IsCursorAtEnd(), true, "Check cursor position");
|
|
});
|
|
QUnit.test("EnterText/CorrectEnterText/CompositeInput in collaboration", function (assert)
|
|
{
|
|
AscTest.StartCollaboration();
|
|
|
|
AscTest.ClearDocument();
|
|
let p = new AscWord.Paragraph();
|
|
logicDocument.AddToContent(0, p);
|
|
|
|
AscTest.EnterText("ABC");
|
|
assert.strictEqual(GetParagraphText(p), "ABC", "Add text 'ABC' in collaboration");
|
|
|
|
AscTest.MoveCursorLeft();
|
|
AscTest.EnterText("111");
|
|
AscTest.SyncCollaboration();
|
|
AscTest.CorrectEnterText("11", "23");
|
|
AscTest.SyncCollaboration();
|
|
assert.strictEqual(GetParagraphText(p), "AB123C", "Add text '111' and correct it with '123' in collaboration (sync between actions)");
|
|
|
|
AscTest.EnterText("QQQ");
|
|
AscTest.CorrectEnterText("QQ", "RS");
|
|
AscTest.SyncCollaboration();
|
|
assert.strictEqual(GetParagraphText(p), "AB123QRSC", "Add text '111' and correct it with '123' in collaboration (no sync between actions)");
|
|
|
|
AscTest.EndCollaboration();
|
|
});
|
|
QUnit.test("EnterText/CorrectEnterText/CompositeInput with running TextSpeaker", function (assert)
|
|
{
|
|
AscTest.StartTextSpeaker();
|
|
|
|
AscTest.ClearDocument();
|
|
let p = new AscWord.Paragraph();
|
|
logicDocument.AddToContent(0, p);
|
|
|
|
AscTest.EnterText("ABC");
|
|
assert.strictEqual(GetParagraphText(p), "ABC", "Add text 'ABC' in collaboration");
|
|
|
|
AscTest.MoveCursorLeft();
|
|
AscTest.EnterText("111");
|
|
AscTest.CorrectEnterText("11", "23");
|
|
assert.strictEqual(GetParagraphText(p), "AB123C", "Add text '111' and correct it with '123' in collaboration (sync between actions)");
|
|
|
|
AscTest.EnterText("QQQ");
|
|
AscTest.CorrectEnterText("QQ", "RS");
|
|
assert.strictEqual(GetParagraphText(p), "AB123QRSC", "Add text '111' and correct it with '123' in collaboration (no sync between actions)");
|
|
|
|
// Вводим на сингальском 1ෑඒ (1-e-e-t)
|
|
p = new AscWord.Paragraph();
|
|
logicDocument.PushToContent(p);
|
|
AscTest.MoveCursorToParagraph(p);
|
|
AscTest.EnterText("1");
|
|
AscTest.BeginCompositeInput();
|
|
AscTest.ReplaceCompositeInput([]);
|
|
AscTest.ReplaceCompositeInput([3536]);
|
|
AscTest.ReplaceCompositeInput([3537]);
|
|
AscTest.ReplaceCompositeInput([3537, 3474]);
|
|
AscTest.EndCompositeInput();
|
|
assert.strictEqual(GetParagraphText(p), "1ෑඒ", "Add text '1ෑඒ'");
|
|
assert.strictEqual(p.IsCursorAtEnd(), true, "Check cursor position");
|
|
|
|
AscTest.StopTextSpeaker();
|
|
});
|
|
QUnit.test("Test 'complex script' property on input", function (assert)
|
|
{
|
|
function CheckParagraphSplit(p, text, runCS, runText)
|
|
{
|
|
let count = runCS.length;
|
|
assert.strictEqual(p.GetElementsCount(), count, "Check runs count on entering '" + text + "'");
|
|
|
|
for (let index = 0; index < count; ++index)
|
|
{
|
|
let element = p.GetElement(index);
|
|
|
|
if (!(element instanceof AscWord.CRun))
|
|
{
|
|
assert.ok(false, "Not a run");
|
|
break;
|
|
}
|
|
|
|
assert.strictEqual(element.GetText(), runText[index], `Check run[${index}] text`);
|
|
assert.strictEqual(element.IsCS(), runCS[index], `Check run[${index}] CS`);
|
|
}
|
|
}
|
|
function CheckTextEnter(arrText, arrComposite, ...args)
|
|
{
|
|
AscTest.ClearDocument();
|
|
|
|
let p = new AscWord.Paragraph();
|
|
logicDocument.AddToContent(0, p);
|
|
|
|
let overallText = "";
|
|
for (let index = 0, count = arrText.length; index < count; ++index)
|
|
{
|
|
let text = arrText[index];
|
|
if (arrComposite[index])
|
|
AscTest.EnterTextCompositeInput(text);
|
|
else
|
|
AscTest.EnterText(text);
|
|
|
|
overallText += text;
|
|
}
|
|
|
|
CheckParagraphSplit(p, overallText, ...args);
|
|
}
|
|
|
|
|
|
CheckTextEnter(
|
|
["Abcෑඒ"],
|
|
[false],
|
|
[false, true],
|
|
["Abc", "ෑඒ"]
|
|
|
|
);
|
|
CheckTextEnter(
|
|
["Abc1ෑඒ"],
|
|
[false],
|
|
[false, true],
|
|
["Abc1", "ෑඒ"]
|
|
);
|
|
CheckTextEnter(
|
|
["Abc1ෑඒabc"],
|
|
[false],
|
|
[false, true, false],
|
|
["Abc1", "ෑඒ", "abc"]
|
|
);
|
|
|
|
// Композитный ввод всегда добавляет новый ран
|
|
CheckTextEnter(
|
|
["Abc", "ෑඒ"],
|
|
[false, true],
|
|
[false, true],
|
|
["Abc", "ෑඒ"]
|
|
);
|
|
|
|
CheckTextEnter(
|
|
["Abc", "ෑඒ", "efg"],
|
|
[false, true, false],
|
|
[false, true, false],
|
|
["Abc", "ෑඒ", "efg"]
|
|
);
|
|
|
|
// Проверяем, что если ран состоит только из Script_Common, то мы параметр CS подхватывается из следующего ввода
|
|
CheckTextEnter(
|
|
["1abc"],
|
|
[false],
|
|
[false],
|
|
["1abc"]
|
|
);
|
|
|
|
CheckTextEnter(
|
|
["2ෑඒ"],
|
|
[false],
|
|
[true],
|
|
["2ෑඒ"]
|
|
);
|
|
|
|
CheckTextEnter(
|
|
["3", "ෑඒ"],
|
|
[false, true],
|
|
[true, true],
|
|
["3", "ෑඒ"]
|
|
);
|
|
});
|
|
QUnit.test("Test EnterText/CorrectEnterText/CompositeInput in Shape", function (assert)
|
|
{
|
|
// Делаем тест по сценарию бага 67336 для прокерки корректности ввода в автофигуру
|
|
AscTest.ClearDocument();
|
|
|
|
let p = new AscWord.Paragraph();
|
|
logicDocument.AddToContent(0, p);
|
|
|
|
let drawing = addShape(0, 0, 100, 100);
|
|
p.AddToParagraph(drawing);
|
|
|
|
let docContent = createTextBoxContent(drawing);
|
|
pInShape = docContent.GetElement(0);
|
|
|
|
assert.strictEqual(GetParagraphText(p), "");
|
|
assert.strictEqual(GetParagraphText(pInShape), "");
|
|
|
|
AscTest.MoveCursorToParagraph(pInShape, true);
|
|
|
|
let _textInShape = "Text in shape";
|
|
AscTest.BeginCompositeInput();
|
|
AscTest.ReplaceCompositeInput("Test");
|
|
AscTest.ReplaceCompositeInput(_textInShape);
|
|
AscTest.EndCompositeInput();
|
|
assert.strictEqual(GetParagraphText(p), "");
|
|
assert.strictEqual(GetParagraphText(pInShape), _textInShape);
|
|
|
|
AscTest.CorrectEnterText(_textInShape, "");
|
|
assert.strictEqual(GetParagraphText(p), "");
|
|
assert.strictEqual(GetParagraphText(pInShape), "");
|
|
|
|
AscTest.EnterText(_textInShape);
|
|
assert.strictEqual(GetParagraphText(p), "");
|
|
assert.strictEqual(GetParagraphText(pInShape), _textInShape);
|
|
});
|
|
});
|