| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295 |
- 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 Walkontable.CellCoords(11, 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(false);
- });
- /*
- +------+
- | | +--+
- | a | | b|
- | | +--+
- +------+
- */
- it('not 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, 6);
- var bBottomRight = new Walkontable.CellCoords(4, 9);
- var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight);
- expect(a.overlaps(b)).toBe(false);
- });
- /*
- +----+
- |a |
- | | +----+
- +----+ |b |
- | |
- +----+
- */
- it('not 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(1, 6);
- var bBottomRight = new Walkontable.CellCoords(4, 9);
- var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight);
- expect(a.overlaps(b)).toBe(false);
- });
- /*
- +----+
- |a |
- | |
- +----+
- +----+
- |b |
- | |
- +----+
- */
- it('not 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(6, 0);
- var bBottomRight = new Walkontable.CellCoords(11, 5);
- var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight);
- expect(a.overlaps(b)).toBe(false);
- });
- /*
- +----+
- |a |
- | |
- +----+
- +----+
- |b |
- | |
- +----+
- */
- it('not 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(6, 0);
- var bBottomRight = new Walkontable.CellCoords(11, 5);
- var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight);
- expect(a.overlaps(b)).toBe(false);
- });
- /*
- +------+
- +--+ | |
- | b| | a |
- +--+ | |
- +------+
- */
- it('not overlapping from W', function () {
- var aTopLeft = new Walkontable.CellCoords(0, 6);
- var aBottomRight = new Walkontable.CellCoords(5, 11);
- var a = new Walkontable.CellRange(aTopLeft, aTopLeft, aBottomRight);
- var bTopLeft = new Walkontable.CellCoords(3, 0);
- var bBottomRight = new Walkontable.CellCoords(6, 3);
- var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight);
- expect(a.overlaps(b)).toBe(false);
- });
- /*
- +----+
- |b |
- | | +----+
- +----+ | a |
- | |
- +----+
- */
- it('not overlapping from NW', function () {
- var aTopLeft = new Walkontable.CellCoords(0, 6);
- var aBottomRight = new Walkontable.CellCoords(3, 11);
- 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(false);
- });
- /*
- +----+
- |b |
- +----+
- +----+
- | a|
- +----+
- */
- it('not overlapping from N', function () {
- var aTopLeft = new Walkontable.CellCoords(6, 0);
- var aBottomRight = new Walkontable.CellCoords(11, 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(false);
- });
- });
- });
- describe('expand by range', function () {
- it('should not expand range A with range B if A includes B', 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(2, 2);
- var bBottomRight = new Walkontable.CellCoords(4, 4);
- var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight);
- expect(a.expandByRange(b)).toBe(false);
- expect(a.getTopLeftCorner().row).toEqual(0);
- expect(a.getTopLeftCorner().col).toEqual(0);
- expect(a.getBottomRightCorner().row).toEqual(5);
- expect(a.getBottomRightCorner().col).toEqual(5);
- });
- it('should not expand range A with range B if A and B don\'t overlap', 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(10, 10);
- var bBottomRight = new Walkontable.CellCoords(15, 15);
- var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight);
- expect(a.expandByRange(b)).toBe(false);
- expect(a.getTopLeftCorner().row).toEqual(0);
- expect(a.getTopLeftCorner().col).toEqual(0);
- expect(a.getBottomRightCorner().row).toEqual(5);
- expect(a.getBottomRightCorner().col).toEqual(5);
- });
- it('should not expand range A with range B', 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(2, 2);
- var bBottomRight = new Walkontable.CellCoords(7, 7);
- var b = new Walkontable.CellRange(bTopLeft, bTopLeft, bBottomRight);
- expect(a.expandByRange(b)).toBe(true);
- expect(a.getTopLeftCorner().row).toEqual(0);
- expect(a.getTopLeftCorner().col).toEqual(0);
- expect(a.getBottomRightCorner().row).toEqual(7);
- expect(a.getBottomRightCorner().col).toEqual(7);
- });
- });
- describe('forAll', function () {
- it('callback should be called for all cells in 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 forAllCallback = jasmine.createSpy('beforeColumnSortHandler');
- range.forAll(forAllCallback);
- expect(forAllCallback.calls.count()).toBe(9);
- });
- it('callback should be called with row, column parameters', function () {
- var from = new Walkontable.CellCoords(1, 1);
- var to = new Walkontable.CellCoords(2, 2);
- var range = new Walkontable.CellRange(from, from, to);
- var rows = [];
- var cols = [];
- range.forAll(function (row, col) {
- rows.push(row);
- cols.push(col);
- });
- expect(rows).toEqual([1, 1, 2, 2]);
- expect(cols).toEqual([1, 2, 1, 2]);
- });
- it('iteration should be interrupted when callback returns false', function () {
- var from = new Walkontable.CellCoords(1, 1);
- var to = new Walkontable.CellCoords(2, 2);
- var range = new Walkontable.CellRange(from, from, to);
- var callCount = 0;
- range.forAll(function (row, col) {
- callCount++;
- if (callCount == 2) {
- return false;
- }
- });
- expect(callCount).toBe(2);
- });
- });
- describe('change direction', function () {
- it('should properly change direction on NW-SE', function () {
- var from = new Walkontable.CellCoords(2, 1);
- var to = new Walkontable.CellCoords(1, 2);
- var range = new Walkontable.CellRange(from, from, to);
- expect(range.getDirection()).toBe('SW-NE');
- range.setDirection('NW-SE');
- expect(range.getDirection()).toBe('NW-SE');
- expect(range.from.row).toBe(1);
- expect(range.from.col).toBe(1);
- expect(range.to.row).toBe(2);
- expect(range.to.col).toBe(2);
- });
- it('should properly change direction on NE-SW', function () {
- var from = new Walkontable.CellCoords(2, 1);
- var to = new Walkontable.CellCoords(1, 2);
- var range = new Walkontable.CellRange(from, from, to);
- expect(range.getDirection()).toBe('SW-NE');
- range.setDirection('NE-SW');
- expect(range.getDirection()).toBe('NE-SW');
- expect(range.from.row).toBe(1);
- expect(range.from.col).toBe(2);
- expect(range.to.row).toBe(2);
- expect(range.to.col).toBe(1);
- });
- it('should properly change direction on SE-NW', function () {
- var from = new Walkontable.CellCoords(1, 1);
- var to = new Walkontable.CellCoords(2, 2);
- var range = new Walkontable.CellRange(from, from, to);
- expect(range.getDirection()).toBe('NW-SE');
- range.setDirection('SE-NW');
- expect(range.getDirection()).toBe('SE-NW');
- expect(range.from.row).toBe(2);
- expect(range.from.col).toBe(2);
- expect(range.to.row).toBe(1);
- expect(range.to.col).toBe(1);
- });
- it('should properly change direction on SW-NE', function () {
- var from = new Walkontable.CellCoords(1, 1);
- var to = new Walkontable.CellCoords(2, 2);
- var range = new Walkontable.CellRange(from, from, to);
- expect(range.getDirection()).toBe('NW-SE');
- range.setDirection('SW-NE');
- expect(range.getDirection()).toBe('SW-NE');
- expect(range.from.row).toBe(2);
- expect(range.from.col).toBe(1);
- expect(range.to.row).toBe(1);
- expect(range.to.col).toBe(2);
- });
- });
- });
|