@@ -1637,20 +1637,20 @@ describe("treeNodeApi", () => {
16371637
16381638 describe ( "object node" , ( ) => {
16391639 const sb = new SchemaFactory ( "object-node-in-root" ) ;
1640- class myObject extends sb . object ( "object" , {
1640+ class MyObject extends sb . object ( "object" , {
16411641 myNumber : sb . number ,
16421642 } ) { }
1643- const treeSchema = sb . object ( "root" , {
1644- rootObject : myObject ,
1645- } ) ;
1643+ class TreeSchema extends sb . object ( "root" , {
1644+ rootObject : MyObject ,
1645+ } ) { }
16461646
16471647 function check (
16481648 eventName : keyof TreeChangeEvents ,
1649- mutate : ( root : NodeFromSchema < typeof treeSchema > ) => void ,
1649+ mutate : ( root : NodeFromSchema < typeof TreeSchema > ) => void ,
16501650 expectedFirings : number = 1 ,
16511651 ) {
16521652 it ( `.on('${ eventName } ') subscribes and unsubscribes correctly` , ( ) => {
1653- const root = hydrate ( treeSchema , {
1653+ const root = hydrate ( TreeSchema , {
16541654 rootObject : {
16551655 myNumber : 1 ,
16561656 } ,
@@ -1675,14 +1675,14 @@ describe("treeNodeApi", () => {
16751675 check (
16761676 "nodeChanged" ,
16771677 ( root ) =>
1678- ( root . rootObject = new myObject ( {
1678+ ( root . rootObject = new MyObject ( {
16791679 myNumber : 2 ,
16801680 } ) ) ,
16811681 ) ;
16821682 check ( "treeChanged" , ( root ) => root . rootObject . myNumber ++ , 1 ) ;
16831683
16841684 it ( `change to direct fields triggers both 'nodeChanged' and 'treeChanged'` , ( ) => {
1685- const root = hydrate ( treeSchema , {
1685+ const root = hydrate ( TreeSchema , {
16861686 rootObject : {
16871687 myNumber : 1 ,
16881688 } ,
@@ -1693,7 +1693,7 @@ describe("treeNodeApi", () => {
16931693 Tree . on ( root , "nodeChanged" , ( ) => shallowChanges ++ ) ;
16941694 Tree . on ( root , "treeChanged" , ( ) => deepChanges ++ ) ;
16951695
1696- root . rootObject = new myObject ( {
1696+ root . rootObject = new MyObject ( {
16971697 myNumber : 2 ,
16981698 } ) ;
16991699
@@ -1702,7 +1702,7 @@ describe("treeNodeApi", () => {
17021702 } ) ;
17031703
17041704 it ( `change to descendant fields only triggers 'treeChanged'` , ( ) => {
1705- const root = hydrate ( treeSchema , {
1705+ const root = hydrate ( TreeSchema , {
17061706 rootObject : {
17071707 myNumber : 1 ,
17081708 } ,
@@ -1718,6 +1718,64 @@ describe("treeNodeApi", () => {
17181718 assert . equal ( shallowChanges , 0 , `nodeChanged should NOT fire.` ) ;
17191719 assert . equal ( deepChanges , 1 , `treeChanged should fire.` ) ;
17201720 } ) ;
1721+
1722+ it ( `changing optional field triggers 'nodeChanged' and 'treeChanged'` , ( ) => {
1723+ class TestObject extends sb . object ( "root" , {
1724+ child : sb . optional ( sb . number ) ,
1725+ } ) { }
1726+
1727+ const testNode = new TestObject ( { } ) ;
1728+
1729+ const log : string [ ] = [ ] ;
1730+
1731+ TreeBeta . on ( testNode , "nodeChanged" , ( changed ) => {
1732+ log . push ( `nodeChanged: ${ JSON . stringify ( [ ...changed . changedProperties ] ) } ` ) ;
1733+ } ) ;
1734+
1735+ TreeBeta . on ( testNode , "treeChanged" , ( ) => {
1736+ log . push ( `treeChanged` ) ;
1737+ } ) ;
1738+
1739+ // Assign new value to empty optional field
1740+ testNode . child = 1 ;
1741+ assert . deepEqual ( log , [ 'nodeChanged: ["child"]' , `treeChanged` ] ) ;
1742+
1743+ log . length = 0 ; // Clear log
1744+
1745+ // Overwrite optional field
1746+ testNode . child = 2 ;
1747+ assert . deepEqual ( log , [ 'nodeChanged: ["child"]' , `treeChanged` ] ) ;
1748+
1749+ log . length = 0 ; // Clear log
1750+
1751+ // Clear optional field
1752+ testNode . child = undefined ;
1753+ assert . deepEqual ( log , [ 'nodeChanged: ["child"]' , `treeChanged` ] ) ;
1754+
1755+ log . length = 0 ; // Clear log
1756+
1757+ // Hydrate the node to confirm hydration does not trigger events,
1758+ // that events registered before hydration continue to work, and that events on hydrated nodes work as expected.
1759+ hydrate ( TestObject , testNode ) ;
1760+
1761+ assert . deepEqual ( log , [ ] ) ;
1762+
1763+ // Assign new value to empty optional field
1764+ testNode . child = 1 ;
1765+ assert . deepEqual ( log , [ 'nodeChanged: ["child"]' , `treeChanged` ] ) ;
1766+
1767+ log . length = 0 ; // Clear log
1768+
1769+ // Overwrite optional field
1770+ testNode . child = 2 ;
1771+ assert . deepEqual ( log , [ 'nodeChanged: ["child"]' , `treeChanged` ] ) ;
1772+
1773+ log . length = 0 ; // Clear log
1774+
1775+ // Clear optional field
1776+ testNode . child = undefined ;
1777+ assert . deepEqual ( log , [ 'nodeChanged: ["child"]' , `treeChanged` ] ) ;
1778+ } ) ;
17211779 } ) ;
17221780
17231781 describe ( "array node" , ( ) => {
0 commit comments