Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions packages/runtime/spec/message-type.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,5 +99,19 @@ describe('MessageType', () => {
expect(msg).toEqual(exp);
})

describe('equals()', () => {
it('decides on wrong MESSAGE_TYPE', () => {
const A: MessageType<any> = new MessageType<any>('.test.A', [
{no: 1, name: 'string_field', kind: "scalar", T: ScalarType.STRING},
]);
const B: MessageType<any> = new MessageType<any>('.test.B', [
{no: 1, name: 'string_field', kind: "scalar", T: ScalarType.STRING},
]);
const a = A.create();
const b = B.create();
expect(A.equals(a, b)).toBe(false);
});
});

});

18 changes: 18 additions & 0 deletions packages/runtime/src/message-type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {reflectionEquals} from "./reflection-equals";
import type {UnknownMessage} from "./unknown-types";
import {binaryWriteOptions} from "./binary-writer";
import {binaryReadOptions} from "./binary-reader";
import { containsMessageType } from "./reflection-contains-message-type";

const baseDescriptors = Object.getOwnPropertyDescriptors(Object.getPrototypeOf({})) as Record<typeof MESSAGE_TYPE, unknown>;
const messageTypeDescriptor = baseDescriptors[MESSAGE_TYPE] = {} as {value?: unknown};
Expand Down Expand Up @@ -126,9 +127,26 @@ export class MessageType<T extends object> implements IMessageType<T> {
* Determines whether two message of the same type have the same field values.
* Checks for deep equality, traversing repeated fields, oneof groups, maps
* and messages recursively.
*
* Will also return true if both messages are `undefined`.
*
* This method checks the MESSAGE_TYPE symbol property added by create()
* since v2.0.3: It returns false if either of the two messages has the wrong
* type.
*/
equals(a: T | undefined, b: T | undefined): boolean {
if (a === b) {
return true;
}
if (!a || !b) {
return false;
}
if (containsMessageType(a) && a[MESSAGE_TYPE].typeName !== this.typeName) {
return false;
}
if (containsMessageType(b) && b[MESSAGE_TYPE].typeName !== this.typeName) {
return false;
}
return reflectionEquals(this, a as UnknownMessage | undefined, b as UnknownMessage | undefined);
}

Expand Down
11 changes: 11 additions & 0 deletions packages/test-default/spec/message-type.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import {Duration} from "../gen/google/protobuf/duration";
import {Timestamp} from "../gen/google/protobuf/timestamp";


describe('MessageType', function () {
it('equals()', () => {
const dur = Duration.create();
const tim = Timestamp.create();
expect( Duration.equals(dur, tim)).toBe(false);
});
});
12 changes: 12 additions & 0 deletions packages/test-force_optimize_code_size/spec/message-type.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import {Duration} from "../gen/google/protobuf/duration";
import {Timestamp} from "../gen/google/protobuf/timestamp";

// Copied from test-default/message-type.spec.ts. Do not edit.

describe('MessageType', function () {
it('equals()', () => {
const dur = Duration.create();
const tim = Timestamp.create();
expect( Duration.equals(dur, tim)).toBe(false);
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import {Duration} from "../gen/google/protobuf/duration";
import {Timestamp} from "../gen/google/protobuf/timestamp";

// Copied from test-default/message-type.spec.ts. Do not edit.

describe('MessageType', function () {
it('equals()', () => {
const dur = Duration.create();
const tim = Timestamp.create();
expect( Duration.equals(dur, tim)).toBe(false);
});
});
12 changes: 12 additions & 0 deletions packages/test-force_optimize_speed/spec/message-type.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import {Duration} from "../gen/google/protobuf/duration";
import {Timestamp} from "../gen/google/protobuf/timestamp";

// Copied from test-default/message-type.spec.ts. Do not edit.

describe('MessageType', function () {
it('equals()', () => {
const dur = Duration.create();
const tim = Timestamp.create();
expect( Duration.equals(dur, tim)).toBe(false);
});
});
12 changes: 12 additions & 0 deletions packages/test-long_type_string/spec/message-type.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import {Duration} from "../gen/google/protobuf/duration";
import {Timestamp} from "../gen/google/protobuf/timestamp";

// Copied from test-default/message-type.spec.ts. Do not edit.

describe('MessageType', function () {
it('equals()', () => {
const dur = Duration.create();
const tim = Timestamp.create();
expect( Duration.equals(dur, tim)).toBe(false);
});
});
Loading