/*jshint indent:2, laxcomma:true, laxbreak:true*/
var util = require('util')
, assert = require('assert')
, diff = require('..')
, data = require('./practice-data')
;

var i = Math.floor(Math.random() * data.length) + 1;
var j = Math.floor(Math.random() * data.length) + 1;

while (j === i) {
  j = Math.floor(Math.random() * data.length) + 1;
}

var source = data[i];
var comparand = data[j];

// source and comparand are different objects
assert.notEqual(source, comparand);

// source and comparand have differences in their structure
assert.notDeepEqual(source, comparand);

// record the differences between source and comparand
var changes = diff(source, comparand);

// apply the changes to the source
changes.forEach(function (change) {
  diff.applyChange(source, true, change);
});

// source and copmarand are now deep equal
assert.deepEqual(source, comparand);

// Simulate serializing to a remote copy of the object (we've already go a copy, copy the changes)...

var remote = JSON.parse(JSON.stringify(source));
var remoteChanges = JSON.parse(JSON.stringify(changes));

// source and remote are different objects
assert.notEqual(source, remote);

// changes and remote changes are different objects
assert.notEqual(changes, remoteChanges);

// remote and comparand are different objects
assert.notEqual(remote, comparand);

remoteChanges.forEach(function (change) {
  diff.applyChange(remote, true, change);
});

assert.deepEqual(remote, comparand);