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("insertAt"), {
 17     setup: function() {
 18       obj = T.newObject();
 19       observer = T.observer(obj);
 20     }
 21   });
 22 
 23   test("[].insertAt(0, X) => [X] + notify", function() {
 24 
 25     var after = T.expected(1);
 26     
 27     observer.observe('[]') ;
 28     obj.insertAt(0, after) ;
 29     T.validateAfter(obj, after, observer);
 30   });
 31   
 32   test("[].insertAt(200,X) => OUT_OF_RANGE_EXCEPTION exception", function() {
 33     var didThrow = NO ;
 34     try {
 35       obj.insertAt(200, T.expected(1));
 36     } catch (e) {
 37       equals(e.message, SC.OUT_OF_RANGE_EXCEPTION, 'should throw SC.OUT_OF_RANGE_EXCEPTION');
 38       didThrow = YES ;
 39     }
 40     ok(didThrow, 'should raise exception');
 41   });
 42 
 43   test("[A].insertAt(0, X) => [X,A] + notify", function() {
 44     var exp = T.expected(2), 
 45         before  = exp.slice(0,1),
 46         replace = exp[1],
 47         after   = [replace, before[0]];
 48     
 49     obj.replace(0,0,before);
 50     observer.observe('[]');
 51     
 52     obj.insertAt(0, replace);
 53     T.validateAfter(obj, after, observer);
 54   });
 55   
 56   test("[A].insertAt(1, X) => [A,X] + notify", function() {
 57     var exp = T.expected(2), 
 58         before  = exp.slice(0,1),
 59         replace = exp[1],
 60         after   = [before[0], replace];
 61     
 62     obj.replace(0,0,before);
 63     observer.observe('[]');
 64     
 65     obj.insertAt(1, replace);
 66     T.validateAfter(obj, after, observer);
 67   });
 68 
 69   test("[A].insertAt(200,X) => OUT_OF_RANGE exception", function() {
 70     obj.replace(0,0, T.expected(1)); // add an item
 71     
 72     var didThrow = NO ;
 73     try {
 74       obj.insertAt(200, T.expected(1));
 75     } catch (e) {
 76       equals(e.message, SC.OUT_OF_RANGE_EXCEPTION, 'should throw SC.OUT_OF_RANGE_EXCEPTION');
 77       didThrow = YES ;
 78     }
 79     ok(didThrow, 'should raise exception');
 80   });
 81   
 82   test("[A,B,C].insertAt(0,X) => [X,A,B,C] + notify", function() {
 83     var exp = T.expected(4), 
 84         before  = exp.slice(1),
 85         replace = exp[0],
 86         after   = [replace, before[0], before[1], before[2]];
 87     
 88     obj.replace(0,0,before);
 89     observer.observe('[]');
 90     
 91     obj.insertAt(0, replace);
 92     T.validateAfter(obj, after, observer);
 93   });
 94   
 95   test("[A,B,C].insertAt(1,X) => [A,X,B,C] + notify", function() {
 96     var exp = T.expected(4), 
 97         before  = exp.slice(1),
 98         replace = exp[0],
 99         after   = [before[0], replace, before[1], before[2]];
100     
101     obj.replace(0,0,before);
102     observer.observe('[]');
103     
104     obj.insertAt(1, replace);
105     T.validateAfter(obj, after, observer);
106   });
107 
108   test("[A,B,C].insertAt(3,X) => [A,B,C,X] + notify", function() {
109     var exp = T.expected(4), 
110         before  = exp.slice(1),
111         replace = exp[0],
112         after   = [before[0], before[1], before[2], replace];
113     
114     obj.replace(0,0,before);
115     observer.observe('[]');
116     
117     obj.insertAt(3, replace);
118     T.validateAfter(obj, after, observer);
119   });
120   
121 });
122