// ========================================================================== // Project: SproutCore - JavaScript Application Framework // Copyright: ©2006-2011 Apple Inc. and contributors. // License: Licensed under MIT license (see license.js) // ========================================================================== /*globals module ok equals same test MyApp */

// NOTE: The test below are based on the Data Hashes state chart. This models // the “read_editable” event in the NestedStore portion of the diagram.

var parent, store, storeKey, json; module(“SC.NestedStore#readEditableDataHash”, {

setup: function() {
  parent = SC.Store.create();

  json = {
    string: "string",
    number: 23,
    bool:   YES
  };

  storeKey = SC.Store.generateStoreKey();

  parent.writeDataHash(storeKey, json, SC.Record.READY_CLEAN);
  parent.editables = null ; // manually reset for testing state

  store = parent.chain();
}

});

test(“data state=INHERITED, parent editable = NO”, function() {

// test preconditions
equals(parent.storeKeyEditState(storeKey), SC.Store.LOCKED, 'precond - parent edit state should be LOCKED');
equals(store.storeKeyEditState(storeKey), SC.Store.INHERITED, 'precond - edit state should be INHERITED');
var oldrev = store.revisions[storeKey] ;

// perform read
var ret = store.readEditableDataHash(storeKey);

// validate
same(ret, json, 'should return equivalent json object');
ok(!(ret===json), 'should not return same json instance');

equals(store.storeKeyEditState(storeKey), SC.Store.EDITABLE, 'edit state should be editable');

// should not change revisions, but should copy it...
equals(store.revisions[storeKey], oldrev, 'should not change revision');
if (!SC.none(oldrev)) {
  ok(store.revisions.hasOwnProperty(storeKey), 'should clone revision reference');
}

});

test(“data state=INHERITED, parent editable = YES”, function() {

// test preconditions
parent.readEditableDataHash(storeKey);
equals(parent.storeKeyEditState(storeKey), SC.Store.EDITABLE, 'precond - parent edit state should be EDITABLE');
equals(store.storeKeyEditState(storeKey), SC.Store.INHERITED, 'precond - edit state should be INHERITED');
var oldrev = store.revisions[storeKey] ;

// perform read
var ret = store.readEditableDataHash(storeKey);

// validate
same(ret, json, 'should return equivalent json object');
ok(!(ret===json), 'should not return same json instance');

equals(store.storeKeyEditState(storeKey), SC.Store.EDITABLE, 'edit state should be editable');

// should not change revisions, but should copy it...
equals(store.revisions[storeKey], oldrev, 'should not change revision');
if (!SC.none(oldrev)) {
  ok(store.revisions.hasOwnProperty(storeKey), 'should clone revision reference');
}

});

test(“data state=LOCKED”, function() {

// test preconditions
store.readDataHash(storeKey);
equals(store.storeKeyEditState(storeKey), SC.Store.LOCKED, 'precond - edit state should be LOCKED');
var oldrev = store.revisions[storeKey] ;

// perform read
var ret = store.readEditableDataHash(storeKey);

// validate
same(ret, json, 'should return equivalent json object');
ok(!(ret===json), 'should not return same json instance');

equals(store.storeKeyEditState(storeKey), SC.Store.EDITABLE, 'edit state should be editable');

// should not change revisions, but should copy it...
equals(store.revisions[storeKey], oldrev, 'should not change revision');
if (!SC.none(oldrev)) {
  ok(store.revisions.hasOwnProperty(storeKey), 'should clone revision reference');
}

});

test(“data state=EDITABLE”, function() {

// test preconditions
json = store.readEditableDataHash(storeKey); // get editable json
equals(store.storeKeyEditState(storeKey), SC.Store.EDITABLE, 'precond - edit state should be EDITABLE');
var oldrev = store.revisions[storeKey] ;

// perform read
var ret = store.readEditableDataHash(storeKey);

// validate
equals(ret, json, 'should return same editable json instance');

equals(store.storeKeyEditState(storeKey), SC.Store.EDITABLE, 'edit state should be editable');

// should not change revisions, but should copy it...
equals(store.revisions[storeKey], oldrev, 'should not change revision');
if (!SC.none(oldrev)) {
  ok(store.revisions.hasOwnProperty(storeKey), 'should clone revision reference');
}

});