@quantlab/handsontable
Version:
Spreadsheet-like data grid editor that provides copy/paste functionality compatible with Excel/Google Docs
1,470 lines (1,138 loc) • 87.5 kB
JavaScript
describe('UndoRedo', () => {
var id = 'testContainer';
beforeEach(function() {
this.$container = $(`<div id="${id}"></div>`).appendTo('body');
});
afterEach(function() {
if (this.$container) {
destroy();
this.$container.remove();
}
});
describe('core features', () => {
describe('Array data', () => {
describe('undo', () => {
it('should undo single change', () => {
handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2)
});
var HOT = getInstance();
setDataAtCell(0, 0, 'X1');
expect(getDataAtCell(0, 0)).toBe('X1');
HOT.undo();
expect(getDataAtCell(0, 0)).toBe('A1');
});
it('should undo single change on cell with validator', (done) => {
handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2),
});
var HOT = getInstance();
setDataAtCell(0, 0, 'X1');
setTimeout(() => {
expect(getDataAtCell(0, 0)).toBe('X1');
HOT.undo();
}, 200);
setTimeout(() => {
expect(getDataAtCell(0, 0)).toBe('A1');
done();
}, 400);
});
it('should undo creation of a single row', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2)
});
expect(countRows()).toEqual(2);
alter('insert_row');
expect(countRows()).toEqual(3);
HOT.undo();
expect(countRows()).toEqual(2);
});
it('should undo creation of multiple rows', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2)
});
expect(countRows()).toEqual(2);
alter('insert_row', 0, 5);
expect(countRows()).toEqual(7);
HOT.undo();
expect(countRows()).toEqual(2);
});
it('should undo creation of multiple rows with minSpareRows', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 1),
minSpareRows: 2
});
expect(getData()).toEqual([['A1'], ['A2'], [null], [null]]);
setDataAtCell(2, 0, 'A3');
setDataAtCell(4, 0, 'A4');
expect(getData()).toEqual([['A1'], ['A2'], ['A3'], [null], ['A4'], [null], [null]]);
HOT.undo();
HOT.undo();
expect(getData()).toEqual([['A1'], ['A2'], [null], [null]]);
});
it('should undo removal of single row', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(3, 2)
});
expect(countRows()).toEqual(3);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(2, 0)).toEqual('A3');
expect(getDataAtCell(2, 1)).toEqual('B3');
alter('remove_row', 1);
expect(countRows()).toEqual(2);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A3');
expect(getDataAtCell(1, 1)).toEqual('B3');
HOT.undo();
expect(countRows()).toEqual(3);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(2, 0)).toEqual('A3');
expect(getDataAtCell(2, 1)).toEqual('B3');
});
it('should undo removal of multiple rows', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(4, 2)
});
expect(countRows()).toEqual(4);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(2, 0)).toEqual('A3');
expect(getDataAtCell(2, 1)).toEqual('B3');
expect(getDataAtCell(3, 0)).toEqual('A4');
expect(getDataAtCell(3, 1)).toEqual('B4');
alter('remove_row', 1, 2);
expect(countRows()).toEqual(2);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A4');
expect(getDataAtCell(1, 1)).toEqual('B4');
HOT.undo();
expect(countRows()).toEqual(4);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(2, 0)).toEqual('A3');
expect(getDataAtCell(2, 1)).toEqual('B3');
expect(getDataAtCell(3, 0)).toEqual('A4');
expect(getDataAtCell(3, 1)).toEqual('B4');
});
it('should undo creation of a single column (colHeaders: undefined)', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 3)
});
expect(countCols()).toEqual(3);
alter('insert_col');
expect(countCols()).toEqual(4);
HOT.undo();
expect(countCols()).toEqual(3);
});
it('should undo creation of a single column (colHeaders: true)', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 3),
colHeaders: true
});
expect(countCols()).toEqual(3);
expect(getColHeader()).toEqual(['A', 'B', 'C']);
alter('insert_col');
expect(countCols()).toEqual(4);
expect(getColHeader()).toEqual(['A', 'B', 'C', 'D']);
HOT.undo();
expect(countCols()).toEqual(3);
expect(getColHeader()).toEqual(['A', 'B', 'C']);
});
it('should undo creation of a single column (colHeaders: Array)', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 3),
colHeaders: ['Header1', 'Header2', 'Header3']
});
expect(countCols()).toEqual(3);
expect(getColHeader()).toEqual(['Header1', 'Header2', 'Header3']);
alter('insert_col', 1);
expect(countCols()).toEqual(4);
expect(getColHeader()).toEqual(['Header1', 'B', 'Header2', 'Header3']);
HOT.undo();
expect(countCols()).toEqual(3);
expect(getColHeader()).toEqual(['Header1', 'Header2', 'Header3']);
});
it('should undo creation of multiple columns (colHeaders: undefined)', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2)
});
expect(countCols()).toEqual(2);
alter('insert_col', 1, 5);
expect(countCols()).toEqual(7);
HOT.undo();
expect(countCols()).toEqual(2);
});
it('should undo creation of multiple columns (colHeaders: true)', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2),
colHeaders: true
});
expect(countCols()).toEqual(2);
expect(getColHeader()).toEqual(['A', 'B']);
alter('insert_col', 1, 5);
expect(countCols()).toEqual(7);
expect(getColHeader()).toEqual(['A', 'B', 'C', 'D', 'E', 'F', 'G']);
HOT.undo();
expect(countCols()).toEqual(2);
expect(getColHeader()).toEqual(['A', 'B']);
});
it('should undo creation of multiple columns (colHeaders: Array)', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2),
colHeaders: ['Header1', 'Header2']
});
expect(countCols()).toEqual(2);
expect(getColHeader()).toEqual(['Header1', 'Header2']);
alter('insert_col', 1, 5);
expect(countCols()).toEqual(7);
expect(getColHeader()).toEqual(['Header1', 'B', 'C', 'D', 'E', 'F', 'Header2']);
HOT.undo();
expect(countCols()).toEqual(2);
expect(getColHeader()).toEqual(['Header1', 'Header2']);
});
it('should undo creation of multiple columns with minSpareCols', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(1, 1),
minSpareCols: 2
});
expect(getData()).toEqual([['A1', null, null]]);
setDataAtCell(0, 1, 'B1');
setDataAtCell(0, 3, 'C1');
expect(getData()).toEqual([['A1', 'B1', null, 'C1', null, null]]);
HOT.undo();
HOT.undo();
expect(getData()).toEqual([['A1', null, null]]);
});
it('should undo removal of single column (colHeaders: undefined)', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 3)
});
expect(countCols()).toEqual(3);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(0, 2)).toEqual('C1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(1, 2)).toEqual('C2');
alter('remove_col', 1);
expect(countCols()).toEqual(2);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('C1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('C2');
HOT.undo();
expect(countCols()).toEqual(3);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(0, 2)).toEqual('C1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(1, 2)).toEqual('C2');
});
it('should undo removal of single column (colHeaders: true)', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2),
colHeaders: true
});
expect(countCols()).toEqual(2);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getColHeader()).toEqual(['A', 'B']);
alter('remove_col');
expect(countCols()).toEqual(1);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toBeNull();
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toBeNull();
expect(getColHeader()).toEqual(['A']);
HOT.undo();
expect(countCols()).toEqual(2);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getColHeader()).toEqual(['A', 'B']);
});
it('should undo removal of single column (colHeaders: Array)', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2),
colHeaders: ['Header1', 'Header2']
});
expect(countCols()).toEqual(2);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getColHeader()).toEqual(['Header1', 'Header2']);
alter('remove_col');
expect(countCols()).toEqual(1);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toBeNull();
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toBeNull();
expect(getColHeader()).toEqual(['Header1']);
HOT.undo();
expect(countCols()).toEqual(2);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getColHeader()).toEqual(['Header1', 'Header2']);
});
it('should undo removal of multiple columns (colHeaders: undefined)', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 4)
});
expect(countCols()).toEqual(4);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(0, 2)).toEqual('C1');
expect(getDataAtCell(0, 3)).toEqual('D1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(1, 2)).toEqual('C2');
expect(getDataAtCell(1, 3)).toEqual('D2');
alter('remove_col', 1, 2);
expect(countCols()).toEqual(2);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('D1');
expect(getDataAtCell(0, 2)).toBeNull();
expect(getDataAtCell(0, 3)).toBeNull();
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('D2');
expect(getDataAtCell(1, 2)).toBeNull();
expect(getDataAtCell(1, 3)).toBeNull();
HOT.undo();
expect(countCols()).toEqual(4);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(0, 2)).toEqual('C1');
expect(getDataAtCell(0, 3)).toEqual('D1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(1, 2)).toEqual('C2');
expect(getDataAtCell(1, 3)).toEqual('D2');
});
it('should undo removal of multiple columns (colHeaders: true)', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 4),
colHeaders: true
});
expect(countCols()).toEqual(4);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(0, 2)).toEqual('C1');
expect(getDataAtCell(0, 3)).toEqual('D1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(1, 2)).toEqual('C2');
expect(getDataAtCell(1, 3)).toEqual('D2');
expect(getColHeader()).toEqual(['A', 'B', 'C', 'D']);
alter('remove_col', 1, 3);
expect(countCols()).toEqual(1);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toBeNull();
expect(getDataAtCell(0, 2)).toBeNull();
expect(getDataAtCell(0, 3)).toBeNull();
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toBeNull();
expect(getDataAtCell(1, 2)).toBeNull();
expect(getDataAtCell(1, 3)).toBeNull();
expect(getColHeader()).toEqual(['A']);
HOT.undo();
expect(countCols()).toEqual(4);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(0, 2)).toEqual('C1');
expect(getDataAtCell(0, 3)).toEqual('D1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(1, 2)).toEqual('C2');
expect(getDataAtCell(1, 3)).toEqual('D2');
expect(getColHeader()).toEqual(['A', 'B', 'C', 'D']);
});
it('should undo removal of multiple columns (colHeaders: Array)', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 4),
colHeaders: ['Header1', 'Header2', 'Header3', 'Header4']
});
expect(countCols()).toEqual(4);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(0, 2)).toEqual('C1');
expect(getDataAtCell(0, 3)).toEqual('D1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(1, 2)).toEqual('C2');
expect(getDataAtCell(1, 3)).toEqual('D2');
expect(getColHeader()).toEqual(['Header1', 'Header2', 'Header3', 'Header4']);
alter('remove_col', 1, 2);
expect(countCols()).toEqual(2);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('D1');
expect(getDataAtCell(0, 2)).toBeNull();
expect(getDataAtCell(0, 3)).toBeNull();
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('D2');
expect(getDataAtCell(1, 2)).toBeNull();
expect(getDataAtCell(1, 3)).toBeNull();
expect(getColHeader()).toEqual(['Header1', 'Header4']);
HOT.undo();
expect(countCols()).toEqual(4);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(0, 2)).toEqual('C1');
expect(getDataAtCell(0, 3)).toEqual('D1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(1, 2)).toEqual('C2');
expect(getDataAtCell(1, 3)).toEqual('D2');
expect(getColHeader()).toEqual(['Header1', 'Header2', 'Header3', 'Header4']);
});
it('should undo removal of multiple columns (with a used manualColumnMove)', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 7),
manualColumnMove: [3, 2, 0, 6, 1, 5, 4]
});
expect(countCols()).toEqual(7);
expect(getDataAtRow(0)).toEqual(['D1', 'C1', 'A1', 'G1', 'B1', 'F1', 'E1']);
alter('remove_col', 1, 3);
expect(countCols()).toEqual(4);
expect(getDataAtRow(0)).toEqual(['D1', 'B1', 'F1', 'E1']);
// HOT.undo();
//
// expect(countCols()).toEqual(7);
// expect(getDataAtRow(0)).toEqual(['D1', 'C1', 'A1', 'G1', 'B1', 'F1', 'E1']);
});
it('should undo multiple changes', () => {
handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2)
});
var HOT = getInstance();
setDataAtCell(0, 0, 'X1');
setDataAtCell(1, 0, 'X2');
setDataAtCell(0, 1, 'Y1');
setDataAtCell(1, 1, 'Y2');
expect(getDataAtCell(0, 0)).toBe('X1');
expect(getDataAtCell(1, 0)).toBe('X2');
expect(getDataAtCell(0, 1)).toBe('Y1');
expect(getDataAtCell(1, 1)).toBe('Y2');
HOT.undo();
expect(getDataAtCell(0, 0)).toBe('X1');
expect(getDataAtCell(1, 0)).toBe('X2');
expect(getDataAtCell(0, 1)).toBe('Y1');
expect(getDataAtCell(1, 1)).toBe('B2');
HOT.undo();
expect(getDataAtCell(0, 0)).toBe('X1');
expect(getDataAtCell(1, 0)).toBe('X2');
expect(getDataAtCell(0, 1)).toBe('B1');
expect(getDataAtCell(1, 1)).toBe('B2');
HOT.undo();
expect(getDataAtCell(0, 0)).toBe('X1');
expect(getDataAtCell(1, 0)).toBe('A2');
expect(getDataAtCell(0, 1)).toBe('B1');
expect(getDataAtCell(1, 1)).toBe('B2');
HOT.undo();
expect(getDataAtCell(0, 0)).toBe('A1');
expect(getDataAtCell(1, 0)).toBe('A2');
expect(getDataAtCell(0, 1)).toBe('B1');
expect(getDataAtCell(1, 1)).toBe('B2');
HOT.undo();
expect(getDataAtCell(0, 0)).toBe('A1');
expect(getDataAtCell(1, 0)).toBe('A2');
expect(getDataAtCell(0, 1)).toBe('B1');
expect(getDataAtCell(1, 1)).toBe('B2');
});
it('should undo multiple changes in cells with validators', (done) => {
handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2),
});
var HOT = getInstance();
setDataAtCell(0, 0, 'X1');
setDataAtCell(1, 0, 'X2');
setDataAtCell(0, 1, 'Y1');
setDataAtCell(1, 1, 'Y2');
setTimeout(() => {
expect(getDataAtCell(0, 0)).toBe('X1');
expect(getDataAtCell(1, 0)).toBe('X2');
expect(getDataAtCell(0, 1)).toBe('Y1');
expect(getDataAtCell(1, 1)).toBe('Y2');
HOT.undo();
}, 200);
setTimeout(() => {
expect(getDataAtCell(0, 0)).toBe('X1');
expect(getDataAtCell(1, 0)).toBe('X2');
expect(getDataAtCell(0, 1)).toBe('Y1');
expect(getDataAtCell(1, 1)).toBe('B2');
HOT.undo();
}, 400);
setTimeout(() => {
expect(getDataAtCell(0, 0)).toBe('X1');
expect(getDataAtCell(1, 0)).toBe('X2');
expect(getDataAtCell(0, 1)).toBe('B1');
expect(getDataAtCell(1, 1)).toBe('B2');
HOT.undo();
}, 600);
setTimeout(() => {
expect(getDataAtCell(0, 0)).toBe('X1');
expect(getDataAtCell(1, 0)).toBe('A2');
expect(getDataAtCell(0, 1)).toBe('B1');
expect(getDataAtCell(1, 1)).toBe('B2');
HOT.undo();
}, 800);
setTimeout(() => {
expect(getDataAtCell(0, 0)).toBe('A1');
expect(getDataAtCell(1, 0)).toBe('A2');
expect(getDataAtCell(0, 1)).toBe('B1');
expect(getDataAtCell(1, 1)).toBe('B2');
HOT.undo();
}, 1000);
setTimeout(() => {
expect(getDataAtCell(0, 0)).toBe('A1');
expect(getDataAtCell(1, 0)).toBe('A2');
expect(getDataAtCell(0, 1)).toBe('B1');
expect(getDataAtCell(1, 1)).toBe('B2');
done();
}, 1200);
});
it('should undo multiple row creations', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2)
});
expect(countRows()).toEqual(2);
alter('insert_row');
alter('insert_row');
alter('insert_row');
alter('insert_row');
expect(countRows()).toEqual(6);
HOT.undo();
expect(countRows()).toEqual(5);
HOT.undo();
expect(countRows()).toEqual(4);
HOT.undo();
expect(countRows()).toEqual(3);
HOT.undo();
expect(countRows()).toEqual(2);
HOT.undo();
expect(countRows()).toEqual(2);
});
it('should undo multiple row removals', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(4, 2)
});
expect(countRows()).toEqual(4);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(2, 0)).toEqual('A3');
expect(getDataAtCell(2, 1)).toEqual('B3');
expect(getDataAtCell(3, 0)).toEqual('A4');
expect(getDataAtCell(3, 1)).toEqual('B4');
alter('remove_row');
alter('remove_row');
alter('remove_row');
expect(countRows()).toEqual(1);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
HOT.undo();
expect(countRows()).toEqual(2);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
HOT.undo();
expect(countRows()).toEqual(3);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(2, 0)).toEqual('A3');
expect(getDataAtCell(2, 1)).toEqual('B3');
HOT.undo();
expect(countRows()).toEqual(4);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(2, 0)).toEqual('A3');
expect(getDataAtCell(2, 1)).toEqual('B3');
expect(getDataAtCell(3, 0)).toEqual('A4');
expect(getDataAtCell(3, 1)).toEqual('B4');
HOT.undo();
expect(countRows()).toEqual(4);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(2, 0)).toEqual('A3');
expect(getDataAtCell(2, 1)).toEqual('B3');
expect(getDataAtCell(3, 0)).toEqual('A4');
expect(getDataAtCell(3, 1)).toEqual('B4');
});
it('should undo changes only for table where the change actually took place', function() {
this.$container2 = $(`<div id="${id}-2"></div>`).appendTo('body');
var hot1 = handsontable({
data: [
[1],
[2],
[3]
]
});
this.$container2.handsontable({
data: [
['A'],
['B'],
['C']
]
});
var hot2 = this.$container2.handsontable('getInstance');
hot1.setDataAtCell(0, 0, 4);
expect(hot1.getDataAtCell(0, 0)).toEqual(4);
expect(hot2.getDataAtCell(0, 0)).toEqual('A');
hot2.undo();
expect(hot2.getDataAtCell(0, 0)).toEqual('A');
expect(hot1.getDataAtCell(0, 0)).toEqual(4);
hot1.undo();
expect(hot2.getDataAtCell(0, 0)).toEqual('A');
expect(hot1.getDataAtCell(0, 0)).toEqual(1);
hot2.destroy();
this.$container2.remove();
});
});
describe('redo', () => {
it('should redo single change', () => {
handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2)
});
var HOT = getInstance();
setDataAtCell(0, 0, 'new value');
expect(getDataAtCell(0, 0)).toBe('new value');
HOT.undo();
expect(getDataAtCell(0, 0)).toBe('A1');
HOT.redo();
expect(getDataAtCell(0, 0)).toBe('new value');
});
it('should redo single change in cell with validator', (done) => {
handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2),
});
var HOT = getInstance();
setDataAtCell(0, 0, 'new value');
setTimeout(() => {
expect(getDataAtCell(0, 0)).toBe('new value');
HOT.undo();
}, 200);
setTimeout(() => {
expect(getDataAtCell(0, 0)).toBe('A1');
HOT.redo();
}, 400);
setTimeout(() => {
expect(getDataAtCell(0, 0)).toBe('new value');
done();
}, 600);
});
it('should redo creation of a single row', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2)
});
expect(countRows()).toEqual(2);
alter('insert_row');
expect(countRows()).toEqual(3);
HOT.undo();
expect(countRows()).toEqual(2);
HOT.redo();
expect(countRows()).toEqual(3);
});
it('should redo creation of multiple rows', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2)
});
expect(countRows()).toEqual(2);
alter('insert_row', 0, 5);
expect(countRows()).toEqual(7);
HOT.undo();
expect(countRows()).toEqual(2);
HOT.redo();
expect(countRows()).toEqual(7);
});
it('should redo removal of single row', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(3, 2)
});
expect(countRows()).toEqual(3);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(2, 0)).toEqual('A3');
expect(getDataAtCell(2, 1)).toEqual('B3');
alter('remove_row', 1);
expect(countRows()).toEqual(2);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A3');
expect(getDataAtCell(1, 1)).toEqual('B3');
HOT.undo();
expect(countRows()).toEqual(3);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(2, 0)).toEqual('A3');
expect(getDataAtCell(2, 1)).toEqual('B3');
HOT.redo();
expect(countRows()).toEqual(2);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A3');
expect(getDataAtCell(1, 1)).toEqual('B3');
});
it('should redo removal of multiple rows', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(4, 2)
});
expect(countRows()).toEqual(4);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(2, 0)).toEqual('A3');
expect(getDataAtCell(2, 1)).toEqual('B3');
expect(getDataAtCell(3, 0)).toEqual('A4');
expect(getDataAtCell(3, 1)).toEqual('B4');
alter('remove_row', 1, 2);
expect(countRows()).toEqual(2);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A4');
expect(getDataAtCell(1, 1)).toEqual('B4');
HOT.undo();
expect(countRows()).toEqual(4);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(2, 0)).toEqual('A3');
expect(getDataAtCell(2, 1)).toEqual('B3');
expect(getDataAtCell(3, 0)).toEqual('A4');
expect(getDataAtCell(3, 1)).toEqual('B4');
HOT.redo();
expect(countRows()).toEqual(2);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A4');
expect(getDataAtCell(1, 1)).toEqual('B4');
});
it('should redo creation of a single column', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2)
});
expect(countCols()).toEqual(2);
alter('insert_col');
expect(countCols()).toEqual(3);
HOT.undo();
expect(countCols()).toEqual(2);
HOT.redo();
expect(countCols()).toEqual(3);
});
it('should redo creation of multiple columns', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2)
});
expect(countCols()).toEqual(2);
alter('insert_col', 1, 5);
expect(countCols()).toEqual(7);
HOT.undo();
expect(countCols()).toEqual(2);
HOT.redo();
expect(countCols()).toEqual(7);
});
it('should redo removal of single column', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2)
});
expect(countCols()).toEqual(2);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
alter('remove_col');
expect(countCols()).toEqual(1);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toBeNull();
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toBeNull();
HOT.undo();
expect(countCols()).toEqual(2);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
HOT.redo();
expect(countCols()).toEqual(1);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toBeNull();
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toBeNull();
});
it('should redo removal of multiple columns', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 4)
});
expect(countCols()).toEqual(4);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(0, 2)).toEqual('C1');
expect(getDataAtCell(0, 3)).toEqual('D1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(1, 2)).toEqual('C2');
expect(getDataAtCell(1, 3)).toEqual('D2');
alter('remove_col', 1, 3);
expect(countCols()).toEqual(1);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toBeNull();
expect(getDataAtCell(0, 2)).toBeNull();
expect(getDataAtCell(0, 3)).toBeNull();
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toBeNull();
expect(getDataAtCell(1, 2)).toBeNull();
expect(getDataAtCell(1, 3)).toBeNull();
HOT.undo();
expect(countCols()).toEqual(4);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(0, 2)).toEqual('C1');
expect(getDataAtCell(0, 3)).toEqual('D1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(1, 2)).toEqual('C2');
expect(getDataAtCell(1, 3)).toEqual('D2');
HOT.redo();
expect(countCols()).toEqual(1);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toBeNull();
expect(getDataAtCell(0, 2)).toBeNull();
expect(getDataAtCell(0, 3)).toBeNull();
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toBeNull();
expect(getDataAtCell(1, 2)).toBeNull();
expect(getDataAtCell(1, 3)).toBeNull();
});
it('should redo multiple changes', () => {
handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2)
});
var HOT = getInstance();
setDataAtCell(0, 0, 'X1');
setDataAtCell(1, 0, 'X2');
setDataAtCell(0, 1, 'Y1');
setDataAtCell(1, 1, 'Y2');
expect(getDataAtCell(0, 0)).toBe('X1');
expect(getDataAtCell(1, 0)).toBe('X2');
expect(getDataAtCell(0, 1)).toBe('Y1');
expect(getDataAtCell(1, 1)).toBe('Y2');
HOT.undo();
HOT.undo();
HOT.undo();
HOT.undo();
expect(getDataAtCell(0, 0)).toBe('A1');
expect(getDataAtCell(1, 0)).toBe('A2');
expect(getDataAtCell(0, 1)).toBe('B1');
expect(getDataAtCell(1, 1)).toBe('B2');
HOT.redo();
expect(getDataAtCell(0, 0)).toBe('X1');
expect(getDataAtCell(1, 0)).toBe('A2');
expect(getDataAtCell(0, 1)).toBe('B1');
expect(getDataAtCell(1, 1)).toBe('B2');
HOT.redo();
expect(getDataAtCell(0, 0)).toBe('X1');
expect(getDataAtCell(1, 0)).toBe('X2');
expect(getDataAtCell(0, 1)).toBe('B1');
expect(getDataAtCell(1, 1)).toBe('B2');
HOT.redo();
expect(getDataAtCell(0, 0)).toBe('X1');
expect(getDataAtCell(1, 0)).toBe('X2');
expect(getDataAtCell(0, 1)).toBe('Y1');
expect(getDataAtCell(1, 1)).toBe('B2');
HOT.redo();
expect(getDataAtCell(0, 0)).toBe('X1');
expect(getDataAtCell(1, 0)).toBe('X2');
expect(getDataAtCell(0, 1)).toBe('Y1');
expect(getDataAtCell(1, 1)).toBe('Y2');
HOT.redo();
expect(getDataAtCell(0, 0)).toBe('X1');
expect(getDataAtCell(1, 0)).toBe('X2');
expect(getDataAtCell(0, 1)).toBe('Y1');
expect(getDataAtCell(1, 1)).toBe('Y2');
});
it('should redo multiple changes in cell with validator', (done) => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2),
});
setDataAtCell(0, 0, 'X1');
setDataAtCell(1, 0, 'X2');
setDataAtCell(0, 1, 'Y1');
setDataAtCell(1, 1, 'Y2');
setTimeout(() => {
expect(getDataAtCell(0, 0)).toBe('X1');
expect(getDataAtCell(1, 0)).toBe('X2');
expect(getDataAtCell(0, 1)).toBe('Y1');
expect(getDataAtCell(1, 1)).toBe('Y2');
HOT.undo();
}, 200);
setTimeout(() => {
HOT.undo();
}, 400);
setTimeout(() => {
HOT.undo();
}, 600);
setTimeout(() => {
HOT.undo();
}, 800);
setTimeout(() => {
expect(getDataAtCell(0, 0)).toBe('A1');
expect(getDataAtCell(1, 0)).toBe('A2');
expect(getDataAtCell(0, 1)).toBe('B1');
expect(getDataAtCell(1, 1)).toBe('B2');
HOT.redo();
}, 1000);
setTimeout(() => {
expect(getDataAtCell(0, 0)).toBe('X1');
expect(getDataAtCell(1, 0)).toBe('A2');
expect(getDataAtCell(0, 1)).toBe('B1');
expect(getDataAtCell(1, 1)).toBe('B2');
HOT.redo();
}, 1200);
setTimeout(() => {
expect(getDataAtCell(0, 0)).toBe('X1');
expect(getDataAtCell(1, 0)).toBe('X2');
expect(getDataAtCell(0, 1)).toBe('B1');
expect(getDataAtCell(1, 1)).toBe('B2');
HOT.redo();
}, 1400);
setTimeout(() => {
expect(getDataAtCell(0, 0)).toBe('X1');
expect(getDataAtCell(1, 0)).toBe('X2');
expect(getDataAtCell(0, 1)).toBe('Y1');
expect(getDataAtCell(1, 1)).toBe('B2');
HOT.redo();
}, 1600);
setTimeout(() => {
expect(getDataAtCell(0, 0)).toBe('X1');
expect(getDataAtCell(1, 0)).toBe('X2');
expect(getDataAtCell(0, 1)).toBe('Y1');
expect(getDataAtCell(1, 1)).toBe('Y2');
HOT.redo();
}, 1800);
setTimeout(() => {
expect(getDataAtCell(0, 0)).toBe('X1');
expect(getDataAtCell(1, 0)).toBe('X2');
expect(getDataAtCell(0, 1)).toBe('Y1');
expect(getDataAtCell(1, 1)).toBe('Y2');
done();
}, 2000);
});
it('should redo multiple row creations', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(2, 2)
});
expect(countRows()).toEqual(2);
alter('insert_row');
alter('insert_row');
alter('insert_row');
alter('insert_row');
expect(countRows()).toEqual(6);
HOT.undo();
HOT.undo();
HOT.undo();
HOT.undo();
expect(countRows()).toEqual(2);
HOT.redo();
expect(countRows()).toEqual(3);
HOT.redo();
expect(countRows()).toEqual(4);
HOT.redo();
expect(countRows()).toEqual(5);
HOT.redo();
expect(countRows()).toEqual(6);
HOT.redo();
expect(countRows()).toEqual(6);
});
it('should undo multiple row removals', () => {
var HOT = handsontable({
data: Handsontable.helper.createSpreadsheetData(4, 2)
});
expect(countRows()).toEqual(4);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(2, 0)).toEqual('A3');
expect(getDataAtCell(2, 1)).toEqual('B3');
expect(getDataAtCell(3, 0)).toEqual('A4');
expect(getDataAtCell(3, 1)).toEqual('B4');
alter('remove_row');
alter('remove_row');
alter('remove_row');
expect(countRows()).toEqual(1);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
HOT.undo();
HOT.undo();
HOT.undo();
expect(countRows()).toEqual(4);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(2, 0)).toEqual('A3');
expect(getDataAtCell(2, 1)).toEqual('B3');
expect(getDataAtCell(3, 0)).toEqual('A4');
expect(getDataAtCell(3, 1)).toEqual('B4');
HOT.redo();
expect(countRows()).toEqual(3);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
expect(getDataAtCell(2, 0)).toEqual('A3');
expect(getDataAtCell(2, 1)).toEqual('B3');
HOT.redo();
expect(countRows()).toEqual(2);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
expect(getDataAtCell(1, 0)).toEqual('A2');
expect(getDataAtCell(1, 1)).toEqual('B2');
HOT.redo();
expect(countRows()).toEqual(1);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
HOT.redo();
expect(countRows()).toEqual(1);
expect(getDataAtCell(0, 0)).toEqual('A1');
expect(getDataAtCell(0, 1)).toEqual('B1');
});
it('should redo changes only for table where the change actually took place', function() {
this.$container2 = $(`<div id="${id}-2"></div>`).appendTo('body');
var hot1 = handsontable({
data: [
[1],
[2],
[3]
]
});
this.$container2.handsontable({
data: [
['A'],
['B'],
['C']
]
});
var hot2 = this.$container2.handsontable('getInstance');
hot1.setDataAtCell(0, 0, 4);
expect(hot1.getDataAtCell(0, 0)).toEqual(4);
expect(hot2.getDataAtCell(0, 0)).toEqual('A');
hot1.undo();
expect(hot1.getDataAtCell(0, 0)).toEqual(1);
expect(hot2.getDataAtCell(0, 0)).toEqual('A');
hot2.redo();
expect(hot1.getDataAtCell(0, 0)).toEqual(1);
expect(hot2.getDataAtCell(0, 0)).toEqual('A');
hot1.redo();
expect(hot1.getDataAtCell(0, 0)).toEqual(4);
expect(hot2.getDataAtCell(0, 0)).toEqual('A');
hot2.destroy();
this.$container2.remove();
});
});
});
describe('Object data', () => {
function createObjectData() {
return [
{name: 'Timothy', surname: 'Dalton'},
{name: 'Sean', surname: 'Connery'},
{name: 'Roger', surname: 'Moore'}
];
}
describe('undo', () => {
it('should undo single change', () => {
handsontable({
data: createObjectData()
});
var HOT = getInstance();
setDataAtRowProp(0, 0, 'Pearce');
expect(getDataAtRowProp(0, 0)).toBe('Pearce');
HOT.undo();
expect(getDataAtCell(0, 0)).toBe('Timothy');
});
it('should undo single change in cell with validator', (done) => {
handsontable({
data: createObjectData(),
});
var HOT = getInstance();
setDataAtRowProp(0, 0, 'Pearce');
setTimeout(() => {
expect(getDataAtRowProp(0, 0)).toBe('Pearce');
HOT.undo();
}, 200);
setTimeout(() => {
expect(getDataAtCell(0, 0)).toBe('Timothy');
done();
}, 400);
});
it('should undo creation of a single row', () => {
var HOT = handsontable({
data: createObjectData().slice(0, 2)
});
expect(countRows()).toEqual(2);
alter('insert_row');
expect(countRows()).toEqual(3);
HOT.undo();
expect(countRows()).toEqual(2);
});
it('should undo creation of multiple rows', () => {
var HOT = handsontable({
data: createObjectData().slice(0, 2)
});
expect(countRows()).toEqual(2);
alter('insert_row', 0, 5);
expect(countRows()).toEqual(7);
HOT.undo();
expect(countRows()).toEqual(2);
});
it('should undo removal of single row', () => {
var HOT = handsontable({
data: createObjectData().slice(0, 2)
});
expect(countRows()).toEqual(2);
expect(getDataAtRowProp(0, 'name')).toEqual('Timothy');
expect(getDataAtRowProp(0, 'surname')).toEqual('Dalton');
expect(getDataAtRowProp(1, 'name')).toEqual('Sean');
expect(getDataAtRowProp(1, 'surname')).toEqual('Connery');
alter('remove_row');
expect(countRows()).toEqual(1);
expect(getDataAtRowProp(0, 'name')).toEqual('Timothy');
expect(getDataAtRowProp(0, 'surname')).toEqual('Dalton');
expect(getDataAtRowProp(1, 'name')).toBeNull();
expect(getDataAtRowProp(1, 'surname')).toBeNull();
HOT.undo();
expect(countRows()).toEqual(2);
expect(getDataAtRowProp(0, 'name')).toEqual('Timothy');
expect(getDataAtRowProp(0, 'surname')).toEqual('Dalton');
expect(getData