1 // ==========================================================================
  2 // Project:   SproutCore Costello - Property Observing Library
  3 // Copyright: ©2006-2011 Strobe Inc. and contributors.
  4 //            Portions ©2008-2011 Apple Inc. All rights reserved.
  5 // License:   Licensed under MIT license (see license.js)
  6 // ==========================================================================
  7 
  8 /*globals module test ok equals same CoreTest */
  9 
 10 sc_require('debug/test_suites/array/base');
 11 
 12 SC.ArraySuite.define(function(T) {
 13   
 14   var observer, obj ;
 15   
 16   module(T.desc("replace"), {
 17     setup: function() {
 18       obj = T.newObject();
 19       observer = T.observer(obj);
 20     }
 21   });
 22   
 23   test("[].replace(0,0,'X') => ['X'] + notify", function() {
 24 
 25     var exp = T.expected(1);
 26     
 27     observer.observe('[]', 'length') ;
 28     obj.replace(0,0,exp) ;
 29 
 30     T.validateAfter(obj, exp, observer, YES);
 31   });
 32 
 33   test("[A,B,C,D].replace(1,2,X) => [A,X,D] + notify", function() {
 34     
 35     var exp = T.expected(5), 
 36         before = exp.slice(0,4),
 37         replace = exp.slice(4),
 38         after = [before[0], replace[0], before[3]];
 39         
 40     obj.replace(0,0, before) ; // precond
 41     observer.observe('[]', 'length') ;
 42 
 43     obj.replace(1,2,replace) ;
 44 
 45     T.validateAfter(obj, after, observer, YES);
 46   });
 47 
 48   test("[A,B,C,D].replace(1,2,[X,Y]) => [A,X,Y,D] + notify", function() {
 49     
 50     // setup the before, after, and replace arrays.  Use generated objects
 51     var exp  = T.expected(6),
 52         before  = exp.slice(0, 4),
 53         replace = exp.slice(4),
 54         after   = [before[0], replace[0], replace[1], before[3]]; 
 55         
 56     obj.replace(0,0, before) ;
 57     observer.observe('[]', 'length') ;
 58 
 59     obj.replace(1,2, replace) ;
 60 
 61     T.validateAfter(obj, after, observer, NO);
 62   });
 63   
 64   test("[A,B].replace(1,0,[X,Y]) => [A,X,Y,B] + notify", function() {
 65 
 66     // setup the before, after, and replace arrays.  Use generated objects
 67     var exp  = T.expected(4),
 68         before  = exp.slice(0, 2),
 69         replace = exp.slice(2),
 70         after   = [before[0], replace[0], replace[1], before[1]] ;
 71 
 72     obj.replace(0,0, before);
 73     observer.observe('[]', 'length') ;
 74   
 75     obj.replace(1,0, replace) ;
 76     
 77     T.validateAfter(obj, after, observer, YES);
 78   });
 79   
 80   test("[A,B,C,D].replace(2,2) => [A,B] + notify", function() {
 81 
 82     // setup the before, after, and replace arrays.  Use generated objects
 83     var before  = T.expected(4),
 84         after   = [before[0], before[1]];
 85 
 86     obj.replace(0,0, before);
 87     observer.observe('[]', 'length') ;
 88   
 89     obj.replace(2,2) ;
 90     
 91     T.validateAfter(obj, after, observer, YES);
 92   });
 93 
 94   test("[].replace(0, 0, 'X') will call notify `[]` changed only once", function() {
 95     var exp = T.expected(1),
 96         callCount = 0;
 97 
 98     obj.addObserver('[]', function () {
 99       callCount++;
100     });
101 
102     obj.replace(0, 0, exp);
103     equals(callCount, 1, "expects the key '[]' to be notified only once");
104   });
105   
106 });
107