Files
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

615 lines
25 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 SheetMemory = AscCommonExcel.SheetMemory;
QUnit.test("Test: \"checkIndex\"", function (assert) {
let sheetMemory = new SheetMemory(8, 100); // Use 8 bytes as minimum struct size
assert.strictEqual(sheetMemory.hasIndex(10), false);
assert.strictEqual(sheetMemory.getMaxIndex(), -1);
assert.strictEqual(sheetMemory.hasIndex(200), false);
sheetMemory.checkIndex(10);
assert.strictEqual(sheetMemory.hasIndex(9), false);
assert.strictEqual(sheetMemory.hasIndex(10), true);
assert.strictEqual(sheetMemory.hasIndex(11), false);
assert.strictEqual(sheetMemory.getMinIndex(), 10);
assert.strictEqual(sheetMemory.getMaxIndex(), 10);
sheetMemory.checkIndex(200);
assert.strictEqual(sheetMemory.hasIndex(200), false);
assert.strictEqual(sheetMemory.getMinIndex(), 10);
assert.strictEqual(sheetMemory.getMaxIndex(), 100);
sheetMemory.checkIndex(15);
assert.strictEqual(sheetMemory.hasIndex(15), true);
assert.strictEqual(sheetMemory.hasIndex(16), true);
assert.strictEqual(sheetMemory.getMinIndex(), 10);
assert.strictEqual(sheetMemory.getMaxIndex(), 100);
sheetMemory.checkIndex(5);
assert.strictEqual(sheetMemory.hasIndex(4), false);
assert.strictEqual(sheetMemory.hasIndex(5), true);
assert.strictEqual(sheetMemory.getMinIndex(), 5);
assert.strictEqual(sheetMemory.getMaxIndex(), 100);
//getAllocatedCount - affected by alignment
let allocThreshOld = sheetMemory.getMinIndex() + sheetMemory.getAllocatedCount() - 1;
sheetMemory.checkIndex(allocThreshOld);
sheetMemory.setUint8(allocThreshOld, 0, 1);
assert.strictEqual(sheetMemory.getMinIndex(), 5);
assert.strictEqual(sheetMemory.getMaxIndex(), 100);
assert.strictEqual(sheetMemory.getUint8(allocThreshOld, 0), 1);
});
QUnit.test("Test: \"clone\"", function (assert) {
let sheetMemory = new SheetMemory(8, 100); // Use 8 bytes as minimum struct size
sheetMemory.checkIndex(5);
sheetMemory.checkIndex(15);
sheetMemory.setUint8(5, 0, 1);
sheetMemory.setUint8(10, 0, 2);
sheetMemory.setUint8(15, 0, 3);
let sheetMemory2 = sheetMemory.clone();
assert.strictEqual(sheetMemory2.getMinIndex(), 5);
assert.strictEqual(sheetMemory2.getMaxIndex(), 15);
assert.strictEqual(sheetMemory2.getUint8(5, 0), 1);
assert.strictEqual(sheetMemory2.getUint8(10, 0), 2);
assert.strictEqual(sheetMemory2.getUint8(15, 0), 3);
});
QUnit.test("Test: \"binary data set/get simple\"", function (assert) {
let sheetMemory = new SheetMemory(24, 100); // 24 is the nearest multiple of 8 that can contain 5+1+4+8=18 bytes
sheetMemory.checkIndex(8);
sheetMemory.checkIndex(12);
sheetMemory.setUint8(8, 5, 2);
sheetMemory.setInt32(9, 5, 0xfffff);
sheetMemory.setFloat64(10, 5, 0.123456789);
assert.strictEqual(sheetMemory.getUint8(8, 5), 2);
assert.strictEqual(sheetMemory.getInt32(9, 5), 0xfffff);
assert.strictEqual(sheetMemory.getFloat64(10, 5), 0.123456789);
sheetMemory.setUint8(11, 3, 2);
sheetMemory.setInt32(11, 3+1, 0xfffff);
sheetMemory.setFloat64(11, 3+1+4, 0.123456789);
assert.strictEqual(sheetMemory.getUint8(11, 3), 2);
assert.strictEqual(sheetMemory.getInt32(11, 3+1), 0xfffff);
assert.strictEqual(sheetMemory.getFloat64(11, 3+1+4), 0.123456789);
});
QUnit.test("Test: \"binary data set/get\"", function (assert) {
// Create memory structure with enough space for all data types
let sheetMemory = new SheetMemory(24, 100); // 24 is a multiple of 8, suitable for aligned memory access
sheetMemory.checkIndex(10);
// Test signed and unsigned 32-bit integer conversion
const negativeInt = -123456;
const positiveInt = 0x7FFFFFFF; // Max positive 32-bit signed int
const largeUint = 0xFFFFFFFF; // Max 32-bit unsigned int (4294967295)
// Set values
sheetMemory.setInt32(10, 0, negativeInt);
sheetMemory.setInt32(10, 4, positiveInt);
sheetMemory.setInt32(10, 8, largeUint);
// Test getInt32 (signed)
assert.strictEqual(sheetMemory.getInt32(10, 0), negativeInt, "Negative int32 should be preserved");
assert.strictEqual(sheetMemory.getInt32(10, 4), positiveInt, "Positive int32 should be preserved");
assert.strictEqual(sheetMemory.getInt32(10, 8), -1, "Overflow value should be -1 when read as signed");
// Test getInt32 (signed and unsigned conversion)
assert.strictEqual(AscFonts.FT_Common.IntToUInt(sheetMemory.getInt32(10, 0)), 0xFFFFFFFF - Math.abs(negativeInt) + 1, "Negative int32 should be converted to unsigned");
assert.strictEqual(AscFonts.FT_Common.IntToUInt(sheetMemory.getInt32(10, 4)), positiveInt, "Positive int32 should remain the same when read as unsigned");
assert.strictEqual(AscFonts.FT_Common.IntToUInt(sheetMemory.getInt32(10, 8)), largeUint, "Max uint32 value should be preserved");
// Test binary data with multiple byte types
const byte1 = 0xAA; // 170
const byte2 = 0x55; // 85
// Set values at specific byte positions
sheetMemory.setUint8(10, 12, byte1);
sheetMemory.setUint8(10, 13, byte2);
sheetMemory.setUint8(10, 14, 0xFF); // 255
sheetMemory.setUint8(10, 15, 0x00); // 0
// Read individual bytes
assert.strictEqual(sheetMemory.getUint8(10, 12), byte1, "Byte 1 should be correctly stored and retrieved");
assert.strictEqual(sheetMemory.getUint8(10, 13), byte2, "Byte 2 should be correctly stored and retrieved");
assert.strictEqual(sheetMemory.getUint8(10, 14), 0xFF, "Byte 3 should be correctly stored and retrieved");
assert.strictEqual(sheetMemory.getUint8(10, 15), 0x00, "Byte 4 should be correctly stored and retrieved");
// Read as 32-bit integer (testing byte order)
const combinedBytes = sheetMemory.getInt32(10, 12);
assert.ok(combinedBytes !== 0, "Combined bytes should not be zero");
// Test a real-world scenario: store RGB color value
const red = 0xFF;
const green = 0x80;
const blue = 0x20;
const alpha = 0xFF;
sheetMemory.setUint8(10, 16, red);
sheetMemory.setUint8(10, 17, green);
sheetMemory.setUint8(10, 18, blue);
sheetMemory.setUint8(10, 19, alpha);
assert.strictEqual(sheetMemory.getUint8(10, 16), red, "Red component should be preserved");
assert.strictEqual(sheetMemory.getUint8(10, 17), green, "Green component should be preserved");
assert.strictEqual(sheetMemory.getUint8(10, 18), blue, "Blue component should be preserved");
assert.strictEqual(sheetMemory.getUint8(10, 19), alpha, "Alpha component should be preserved");
// Read color as 32-bit value
const colorValue = sheetMemory.getInt32(10, 16);
assert.ok(colorValue !== 0, "RGBA color value should not be zero");
});
QUnit.test("Test: \"deleteRange\"", function (assert) {
let sheetMemory = new SheetMemory(8, 100); // Use 8 bytes as minimum struct size
sheetMemory.checkIndex(12);
sheetMemory.checkIndex(20);
sheetMemory.setUint8(12, 0, 1);
sheetMemory.setUint8(13, 0, 2);
sheetMemory.setUint8(14, 0, 3);
sheetMemory.setUint8(15, 0, 4);
sheetMemory.setUint8(16, 0, 5);
sheetMemory.setUint8(17, 0, 6);
sheetMemory.setUint8(18, 0, 7);
sheetMemory.setUint8(19, 0, 8);
sheetMemory.setUint8(20, 0, 9);
sheetMemory.deleteRange(30, 100);
assert.strictEqual(sheetMemory.getMinIndex(), 12);
assert.strictEqual(sheetMemory.getMaxIndex(), 20);
assert.strictEqual(sheetMemory.getUint8(12, 0), 1);
assert.strictEqual(sheetMemory.getUint8(13, 0), 2);
assert.strictEqual(sheetMemory.getUint8(14, 0), 3);
assert.strictEqual(sheetMemory.getUint8(15, 0), 4);
assert.strictEqual(sheetMemory.getUint8(16, 0), 5);
assert.strictEqual(sheetMemory.getUint8(17, 0), 6);
assert.strictEqual(sheetMemory.getUint8(18, 0), 7);
assert.strictEqual(sheetMemory.getUint8(19, 0), 8);
assert.strictEqual(sheetMemory.getUint8(20, 0), 9);
sheetMemory.deleteRange(2, 2);
assert.strictEqual(sheetMemory.getMinIndex(), 10);
assert.strictEqual(sheetMemory.getMaxIndex(), 18);
assert.strictEqual(sheetMemory.getUint8(10, 0), 1);
assert.strictEqual(sheetMemory.getUint8(11, 0), 2);
assert.strictEqual(sheetMemory.getUint8(12, 0), 3);
assert.strictEqual(sheetMemory.getUint8(13, 0), 4);
assert.strictEqual(sheetMemory.getUint8(14, 0), 5);
assert.strictEqual(sheetMemory.getUint8(15, 0), 6);
assert.strictEqual(sheetMemory.getUint8(16, 0), 7);
assert.strictEqual(sheetMemory.getUint8(17, 0), 8);
assert.strictEqual(sheetMemory.getUint8(18, 0), 9);
sheetMemory.deleteRange(8, 3);
assert.strictEqual(sheetMemory.getMinIndex(), 8);
assert.strictEqual(sheetMemory.getMaxIndex(), 15);
assert.strictEqual(sheetMemory.getUint8(8, 0), 2);
assert.strictEqual(sheetMemory.getUint8(9, 0), 3);
assert.strictEqual(sheetMemory.getUint8(10, 0), 4);
assert.strictEqual(sheetMemory.getUint8(11, 0), 5);
assert.strictEqual(sheetMemory.getUint8(12, 0), 6);
assert.strictEqual(sheetMemory.getUint8(13, 0), 7);
assert.strictEqual(sheetMemory.getUint8(14, 0), 8);
assert.strictEqual(sheetMemory.getUint8(15, 0), 9);
sheetMemory.deleteRange(14, 4);
assert.strictEqual(sheetMemory.getMinIndex(), 8);
assert.strictEqual(sheetMemory.getMaxIndex(), 13);
assert.strictEqual(sheetMemory.getUint8(8, 0), 2);
assert.strictEqual(sheetMemory.getUint8(9, 0), 3);
assert.strictEqual(sheetMemory.getUint8(10, 0), 4);
assert.strictEqual(sheetMemory.getUint8(11, 0), 5);
assert.strictEqual(sheetMemory.getUint8(12, 0), 6);
assert.strictEqual(sheetMemory.getUint8(13, 0), 7);
sheetMemory.deleteRange(10, 2);
assert.strictEqual(sheetMemory.getMinIndex(), 8);
assert.strictEqual(sheetMemory.getMaxIndex(), 11);
assert.strictEqual(sheetMemory.getUint8(8, 0), 2);
assert.strictEqual(sheetMemory.getUint8(9, 0), 3);
assert.strictEqual(sheetMemory.getUint8(10, 0), 6);
assert.strictEqual(sheetMemory.getUint8(11, 0), 7);
sheetMemory.deleteRange(8, 20);
assert.strictEqual(sheetMemory.getMinIndex(), -1);
assert.strictEqual(sheetMemory.getMaxIndex(), -1);
});
QUnit.test("Test: \"insertRange\"", function (assert) {
let sheetMemory = new SheetMemory(8, 100); // Use 8 bytes as minimum struct size
sheetMemory.checkIndex(8);
sheetMemory.checkIndex(12);
sheetMemory.setUint8(8, 0, 1);
sheetMemory.setUint8(9, 0, 2);
sheetMemory.setUint8(10, 0, 3);
sheetMemory.setUint8(11, 0, 4);
sheetMemory.setUint8(12, 0, 5);
sheetMemory.insertRange(30, 100);
assert.strictEqual(sheetMemory.getMinIndex(), 8);
assert.strictEqual(sheetMemory.getMaxIndex(), 12);
assert.strictEqual(sheetMemory.getUint8(8, 0), 1);
assert.strictEqual(sheetMemory.getUint8(9, 0), 2);
assert.strictEqual(sheetMemory.getUint8(10, 0), 3);
assert.strictEqual(sheetMemory.getUint8(11, 0), 4);
assert.strictEqual(sheetMemory.getUint8(12, 0), 5);
sheetMemory.insertRange(8, 2);
assert.strictEqual(sheetMemory.getMinIndex(), 10);
assert.strictEqual(sheetMemory.getMaxIndex(), 14);
assert.strictEqual(sheetMemory.getUint8(10, 0), 1);
assert.strictEqual(sheetMemory.getUint8(11, 0), 2);
assert.strictEqual(sheetMemory.getUint8(12, 0), 3);
assert.strictEqual(sheetMemory.getUint8(13, 0), 4);
assert.strictEqual(sheetMemory.getUint8(14, 0), 5);
sheetMemory.insertRange(11, 2);
assert.strictEqual(sheetMemory.getMinIndex(), 10);
assert.strictEqual(sheetMemory.getMaxIndex(), 16);
assert.strictEqual(sheetMemory.getUint8(10, 0), 1);
assert.strictEqual(sheetMemory.getUint8(11, 0), 0);
assert.strictEqual(sheetMemory.getUint8(12, 0), 0);
assert.strictEqual(sheetMemory.getUint8(13, 0), 2);
assert.strictEqual(sheetMemory.getUint8(14, 0), 3);
assert.strictEqual(sheetMemory.getUint8(15, 0), 4);
assert.strictEqual(sheetMemory.getUint8(16, 0), 5);
sheetMemory.insertRange(15, 4);
assert.strictEqual(sheetMemory.getMinIndex(), 10);
assert.strictEqual(sheetMemory.getMaxIndex(), 20);
assert.strictEqual(sheetMemory.getUint8(10, 0), 1);
assert.strictEqual(sheetMemory.getUint8(11, 0), 0);
assert.strictEqual(sheetMemory.getUint8(12, 0), 0);
assert.strictEqual(sheetMemory.getUint8(13, 0), 2);
assert.strictEqual(sheetMemory.getUint8(14, 0), 3);
assert.strictEqual(sheetMemory.getUint8(15, 0), 0);
assert.strictEqual(sheetMemory.getUint8(16, 0), 0);
assert.strictEqual(sheetMemory.getUint8(17, 0), 0);
assert.strictEqual(sheetMemory.getUint8(18, 0), 0);
assert.strictEqual(sheetMemory.getUint8(19, 0), 4);
assert.strictEqual(sheetMemory.getUint8(20, 0), 5);
});
QUnit.test("Test: \"copyRange1\"", function (assert) {
let sheetMemory = new SheetMemory(8, 100); // Use 8 bytes as minimum struct size
sheetMemory.checkIndex(10);
sheetMemory.checkIndex(12);
sheetMemory.setUint8(10, 0, 1);
sheetMemory.setUint8(11, 0, 2);
sheetMemory.setUint8(12, 0, 3);
let sheetMemory2 = new SheetMemory(8, 100);
sheetMemory2.checkIndex(8);
sheetMemory2.checkIndex(12);
sheetMemory2.setUint8(8, 0, 1);
sheetMemory2.setUint8(9, 0, 2);
sheetMemory2.setUint8(10, 0, 3);
sheetMemory2.setUint8(11, 0, 4);
sheetMemory2.setUint8(12, 0, 5);
sheetMemory.copyRange(sheetMemory2, 7, 8, 7);
assert.strictEqual(sheetMemory.getMinIndex(), 9);
assert.strictEqual(sheetMemory.getMaxIndex(), 13);
assert.strictEqual(sheetMemory.getUint8(9, 0), 1);
assert.strictEqual(sheetMemory.getUint8(10, 0), 2);
assert.strictEqual(sheetMemory.getUint8(11, 0), 3);
assert.strictEqual(sheetMemory.getUint8(12, 0), 4);
assert.strictEqual(sheetMemory.getUint8(13, 0), 5);
sheetMemory.copyRange(sheetMemory2, 10, 9, 4);
assert.strictEqual(sheetMemory.getMinIndex(), 9);
assert.strictEqual(sheetMemory.getMaxIndex(), 13);
assert.strictEqual(sheetMemory.getUint8(9, 0), 3);
assert.strictEqual(sheetMemory.getUint8(10, 0), 4);
assert.strictEqual(sheetMemory.getUint8(11, 0), 5);
assert.strictEqual(sheetMemory.getUint8(12, 0), 0);
assert.strictEqual(sheetMemory.getUint8(13, 0), 5);
});
QUnit.test("Test: \"copyRange2\"", function (assert) {
let sheetMemory = new SheetMemory(8, 100); // Use 8 bytes as minimum struct size
sheetMemory.checkIndex(10);
sheetMemory.checkIndex(12);
sheetMemory.setUint8(10, 0, 1);
sheetMemory.setUint8(11, 0, 2);
sheetMemory.setUint8(12, 0, 3);
sheetMemory.copyRange(sheetMemory, 10, 13, 3);
assert.strictEqual(sheetMemory.getMinIndex(), 10);
assert.strictEqual(sheetMemory.getMaxIndex(), 15);
assert.strictEqual(sheetMemory.getUint8(10, 0), 1);
assert.strictEqual(sheetMemory.getUint8(11, 0), 2);
assert.strictEqual(sheetMemory.getUint8(12, 0), 3);
assert.strictEqual(sheetMemory.getUint8(13, 0), 1);
assert.strictEqual(sheetMemory.getUint8(14, 0), 2);
assert.strictEqual(sheetMemory.getUint8(15, 0), 3);
sheetMemory.copyRange(sheetMemory, 10, 12, 3);
assert.strictEqual(sheetMemory.getMinIndex(), 10);
assert.strictEqual(sheetMemory.getMaxIndex(), 15);
assert.strictEqual(sheetMemory.getUint8(10, 0), 1);
assert.strictEqual(sheetMemory.getUint8(11, 0), 2);
assert.strictEqual(sheetMemory.getUint8(12, 0), 1);
assert.strictEqual(sheetMemory.getUint8(13, 0), 2);
assert.strictEqual(sheetMemory.getUint8(14, 0), 3);
assert.strictEqual(sheetMemory.getUint8(15, 0), 3);
sheetMemory.copyRange(sheetMemory, 10, 11, 3);
assert.strictEqual(sheetMemory.getMinIndex(), 10);
assert.strictEqual(sheetMemory.getMaxIndex(), 15);
assert.strictEqual(sheetMemory.getUint8(10, 0), 1);
assert.strictEqual(sheetMemory.getUint8(11, 0), 1);
assert.strictEqual(sheetMemory.getUint8(12, 0), 2);
assert.strictEqual(sheetMemory.getUint8(13, 0), 1);
assert.strictEqual(sheetMemory.getUint8(14, 0), 3);
assert.strictEqual(sheetMemory.getUint8(15, 0), 3);
sheetMemory.copyRange(sheetMemory, 10, 10, 3);
assert.strictEqual(sheetMemory.getMinIndex(), 10);
assert.strictEqual(sheetMemory.getMaxIndex(), 15);
assert.strictEqual(sheetMemory.getUint8(10, 0), 1);
assert.strictEqual(sheetMemory.getUint8(11, 0), 1);
assert.strictEqual(sheetMemory.getUint8(12, 0), 2);
assert.strictEqual(sheetMemory.getUint8(13, 0), 1);
assert.strictEqual(sheetMemory.getUint8(14, 0), 3);
assert.strictEqual(sheetMemory.getUint8(15, 0), 3);
sheetMemory.copyRange(sheetMemory, 10, 9, 3);
assert.strictEqual(sheetMemory.getMinIndex(), 9);
assert.strictEqual(sheetMemory.getMaxIndex(), 15);
assert.strictEqual(sheetMemory.getUint8(9, 0), 1);
assert.strictEqual(sheetMemory.getUint8(10, 0), 1);
assert.strictEqual(sheetMemory.getUint8(11, 0), 2);
assert.strictEqual(sheetMemory.getUint8(12, 0), 2);
assert.strictEqual(sheetMemory.getUint8(13, 0), 1);
assert.strictEqual(sheetMemory.getUint8(14, 0), 3);
assert.strictEqual(sheetMemory.getUint8(15, 0), 3);
});
QUnit.test("Test: \"copyRange3\"", function (assert) {
let sheetMemory = new SheetMemory(8, 100); // Use 8 bytes as minimum struct size
sheetMemory.checkIndex(10);
sheetMemory.checkIndex(12);
sheetMemory.setUint8(10, 0, 1);
sheetMemory.setUint8(11, 0, 2);
sheetMemory.setUint8(12, 0, 3);
sheetMemory.copyRange(sheetMemory, 9, 11, 2);
assert.strictEqual(sheetMemory.getMinIndex(), 10);
assert.strictEqual(sheetMemory.getMaxIndex(), 12);
assert.strictEqual(sheetMemory.getUint8(10, 0), 1);
assert.strictEqual(sheetMemory.getUint8(11, 0), 0);
assert.strictEqual(sheetMemory.getUint8(12, 0), 1);
sheetMemory.copyRange(sheetMemory, 12, 11, 2);
assert.strictEqual(sheetMemory.getMinIndex(), 10);
assert.strictEqual(sheetMemory.getMaxIndex(), 12);
assert.strictEqual(sheetMemory.getUint8(10, 0), 1);
assert.strictEqual(sheetMemory.getUint8(11, 0), 1);
assert.strictEqual(sheetMemory.getUint8(12, 0), 0);
});
QUnit.test("Test: \"copyRangeByChunk\"", function (assert) {
let sheetMemory = new SheetMemory(8, 100); // Use 8 bytes as minimum struct size
sheetMemory.checkIndex(8);
sheetMemory.checkIndex(9);
sheetMemory.setUint8(8, 0, 1);
sheetMemory.setUint8(9, 0, 2);
sheetMemory.copyRangeByChunk(8, 1, 10, 2);
assert.strictEqual(sheetMemory.getMinIndex(), 8);
assert.strictEqual(sheetMemory.getMaxIndex(), 11);
assert.strictEqual(sheetMemory.getUint8(8, 0), 1);
assert.strictEqual(sheetMemory.getUint8(9, 0), 2);
assert.strictEqual(sheetMemory.getUint8(10, 0), 1);
assert.strictEqual(sheetMemory.getUint8(11, 0), 1);
sheetMemory.copyRangeByChunk(8, 1, 13, 3);
assert.strictEqual(sheetMemory.getMinIndex(), 8);
assert.strictEqual(sheetMemory.getMaxIndex(), 15);
assert.strictEqual(sheetMemory.getUint8(8, 0), 1);
assert.strictEqual(sheetMemory.getUint8(9, 0), 2);
assert.strictEqual(sheetMemory.getUint8(10, 0), 1);
assert.strictEqual(sheetMemory.getUint8(11, 0), 1);
assert.strictEqual(sheetMemory.getUint8(12, 0), 0);
assert.strictEqual(sheetMemory.getUint8(13, 0), 1);
assert.strictEqual(sheetMemory.getUint8(14, 0), 1);
assert.strictEqual(sheetMemory.getUint8(15, 0), 1);
});
QUnit.test("Test: \"clear1\"", function (assert) {
let sheetMemory = new SheetMemory(8, 100); // Use 8 bytes as minimum struct size
sheetMemory.checkIndex(8);
sheetMemory.checkIndex(12);
sheetMemory.setUint8(8, 0, 1);
sheetMemory.setUint8(9, 0, 2);
sheetMemory.setUint8(10, 0, 3);
sheetMemory.setUint8(11, 0, 4);
sheetMemory.setUint8(12, 0, 5);
sheetMemory.clear(5, 15);
assert.strictEqual(sheetMemory.getMinIndex(), 8);
assert.strictEqual(sheetMemory.getMaxIndex(), 12);
assert.strictEqual(sheetMemory.getUint8(8, 0), 0);
assert.strictEqual(sheetMemory.getUint8(9, 0), 0);
assert.strictEqual(sheetMemory.getUint8(10, 0), 0);
assert.strictEqual(sheetMemory.getUint8(11, 0), 0);
assert.strictEqual(sheetMemory.getUint8(12, 0), 0);
});
QUnit.test("Test: \"clear2\"", function (assert) {
let sheetMemory = new SheetMemory(8, 100); // Use 8 bytes as minimum struct size
sheetMemory.checkIndex(8);
sheetMemory.checkIndex(12);
sheetMemory.setUint8(8, 0, 1);
sheetMemory.setUint8(9, 0, 2);
sheetMemory.setUint8(10, 0, 3);
sheetMemory.setUint8(11, 0, 4);
sheetMemory.setUint8(12, 0, 5);
sheetMemory.clear(8, 11);
assert.strictEqual(sheetMemory.getMinIndex(), 8);
assert.strictEqual(sheetMemory.getMaxIndex(), 12);
assert.strictEqual(sheetMemory.getUint8(8, 0), 0);
assert.strictEqual(sheetMemory.getUint8(9, 0), 0);
assert.strictEqual(sheetMemory.getUint8(10, 0), 0);
assert.strictEqual(sheetMemory.getUint8(11, 0), 4);
assert.strictEqual(sheetMemory.getUint8(12, 0), 5);
sheetMemory.clear(11, 13);
assert.strictEqual(sheetMemory.getMinIndex(), 8);
assert.strictEqual(sheetMemory.getMaxIndex(), 12);
assert.strictEqual(sheetMemory.getUint8(8, 0), 0);
assert.strictEqual(sheetMemory.getUint8(9, 0), 0);
assert.strictEqual(sheetMemory.getUint8(10, 0), 0);
assert.strictEqual(sheetMemory.getUint8(11, 0), 0);
assert.strictEqual(sheetMemory.getUint8(12, 0), 0);
});
testForeachNoEmpty("Test: SweepLineRowIterator step" + 1, 1, 1);
testForeachNoEmpty("Test: SweepLineRowIterator step" + 2, 1, 1);
QUnit.module("SheetMemory");
function testForeachNoEmpty(name, offset, stepRow) {
QUnit.test(name, function (assert) {
// console.profile('testForeachNoEmpty');
// let rowsTest = offset + 2 + stepRow;
// let colsTest = 2;
// let dataTest = [0,2,3,4,0,0,0,0];
// testCellsByCol(dataTest, rowsTest + 1, colsTest, offset, stepRow, assert);
let rows = offset + 3 + stepRow;//stepRow rows are needed to properly clean
let cols = 3;
let baseLen = (rows - stepRow) * cols;//last row for correct cleaning
let base = [...Array(baseLen + 1).keys()].slice(1);
let data = new Array(rows * cols);
data.fill(0);
let iterations = Math.pow(2, baseLen);
for (let i = 0; i < iterations; ++i) {
for (let j = 0; j < baseLen; ++j) {
let bit = ((i >> j) % 2 !== 0);
data[j] = bit ? base[j] : 0;
}
testCellsByCol(data, rows, cols, offset, stepRow, assert);
}
// console.profileEnd('testForeachNoEmpty');
assert.ok(true);
});
}
function testCellsByCol(data, rows, cols, offset, stepRow, assert) {
let res = '';
let testData = getTestDataFromArray(data, rows, cols, offset, stepRow);
let r1 = offset;
let sweepLine = new AscCommonExcel.SweepLineRowIterator();
sweepLine.init(testData.cellsByCol, r1, 0, cols);
for (let i = r1; i < rows; i += stepRow) {
sweepLine.setRow(i);
while (sweepLine.nextCol()) {
res += `${i}-${sweepLine.col}-${sweepLine.colData.getUint8(i, 0)};`;
}
}
//many asserts processes very slow
if (res !== testData.expected) {
assert.strictEqual(res, testData.expected, JSON.stringify(data));
}
if (sweepLine.colDatas.length !== sweepLine.colDatasIndex) {
assert.strictEqual(sweepLine.colDatas.length, sweepLine.colDatasIndex, "colDatas");
}
if (sweepLine.toInsert.length !== sweepLine.toInsertIndex) {
assert.strictEqual(sweepLine.toInsert.length, sweepLine.toInsertIndex, "toInsert");
}
if (sweepLine.toDelete.length !== sweepLine.toDeleteIndex) {
assert.strictEqual(sweepLine.toDelete.length, sweepLine.toDeleteIndex, "toDelete");
}
if (sweepLine.r1.length !== sweepLine.r1Index) {
assert.strictEqual(sweepLine.r1.length, sweepLine.r1Index, "r1");
}
if (sweepLine.r2.length !== sweepLine.r2Index) {
assert.strictEqual(sweepLine.r2.length, sweepLine.r2Index, "r2");
}
}
function getTestDataFromArray(data, rows, cols, offset, stepRow) {
let expected = "";
let cellsByCol = Array.from(Array(cols), () => {
return new SheetMemory(8, rows);
});
let dataLen = data.length;
for (let i = 0; i < dataLen; ++i) {
if (data[i] > 0) {
let row = Math.trunc(i / cols);
let col = i % cols;
let sheetMemory = cellsByCol[col];
sheetMemory.checkIndex(row);
sheetMemory.setUint8(row, 0, data[i]);
}
}
for (let i = 0; i < cellsByCol.length; ++i) {
if (cellsByCol[i].getAllocatedCount() === 0) {
delete cellsByCol[i];
}
}
for (let i = offset * cols; i < dataLen; ++i) {
let row = Math.trunc(i / cols);
let col = i % cols;
if(row % stepRow === 0) {
let sheetMemory = cellsByCol[col];
if (sheetMemory && sheetMemory.hasIndex(row)) {
expected += `${row}-${col}-${data[i]};`;
}
}
}
return {cellsByCol, expected}
}
});