Skip to content

Commit 7d071f5

Browse files
committed
feat(json-crdt): 🎸 improve schema comparison script
1 parent afa9d5c commit 7d071f5

File tree

2 files changed

+26
-11
lines changed

2 files changed

+26
-11
lines changed

src/json-crdt/equal/__tests__/index.spec.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,33 @@ import {Model} from '../../model';
22
import {equalSchema} from '..';
33
import {s} from '../../../json-crdt-patch';
44

5-
describe('equalSchema()', () => {
5+
describe('equalSchema(), schema only', () => {
6+
const assertSchemasEqual = (a: unknown, b: unknown): void => {
7+
const model1 = Model.create(a);
8+
const model2 = Model.create(b);
9+
const result = equalSchema(model1.root, model2.root, false);
10+
expect(result).toBe(true);
11+
};
12+
13+
test('returns true for identical nodes', () => {
14+
assertSchemasEqual(new Uint8Array([1, 2, 3]), new Uint8Array([1, 2, 4]));
15+
assertSchemasEqual({foo: 'bar', num: 123}, {foo: 'baz', num: 456});
16+
expect(() => assertSchemasEqual({foo: 'bar', num: 123}, {foo: 'baz', num: 456, x: 'y'})).toThrow();
17+
});
18+
});
19+
20+
describe('equalSchema(), with content comparison', () => {
621
const assertSchemasEqual = (a: unknown): void => {
722
const model1 = Model.create(a);
823
const model2 = Model.create(a);
9-
const result = equalSchema(model1.root, model2.root);
24+
const result = equalSchema(model1.root, model2.root, true);
1025
expect(result).toBe(true);
1126
};
1227

1328
const assertSchemasDifferent = (a: unknown, b: unknown): void => {
1429
const model1 = Model.create(a);
1530
const model2 = Model.create(b);
16-
const result = equalSchema(model1.root, model2.root);
31+
const result = equalSchema(model1.root, model2.root, true);
1732
expect(result).toBe(false);
1833
};
1934

src/json-crdt/equal/index.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ import {ArrNode, BinNode, ConNode, JsonNode, ObjNode, StrNode, ValNode, VecNode}
1010
* @param b The second JSON CRDT node.
1111
* @returns True if the schemas and values are equal, false otherwise.
1212
*/
13-
export const equalSchema = <A extends JsonNode<any>>(a: A, b: unknown): b is A => {
13+
export const equalSchema = <A extends JsonNode<any>>(a: A, b: unknown, compareContent: boolean): b is A => {
1414
if (a === b) return true;
15-
if (a instanceof ConNode) return b instanceof ConNode && deepEqual(a.val, b.val);
16-
else if (a instanceof ValNode) return b instanceof ValNode && equalSchema(a.node(), b.node());
17-
else if (a instanceof StrNode) return b instanceof StrNode && a.length() === b.length() && a.view() === b.view();
15+
if (a instanceof ConNode) return b instanceof ConNode && (!compareContent || deepEqual(a.val, b.val));
16+
else if (a instanceof ValNode) return b instanceof ValNode && equalSchema(a.node(), b.node(), compareContent);
17+
else if (a instanceof StrNode) return b instanceof StrNode && (!compareContent || (a.length() === b.length() && a.view() === b.view()));
1818
else if (a instanceof ObjNode) {
1919
if (!(b instanceof ObjNode)) return false;
2020
const keys1 = a.keys;
@@ -24,22 +24,22 @@ export const equalSchema = <A extends JsonNode<any>>(a: A, b: unknown): b is A =
2424
if (length1 !== length2) return false;
2525
for (const key of keys1.keys()) {
2626
if (!keys2.has(key)) return false;
27-
if (!equalSchema(a.get(key), b.get(key))) return false;
27+
if (!equalSchema(a.get(key), b.get(key), compareContent)) return false;
2828
}
2929
return true;
3030
} else if (a instanceof ArrNode) {
3131
if (!(b instanceof ArrNode)) return false;
3232
const length = a.length();
3333
if (length !== b.length()) return false;
34-
for (let i = 0; i < length; i++) if (!equalSchema(a.getNode(i)!, b.getNode(i))) return false;
34+
for (let i = 0; i < length; i++) if (!equalSchema(a.getNode(i)!, b.getNode(i), compareContent)) return false;
3535
return true;
3636
} else if (a instanceof VecNode) {
3737
if (!(b instanceof VecNode)) return false;
3838
const length = a.length();
3939
if (length !== b.length()) return false;
40-
for (let i = 0; i < length; i++) if (!equalSchema(a.get(i), b.get(i))) return false;
40+
for (let i = 0; i < length; i++) if (!equalSchema(a.get(i), b.get(i), compareContent)) return false;
4141
return true;
4242
} else if (a instanceof BinNode)
43-
return b instanceof BinNode && a.length() === b.length() && deepEqual(a.view(), b.view());
43+
return b instanceof BinNode && (!compareContent || (a.length() === b.length() && deepEqual(a.view(), b.view())));
4444
return false;
4545
};

0 commit comments

Comments
 (0)