Skip to content

Commit 8f3f9d7

Browse files
Add tests for events in optional field (microsoft#25168)
## Description Add test coverage for events in optional fields.
1 parent be1a783 commit 8f3f9d7

File tree

1 file changed

+68
-10
lines changed

1 file changed

+68
-10
lines changed

packages/dds/tree/src/test/simple-tree/api/treeNodeApi.spec.ts

Lines changed: 68 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)