diff options
Diffstat (limited to 'tests/dataview/dataview.js')
-rw-r--r-- | tests/dataview/dataview.js | 886 |
1 files changed, 886 insertions, 0 deletions
diff --git a/tests/dataview/dataview.js b/tests/dataview/dataview.js new file mode 100644 index 0000000..a5b56ac --- /dev/null +++ b/tests/dataview/dataview.js @@ -0,0 +1,886 @@ + +module("basic"); + +function assertEmpty(dv) { + ok(dv.rows !== null, ".rows is not null"); + ok(dv.rows !== undefined, ".rows is not undefined"); + same(0, dv.rows.length, ".rows is initialized to an empty array"); + same(dv.getItems().length, 0, "getItems().length"); + same(undefined, dv.getIdxById("id"), "getIdxById should return undefined if not found"); + same(undefined, dv.getRowById("id"), "getRowById should return undefined if not found"); + same(undefined, dv.getItemById("id"), "getItemById should return undefined if not found"); + same(undefined, dv.getItemByIdx(0), "getItemByIdx should return undefined if not found"); +} + +function assertConsistency(dv,idProperty) { + idProperty = idProperty || "id"; + var items = dv.getItems(), + filteredOut = 0, + row, + id; + + for (var i=0; i<items.length; i++) { + id = items[i][idProperty]; + same(dv.getItemByIdx(i), items[i], "getItemByIdx"); + same(dv.getItemById(id), items[i], "getItemById"); + same(dv.getIdxById(id), i, "getIdxById"); + + row = dv.getRowById(id); + if (row === undefined) + filteredOut++; + else + same(dv.rows[row], items[i], "getRowById"); + } + + same(items.length-dv.rows.length, filteredOut, "filtered rows"); +} + +test("initial setup", function() { + var dv = new Slick.Data.DataView(); + assertEmpty(dv); +}); + +test("initial setup, refresh", function() { + var dv = new Slick.Data.DataView(); + dv.refresh(); + assertEmpty(dv); +}); + + +module("setItems"); + +test("empty", function() { + var dv = new Slick.Data.DataView(); + dv.setItems([]); + assertEmpty(dv); +}); + +test("basic", function() { + var dv = new Slick.Data.DataView(); + dv.setItems([{id:0},{id:1}]); + same(2, dv.rows.length, "rows.length"); + same(dv.getItems().length, 2, "getItems().length"); + assertConsistency(dv); +}); + +test("alternative idProperty", function() { + var dv = new Slick.Data.DataView(); + dv.setItems([{uid:0},{uid:1}], "uid"); + assertConsistency(dv,"uid"); +}); + +test("requires an id on objects", function() { + var dv = new Slick.Data.DataView(); + try { + dv.setItems([1,2,3]); + ok(false, "exception expected") + } + catch (ex) {} +}); + +test("requires a unique id on objects", function() { + var dv = new Slick.Data.DataView(); + try { + dv.setItems([{id:0},{id:0}]); + ok(false, "exception expected") + } + catch (ex) {} +}); + +test("requires a unique id on objects (alternative idProperty)", function() { + var dv = new Slick.Data.DataView(); + try { + dv.setItems([{uid:0},{uid:0}], "uid"); + ok(false, "exception expected") + } + catch (ex) {} +}); + +test("events fired on setItems", function() { + var count = 0; + var dv = new Slick.Data.DataView(); + dv.onRowsChanged.subscribe(function() { + ok(true, "onRowsChanged called"); + count++; + }); + dv.onRowCountChanged.subscribe(function(args) { + ok(true, "onRowCountChanged called"); + same(args.previous, 0, "previous arg"); + same(args.current, 2, "current arg"); + count++; + }); + dv.onPagingInfoChanged.subscribe(function(args) { + ok(true, "onPagingInfoChanged called"); + same(args.pageSize, 0, "pageSize arg"); + same(args.pageNum, 0, "pageNum arg"); + same(args.totalRows, 2, "totalRows arg"); + count++; + }); + dv.setItems([{id:0},{id:1}]); + dv.refresh(); + same(3, count, "3 events should have been called"); +}); + +test("no events on setItems([])", function() { + var dv = new Slick.Data.DataView(); + dv.onRowsChanged.subscribe(function() { ok(false, "onRowsChanged called") }); + dv.onRowCountChanged.subscribe(function() { ok(false, "onRowCountChanged called") }); + dv.onPagingInfoChanged.subscribe(function() { ok(false, "onPagingInfoChanged called") }); + dv.setItems([]); + dv.refresh(); +}); + +test("no events on setItems followed by refresh", function() { + var dv = new Slick.Data.DataView(); + dv.setItems([{id:0},{id:1}]); + dv.onRowsChanged.subscribe(function() { ok(false, "onRowsChanged called") }); + dv.onRowCountChanged.subscribe(function() { ok(false, "onRowCountChanged called") }); + dv.onPagingInfoChanged.subscribe(function() { ok(false, "onPagingInfoChanged called") }); + dv.refresh(); +}); + +test("no refresh while suspended", function() { + var dv = new Slick.Data.DataView(); + dv.beginUpdate(); + dv.onRowsChanged.subscribe(function() { ok(false, "onRowsChanged called") }); + dv.onRowCountChanged.subscribe(function() { ok(false, "onRowCountChanged called") }); + dv.onPagingInfoChanged.subscribe(function() { ok(false, "onPagingInfoChanged called") }); + dv.setItems([{id:0},{id:1}]); + dv.setFilter(function(o) { return true }); + dv.refresh(); + same(dv.rows.length, 0, "rows aren't updated until resumed"); +}); + +test("refresh fires after resume", function() { + var dv = new Slick.Data.DataView(); + dv.beginUpdate(); + dv.setItems([{id:0},{id:1}]); + same(dv.getItems().length, 2, "items updated immediately"); + dv.setFilter(function(o) { return true }); + dv.refresh(); + + var count = 0; + dv.onRowsChanged.subscribe(function(args) { + ok(true, "onRowsChanged called"); + same(args, [0,1], "args"); + count++; + }); + dv.onRowCountChanged.subscribe(function(args) { + ok(true, "onRowCountChanged called"); + same(args.previous, 0, "previous arg"); + same(args.current, 2, "current arg"); + count++; + }); + dv.onPagingInfoChanged.subscribe(function(args) { + ok(true, "onPagingInfoChanged called"); + same(args.pageSize, 0, "pageSize arg"); + same(args.pageNum, 0, "pageNum arg"); + same(args.totalRows, 2, "totalRows arg"); + count++; + }); + dv.endUpdate(); + equal(count, 3, "events fired"); + same(dv.getItems().length, 2, "items are the same"); + same(dv.rows.length, 2, "rows updated"); +}); + +module("sort"); + +test("happy path", function() { + var count = 0; + var items = [{id:2,val:2},{id:1,val:1},{id:0,val:0}]; + var dv = new Slick.Data.DataView(); + dv.setItems(items); + dv.onRowsChanged.subscribe(function() { + ok(true, "onRowsChanged called"); + count++; + }); + dv.onRowCountChanged.subscribe(function() { ok(false, "onRowCountChanged called") }); + dv.onPagingInfoChanged.subscribe(function() { ok(false, "onPagingInfoChanged called") }); + dv.sort(function(x,y) { return x.val-y.val }, true); + equal(count, 1, "events fired"); + same(dv.getItems(), items, "original array should get sorted"); + same(items, [{id:0,val:0},{id:1,val:1},{id:2,val:2}], "sort order"); + assertConsistency(dv); +}); + +test("asc by default", function() { + var items = [{id:2,val:2},{id:1,val:1},{id:0,val:0}]; + var dv = new Slick.Data.DataView(); + dv.setItems(items); + dv.sort(function(x,y) { return x.val-y.val }); + same(items, [{id:0,val:0},{id:1,val:1},{id:2,val:2}], "sort order"); +}); + +test("desc", function() { + var items = [{id:0,val:0},{id:2,val:2},{id:1,val:1}]; + var dv = new Slick.Data.DataView(); + dv.setItems(items); + dv.sort(function(x,y) { return x.val-y.val }, false); + same(items, [{id:2,val:2},{id:1,val:1},{id:0,val:0}], "sort order"); +}); + +test("sort is stable", function() { + var items = [{id:0,val:0},{id:2,val:2},{id:3,val:2},{id:1,val:1}]; + var dv = new Slick.Data.DataView(); + dv.setItems(items); + + dv.sort(function(x,y) { return x.val-y.val }); + same(items, [{id:0,val:0},{id:1,val:1},{id:2,val:2},{id:3,val:2}], "sort order"); + + dv.sort(function(x,y) { return x.val-y.val }); + same(items, [{id:0,val:0},{id:1,val:1},{id:2,val:2},{id:3,val:2}], "sorting on the same column again doesn't change the order"); + + dv.sort(function(x,y) { return x.val-y.val }, false); + same(items, [{id:2,val:2},{id:3,val:2},{id:1,val:1},{id:0,val:0}], "sort order"); +}); + + + +module("fastSort"); + +test("happy path", function() { + var count = 0; + var items = [{id:2,val:2},{id:1,val:1},{id:0,val:0}]; + var dv = new Slick.Data.DataView(); + dv.setItems(items); + dv.onRowsChanged.subscribe(function() { + ok(true, "onRowsChanged called"); + count++; + }); + dv.onRowCountChanged.subscribe(function() { ok(false, "onRowCountChanged called") }); + dv.onPagingInfoChanged.subscribe(function() { ok(false, "onPagingInfoChanged called") }); + dv.fastSort("val", true); + equal(count, 1, "events fired"); + same(dv.getItems(), items, "original array should get sorted"); + same(items, [{id:0,val:0},{id:1,val:1},{id:2,val:2}], "sort order"); + assertConsistency(dv); +}); + +test("asc by default", function() { + var items = [{id:2,val:2},{id:1,val:1},{id:0,val:0}]; + var dv = new Slick.Data.DataView(); + dv.setItems(items); + dv.fastSort("val"); + same(items, [{id:0,val:0},{id:1,val:1},{id:2,val:2}], "sort order"); +}); + +test("desc", function() { + var items = [{id:0,val:0},{id:2,val:2},{id:1,val:1}]; + var dv = new Slick.Data.DataView(); + dv.setItems(items); + dv.fastSort("val", false); + same(items, [{id:2,val:2},{id:1,val:1},{id:0,val:0}], "sort order"); +}); + +test("sort is stable", function() { + var items = [{id:0,val:0},{id:2,val:2},{id:3,val:2},{id:1,val:1}]; + var dv = new Slick.Data.DataView(); + dv.setItems(items); + + dv.fastSort("val"); + same(items, [{id:0,val:0},{id:1,val:1},{id:2,val:2},{id:3,val:2}], "sort order"); + + dv.fastSort("val"); + same(items, [{id:0,val:0},{id:1,val:1},{id:2,val:2},{id:3,val:2}], "sorting on the same column again doesn't change the order"); + + dv.fastSort("val", false); + same(items, [{id:2,val:2},{id:3,val:2},{id:1,val:1},{id:0,val:0}], "sort order"); +}); + +test("w/ function param", function() { + var count = 0; + var items = [{id:2,val:2},{id:1,val:10},{id:0,val:0}]; + var dv = new Slick.Data.DataView(); + dv.setItems(items); + dv.onRowsChanged.subscribe(function() { + ok(true, "onRowsChanged called"); + count++; + }); + dv.onRowCountChanged.subscribe(function() { ok(false, "onRowCountChanged called") }); + dv.onPagingInfoChanged.subscribe(function() { ok(false, "onPagingInfoChanged called") }); + var numericValueFn = function() { + var val = this["val"]; + if (val < 10) + return "00" + val; + else if (val < 100) + return "0" + val; + else + return val; + }; + dv.fastSort(numericValueFn, true); + equal(count, 1, "events fired"); + same(dv.getItems(), items, "original array should get sorted"); + same(items, [{id:0,val:0},{id:2,val:2},{id:1,val:10}], "sort order"); + assertConsistency(dv); +}); + +module("filtering"); + +test("applied immediately", function() { + var count = 0; + var dv = new Slick.Data.DataView(); + dv.setItems([{id:0,val:0},{id:1,val:1},{id:2,val:2}]); + dv.onRowsChanged.subscribe(function(args) { + ok(true, "onRowsChanged called"); + same(args, [0], "args"); + count++; + }); + dv.onRowCountChanged.subscribe(function(args) { + ok(true, "onRowCountChanged called"); + same(args.previous, 3, "previous arg"); + same(args.current, 1, "current arg"); + count++; + }); + dv.onPagingInfoChanged.subscribe(function(args) { + ok(true, "onPagingInfoChanged called"); + same(args.pageSize, 0, "pageSize arg"); + same(args.pageNum, 0, "pageNum arg"); + same(args.totalRows, 1, "totalRows arg"); + count++; + }); + dv.setFilter(function(o) { return o.val === 1 }); + equal(count, 3, "events fired"); + same(dv.getItems().length, 3, "original data is still there"); + same(dv.rows.length, 1, "rows are filtered"); + assertConsistency(dv); +}); + +test("re-applied on refresh", function() { + var count = 0; + var filterVal = 0; + var dv = new Slick.Data.DataView(); + dv.setItems([{id:0,val:0},{id:1,val:1},{id:2,val:2}]); + dv.setFilter(function(o) { return o.val >= filterVal }); + same(dv.rows.length, 3, "nothing is filtered out"); + assertConsistency(dv); + + dv.onRowsChanged.subscribe(function(args) { + ok(true, "onRowsChanged called"); + same(args, [0], "args"); + count++; + }); + dv.onRowCountChanged.subscribe(function(args) { + ok(true, "onRowCountChanged called"); + same(args.previous, 3, "previous arg"); + same(args.current, 1, "current arg"); + count++; + }); + dv.onPagingInfoChanged.subscribe(function(args) { + ok(true, "onPagingInfoChanged called"); + same(args.pageSize, 0, "pageSize arg"); + same(args.pageNum, 0, "pageNum arg"); + same(args.totalRows, 1, "totalRows arg"); + count++; + }); + filterVal = 2; + dv.refresh(); + equal(count, 3, "events fired"); + same(dv.getItems().length, 3, "original data is still there"); + same(dv.rows.length, 1, "rows are filtered"); + assertConsistency(dv); +}); + +test("re-applied on sort", function() { + var dv = new Slick.Data.DataView(); + dv.setItems([{id:0,val:0},{id:1,val:1},{id:2,val:2}]); + dv.setFilter(function(o) { return o.val === 1 }); + same(dv.rows.length, 1, "one row is remaining"); + + dv.onRowsChanged.subscribe(function() { ok(false, "onRowsChanged called") }); + dv.onRowCountChanged.subscribe(function() { ok(false, "onRowCountChanged called") }); + dv.onPagingInfoChanged.subscribe(function() { ok(false, "onPagingInfoChanged called") }); + dv.sort(function(x,y) { return x.val-y.val }, false); + same(dv.getItems().length, 3, "original data is still there"); + same(dv.rows.length, 1, "rows are filtered"); + assertConsistency(dv); +}); + +test("all", function() { + var count = 0; + var dv = new Slick.Data.DataView(); + dv.setItems([{id:0,val:0},{id:1,val:1},{id:2,val:2}]); + dv.onRowsChanged.subscribe(function(args) { + ok(false, "onRowsChanged called"); + }); + dv.onRowCountChanged.subscribe(function(args) { + ok(true, "onRowCountChanged called"); + same(args.previous, 3, "previous arg"); + same(args.current, 0, "current arg"); + count++; + }); + dv.onPagingInfoChanged.subscribe(function(args) { + ok(true, "onPagingInfoChanged called"); + same(args.pageSize, 0, "pageSize arg"); + same(args.pageNum, 0, "pageNum arg"); + same(args.totalRows, 0, "totalRows arg"); + count++; + }); + dv.setFilter(function(o) { return false }); + equal(count, 2, "events fired"); + same(dv.getItems().length, 3, "original data is still there"); + same(dv.rows.length, 0, "rows are filtered"); + assertConsistency(dv); +}); + +test("all then none", function() { + var filterResult = false; + var count = 0; + var dv = new Slick.Data.DataView(); + dv.setItems([{id:0,val:0},{id:1,val:1},{id:2,val:2}]); + dv.setFilter(function(o) { return filterResult }); + same(dv.rows.length, 0, "all rows are filtered out"); + + dv.onRowsChanged.subscribe(function(args) { + ok(true, "onRowsChanged called"); + same(args, [0,1,2], "args"); + count++; + }); + dv.onRowCountChanged.subscribe(function(args) { + ok(true, "onRowCountChanged called"); + same(args.previous, 0, "previous arg"); + same(args.current, 3, "current arg"); + count++; + }); + dv.onPagingInfoChanged.subscribe(function(args) { + ok(true, "onPagingInfoChanged called"); + same(args.pageSize, 0, "pageSize arg"); + same(args.pageNum, 0, "pageNum arg"); + same(args.totalRows, 3, "totalRows arg"); + count++; + }); + filterResult = true; + dv.refresh(); + equal(count, 3, "events fired"); + same(dv.getItems().length, 3, "original data is still there"); + same(dv.rows.length, 3, "all rows are back"); + assertConsistency(dv); +}); + +module("updateItem"); + +test("basic", function() { + var count = 0; + var dv = new Slick.Data.DataView(); + dv.setItems([{id:0,val:0},{id:1,val:1},{id:2,val:2}]); + + dv.onRowsChanged.subscribe(function(args) { + ok(true, "onRowsChanged called"); + same(args, [1], "args"); + count++; + }); + dv.onRowCountChanged.subscribe(function(args) { + ok(false, "onRowCountChanged called"); + }); + dv.onPagingInfoChanged.subscribe(function(args) { + ok(false, "onPagingInfoChanged called"); + }); + + dv.updateItem(1,{id:1,val:1337}); + equal(count, 1, "events fired"); + same(dv.rows[1], {id:1,val:1337}, "item updated"); + assertConsistency(dv); +}); + +test("updating an item not passing the filter", function() { + var dv = new Slick.Data.DataView(); + dv.setItems([{id:0,val:0},{id:1,val:1},{id:2,val:2},{id:3,val:1337}]); + dv.setFilter(function(o) { return o["val"] !== 1337 }); + dv.onRowsChanged.subscribe(function(args) { + ok(false, "onRowsChanged called"); + }); + dv.onRowCountChanged.subscribe(function(args) { + ok(false, "onRowCountChanged called"); + }); + dv.onPagingInfoChanged.subscribe(function(args) { + ok(false, "onPagingInfoChanged called"); + }); + dv.updateItem(3,{id:3,val:1337}); + same(dv.getItems()[3], {id:3,val:1337}, "item updated"); + assertConsistency(dv); +}); + +test("updating an item to pass the filter", function() { + var count = 0; + var dv = new Slick.Data.DataView(); + dv.setItems([{id:0,val:0},{id:1,val:1},{id:2,val:2},{id:3,val:1337}]); + dv.setFilter(function(o) { return o["val"] !== 1337 }); + dv.onRowsChanged.subscribe(function(args) { + ok(true, "onRowsChanged called"); + same(args, [3], "args"); + count++; + }); + dv.onRowCountChanged.subscribe(function(args) { + ok(true, "onRowCountChanged called"); + equal(args.previous, 3, "previous arg"); + equal(args.current, 4, "current arg"); + count++; + }); + dv.onPagingInfoChanged.subscribe(function(args) { + ok(true, "onPagingInfoChanged called"); + same(args.pageSize, 0, "pageSize arg"); + same(args.pageNum, 0, "pageNum arg"); + same(args.totalRows, 4, "totalRows arg"); + count++; + }); + dv.updateItem(3,{id:3,val:3}); + equal(count, 3, "events fired"); + same(dv.getItems()[3], {id:3,val:3}, "item updated"); + assertConsistency(dv); +}); + +test("updating an item to not pass the filter", function() { + var count = 0; + var dv = new Slick.Data.DataView(); + dv.setItems([{id:0,val:0},{id:1,val:1},{id:2,val:2},{id:3,val:3}]); + dv.setFilter(function(o) { return o["val"] !== 1337 }); + dv.onRowsChanged.subscribe(function(args) { + console.log(args) + ok(false, "onRowsChanged called"); + }); + dv.onRowCountChanged.subscribe(function(args) { + ok(true, "onRowCountChanged called"); + equal(args.previous, 4, "previous arg"); + equal(args.current, 3, "current arg"); + count++; + }); + dv.onPagingInfoChanged.subscribe(function(args) { + ok(true, "onPagingInfoChanged called"); + same(args.pageSize, 0, "pageSize arg"); + same(args.pageNum, 0, "pageNum arg"); + same(args.totalRows, 3, "totalRows arg"); + count++; + }); + dv.updateItem(3,{id:3,val:1337}); + equal(count, 2, "events fired"); + same(dv.getItems()[3], {id:3,val:1337}, "item updated"); + assertConsistency(dv); +}); + + +module("addItem"); + +test("must have id", function() { + var count = 0; + var dv = new Slick.Data.DataView(); + dv.setItems([{id:0,val:0},{id:1,val:1},{id:2,val:2}]); + try { + dv.addItem({val:1337}); + ok(false, "exception thrown"); + } + catch (ex) {} +}); + +test("must have id (custom)", function() { + var count = 0; + var dv = new Slick.Data.DataView(); + dv.setItems([{uid:0,val:0},{uid:1,val:1},{uid:2,val:2}], "uid"); + try { + dv.addItem({id:3,val:1337}); + ok(false, "exception thrown"); + } + catch (ex) {} +}); + +test("basic", function() { + var count = 0; + var dv = new Slick.Data.DataView(); + dv.setItems([{id:0,val:0},{id:1,val:1},{id:2,val:2}]); + dv.onRowsChanged.subscribe(function(args) { + ok(true, "onRowsChanged called"); + same(args, [3], "args"); + count++; + }); + dv.onRowCountChanged.subscribe(function(args) { + ok(true, "onRowCountChanged called"); + equal(args.previous, 3, "previous arg"); + equal(args.current, 4, "current arg"); + count++; + }); + dv.onPagingInfoChanged.subscribe(function(args) { + ok(true, "onPagingInfoChanged called"); + equal(args.pageSize, 0, "pageSize arg"); + equal(args.pageNum, 0, "pageNum arg"); + equal(args.totalRows, 4, "totalRows arg"); + count++; + }); + dv.addItem({id:3,val:1337}); + equal(count, 3, "events fired"); + same(dv.getItems()[3], {id:3,val:1337}, "item updated"); + same(dv.rows[3], {id:3,val:1337}, "item updated"); + assertConsistency(dv); +}); + +test("add an item not passing the filter", function() { + var dv = new Slick.Data.DataView(); + dv.setItems([{id:0,val:0},{id:1,val:1},{id:2,val:2}]); + dv.setFilter(function(o) { return o["val"] !== 1337 }); + dv.onRowsChanged.subscribe(function(args) { + ok(false, "onRowsChanged called"); + }); + dv.onRowCountChanged.subscribe(function(args) { + ok(false, "onRowCountChanged called"); + }); + dv.onPagingInfoChanged.subscribe(function(args) { + ok(false, "onPagingInfoChanged called"); + }); + dv.addItem({id:3,val:1337}); + same(dv.getItems()[3], {id:3,val:1337}, "item updated"); + assertConsistency(dv); +}); + +module("insertItem"); + +test("must have id", function() { + var count = 0; + var dv = new Slick.Data.DataView(); + dv.setItems([{id:0,val:0},{id:1,val:1},{id:2,val:2}]); + try { + dv.insertItem(0,{val:1337}); + ok(false, "exception thrown"); + } + catch (ex) {} +}); + +test("must have id (custom)", function() { + var count = 0; + var dv = new Slick.Data.DataView(); + dv.setItems([{uid:0,val:0},{uid:1,val:1},{uid:2,val:2}], "uid"); + try { + dv.insertItem(0,{id:3,val:1337}); + ok(false, "exception thrown"); + } + catch (ex) {} +}); + +test("insert at the beginning", function() { + var count = 0; + var dv = new Slick.Data.DataView(); + dv.setItems([{id:0,val:0},{id:1,val:1},{id:2,val:2}]); + dv.onRowsChanged.subscribe(function(args) { + ok(true, "onRowsChanged called"); + same(args, [0,1,2,3], "args"); + count++; + }); + dv.onRowCountChanged.subscribe(function(args) { + ok(true, "onRowCountChanged called"); + equal(args.previous, 3, "previous arg"); + equal(args.current, 4, "current arg"); + count++; + }); + dv.onPagingInfoChanged.subscribe(function(args) { + ok(true, "onPagingInfoChanged called"); + equal(args.pageSize, 0, "pageSize arg"); + equal(args.pageNum, 0, "pageNum arg"); + equal(args.totalRows, 4, "totalRows arg"); + count++; + }); + dv.insertItem(0, {id:3,val:1337}); + equal(count, 3, "events fired"); + same(dv.rows[0], {id:3,val:1337}, "item updated"); + equal(dv.getItems().length, 4, "items updated"); + equal(dv.rows.length, 4, "rows updated"); + assertConsistency(dv); +}); + +test("insert in the middle", function() { + var count = 0; + var dv = new Slick.Data.DataView(); + dv.setItems([{id:0,val:0},{id:1,val:1},{id:2,val:2}]); + dv.onRowsChanged.subscribe(function(args) { + ok(true, "onRowsChanged called"); + same(args, [2,3], "args"); + count++; + }); + dv.onRowCountChanged.subscribe(function(args) { + ok(true, "onRowCountChanged called"); + equal(args.previous, 3, "previous arg"); + equal(args.current, 4, "current arg"); + count++; + }); + dv.onPagingInfoChanged.subscribe(function(args) { + ok(true, "onPagingInfoChanged called"); + equal(args.pageSize, 0, "pageSize arg"); + equal(args.pageNum, 0, "pageNum arg"); + equal(args.totalRows, 4, "totalRows arg"); + count++; + }); + dv.insertItem(2,{id:3,val:1337}); + equal(count, 3, "events fired"); + same(dv.rows[2], {id:3,val:1337}, "item updated"); + equal(dv.getItems().length, 4, "items updated"); + equal(dv.rows.length, 4, "rows updated"); + assertConsistency(dv); +}); + +test("insert at the end", function() { + var count = 0; + var dv = new Slick.Data.DataView(); + dv.setItems([{id:0,val:0},{id:1,val:1},{id:2,val:2}]); + dv.onRowsChanged.subscribe(function(args) { + ok(true, "onRowsChanged called"); + same(args, [3], "args"); + count++; + }); + dv.onRowCountChanged.subscribe(function(args) { + ok(true, "onRowCountChanged called"); + equal(args.previous, 3, "previous arg"); + equal(args.current, 4, "current arg"); + count++; + }); + dv.onPagingInfoChanged.subscribe(function(args) { + ok(true, "onPagingInfoChanged called"); + equal(args.pageSize, 0, "pageSize arg"); + equal(args.pageNum, 0, "pageNum arg"); + equal(args.totalRows, 4, "totalRows arg"); + count++; + }); + dv.insertItem(3,{id:3,val:1337}); + equal(count, 3, "events fired"); + same(dv.rows[3], {id:3,val:1337}, "item updated"); + equal(dv.getItems().length, 4, "items updated"); + equal(dv.rows.length, 4, "rows updated"); + assertConsistency(dv); +}); + +module("deleteItem"); + +test("must have id", function() { + var count = 0; + var dv = new Slick.Data.DataView(); + dv.setItems([{id:0,val:0},{id:1,val:1},{id:2,val:2}]); + try { + dv.deleteItem(-1); + ok(false, "exception thrown"); + } + catch (ex) {} + try { + dv.deleteItem(undefined); + ok(false, "exception thrown"); + } + catch (ex) {} + try { + dv.deleteItem(null); + ok(false, "exception thrown"); + } + catch (ex) {} + try { + dv.deleteItem(3); + ok(false, "exception thrown"); + } + catch (ex) {} +}); + +test("must have id (custom)", function() { + var count = 0; + var dv = new Slick.Data.DataView(); + dv.setItems([{uid:0,id:-1,val:0},{uid:1,id:3,val:1},{uid:2,id:null,val:2}], "uid"); + try { + dv.deleteItem(-1); + ok(false, "exception thrown"); + } + catch (ex) {} + try { + dv.deleteItem(undefined); + ok(false, "exception thrown"); + } + catch (ex) {} + try { + dv.deleteItem(null); + ok(false, "exception thrown"); + } + catch (ex) {} + try { + dv.deleteItem(3); + ok(false, "exception thrown"); + } + catch (ex) {} +}); + +test("delete at the beginning", function() { + var count = 0; + var dv = new Slick.Data.DataView(); + dv.setItems([{id:05,val:0},{id:15,val:1},{id:25,val:2}]); + dv.onRowsChanged.subscribe(function(args) { + ok(true, "onRowsChanged called"); + same(args, [0,1], "args"); + count++; + }); + dv.onRowCountChanged.subscribe(function(args) { + ok(true, "onRowCountChanged called"); + equal(args.previous, 3, "previous arg"); + equal(args.current, 2, "current arg"); + count++; + }); + dv.onPagingInfoChanged.subscribe(function(args) { + ok(true, "onPagingInfoChanged called"); + equal(args.pageSize, 0, "pageSize arg"); + equal(args.pageNum, 0, "pageNum arg"); + equal(args.totalRows, 2, "totalRows arg"); + count++; + }); + dv.deleteItem(05); + equal(count, 3, "events fired"); + equal(dv.getItems().length, 2, "items updated"); + equal(dv.rows.length, 2, "rows updated"); + assertConsistency(dv); +}); + +test("delete in the middle", function() { + var count = 0; + var dv = new Slick.Data.DataView(); + dv.setItems([{id:05,val:0},{id:15,val:1},{id:25,val:2}]); + dv.onRowsChanged.subscribe(function(args) { + ok(true, "onRowsChanged called"); + same(args, [1], "args"); + count++; + }); + dv.onRowCountChanged.subscribe(function(args) { + ok(true, "onRowCountChanged called"); + equal(args.previous, 3, "previous arg"); + equal(args.current, 2, "current arg"); + count++; + }); + dv.onPagingInfoChanged.subscribe(function(args) { + ok(true, "onPagingInfoChanged called"); + equal(args.pageSize, 0, "pageSize arg"); + equal(args.pageNum, 0, "pageNum arg"); + equal(args.totalRows, 2, "totalRows arg"); + count++; + }); + dv.deleteItem(15); + equal(count, 3, "events fired"); + equal(dv.getItems().length, 2, "items updated"); + equal(dv.rows.length, 2, "rows updated"); + assertConsistency(dv); +}); + +test("delete at the end", function() { + var count = 0; + var dv = new Slick.Data.DataView(); + dv.setItems([{id:05,val:0},{id:15,val:1},{id:25,val:2}]); + dv.onRowsChanged.subscribe(function(args) { + ok(false, "onRowsChanged called"); + }); + dv.onRowCountChanged.subscribe(function(args) { + ok(true, "onRowCountChanged called"); + equal(args.previous, 3, "previous arg"); + equal(args.current, 2, "current arg"); + count++; + }); + dv.onPagingInfoChanged.subscribe(function(args) { + ok(true, "onPagingInfoChanged called"); + equal(args.pageSize, 0, "pageSize arg"); + equal(args.pageNum, 0, "pageNum arg"); + equal(args.totalRows, 2, "totalRows arg"); + count++; + }); + dv.deleteItem(25); + equal(count, 2, "events fired"); + equal(dv.getItems().length, 2, "items updated"); + equal(dv.rows.length, 2, "rows updated"); + assertConsistency(dv); +}); + +// TODO: paging +// TODO: combination
\ No newline at end of file |