|
7 | 7 | */ |
8 | 8 |
|
9 | 9 | import { |
| 10 | + $copyNode, |
10 | 11 | $createParagraphNode, |
11 | 12 | $createTextNode, |
12 | 13 | $getRoot, |
@@ -544,6 +545,116 @@ describe('LexicalNode state', () => { |
544 | 545 | } |
545 | 546 | }); |
546 | 547 | }); |
| 548 | + |
| 549 | + describe('resetOnCopyNode', () => { |
| 550 | + test('state with resetOnCopyNode: true is reset when using $copyNode', () => { |
| 551 | + const {editor} = testEnv; |
| 552 | + const resetState = createState('resetState', { |
| 553 | + parse: (v) => (typeof v === 'number' ? v : 0), |
| 554 | + resetOnCopyNode: true, |
| 555 | + }); |
| 556 | + editor.update( |
| 557 | + () => { |
| 558 | + const node = $createStateNode(); |
| 559 | + $setState(node, resetState, 42); |
| 560 | + expect($getState(node, resetState)).toBe(42); |
| 561 | + |
| 562 | + const copy = $copyNode(node); |
| 563 | + expect($getState(copy, resetState)).toBe(0); |
| 564 | + expect($getState(node, resetState)).toBe(42); |
| 565 | + }, |
| 566 | + {discrete: true}, |
| 567 | + ); |
| 568 | + }); |
| 569 | + |
| 570 | + test('state with resetOnCopyNode: false is preserved when using $copyNode', () => { |
| 571 | + const {editor} = testEnv; |
| 572 | + const persistState = createState('persistState', { |
| 573 | + parse: (v) => (typeof v === 'number' ? v : 0), |
| 574 | + resetOnCopyNode: false, |
| 575 | + }); |
| 576 | + editor.update( |
| 577 | + () => { |
| 578 | + const node = $createStateNode(); |
| 579 | + $setState(node, persistState, 42); |
| 580 | + expect($getState(node, persistState)).toBe(42); |
| 581 | + |
| 582 | + const copy = $copyNode(node); |
| 583 | + expect($getState(copy, persistState)).toBe(42); |
| 584 | + expect($getState(node, persistState)).toBe(42); |
| 585 | + }, |
| 586 | + {discrete: true}, |
| 587 | + ); |
| 588 | + }); |
| 589 | + |
| 590 | + test('state without resetOnCopyNode option is preserved when using $copyNode', () => { |
| 591 | + const {editor} = testEnv; |
| 592 | + const defaultState = createState('defaultState', { |
| 593 | + parse: (v) => (typeof v === 'number' ? v : 0), |
| 594 | + }); |
| 595 | + editor.update( |
| 596 | + () => { |
| 597 | + const node = $createStateNode(); |
| 598 | + $setState(node, defaultState, 42); |
| 599 | + expect($getState(node, defaultState)).toBe(42); |
| 600 | + |
| 601 | + const copy = $copyNode(node); |
| 602 | + expect($getState(copy, defaultState)).toBe(42); |
| 603 | + expect($getState(node, defaultState)).toBe(42); |
| 604 | + }, |
| 605 | + {discrete: true}, |
| 606 | + ); |
| 607 | + }); |
| 608 | + |
| 609 | + test('multiple states with different resetOnCopyNode configurations', () => { |
| 610 | + const {editor} = testEnv; |
| 611 | + const resetState = createState('resetState', { |
| 612 | + parse: (v) => (typeof v === 'number' ? v : 0), |
| 613 | + resetOnCopyNode: true, |
| 614 | + }); |
| 615 | + const persistState = createState('persistState', { |
| 616 | + parse: (v) => (typeof v === 'string' ? v : ''), |
| 617 | + resetOnCopyNode: false, |
| 618 | + }); |
| 619 | + const defaultState = createState('defaultState', { |
| 620 | + parse: (v) => (typeof v === 'boolean' ? v : false), |
| 621 | + }); |
| 622 | + |
| 623 | + editor.update( |
| 624 | + () => { |
| 625 | + const node = $createStateNode(); |
| 626 | + $setState(node, resetState, 100); |
| 627 | + $setState(node, persistState, 'hello'); |
| 628 | + $setState(node, defaultState, true); |
| 629 | + |
| 630 | + expect($getState(node, resetState)).toBe(100); |
| 631 | + expect($getState(node, persistState)).toBe('hello'); |
| 632 | + expect($getState(node, defaultState)).toBe(true); |
| 633 | + |
| 634 | + const copy = $copyNode(node); |
| 635 | + expect($getState(copy, resetState)).toBe(0); |
| 636 | + expect($getState(copy, persistState)).toBe('hello'); |
| 637 | + expect($getState(copy, defaultState)).toBe(true); |
| 638 | + |
| 639 | + // Original node should be unchanged |
| 640 | + expect($getState(node, resetState)).toBe(100); |
| 641 | + expect($getState(node, persistState)).toBe('hello'); |
| 642 | + expect($getState(node, defaultState)).toBe(true); |
| 643 | + |
| 644 | + const fullCopy = $copyNode(node, true); |
| 645 | + // Original node should be unchanged |
| 646 | + expect($getState(node, resetState)).toBe(100); |
| 647 | + expect($getState(node, persistState)).toBe('hello'); |
| 648 | + expect($getState(node, defaultState)).toBe(true); |
| 649 | + // Full copy should match all properties |
| 650 | + expect($getState(fullCopy, resetState)).toBe(100); |
| 651 | + expect($getState(fullCopy, persistState)).toBe('hello'); |
| 652 | + expect($getState(fullCopy, defaultState)).toBe(true); |
| 653 | + }, |
| 654 | + {discrete: true}, |
| 655 | + ); |
| 656 | + }); |
| 657 | + }); |
547 | 658 | }, |
548 | 659 | { |
549 | 660 | namespace: '', |
|
0 commit comments