Files
DocumentServer-v-9.2.0/sdkjs/tests/word/numbering/numberingCalculation.js
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

238 lines
10 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* (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
*
*/
"use strict";
$(function ()
{
const logicDocument = AscTest.CreateLogicDocument();
const styleManager = logicDocument.GetStyleManager();
const numberingManager = logicDocument.GetNumberingManager();
let styleCounter = 0;
function CreateStyle()
{
let style = new AscWord.CStyle("style" + (++styleCounter), null, null, styletype_Paragraph);
styleManager.Add(style);
return style;
}
function CreateNum()
{
let numInfo = AscWord.GetNumberingObjectByDeprecatedTypes(2, 7);
let num = numberingManager.CreateNum();
numInfo.FillNum(num);
numberingManager.AddNum(num);
return num;
}
QUnit.module("Test the numbering calculation");
QUnit.test("Test the numbering specified in a style", function (assert)
{
function AddParagraph(style, text)
{
let p = AscTest.CreateParagraph();
logicDocument.PushToContent(p);
p.SetParagraphStyle(style.GetName());
let run = new AscWord.CRun();
p.AddToContent(0, run);
run.AddText(text);
return p;
}
function CheckParagraph(paraIndex, text)
{
let p = logicDocument.GetElement(paraIndex);
assert.strictEqual(p.GetNumberingText(false), text, "Check numbering text for paragraph " + paraIndex);
}
// Задаем 3 независимых стиля и свяжем их с тремя уровнями нумерации
let style0 = CreateStyle();
let style1 = CreateStyle();
let style2 = CreateStyle();
function GenerateDocument()
{
AscTest.ClearDocument();
AddParagraph(style0, "Style1");
AddParagraph(style1, "Style2");
AddParagraph(style2, "Style3");
}
function Recalculate()
{
GenerateDocument();
AscTest.Recalculate();
}
//--------------------------------------------------------------------------------------------------------------
// Нет нумерации
//--------------------------------------------------------------------------------------------------------------
Recalculate();
CheckParagraph(0, "");
CheckParagraph(1, "");
CheckParagraph(2, "");
//--------------------------------------------------------------------------------------------------------------
// Нумерация указана в стиле, и в стиле сразу заданы правильные уровни
//--------------------------------------------------------------------------------------------------------------
let num = CreateNum();
num.GetLvl(0).SetPStyle(style0.GetId());
num.GetLvl(1).SetPStyle(style1.GetId());
num.GetLvl(2).SetPStyle(style2.GetId());
style0.SetNumPr(num.GetId(), 0);
style1.SetNumPr(num.GetId(), 1);
style2.SetNumPr(num.GetId(), 2);
Recalculate();
CheckParagraph(0, "1.");
CheckParagraph(1, "1.1.");
CheckParagraph(2, "1.1.1.");
//--------------------------------------------------------------------------------------------------------------
// Нумерация указана в стиле, но в стиле уровни не указаны
// Не смотря на то, что в спецификации написано, что мы должны определять уровень по pStyle в уровне нумерации,
// MSWord так не делает. В MSWord если не задан уровнь, значит уровень = 0. А если стиль не совпадает со стилем
// в заданном уровне, значит нумерации нет.
//--------------------------------------------------------------------------------------------------------------
style0.SetNumPr(num.GetId(), undefined);
style1.SetNumPr(num.GetId(), undefined);
style2.SetNumPr(num.GetId(), undefined);
Recalculate();
CheckParagraph(0, "1.");
CheckParagraph(1, "");
CheckParagraph(2, "");
//--------------------------------------------------------------------------------------------------------------
// Нумерация указана в стиле, но в стиле уровни не указаны. Сами стили наследуются друг от друга
// В добавок к предыдущей ситуации, MSWord проверят иерархию наследования стилей, если один из цепочки подходит
// с текущим уровнем, то нумерация добавляется именно для подошедшего стиля.
// https://bugzilla.onlyoffice.com/show_bug.cgi?id=51893
//--------------------------------------------------------------------------------------------------------------
style1.SetNumPr(null);
style2.SetNumPr(null);
style1.SetBasedOn(style0.GetId());
style2.SetBasedOn(style1.GetId());
Recalculate();
CheckParagraph(0, "1.");
CheckParagraph(1, "2.");
CheckParagraph(2, "3.");
});
// TODO: Добавить больше тестов и вынести в отдельный файл
QUnit.test("Test numbering collection", function (assert)
{
function AddParagraph(text)
{
let p = AscTest.CreateParagraph();
logicDocument.PushToContent(p);
let run = new AscWord.CRun();
p.AddToContent(0, run);
run.AddText(text);
return p;
}
AscTest.ClearDocument();
let p1 = AddParagraph("Paragraph 1");
let p2 = AddParagraph("Paragraph 2");
let p3 = AddParagraph("Paragraph 3");
let p4 = AddParagraph("Paragraph 4");
let style = CreateStyle();
p2.SetParagraphStyle(style.GetName());
let num = CreateNum();
let numPr = new AscWord.NumPr(num.GetId(), 0);
let collection = logicDocument.GetNumberingCollection();
let paraArray = collection.GetAllParagraphsByNumbering(numPr);
assert.strictEqual(paraArray.length, 0, "Check paragraphs for just created numbering");
p1.SetNumPr(numPr.NumId, numPr.Lvl);
paraArray = collection.GetAllParagraphsByNumbering(numPr);
assert.strictEqual(paraArray.length, 1, "Add numbering direct to paragraph and check numbering collection");
assert.ok(-1 !== paraArray.indexOf(p1), "Check paragraph in collection");
assert.strictEqual(p1.GetNumberingText(false), "1.", "Check numbering text for paragraph " + 0);
num.GetLvl(0).SetPStyle(style.GetId());
style.SetNumPr(num.GetId(), 0);
paraArray = collection.GetAllParagraphsByNumbering(numPr);
assert.strictEqual(paraArray.length, 2, "Add numbering to a style. We have a predefined paragraph with that style. Check numbering collection");
assert.ok(-1 !== paraArray.indexOf(p2), "Check paragraph in collection");
assert.strictEqual(p2.GetNumberingText(false), "2.", "Check numbering text for paragraph " + 1);
p3.SetParagraphStyle(style.GetName());
paraArray = collection.GetAllParagraphsByNumbering(numPr);
assert.strictEqual(paraArray.length, 3, "Add style with numbering to paragraph and check numbering collection");
assert.ok(-1 !== paraArray.indexOf(p3), "Check paragraph in collection");
assert.strictEqual(p3.GetNumberingText(false), "3.", "Check numbering text for paragraph " + 2);
p4.SetParagraphStyle(style.GetName());
paraArray = collection.GetAllParagraphsByNumbering(numPr);
assert.strictEqual(paraArray.length, 4, "Add style with numbering to paragraph and check numbering collection");
assert.ok(-1 !== paraArray.indexOf(p4), "Check paragraph in collection");
assert.strictEqual(p4.GetNumberingText(false), "4.", "Check numbering text for paragraph " + 3);
p4.SetNumPr(0, 0);
paraArray = collection.GetAllParagraphsByNumbering(numPr);
assert.strictEqual(paraArray.length, 3, "Cancel numbering by direct paragraph properties and check numbering collection");
assert.ok(-1 === paraArray.indexOf(p4), "Check paragraph is not in the collection");
assert.strictEqual(p4.GetNumberingText(false), "", "Check that there is no numbering text for paragraph " + 3);
p3.SetParagraphStyleById(styleManager.GetDefaultParagraph());
paraArray = collection.GetAllParagraphsByNumbering(numPr);
assert.strictEqual(paraArray.length, 2, "Cancel numbering by removing style from paragraph. Check numbering collection");
assert.ok(-1 === paraArray.indexOf(p3), "Check paragraph is not in the collection");
assert.strictEqual(p3.GetNumberingText(false), "", "Check that there is no numbering text for paragraph " + 2);
num.GetLvl(0).SetPStyle(undefined);
style.SetNumPr(undefined);
paraArray = collection.GetAllParagraphsByNumbering(numPr);
assert.strictEqual(paraArray.length, 1, "Remove numbering link from style and check numbering collection");
assert.ok(-1 === paraArray.indexOf(p2), "Check that paragraph with this style is not in the collection");
assert.strictEqual(p2.GetNumberingText(false), "", "Check that there is no numbering text for paragraph " + 1);
logicDocument.RemoveFromContent(0, 1);
assert.strictEqual(p1.IsUseInDocument(), false, "Remove first paragraph and check if it is not present in the document");
paraArray = collection.GetAllParagraphsByNumbering(numPr);
assert.strictEqual(paraArray.length, 0, "Remove first paragraph and check numbering collection");
assert.ok(-1 === paraArray.indexOf(p1), "Check that removed paragraph is not in the collection");
});
});