describe('WalkontableScroll', function () { var $table, $container, $wrapper, debug = false; beforeEach(function () { $wrapper = $('
').css({ overflow: 'hidden' }); $container = $('
'); $table = $('
'); // create a table that is not attached to document $wrapper.append($container); $container.append($table); $wrapper.appendTo('body'); createDataArray(100, 4); }); afterEach(function () { if (!debug) { $('.wtHolder').remove(); } $wrapper.remove(); }); describe('scroll', function () { it('should scroll to last column when rowHeaders is not in use', function () { var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw().scrollHorizontal(999).draw(); expect($table.find('tbody tr:eq(0) td:last')[0].innerHTML).toBe('c'); }); it('should scroll to last column when rowHeaders is in use', function () { function plusOne(i) { return i + 1; } var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns, columnHeaders: [function (col, TH) { TH.innerHTML = plusOne(col); }], rowHeaders: [function (row, TH) { TH.innerHTML = plusOne(row); }] }); wt.draw().scrollHorizontal(999).draw(); expect($table.find('tbody tr:eq(0) td:last')[0].innerHTML).toBe('c'); }); it('scroll not scroll the viewport if all rows are visible', function () { this.data.splice(5); $wrapper.height(201).width(100); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw(); expect(wt.wtTable.getVisibleRowsCount()).toEqual(5); wt.scrollVertical(999).draw(); expect(wt.wtTable.getCoords($table.find('tbody tr:eq(0) td:eq(0)')[0])).toEqual(new Walkontable.CellCoords(0, 0)); }); it('scroll horizontal should take totalColumns if it is smaller than width', function () { var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw().scrollHorizontal(999).draw(); expect(wt.wtTable.getCoords($table.find('tbody tr:eq(0) td:eq(0)')[0])).toEqual(new Walkontable.CellCoords(0, 0)); }); it('scroll vertical should scroll to first row if given number smaller than 0', function () { var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw().scrollVertical(-1).draw(); expect(wt.wtTable.getCoords($table.find('tbody tr:first td:first')[0])).toEqual(new Walkontable.CellCoords(0, 0)); }); it('scroll vertical should scroll to last row if given number bigger than totalRows', function () { this.data.splice(20, this.data.length - 20); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw().scrollVertical(999).draw(); expect(wt.wtTable.getCoords($table.find('tbody tr:last td:first')[0])).toEqual(new Walkontable.CellCoords(19, 0)); }); it('scroll horizontal should scroll to first row if given number smaller than 0', function () { var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw().scrollHorizontal(-1).draw(); expect(wt.wtTable.getCoords($table.find('tbody tr:first td:first')[0])).toEqual(new Walkontable.CellCoords(0, 0)); }); it('scroll horizontal should scroll to last row if given number bigger than totalRows', function () { var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw().scrollHorizontal(999).draw(); expect(wt.wtTable.getCoords($table.find('tbody tr:first td:last')[0])).toEqual(new Walkontable.CellCoords(0, 3)); }); it('scroll viewport to a cell that is visible should do nothing', function () { $wrapper.height(201).width(120); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw(); var tmp = wt.getViewport(); wt.scrollViewport(new Walkontable.CellCoords(0, 1)).draw(); expect(wt.getViewport()).toEqual(tmp); }); it('scroll viewport to a cell on far right should make it visible on right edge', function () { $wrapper.width(125).height(201); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw(); var height = $wrapper[0].clientHeight; var visibleRowCount = Math.floor(height / 23); wt.scrollViewport(new Walkontable.CellCoords(0, 2)).draw(); expect(wt.getViewport()).toEqual([0, 1, visibleRowCount - 1, 2]); }); it('scroll viewport to a cell on far left should make it visible on left edge', function () { $wrapper.width(100).height(201); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw(); var height = $wrapper[0].clientHeight; var visibleRowCount = Math.floor(height / 23); wt.scrollViewport(new Walkontable.CellCoords(0, 3)).draw(); expect(wt.getViewport()).toEqual([0, 3, visibleRowCount - 1, 3]); wt.scrollViewport(new Walkontable.CellCoords(0, 1)).draw(); expect(wt.getViewport()).toEqual([0, 1, visibleRowCount - 1, 1]); }); it('scroll viewport to a cell on far left should make it visible on left edge (with row header)', function () { $wrapper.width(140).height(201); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns, rowHeaders: [function (row, TH) { TH.innerHTML = row + 1; }] }); wt.draw(); var height = $wrapper[0].clientHeight; var visibleRowCount = Math.floor(height / 23); wt.scrollViewport(new Walkontable.CellCoords(0, 3)).draw(); expect(wt.getViewport()).toEqual([0, 3, visibleRowCount - 1, 3]); wt.scrollViewport(new Walkontable.CellCoords(0, 1)).draw(); expect(wt.wtTable.getFirstVisibleColumn()).toEqual(1); }); it('scroll viewport to a cell on far right should make it visible on right edge (with row header)', function () { var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns, rowHeaders: [function (row, TH) { TH.innerHTML = row + 1; }] }); wt.draw().scrollViewport(new Walkontable.CellCoords(0, 2)).draw(); expect(wt.wtTable.getCoords($table.find('tbody tr:first td:last')[0])).toEqual(new Walkontable.CellCoords(0, 3)); }); it('scroll viewport to a cell on far bottom should make it visible on bottom edge', function () { $wrapper.width(125).height(201); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw(); wt.scrollViewport(new Walkontable.CellCoords(12, 0)).draw(); expect(wt.getViewport()[0]).toBeAroundValue(5); expect(wt.getViewport()[1]).toBeAroundValue(0); expect(wt.getViewport()[2]).toBeAroundValue(12); expect(wt.getViewport()[3]).toBeAroundValue(1); }); it('scroll viewport to a cell on far top should make it visible on top edge', function () { $wrapper.width(100).height(201); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw(); wt.scrollViewport(new Walkontable.CellCoords(20, 0)).draw(); wt.scrollViewport(new Walkontable.CellCoords(12, 0)).draw(); expect(wt.wtTable.getCoords($table.find('tbody tr:first td:first')[0])).toEqual(new Walkontable.CellCoords(12, 0)); }); it('scroll viewport to a cell that does not exist (vertically) should throw an error', function () { this.data.splice(20, this.data.length - 20); expect(function () { $wrapper.width(100).height(201); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw(); wt.scrollViewport(new Walkontable.CellCoords(40, 0)).draw(); }).toThrow(); }); it('scroll viewport to a cell that does not exist (horizontally) should throw an error', function () { expect(function () { $wrapper.width(100).height(201); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw(); wt.scrollViewport(new Walkontable.CellCoords(0, 40)).draw(); }).toThrow(); }); it('remove row from the last scroll page should scroll viewport a row up if needed', function () { $wrapper.width(100).height(210); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw().scrollViewport(new Walkontable.CellCoords(getTotalRows() - 1, 0)).draw(); var originalViewportStartRow = wt.getViewport()[0]; this.data.splice(getTotalRows() - 4, 1); // remove row at index 96 wt.draw(); expect(originalViewportStartRow - 1).toEqual(wt.getViewport()[0]); }); it('should scroll to last row if smaller data source is loaded that does not have currently displayed row', function () { $wrapper.width(100).height(260); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw(); wt.scrollVertical(50).draw(); this.data.splice(30, this.data.length - 30); wt.draw(); expect($table.find('tbody tr').length).toBeGreaterThan(9); }); it('should scroll to last column if smaller data source is loaded that does not have currently displayed column', function () { createDataArray(20, 100); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw().scrollHorizontal(50).draw(); createDataArray(100, 30); wt.draw(); expect($table.find('tbody tr:first td').length).toBeGreaterThan(3); }); it('should scroll to last row with very high rows', function () { createDataArray(20, 100); for (var i = 0, ilen = this.data.length; i < ilen; i++) { this.data[i][0] += '\n this \nis \na \nmultiline \ncell'; } $wrapper.width(260).height(201); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw(); wt.scrollVertical(20).draw(); expect($table.find('tbody tr:last td:first')[0]).toBe(wt.wtTable.getCell(new Walkontable.CellCoords(this.data.length - 1, 0))); // last rendered row should be last data row }); xit('should scroll to last row with very high rows (respecting fixedRows)', function () { createDataArray(20, 100); for (var i = 0, ilen = this.data.length; i < ilen; i++) { this.data[i][0] += '\n this \nis \na \nmultiline \ncell'; } var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns, fixedRowsTop: 2 }); wt.draw().scrollVertical(2000).draw(); expect($table.find('tbody tr:eq(0) td:first')[0]).toBe(wt.wtTable.getCell(new Walkontable.CellCoords(0, 0))); // first rendered row should fixed row 0 expect($table.find('tbody tr:eq(1) td:first')[0]).toBe(wt.wtTable.getCell(new Walkontable.CellCoords(1, 0))); // second rendered row should fixed row 1 expect($table.find('tbody tr:eq(2) td:first')[0]).toBe(wt.wtTable.getCell(new Walkontable.CellCoords(2, 0))); // third rendered row should fixed row 1 expect($table.find('tbody tr:last td:first')[0]).toBe(wt.wtTable.getCell(new Walkontable.CellCoords(this.data.length - 1, 0))); // last rendered row should be last data row }); it('should scroll to last column with very wide cells', function () { createDataArray(20, 100); $wrapper.width(260).height(201); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw().scrollHorizontal(50).draw(); createDataArray(100, 30); wt.draw(); expect($table.find('tbody tr:first td').length).toBeGreaterThan(3); }); it('should scroll the desired cell to the bottom edge even if it\'s located in a fixed column', function (done) { createDataArray(20, 100); $wrapper.width(260).height(201); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns, fixedColumnsLeft: 2 }); wt.draw().scrollViewport(new Walkontable.CellCoords(8, 1)).draw(); setTimeout(function () { expect(wt.wtTable.getLastVisibleRow()).toBe(8); done(); }, 20); }); it('should update the scroll position of overlays only once, when scrolling the master table', function (done) { createDataArray(100, 100); $wrapper.width(260).height(201); var topOverlayCallback = jasmine.createSpy('topOverlayCallback'); var leftOverlayCallback = jasmine.createSpy('leftOverlayCallback'); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns, fixedColumnsLeft: 2, fixedRowsTop: 2 }); var masterHolder = wt.wtTable.holder; var leftOverlayHolder = wt.wtOverlays.leftOverlay.clone.wtTable.holder; var topOverlayHolder = wt.wtOverlays.topOverlay.clone.wtTable.holder; topOverlayHolder.addEventListener('scroll', topOverlayCallback); leftOverlayHolder.addEventListener('scroll', leftOverlayCallback); wt.draw(); wt.scrollViewport(new Walkontable.CellCoords(50, 50)).draw(); setTimeout(function () { expect(topOverlayCallback.calls.count()).toEqual(1); expect(leftOverlayCallback.calls.count()).toEqual(1); expect(topOverlayHolder.scrollLeft).toEqual(masterHolder.scrollLeft); expect(leftOverlayHolder.scrollTop).toEqual(masterHolder.scrollTop); topOverlayHolder.removeEventListener('scroll', topOverlayCallback); leftOverlayHolder.removeEventListener('scroll', leftOverlayCallback); done(); }, 20); }); it('should update the scroll position of the master table only once, when scrolling the overlay', function (done) { createDataArray(100, 100); $wrapper.width(260).height(201); var masterCallback = jasmine.createSpy('masterCallback'); var topOverlayCallback = jasmine.createSpy('topOverlayCallback'); var leftOverlayCallback = jasmine.createSpy('leftOverlayCallback'); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns, fixedColumnsLeft: 2, fixedRowsTop: 2 }); var masterHolder = wt.wtTable.holder; var leftOverlayHolder = wt.wtOverlays.leftOverlay.clone.wtTable.holder; var topOverlayHolder = wt.wtOverlays.topOverlay.clone.wtTable.holder; masterHolder.addEventListener('scroll', masterCallback); leftOverlayHolder.addEventListener('scroll', leftOverlayCallback); wt.draw(); topOverlayHolder.scrollLeft = 400; wt.draw(); setTimeout(function () { expect(masterCallback.calls.count()).toEqual(1); expect(leftOverlayCallback.calls.count()).toEqual(0); expect(topOverlayHolder.scrollLeft).toEqual(masterHolder.scrollLeft); leftOverlayHolder.scrollTop = 200; wt.draw(); }, 50); setTimeout(function () { expect(masterCallback.calls.count()).toEqual(2); expect(leftOverlayCallback.calls.count()).toEqual(1); expect(leftOverlayHolder.scrollTop).toEqual(masterHolder.scrollTop); masterHolder.removeEventListener('scroll', masterCallback); leftOverlayHolder.removeEventListener('scroll', leftOverlayCallback); done(); }, 100); }); // Commented due to PhantomJS WheelEvent problem. // Throws an error: TypeError: '[object WheelEventConstructor]' is not a constructor xit('should scroll the table when the `wheel` event is triggered on the corner overlay', function () { createDataArray(100, 100); $wrapper.width(260).height(201); var masterCallback = jasmine.createSpy('masterCallback'); var topCallback = jasmine.createSpy('topCallback'); var leftCallback = jasmine.createSpy('leftCallback'); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns, fixedColumnsLeft: 2, fixedRowsTop: 2 }); wt.draw(); var topLeftCornerOverlayHolder = wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.holder; var topHolder = wt.wtOverlays.topOverlay.clone.wtTable.holder; var leftHolder = wt.wtOverlays.leftOverlay.clone.wtTable.holder; var masterHolder = wt.wtTable.holder; masterHolder.addEventListener('scroll', masterCallback); topHolder.addEventListener('scroll', topCallback); leftHolder.addEventListener('scroll', leftCallback); var wheelEvent = new WheelEvent('wheel', { deltaX: 400 }); topLeftCornerOverlayHolder.dispatchEvent(wheelEvent); wt.draw(); waits(20); runs(function () { expect(masterCallback.callCount).toEqual(1); expect(topCallback.callCount).toEqual(1); expect(leftCallback.callCount).toEqual(0); wheelEvent = new WheelEvent('wheel', { deltaY: 400 }); topLeftCornerOverlayHolder.dispatchEvent(wheelEvent); wt.draw(); }); waits(20); runs(function () { expect(masterCallback.callCount).toEqual(2); expect(topCallback.callCount).toEqual(1); expect(leftCallback.callCount).toEqual(1); }); }); }); describe('scrollViewport - horizontally', function () { beforeEach(function () { $wrapper.width(201).height(201); }); it('should scroll to last column on the right', function () { this.data = createSpreadsheetData(10, 10); $wrapper.width(201).height(201); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns, columnWidth: 50 }); wt.draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(2); wt.scrollViewport(new Walkontable.CellCoords(0, 9)).draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(9); }); it('should not scroll back to a column that is in viewport', function () { this.data = createSpreadsheetData(10, 10); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns, columnWidth: 50 }); wt.draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(2); wt.scrollViewport(new Walkontable.CellCoords(0, 9)).draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(9); wt.scrollViewport(new Walkontable.CellCoords(0, 9)).draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(9); // nothing changed wt.scrollViewport(new Walkontable.CellCoords(0, 8)).draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(9); // nothing changed wt.scrollViewport(new Walkontable.CellCoords(0, 7)).draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(9); // nothing changed }); it('should scroll back to a column that is before viewport', function () { this.data = createSpreadsheetData(10, 10); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns, columnWidth: 50 }); wt.draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(2); wt.scrollViewport(new Walkontable.CellCoords(0, 9)).draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(9); wt.draw().scrollViewport(new Walkontable.CellCoords(0, 3)).draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(5); wt.draw().scrollViewport(new Walkontable.CellCoords(0, 4)).draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(5); // nothing changed wt.scrollViewport(new Walkontable.CellCoords(0, 9)).draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(9); }); it('should scroll to a column that is after viewport', function () { this.data = createSpreadsheetData(10, 10); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns, columnWidth: 50 }); wt.draw(); wt.scrollViewport(new Walkontable.CellCoords(0, 2)).draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(2); wt.draw().scrollViewport(new Walkontable.CellCoords(0, 4)).draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(4); }); it('should scroll to a wide column that is after viewport', function () { this.data = createSpreadsheetData(10, 10); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns, columnWidth: function columnWidth(col) { if (col === 3) { return 100; } return 50; } }); wt.draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(2); expect(wt.wtTable.getFirstVisibleColumn()).toEqual(0); wt.scrollViewport(new Walkontable.CellCoords(0, 3)).draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(3); expect(wt.wtTable.getFirstVisibleColumn()).toEqual(2); }); xit('should scroll to a very wide column that is after viewport', function () { this.data = createSpreadsheetData(10, 10); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns, columnWidth: function columnWidth(col) { if (col === 3) { return 300; } return 50; } }); wt.draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(3); expect(wt.wtTable.getFirstVisibleColumn()).toEqual(0); wt.scrollViewport(new Walkontable.CellCoords(0, 3)).draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(3); expect(wt.wtTable.getFirstVisibleColumn()).toEqual(3); wt.scrollViewport(new Walkontable.CellCoords(0, 2)).draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(3); expect(wt.wtTable.getFirstVisibleColumn()).toEqual(2); wt.scrollViewport(new Walkontable.CellCoords(0, 3)).draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(3); expect(wt.wtTable.getFirstVisibleColumn()).toEqual(3); wt.scrollViewport(new Walkontable.CellCoords(0, 4)).draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(4); expect(wt.wtTable.getFirstVisibleColumn()).toEqual(3); }); xit('should scroll to a very wide column that is after viewport (with fixedColumnsLeft)', function () { this.data = createSpreadsheetData(1, 10); var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns, columnWidth: function columnWidth(col) { if (col === 3) { return 300; } return 50; }, fixedColumnsLeft: 2 }); wt.draw(); wt.scrollViewport(new Walkontable.CellCoords(0, 3)).draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(3); wt.draw().scrollViewport(new Walkontable.CellCoords(0, 2)).draw(); expect(wt.wtTable.getFirstVisibleColumn()).toBeGreaterThan(2); expect(wt.wtTable.getLastVisibleColumn()).toBeGreaterThan(2); wt.draw().scrollViewport(new Walkontable.CellCoords(0, 3)).draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(3); wt.draw().scrollViewport(new Walkontable.CellCoords(0, 4)).draw(); expect(wt.wtTable.getLastVisibleColumn()).toEqual(4); }); }); describe('scrollViewport - vertically', function () { beforeEach(function () { $wrapper.width(201).height(201); }); xit('should scroll to a very high row that is after viewport', function () { this.data = createSpreadsheetData(20, 1); var txt = 'Very very very very very very very very very very very very very very very very very long text.'; this.data[4][0] = txt; var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw(); expect(wt.wtTable.getFirstVisibleRow()).toEqual(0); wt.scrollViewport(new Walkontable.CellCoords(4, 0)).draw(); expect(wt.wtTable.getLastVisibleRow()).toEqual(4); wt.draw().scrollViewport(new Walkontable.CellCoords(5, 0)).draw(); expect(wt.wtTable.getLastVisibleRow()).toEqual(5); wt.draw().scrollViewport(new Walkontable.CellCoords(4, 0)).draw(); expect(wt.wtTable.getFirstVisibleRow()).toEqual(4); wt.draw().scrollViewport(new Walkontable.CellCoords(3, 0)).draw(); expect(wt.wtTable.getFirstVisibleRow()).toEqual(3); }); xit('should scroll to a very high row that is after viewport (at the end)', function () { this.data = createSpreadsheetData(20, 1); var txt = 'Very very very very very very very very very very very very very very very very very long text.'; this.data[19][0] = txt; var wt = new Walkontable.Core({ table: $table[0], data: getData, totalRows: getTotalRows, totalColumns: getTotalColumns }); wt.draw().scrollViewport(new Walkontable.CellCoords(18, 0)).draw(); expect($table.find('tbody tr').length).toBe(2); expect($table.find('tbody tr:eq(0) td:eq(0)').html()).toBe('A18'); expect($table.find('tbody tr:eq(1) td:eq(0)').html()).toBe(txt); wt.draw().scrollViewport(new Walkontable.CellCoords(19, 0)).draw(); expect($table.find('tbody tr').length).toBe(1); expect($table.find('tbody tr:eq(0) td:eq(0)').html()).toBe(txt); // scrolled down wt.draw().scrollViewport(new Walkontable.CellCoords(18, 0)).draw(); expect($table.find('tbody tr').length).toBe(2); expect($table.find('tbody tr:eq(0) td:eq(0)').html()).toBe('A18'); // scrolled up expect($table.find('tbody tr:eq(1) td:eq(0)').html()).toBe(txt); wt.draw().scrollViewport(new Walkontable.CellCoords(17, 0)).draw(); expect($table.find('tbody tr').length).toBe(3); expect($table.find('tbody tr:eq(0) td:eq(0)').html()).toBe('A17'); // scrolled up expect($table.find('tbody tr:eq(1) td:eq(0)').html()).toBe('A18'); expect($table.find('tbody tr:eq(2) td:eq(0)').html()).toBe(txt); }); }); });