UNPKG

@quantlab/handsontable

Version:

Spreadsheet-like data grid editor that provides copy/paste functionality compatible with Excel/Google Docs

976 lines (828 loc) 65.3 kB
describe('Walkontable.CellRange', function () { describe('getAll', function () { it('should get all cells in range', function () { var from = new Walkontable.CellCoords(1, 1); var to = new Walkontable.CellCoords(3, 3); var range = new Walkontable.CellRange(from, from, to); var all = range.getAll(); expect(all.length).toBe(9); expect(all[0].row).toBe(from.row); expect(all[0].col).toBe(from.col); expect(all[1].row).toBe(1); expect(all[1].col).toBe(2); expect(all[8].row).toBe(to.row); expect(all[8].col).toBe(to.col); }); it('should get all cells in range (reverse order)', function () { var from = new Walkontable.CellCoords(3, 3); var to = new Walkontable.CellCoords(1, 1); var range = new Walkontable.CellRange(from, from, to); var all = range.getAll(); expect(all.length).toBe(9); expect(all[0].row).toBe(to.row); expect(all[0].col).toBe(to.col); expect(all[1].row).toBe(1); expect(all[1].col).toBe(2); expect(all[8].row).toBe(from.row); expect(all[8].col).toBe(from.col); }); }); describe('getInner', function () { it('should get cells in range excluding from and to', function () { var from = new Walkontable.CellCoords(1, 1); var to = new Walkontable.CellCoords(3, 3); var range = new Walkontable.CellRange(from, from, to); var inner = range.getInner(); expect(inner.length).toBe(7); expect(inner[1].row).toBe(1); expect(inner[1].col).toBe(3); }); it('should get cells in range excluding from and to (reverse order)', function () { var from = new Walkontable.CellCoords(3, 3); var to = new Walkontable.CellCoords(1, 1); var range = new Walkontable.CellRange(from, from, to); var inner = range.getInner(); expect(inner.length).toBe(7); expect(inner[1].row).toBe(1); expect(inner[1].col).toBe(3); }); }); describe('includes', function () { it('should return true if range is a single cell and the same cell is given', function () { var from = new Walkontable.CellCoords(0, 0); var to = new Walkontable.CellCoords(0, 0); var range = new Walkontable.CellRange(from, from, to); expect(range.includes(new Walkontable.CellCoords(0, 0))).toBe(true); }); it('should return true if given cell is within the range', function () { var from = new Walkontable.CellCoords(1, 1); var to = new Walkontable.CellCoords(3, 3); var range = new Walkontable.CellRange(from, from, to); expect(range.includes(new Walkontable.CellCoords(1, 1))).toBe(true); expect(range.includes(new Walkontable.CellCoords(3, 1))).toBe(true); expect(range.includes(new Walkontable.CellCoords(3, 3))).toBe(true); expect(range.includes(new Walkontable.CellCoords(1, 3))).toBe(true); expect(range.includes(new Walkontable.CellCoords(2, 2))).toBe(true); expect(range.includes(new Walkontable.CellCoords(1, 2))).toBe(true); expect(range.includes(new Walkontable.CellCoords(2, 1))).toBe(true); }); it('should return false if given cell outside the range', function () { var from = new Walkontable.CellCoords(1, 1); var to = new Walkontable.CellCoords(3, 3); var range = new Walkontable.CellRange(from, from, to); expect(range.includes(new Walkontable.CellCoords(0, 0))).toBe(false); expect(range.includes(new Walkontable.CellCoords(4, 4))).toBe(false); expect(range.includes(new Walkontable.CellCoords(1, 4))).toBe(false); expect(range.includes(new Walkontable.CellCoords(4, 1))).toBe(false); expect(range.includes(new Walkontable.CellCoords(-1, -1))).toBe(false); }); }); describe('includesRange', function () { describe('B has more than one cell', function () { /* +----------+ | a | | +------+ | | | b | | | | | | | +------+ | +----------+ */ it('B is included in A, none of borders touch each other', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(1, 1); var bBottomRight = new Walkontable.CellCoords(4, 4); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.includesRange(b)).toBe(true); }); /* +----------+ | b | | +------+ | | | a | | | | | | | +------+ | +----------+ */ it('A is included in B, none of borders touch each other', function () { var aTopLeft = new Walkontable.CellCoords(1, 1); var aBottomRight = new Walkontable.CellCoords(4, 4); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(0, 0); var bBottomRight = new Walkontable.CellCoords(5, 4); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.includesRange(b)).toBe(false); }); /* +-----------+ | a | b | | | | | | | +-----+ | +-----------+ */ it('B is included in A, top borders touch', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(0, 1); var bBottomRight = new Walkontable.CellCoords(4, 4); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.includesRange(b)).toBe(true); }); /* +---------+ | a | b | | | | | +-----| | | +---------+ */ it('B is included in A, top and right borders touch', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(0, 1); var bBottomRight = new Walkontable.CellCoords(4, 5); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.includesRange(b)).toBe(true); }); /* +---------+ | +-----| | a | b | | | | | +-----| +---------+ */ it('B is included in A, right borders touch', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(1, 1); var bBottomRight = new Walkontable.CellCoords(4, 5); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.includesRange(b)).toBe(true); }); /* +---------+ | +-----| | a | b | | | | +---------+ */ it('B is included in A, bottom and right borders touch', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(1, 1); var bBottomRight = new Walkontable.CellCoords(5, 5); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.includesRange(b)).toBe(true); }); /* +-----------+ | +-----+ | | a | b | | | | | | +-----------+ */ it('B is included in A, bottom borders touch', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(1, 1); var bBottomRight = new Walkontable.CellCoords(5, 4); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.includesRange(b)).toBe(true); }); /* +-----------+ |-----+ a | | b | | | | | +-----------+ */ it('B is included in A, bottom and left borders touch', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(1, 0); var bBottomRight = new Walkontable.CellCoords(5, 4); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.includesRange(b)).toBe(true); }); /* +-----------+ |-----+ a | | b | | | | | |-----+ | +-----------+ */ it('B is included in A, left borders touch', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(1, 0); var bBottomRight = new Walkontable.CellCoords(4, 4); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.includesRange(b)).toBe(true); }); /* +-----------+ | b | a | | | | |-----+ | +-----------+ */ it('B is included in A, top and left borders touch', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(0, 0); var bBottomRight = new Walkontable.CellCoords(4, 4); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.includesRange(b)).toBe(true); }); /* +------------+ | a | b | | | | | | +------------+ */ it('B is included in A, top and bottom borders touch', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(0, 1); var bBottomRight = new Walkontable.CellCoords(5, 4); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.includesRange(b)).toBe(true); }); /* +----------+ | a | b | | | | +----------+ */ it('B is included in A, top, right and bottom borders touch', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(0, 1); var bBottomRight = new Walkontable.CellCoords(5, 5); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.includesRange(b)).toBe(true); }); /* +----------+ | b | a | | | | +----------+ */ it('B is included in A, top, left and bottom borders touch', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(0, 0); var bBottomRight = new Walkontable.CellCoords(5, 4); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.includesRange(b)).toBe(true); }); /* +----------+ | a | |----------| | b | |----------| +----------+ */ it('B is included in A, left and right borders touch', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(1, 0); var bBottomRight = new Walkontable.CellCoords(4, 5); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.includesRange(b)).toBe(true); }); /* +----------+ | a | |----------| | b | +----------+ */ it('B is included in A, left, bottom and right borders touch', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(1, 0); var bBottomRight = new Walkontable.CellCoords(5, 5); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.includesRange(b)).toBe(true); }); /* +----------+ | b | |----------| | a | +----------+ */ it('B is included in A, left, top and right borders touch', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(0, 0); var bBottomRight = new Walkontable.CellCoords(4, 5); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.includesRange(b)).toBe(true); }); }); describe('B has exactly one cell', function () { /* +----------+ | a | | +------+ | | | b | | | | | | | +------+ | +----------+ */ it('B is included in A, none of borders touch each other', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(1, 1); var bBottomRight = new Walkontable.CellCoords(1, 1); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.includesRange(b)).toBe(true); }); }); }); describe('expand', function () { it('should not change range if expander to a cell that fits within the range', function () { var from = new Walkontable.CellCoords(1, 1); var to = new Walkontable.CellCoords(3, 3); var range = new Walkontable.CellRange(from, from, to); var topLeft = range.getTopLeftCorner(); var bottomRight = range.getBottomRightCorner(); var expander = new Walkontable.CellCoords(3, 1); var res = range.expand(expander); expect(res).toBe(false); var topLeft2 = range.getTopLeftCorner(); var bottomRight2 = range.getBottomRightCorner(); expect(topLeft2).toEqual(topLeft); expect(bottomRight2).toEqual(bottomRight); }); it('should change range if expander to a cell outside of the cell range', function () { var from = new Walkontable.CellCoords(1, 1); var to = new Walkontable.CellCoords(3, 3); var range = new Walkontable.CellRange(from, from, to); var topLeft = range.getTopLeftCorner(); var expander = new Walkontable.CellCoords(4, 4); var res = range.expand(expander); expect(res).toBe(true); var topLeft2 = range.getTopLeftCorner(); var bottomRight2 = range.getBottomRightCorner(); expect(topLeft2).toEqual(topLeft); expect(bottomRight2).toEqual(expander); }); it('should change range if expander to a cell outside of the cell range (inverted)', function () { var from = new Walkontable.CellCoords(1, 1); var to = new Walkontable.CellCoords(3, 3); var range = new Walkontable.CellRange(from, from, to); var topLeft = range.getTopLeftCorner(); var expander = new Walkontable.CellCoords(4, 4); var res = range.expand(expander); expect(res).toBe(true); var topLeft2 = range.getTopLeftCorner(); var bottomRight2 = range.getBottomRightCorner(); expect(topLeft2).toEqual(topLeft); expect(bottomRight2).toEqual(expander); }); it('should change range if expander to a cell outside of the cell range (bottom left)', function () { var from = new Walkontable.CellCoords(1, 1); var to = new Walkontable.CellCoords(3, 3); var range = new Walkontable.CellRange(from, from, to); var expander = new Walkontable.CellCoords(3, 0); var res = range.expand(expander); expect(res).toBe(true); var topLeft2 = range.getTopLeftCorner(); var bottomRight2 = range.getBottomRightCorner(); expect(topLeft2).toEqual(new Walkontable.CellCoords(1, 0)); expect(bottomRight2).toEqual(new Walkontable.CellCoords(3, 3)); }); it('should change range if expander to a cell outside of the cell range (inverted top right)', function () { var from = new Walkontable.CellCoords(2, 0); var to = new Walkontable.CellCoords(1, 0); var range = new Walkontable.CellRange(from, from, to); var expander = new Walkontable.CellCoords(1, 1); var res = range.expand(expander); expect(res).toBe(true); var topLeft2 = range.getTopLeftCorner(); var bottomRight2 = range.getBottomRightCorner(); expect(topLeft2).toEqual(new Walkontable.CellCoords(1, 0)); expect(bottomRight2).toEqual(new Walkontable.CellCoords(2, 1)); }); it('should change range if expander to a cell outside of the cell range (inverted bottom left)', function () { var from = new Walkontable.CellCoords(2, 1); var to = new Walkontable.CellCoords(1, 1); var range = new Walkontable.CellRange(from, from, to); var expander = new Walkontable.CellCoords(3, 0); var res = range.expand(expander); expect(res).toBe(true); var topLeft2 = range.getTopLeftCorner(); var bottomRight2 = range.getBottomRightCorner(); expect(topLeft2).toEqual(new Walkontable.CellCoords(1, 0)); expect(bottomRight2).toEqual(new Walkontable.CellCoords(3, 1)); }); }); describe('overlaps', function () { describe('positive', function () { /* +-------+ | | | b | +-------+ | | +-|-----+ | a | | | +-------+ */ it('overlapping from NE', function () { var aTopLeft = new Walkontable.CellCoords(3, 0); var aBottomRight = new Walkontable.CellCoords(8, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(0, 3); var bBottomRight = new Walkontable.CellCoords(5, 8); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* +---------+ | +-------+ | | | | | a | | b | | | | | | +-------+ +---------+ */ it('overlapping from E', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(1, 3); var bBottomRight = new Walkontable.CellCoords(4, 6); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* +--------+ | | | a | | +---------+ | | | | +----|---+ | | b | | | +---------+ */ it('overlapping from SE', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(3, 3); var bBottomRight = new Walkontable.CellCoords(8, 8); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* +---------+ | a | | +-----+ | +-|-----|-+ | b | +-----+ */ it('overlapping from S', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(3, 1); var bBottomRight = new Walkontable.CellCoords(6, 4); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* +--------+ | a | +--------+ | | | | | | +----|---+ | b | +--------+ */ it('overlapping from SW', function () { var aTopLeft = new Walkontable.CellCoords(0, 3); var aBottomRight = new Walkontable.CellCoords(5, 8); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(3, 0); var bBottomRight = new Walkontable.CellCoords(8, 5); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* +-------+ +---|--+ | | | | | | b | | a | | | | | +---|--+ | +-------+ */ it('overlapping from S', function () { var aTopLeft = new Walkontable.CellCoords(0, 3); var aBottomRight = new Walkontable.CellCoords(5, 8); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(1, 1); var bBottomRight = new Walkontable.CellCoords(4, 4); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* +------+ | b | | +-------+ | | | | +---|--+ a | | | +-------+ */ it('overlapping from NW', function () { var aTopLeft = new Walkontable.CellCoords(3, 3); var aBottomRight = new Walkontable.CellCoords(8, 8); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(0, 0); var bBottomRight = new Walkontable.CellCoords(5, 5); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* +---------+ | b | | +-----+ | +-|-----|-+ | a | +-----+ */ it('overlapping from N', function () { var aTopLeft = new Walkontable.CellCoords(3, 1); var aBottomRight = new Walkontable.CellCoords(6, 4); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(0, 0); var bBottomRight = new Walkontable.CellCoords(5, 5); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* +----------+ | a | | +------+ | | | b | | | | | | | +------+ | +----------+ */ it('overlapping when includes', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(1, 1); var bBottomRight = new Walkontable.CellCoords(4, 4); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* +----------+ | b | | +------+ | | | a | | | | | | | +------+ | +----------+ */ it('overlapping when included', function () { var aTopLeft = new Walkontable.CellCoords(1, 1); var aBottomRight = new Walkontable.CellCoords(4, 4); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(0, 0); var bBottomRight = new Walkontable.CellCoords(5, 5); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* b-> +----------+ | a | | | | | +----------+ */ it('overlapping when A includes B and B has only one cell, and this cell is A\'s top left corner', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(0, 0); var bBottomRight = new Walkontable.CellCoords(0, 0); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* +----------+ <- b | a | | | | | +----------+ */ it('overlapping when A includes B and B has only one cell, and this cell is A\'s top right corner', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(0, 5); var bBottomRight = new Walkontable.CellCoords(0, 5); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* +----------+ | a | | | | | b -> +----------+ */ it('overlapping when A includes B and B has only one cell, and this cell is A\'s bottom left corner', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(5, 0); var bBottomRight = new Walkontable.CellCoords(5, 0); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* +----------+ | a | | | | | +----------+ <- b */ it('overlapping when A includes B and B has only one cell, and this cell is A\'s bottom right corner', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(5, 5); var bBottomRight = new Walkontable.CellCoords(5, 5); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* +----+ |b | +----+----+ | a| +----+ */ it('overlapping by touching from NE', function () { var aTopLeft = new Walkontable.CellCoords(5, 0); var aBottomRight = new Walkontable.CellCoords(10, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(0, 5); var bBottomRight = new Walkontable.CellCoords(5, 10); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* +----+----+ | a| b| +----+----+ */ it('overlapping by touching from E', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(0, 5); var bBottomRight = new Walkontable.CellCoords(5, 10); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* +----+ | a| +----+----+ | b| +----+ */ it('overlapping by touching from SE', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(5, 5); var bBottomRight = new Walkontable.CellCoords(10, 10); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* +----+ | a| +----+ | b| +----+ */ it('overlapping by touching from S', function () { var aTopLeft = new Walkontable.CellCoords(0, 0); var aBottomRight = new Walkontable.CellCoords(5, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(5, 5); var bBottomRight = new Walkontable.CellCoords(10, 5); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* +----+ | a| +----+----+ | b| +----+ */ it('overlapping by touching from SW', function () { var aTopLeft = new Walkontable.CellCoords(0, 5); var aBottomRight = new Walkontable.CellCoords(5, 10); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(5, 0); var bBottomRight = new Walkontable.CellCoords(10, 5); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* +----+----+ | b| a| +----+----+ */ it('overlapping by touching from W', function () { var aTopLeft = new Walkontable.CellCoords(0, 5); var aBottomRight = new Walkontable.CellCoords(5, 10); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(0, 0); var bBottomRight = new Walkontable.CellCoords(5, 5); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* +----+ | b| +----+----+ | a| +----+ */ it('overlapping by touching from NW', function () { var aTopLeft = new Walkontable.CellCoords(5, 5); var aBottomRight = new Walkontable.CellCoords(10, 10); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(0, 0); var bBottomRight = new Walkontable.CellCoords(5, 5); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); /* +----+ | b| +----+ | a| +----+ */ it('overlapping by touching from E', function () { var aTopLeft = new Walkontable.CellCoords(5, 0); var aBottomRight = new Walkontable.CellCoords(10, 5); var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight); var bTopLeft = new Walkontable.CellCoords(0, 0); var bBottomRight = new Walkontable.CellCoords(5, 5); var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight); expect(a.overlaps(b)).toBe(true); }); }); describe('negative', function () { /* +---+ | b| +---+ +------+ | | | a | | | +------+ */ it('not overlapping from NE', function () { var aTopLeft = new Walkontable.CellCoords(6, 0); var aBottomRight = new Walkonta