|
10 | 10 |
|
11 | 11 | 'use strict';
|
12 | 12 |
|
| 13 | +const deepFreeze = require('../deepFreeze'); |
13 | 14 | const recycleNodesInto = require('../recycleNodesInto');
|
14 | 15 |
|
15 | 16 | describe('recycleNodesInto', () => {
|
@@ -177,10 +178,9 @@ describe('recycleNodesInto', () => {
|
177 | 178 | expect(recycleNodesInto(prevData, nextData)).toBe(prevData);
|
178 | 179 | });
|
179 | 180 |
|
180 |
| - it('does not recycle into frozen `nextData`', () => { |
| 181 | + it('does not recycle different `nextData`', () => { |
181 | 182 | const prevData = [{x: 1}, 2, 3];
|
182 | 183 | const nextData = [{x: 1}, 2, 4];
|
183 |
| - Object.freeze(nextData); |
184 | 184 | expect(recycleNodesInto(prevData, nextData)).toBe(nextData);
|
185 | 185 | });
|
186 | 186 |
|
@@ -347,4 +347,71 @@ describe('recycleNodesInto', () => {
|
347 | 347 | expect(recycleNodesInto(a, b)).toBe(b);
|
348 | 348 | });
|
349 | 349 | });
|
| 350 | + |
| 351 | + describe('deepFreeze', () => { |
| 352 | + it('does not mutate deeply frozen array in `nextData`', () => { |
| 353 | + const prevData = [[{x: 1}], 1]; |
| 354 | + const nextData = [[{x: 1}], 2]; |
| 355 | + deepFreeze(nextData); |
| 356 | + const recycled = recycleNodesInto(prevData, nextData); |
| 357 | + expect(recycled).toBe(nextData); |
| 358 | + expect(recycled[0]).toBe(nextData[0]); |
| 359 | + expect(recycled[0][0]).toBe(nextData[0][0]); |
| 360 | + }); |
| 361 | + |
| 362 | + it('does not mutate deeply frozen object in `nextData`', () => { |
| 363 | + const nextItem = { |
| 364 | + c: 1, |
| 365 | + }; |
| 366 | + const nextObject = { |
| 367 | + b: nextItem, |
| 368 | + }; |
| 369 | + const nextData = { |
| 370 | + a: nextObject, |
| 371 | + }; |
| 372 | + const prevData = {a: {b: {c: 1}}, d: 1}; |
| 373 | + |
| 374 | + deepFreeze(nextData); |
| 375 | + const recycled = recycleNodesInto(prevData, nextData); |
| 376 | + expect(recycled).toBe(nextData); |
| 377 | + expect(recycled.a).toBe(nextObject); |
| 378 | + expect(recycled.a.b).toBe(nextItem); |
| 379 | + }); |
| 380 | + |
| 381 | + it('reuse prevData and does not mutate deeply frozen array in `nextData`', () => { |
| 382 | + const nextItem = {x: 1}; |
| 383 | + const nextArray = [nextItem]; |
| 384 | + const prevData = [[{x: 1}], 1]; |
| 385 | + const nextData = [nextArray, 1]; |
| 386 | + deepFreeze(nextData); |
| 387 | + const recycled = recycleNodesInto(prevData, nextData); |
| 388 | + expect(recycled).toBe(prevData); |
| 389 | + expect(nextData[0]).toBe(nextArray); |
| 390 | + expect(nextData[0][0]).toBe(nextItem); |
| 391 | + }); |
| 392 | + |
| 393 | + it('reuse prevData and does not mutate deeply frozen object in `nextData`', () => { |
| 394 | + const nextItem = { |
| 395 | + c: 1, |
| 396 | + }; |
| 397 | + const nextObject = { |
| 398 | + b: nextItem, |
| 399 | + }; |
| 400 | + const nextData = { |
| 401 | + a: nextObject, |
| 402 | + }; |
| 403 | + const prevData = { |
| 404 | + a: { |
| 405 | + b: { |
| 406 | + c: 1, |
| 407 | + }, |
| 408 | + }, |
| 409 | + }; |
| 410 | + deepFreeze(nextData); |
| 411 | + const recycled = recycleNodesInto(prevData, nextData); |
| 412 | + expect(recycled).toBe(prevData); |
| 413 | + expect(nextData.a).toBe(nextObject); |
| 414 | + expect(nextData.a.b).toBe(nextItem); |
| 415 | + }); |
| 416 | + }); |
350 | 417 | });
|
0 commit comments