// ========================================================================== // Project: SproutCore Costello - Property Observing Library // Copyright: ©2006-2011 Strobe Inc. and contributors. // Portions ©2008-2011 Apple Inc. All rights reserved. // License: Licensed under MIT license (see license.js) // ==========================================================================

/*globals module test ok equals expects object same */

var object ;

module(“Cloned Objects”, {

setup: function() {

      object = SC.Object.create({

        name:'Cloned Object',
        value:'value1',

        clone: function(object) {
          var ret = object ;
          switch (SC.typeOf(object)) {

               case SC.T_ARRAY:
              ret = object.slice() ;
              break ;

           case SC.T_OBJECT:
              ret = {} ;
              for(var key in object) ret[key] = object[key] ;
          }

          return ret ;
        }
      });
}

});

test(“should return a cloned object”, function() {

var objectA = [1,2,3,4,5] ;
var objectB = "SproutCore" ;
var objectC = SC.hashFor(objectA);      
var objectE = 100;
var a = SC.clone(objectA);
var b = SC.clone(objectA);

equals(SC.clone(objectB), SC.clone(objectB)) ;
equals(SC.clone(objectC), SC.clone(objectC)) ;
equals(SC.clone(objectE), SC.clone(objectE)) ;
same(a, b);

});

test(“should return cloned object when the object is null”, function() {

var objectD = null;
equals(SC.clone(objectD), SC.clone(objectD)) ;

});

test(“should return a cloned array ”, function() {

    var arrayA  = ['value1','value2'] ;
    var resultArray = object.clone(arrayA);
equals(resultArray[0], arrayA[0], 'check first array item');
equals(resultArray[1], arrayA[1], 'check first array item');

});

test(“should return a deeply cloned arrays”, function() {

var original  = [{value: 'value1'}, SC.Object.create({value: 'value2'})] ;
var cloned = SC.clone(original, true);
original[0].value = 'bogus';
equals(cloned[0].value, 'value1');
original[1].set('value', 'bogus');
equals(cloned[1].get('value'), 'value2');

});

test(“should return shallow clones of hashes”, function() {

var original = { foo: 'bar', nested: { key: 'value'}} ;
var cloned = SC.clone(original) ;
same(original, cloned);
cloned.nested.key = 'another value' ;
equals(original.nested.key, 'another value') ;

});

test(“should return deep clones of hashes”, function() {

var original = { foo: 'bar', nested: { key: 'value'}} ;
var cloned = SC.clone(original, true) ;
same(original, cloned);
cloned.nested.key = 'another value' ;
equals(original.nested.key, 'value') ;

});

test(“should use copy() if isCopyable”, function() {

var obj = SC.Object.create(SC.Copyable, {
  isCopy: NO,

  copy: function() {
    return SC.Object.create(SC.Copyable, { isCopy: YES });
  }

});

var copy = SC.clone(obj);
ok(!!copy, 'clone should return a copy');
equals(copy.isCopy, YES, 'copy.isCopy should be YES');

});

test(“SC.copy should be an alias for SC.clone”, function() {

equals(SC.copy, SC.clone, 'SC.copy should equal SC.clone');

});