var assert = require('assert'),
    moment = require('moment'),
    vis = require('../dist/vis.js'),
    DataSet = vis.DataSet,
    DataView = vis.DataView;


var groups = new DataSet();

// add items with different groups
groups.add([
  {id: 1, content: 'Item 1', group: 1},
  {id: 2, content: 'Item 2', group: 2},
  {id: 3, content: 'Item 3', group: 2},
  {id: 4, content: 'Item 4', group: 1},
  {id: 5, content: 'Item 5', group: 3}
]);

var group2 = new DataView(groups, {
  filter: function (item) {
    return item.group == 2;
  }
});

// test getting the filtered data
assert.deepEqual(group2.get(), [
  {id: 2, content: 'Item 2', group: 2},
  {id: 3, content: 'Item 3', group: 2}
]);

// test filtering the view contents
assert.deepEqual(group2.get({
  filter: function (item) {
    return item.id > 2;
  }
}), [
  {id: 3, content: 'Item 3', group: 2}
]);

// test event subscription
var groupsTriggerCount = 0;
groups.on('*', function () {
  groupsTriggerCount++;
});
var group2TriggerCount = 0;
group2.on('*', function () {
  group2TriggerCount++;
});

groups.update({id:2, content: 'Item 2 (changed)'});
assert.equal(groupsTriggerCount, 1);
assert.equal(group2TriggerCount, 1);

groups.update({id:5, content: 'Item 5 (changed)'});
assert.equal(groupsTriggerCount, 2);
assert.equal(group2TriggerCount, 1);

// detach the view from groups
group2.setData(null);
assert.equal(groupsTriggerCount, 2);
assert.equal(group2TriggerCount, 2);

groups.update({id:2, content: 'Item 2 (changed again)'});
assert.equal(groupsTriggerCount, 3);
assert.equal(group2TriggerCount, 2);