diff options
| author | R. Merkert | 2013-04-16 20:09:43 -0400 | 
|---|---|---|
| committer | Pete Bacon Darwin | 2013-05-08 13:04:08 +0100 | 
| commit | 016e1e675e717ab851759eac5be640bd2f238331 (patch) | |
| tree | b3c7f753ca2fa55efecf079dab71949811c1e46a /test | |
| parent | 1240641f765f7bcef8c6050fd04e9c4530b9e0c2 (diff) | |
| download | angular.js-016e1e675e717ab851759eac5be640bd2f238331.tar.bz2 | |
fix(angular): do not copy $$hashKey in copy/extend functions.
Copying the $$hashKey as part of copy/extend operations makes little
sense since hashkey is used primarily as an object id, especially in
the context of the ngRepeat directive. This change maintains the
existing $$hashKey of an object that is being copied into (likewise for
extend).
It is not uncommon to take an item in a collection, copy it,
and then append it to the collection. By copying the $$hashKey, this
leads to duplicate object errors with the current ngRepeat.
Closes #1875
Diffstat (limited to 'test')
| -rw-r--r-- | test/AngularSpec.js | 57 | 
1 files changed, 57 insertions, 0 deletions
diff --git a/test/AngularSpec.js b/test/AngularSpec.js index 28b2205f..db7ac785 100644 --- a/test/AngularSpec.js +++ b/test/AngularSpec.js @@ -98,6 +98,63 @@ describe('angular', function() {        src = dst = [2, 4];        expect(function() { copy(src, dst); }).toThrow("Can't copy equivalent objects or arrays");      }); + +    it('should not copy the private $$hashKey', function() { +      var src,dst; +      src = {}; +      hashKey(src); +      dst = copy(src); +      expect(hashKey(dst)).not.toEqual(hashKey(src)); +    }); + +    it('should retain the previous $$hashKey', function() { +      var src,dst,h; +      src = {}; +      dst = {}; +      // force creation of a hashkey +      h = hashKey(dst); +      hashKey(src); +      dst = copy(src,dst); + +      // make sure we don't copy the key +      expect(hashKey(dst)).not.toEqual(hashKey(src)); +      // make sure we retain the old key +      expect(hashKey(dst)).toEqual(h); +    }); +  }); + +  describe("extend", function() { + +    it('should not copy the private $$hashKey', function() { +      var src,dst; +      src = {}; +      dst = {}; +      hashKey(src); +      dst = extend(dst,src); +      expect(hashKey(dst)).not.toEqual(hashKey(src)); +    }); + +    it('should retain the previous $$hashKey', function() { +      var src,dst,h; +      src = {}; +      dst = {}; +      h = hashKey(dst); +      hashKey(src); +      dst = extend(dst,src); +      // make sure we don't copy the key +      expect(hashKey(dst)).not.toEqual(hashKey(src)); +      // make sure we retain the old key +      expect(hashKey(dst)).toEqual(h); +    }); + +    it('should work when extending with itself', function() { +      var src,dst,h; +      dst = src = {}; +      h = hashKey(dst); +      dst = extend(dst,src); +      // make sure we retain the old key +      expect(hashKey(dst)).toEqual(h); +    });    });    describe('shallow copy', function() {  | 
