From 14fa97034afc0079626fe2112907fc8f4e93616a Mon Sep 17 00:00:00 2001 From: Minggang Wang Date: Wed, 26 Feb 2025 17:45:00 +0800 Subject: [PATCH] Pump deep-equal to least version Fix: #1044 --- package.json | 3 +- test/test-action-server.js | 12 ++-- test/test-array-data.js | 7 +-- test/test-message-properties-validation.js | 24 +++++--- test/test-message-translator-complex.js | 68 +++------------------- test/test-message-translator-primitive.js | 16 ++++- test/test-msg-type-cpp-node.js | 10 ++-- test/test-msg-type-py-node.js | 8 +-- 8 files changed, 58 insertions(+), 90 deletions(-) diff --git a/package.json b/package.json index adf72e80..fe729292 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,6 @@ "type": "git", "url": "git+https://github.com/RobotWebTools/rclnodejs.git" }, - "//": "Pin deep-equal to ^1.1.1", "devDependencies": { "@babel/eslint-parser": "^7.25.9", "@typescript-eslint/eslint-plugin": "^8.18.0", @@ -51,7 +50,7 @@ "babel-eslint": "^10.1.0", "clang-format": "^1.8.0", "commander": "^13.1.0", - "deep-equal": "^1.1.1", + "deep-equal": "^2.2.3", "eslint": "^9.16.0", "eslint-config-prettier": "^10.0.1", "eslint-plugin-prettier": "^5.2.1", diff --git a/test/test-action-server.js b/test/test-action-server.js index 7fc462a9..ad5f08e0 100644 --- a/test/test-action-server.js +++ b/test/test-action-server.js @@ -446,7 +446,7 @@ describe('rclnodejs action server', function () { let result = await handle.getResult(); assert.ok(result); assert.ok(handle.status, GoalStatus.STATUS_SUCCEEDED); - assert.ok(deepEqual(result.sequence, testSequence)); + assert.ok(deepEqual(result.sequence, Int32Array.from(testSequence))); server.destroy(); }); @@ -480,7 +480,7 @@ describe('rclnodejs action server', function () { let result = await handle.getResult(); assert.ok(result); assert.ok(handle.status, GoalStatus.STATUS_ABORTED); - assert.ok(deepEqual(result.sequence, testSequence)); + assert.ok(deepEqual(result.sequence, Int32Array.from(testSequence))); server.destroy(); }); @@ -515,7 +515,7 @@ describe('rclnodejs action server', function () { assert.ok(result); // Goal status should default to aborted assert.ok(handle.status, GoalStatus.STATUS_ABORTED); - assert.ok(deepEqual(result.sequence, testSequence)); + assert.ok(deepEqual(result.sequence, Int32Array.from(testSequence))); server.destroy(); }); @@ -543,7 +543,7 @@ describe('rclnodejs action server', function () { assert.ok(result); // Goal status should default to aborted assert.ok(handle.status, GoalStatus.STATUS_ABORTED); - assert.ok(deepEqual(result.sequence, [])); + assert.ok(deepEqual(result.sequence, Int32Array.from([]))); server.destroy(); }); @@ -660,7 +660,7 @@ describe('rclnodejs action server', function () { await assertUtils.createDelay(50); assert.ok(feedbackMessage); - assert.ok(deepEqual(sequence, feedbackMessage.sequence)); + assert.ok(deepEqual(Int32Array.from(sequence), feedbackMessage.sequence)); server.destroy(); }); @@ -704,7 +704,7 @@ describe('rclnodejs action server', function () { await assertUtils.createDelay(50); assert.ok(feedbackMessage); - assert.ok(deepEqual(sequence, feedbackMessage.sequence)); + assert.ok(deepEqual(Int32Array.from(sequence), feedbackMessage.sequence)); server.destroy(); }); diff --git a/test/test-array-data.js b/test/test-array-data.js index 85d56812..4e2b33da 100644 --- a/test/test-array-data.js +++ b/test/test-array-data.js @@ -15,7 +15,6 @@ 'use strict'; const assert = require('assert'); -const childProcess = require('child_process'); const deepEqual = require('deep-equal'); const rclnodejs = require('../index.js'); const translator = require('../rosidl_gen/message_translator.js'); @@ -180,10 +179,10 @@ describe('rclnodejs message communication', function () { assert(msg.layout.data_offset === v.layout.data_offset); assert(msg.data); - if (isTypedArray(v.data)) { - assert.deepStrictEqual(msg.data, v.data); - } else { + if (isTypedArray(v.data) && isTypedArray(msg.data)) { assert.ok(deepEqual(msg.data, v.data)); + } else { + assert.ok(deepEqual(Array.from(msg.data), v.data)); } } diff --git a/test/test-message-properties-validation.js b/test/test-message-properties-validation.js index 9c5d1366..98cb964b 100644 --- a/test/test-message-properties-validation.js +++ b/test/test-message-properties-validation.js @@ -75,9 +75,9 @@ describe('Rclnodejs message properities validation', function () { frame_id: '1234567x', }, name: ['Willy', 'Tacky'], - position: [1, 7, 3, 4, 2, 2, 8], - velocity: [8, 9, 6, 4], - effort: [1, 0, 2, 6, 7], + position: Float64Array.from([1, 7, 3, 4, 2, 2, 8]), + velocity: Float64Array.from([8, 9, 6, 4]), + effort: Float64Array.from([1, 0, 2, 6, 7]), }, }, { @@ -92,7 +92,7 @@ describe('Rclnodejs message properities validation', function () { ], data_offset: 1024, }, - data: [1.0, 2.0, 3.0, 8.5, 6.75, 0.5, -0.25], + data: Float32Array.from([1.0, 2.0, 3.0, 8.5, 6.75, 0.5, -0.25]), }, }, { @@ -157,11 +157,11 @@ describe('Rclnodejs message properities validation', function () { channels: [ { name: 'rgb', - values: [0.0, 1.5, 2.0, 3.75], + values: Float32Array.from([0.0, 1.5, 2.0, 3.75]), }, { name: 'intensity', - values: [10.0, 21.5, 2.0, 3.75], + values: Float32Array.from([10.0, 21.5, 2.0, 3.75]), }, ], }, @@ -174,7 +174,17 @@ describe('Rclnodejs message properities validation', function () { for (let i in testData.value) { // Assign the property with a plain object. left[i] = testData.value[i]; - deepEqual(left[i], right[i]); + if (typeof left[i].toPlainObject === 'function') { + assert.ok(deepEqual(testData.value[i], left[i].toPlainObject())); + } else if (left[i].classType && left[i].classType.isROSArray) { + left[i].data.forEach((value, index) => { + assert.ok( + deepEqual(testData.value[i][index], value.toPlainObject()) + ); + }); + } else { + assert.ok(deepEqual(testData.value[i], left[i])); + } } }); }); diff --git a/test/test-message-translator-complex.js b/test/test-message-translator-complex.js index 3c60a991..7d91bb79 100644 --- a/test/test-message-translator-complex.js +++ b/test/test-message-translator-complex.js @@ -18,6 +18,10 @@ const assert = require('assert'); const rclnodejs = require('../index.js'); const deepEqual = require('deep-equal'); +function isTypedArray(v) { + return ArrayBuffer.isView(v) && !(v instanceof DataView); +} + describe('Rclnodejs message translation: complex types', function () { this.timeout(60 * 1000); @@ -98,25 +102,15 @@ describe('Rclnodejs message translation: complex types', function () { pkg: 'sensor_msgs', type: 'JointState', values: [ - { - header: { - stamp: { sec: 11223, nanosec: 44556 }, - frame_id: '1234567x', - }, - name: ['Willy', 'Tacky'], - position: [1, 7, 3, 4, 2, 2, 8], - velocity: [8, 9, 6, 4], - effort: [1, 0, 2, 6, 7], - }, { header: { stamp: { sec: 11223, nanosec: 44556 }, frame_id: '0001234567x', }, name: ['Goodly', 'Lovely', 'Angel', 'Neatly', 'Perfect', 'Tacky'], - position: [1, 23, 7, 3, 4, 2, 2, 8], - velocity: [1, 9, 8, 9, 6, 4], - effort: [2, 1, 1, 0, 2, 6, 7], + position: Float64Array.from([1, 23, 7, 3, 4, 2, 2, 8]), + velocity: Float64Array.from([1, 9, 8, 9, 6, 4]), + effort: Float64Array.from([2, 1, 1, 0, 2, 6, 7]), }, ], }, @@ -124,17 +118,6 @@ describe('Rclnodejs message translation: complex types', function () { pkg: 'std_msgs', type: 'Float32MultiArray', values: [ - { - layout: { - dim: [ - { label: 'height', size: 480, stride: 921600 }, - { label: 'width', size: 640, stride: 1920 }, - { label: 'channel', size: 3, stride: 8 }, - ], - data_offset: 1024, - }, - data: [1.0, 2.0, 3.0, 8.5, 6.75, 0.5, -0.25], - }, { layout: { dim: [ @@ -152,17 +135,6 @@ describe('Rclnodejs message translation: complex types', function () { pkg: 'std_msgs', type: 'Int32MultiArray', values: [ - { - layout: { - dim: [ - { label: 'height', size: 10, stride: 600 }, - { label: 'width', size: 20, stride: 60 }, - { label: 'channel', size: 3, stride: 4 }, - ], - data_offset: 0, - }, - data: [-10, 1, 2, 3, 8, 6, 0, -25], // Provide data via Array - }, { layout: { dim: [ @@ -180,17 +152,6 @@ describe('Rclnodejs message translation: complex types', function () { pkg: 'std_msgs', type: 'Int16MultiArray', values: [ - { - layout: { - dim: [ - { label: 'height', size: 10, stride: 600 }, - { label: 'width', size: 20, stride: 60 }, - { label: 'channel', size: 3, stride: 4 }, - ], - data_offset: 0, - }, - data: [-10, 1, 2, 3, 8, 6, 0, -25], // Provide data via Array - }, { layout: { dim: [ @@ -208,17 +169,6 @@ describe('Rclnodejs message translation: complex types', function () { pkg: 'std_msgs', type: 'Int8MultiArray', values: [ - { - layout: { - dim: [ - { label: 'height', size: 10, stride: 600 }, - { label: 'width', size: 20, stride: 60 }, - { label: 'channel', size: 3, stride: 4 }, - ], - data_offset: 0, - }, - data: [-10, 1, 2, 3, 8, 6, 0, -25], // Provide data via Array - }, { layout: { dim: [ @@ -250,11 +200,11 @@ describe('Rclnodejs message translation: complex types', function () { channels: [ { name: 'rgb', - values: [0.0, 1.5, 2.0, 3.75], + values: Float32Array.from([0.0, 1.5, 2.0, 3.75]), }, { name: 'intensity', - values: [10.0, 21.5, 2.0, 3.75], + values: Float32Array.from([10.0, 21.5, 2.0, 3.75]), }, ], }, diff --git a/test/test-message-translator-primitive.js b/test/test-message-translator-primitive.js index ab093e4c..9e7f1cc3 100644 --- a/test/test-message-translator-primitive.js +++ b/test/test-message-translator-primitive.js @@ -18,6 +18,10 @@ const rclnodejs = require('../index.js'); const deepEqual = require('deep-equal'); const arrayGen = require('./array_generator.js'); +function isTypedArray(v) { + return ArrayBuffer.isView(v) && !(v instanceof DataView); +} + /* eslint-disable camelcase */ /* eslint-disable indent */ @@ -219,7 +223,11 @@ describe('Rclnodejs message translation: primitive types array', function () { return new Promise((resolve, reject) => { const sub = node.createSubscription(MessageType, topic, (value) => { // For primitive types, msgs are defined as a single `.data` field - if (deepEqual(value.data, testData.values)) { + if ( + (isTypedArray(value.data) && + deepEqual(Array.from(value.data), testData.values)) || + deepEqual(value.data, testData.values) + ) { node.destroy(); resolve(); } else { @@ -474,7 +482,11 @@ describe('Rclnodejs message translation: TypedArray large data', function () { return new Promise((resolve, reject) => { const sub = node.createSubscription(MessageType, topic, (value) => { // For primitive types, msgs are defined as a single `.data` field - if (deepEqual(value.data, testData.values)) { + if ( + (isTypedArray(value.data) && + deepEqual(Array.from(value.data), testData.values)) || + deepEqual(value.data, testData.values) + ) { node.destroy(); resolve(); } else { diff --git a/test/test-msg-type-cpp-node.js b/test/test-msg-type-cpp-node.js index c105e5d8..38315682 100644 --- a/test/test-msg-type-cpp-node.js +++ b/test/test-msg-type-cpp-node.js @@ -21,7 +21,6 @@ const path = require('path'); const childProcess = require('child_process'); const deepEqual = require('deep-equal'); const rclnodejs = require('../index.js'); -const utils = require('./utils.js'); describe('Rclnodejs - Cpp message type testing', function () { var cppSubscriptionPath = path.join(__dirname, 'cpp', 'subscription_msg'); @@ -423,7 +422,7 @@ describe('Rclnodejs - Cpp message type testing', function () { ], data_offset: 0, }, - data: [65, 66, 67], + data: Uint8Array.from([65, 66, 67]), }; var publisher = node.createPublisher( @@ -491,12 +490,11 @@ describe('Rclnodejs - Cpp message type testing', function () { frame_id: 'main frame', }, name: ['Tom', 'Jerry'], - position: [1, 2], - velocity: [2, 3], - effort: [4, 5, 6], + position: Float64Array.from([1, 2]), + velocity: Float64Array.from([2, 3]), + effort: Float64Array.from([4, 5, 6]), }; - var destroy = false; var publisher = node.createPublisher( JointState, 'JointState_js_cpp_channel' diff --git a/test/test-msg-type-py-node.js b/test/test-msg-type-py-node.js index 0ba38675..26ab5044 100644 --- a/test/test-msg-type-py-node.js +++ b/test/test-msg-type-py-node.js @@ -447,7 +447,7 @@ describe('Rclnodejs - Python message type testing', function () { ], data_offset: 0, }, - data: [65, 66, 67], + data: Uint8Array.from([65, 66, 67]), }; var destroy = false; @@ -560,9 +560,9 @@ describe('Rclnodejs - Python message type testing', function () { frame_id: 'main frame', }, name: ['Tom', 'Jerry'], - position: [1, 2], - velocity: [2, 3], - effort: [4, 5, 6], + position: Float64Array.from([1, 2]), + velocity: Float64Array.from([2, 3]), + effort: Float64Array.from([4, 5, 6]), }; var destroy = false;