From e48a6386dc44ffc21ba6cd8df1566398d0bd6371 Mon Sep 17 00:00:00 2001 From: officiallyanee Date: Thu, 1 Oct 2026 19:31:19 +0530 Subject: [PATCH 1/2] fix: differentiate positive and negative zero in compare-values --- type: pre_commit_static_analysis_report description: Results of running static analysis checks when committing changes. report: - task: lint_filenames status: passed - task: lint_editorconfig status: skipped - task: lint_markdown_pkg_readmes status: na - task: lint_markdown_docs status: na - task: lint_markdown status: na - task: lint_package_json status: na - task: lint_repl_help status: na - task: lint_javascript_src status: passed - task: lint_javascript_cli status: na - task: lint_javascript_examples status: na - task: lint_javascript_tests status: passed - task: lint_javascript_benchmarks status: na - task: lint_python status: na - task: lint_r status: na - task: lint_c_src status: na - task: lint_c_examples status: na - task: lint_c_benchmarks status: na - task: lint_c_tests_fixtures status: na - task: lint_shell status: na - task: lint_typescript_declarations status: passed - task: lint_typescript_tests status: na - task: lint_license_headers status: passed --- --- .../_tools/doctest/compare-values/lib/main.js | 21 +++++- .../doctest/compare-values/test/test.js | 75 +++++++++++++++++++ 2 files changed, 92 insertions(+), 4 deletions(-) diff --git a/lib/node_modules/@stdlib/_tools/doctest/compare-values/lib/main.js b/lib/node_modules/@stdlib/_tools/doctest/compare-values/lib/main.js index 363a0f0ec11c..48f9427db729 100644 --- a/lib/node_modules/@stdlib/_tools/doctest/compare-values/lib/main.js +++ b/lib/node_modules/@stdlib/_tools/doctest/compare-values/lib/main.js @@ -151,6 +151,9 @@ function formatValue( value ) { if ( isBigInt( value ) ) { return value.toString() + 'n'; } + if ( value === 0.0 && 1.0 / value === NINF ) { + return '-0.0'; + } return value; } @@ -179,7 +182,7 @@ function copy2primitives( arr ) { * * @private * @param {(string|boolean|number|bigint|null|void)} actual - primitive value -* @param {string} expected - return value annotation +* @param {(string|boolean|number|bigint|null|void)} expected - return value annotation * @returns {boolean} boolean indicating whether a value matches a return annotation */ function checkPrimitive( actual, expected ) { @@ -203,7 +206,11 @@ function checkPrimitive( actual, expected ) { return false; } } - expected = String( expected ); + if ( expected === 0.0 && 1.0 / expected === NINF ) { + expected = '-0.0'; + } else { + expected = String( expected ); + } if ( type === 'number' ) { if ( expected === 'Infinity' || expected === '+Infinity' ) { return actual === PINF; @@ -214,6 +221,12 @@ function checkPrimitive( actual, expected ) { if ( expected === 'NaN' ) { return isnan( actual ); } + if ( expected === '-0.0' || expected === '-0' ) { + return ( actual === 0.0 && 1.0 / actual === NINF ); + } + if ( expected === '0.0' || expected === '0' || expected === '+0.0' || expected === '+0' ) { + return ( actual === 0.0 && 1.0 / actual === PINF ); + } if ( startsWith( expected, '~' ) ) { if ( contains( expected, 'e' ) ) { dgts = indexOf( expected, 'e', 0 ) - indexOf( expected, '.', 0 ); @@ -378,11 +391,11 @@ function checkForPlaceholders( actual, expected ) { function compareEntries( actual, expected ) { var i; if ( actual.length !== expected.length ) { - return format( 'Expected entries [%s], but observed [%s]', map( expected, formatValue ), map( actual, formatValue ) ); + return format( 'Expected entries [%s], but observed [%s]', map( expected, formatValue ), map( copyArray( actual ), formatValue ) ); } for ( i = 0; i < expected.length; i++ ) { if ( !checkPrimitive( actual[ i ], expected[ i ] ) ) { - return format( 'Expected entries [%s], but observed [%s]', map( expected, formatValue ), map( actual, formatValue ) ); + return format( 'Expected entries [%s], but observed [%s]', map( expected, formatValue ), map( copyArray( actual ), formatValue ) ); } } return null; diff --git a/lib/node_modules/@stdlib/_tools/doctest/compare-values/test/test.js b/lib/node_modules/@stdlib/_tools/doctest/compare-values/test/test.js index a5f83b4af8ae..1b4a8a03810d 100644 --- a/lib/node_modules/@stdlib/_tools/doctest/compare-values/test/test.js +++ b/lib/node_modules/@stdlib/_tools/doctest/compare-values/test/test.js @@ -167,6 +167,81 @@ tape( 'the function compares primitives and a corresponding non-matching return t.end(); }); +tape( 'the function differentiates between positive and negative zero', function test( t ) { + var expected; + var actual; + var msg; + + actual = 0.0; + expected = '0.0'; + t.strictEqual( compareValues( actual, expected ), null, 'returns expected value' ); + + actual = 0.0; + expected = '0'; + t.strictEqual( compareValues( actual, expected ), null, 'returns expected value' ); + + actual = 0.0; + expected = '+0.0'; + t.strictEqual( compareValues( actual, expected ), null, 'returns expected value' ); + + actual = -0.0; + expected = '-0.0'; + t.strictEqual( compareValues( actual, expected ), null, 'returns expected value' ); + + actual = -0.0; + expected = '-0'; + t.strictEqual( compareValues( actual, expected ), null, 'returns expected value' ); + + actual = -0.0; + expected = '0.0'; + msg = 'Displayed return value is `0.0`, but expected `-0.0` instead'; + t.strictEqual( compareValues( actual, expected ), msg, 'returns expected message' ); + + actual = -0.0; + expected = '0'; + msg = 'Displayed return value is `0`, but expected `-0.0` instead'; + t.strictEqual( compareValues( actual, expected ), msg, 'returns expected message' ); + + actual = 0.0; + expected = '-0.0'; + msg = 'Displayed return value is `-0.0`, but expected `0` instead'; + t.strictEqual( compareValues( actual, expected ), msg, 'returns expected message' ); + + actual = 0.0; + expected = '-0'; + msg = 'Displayed return value is `-0`, but expected `0` instead'; + t.strictEqual( compareValues( actual, expected ), msg, 'returns expected message' ); + + actual = [ +0, -0 ]; + expected = '[ +0, -0 ]'; + t.strictEqual( compareValues( actual, expected ), null, 'returns expected value' ); + + actual = [ -0, +0 ]; + expected = '[ -0, +0 ]'; + t.strictEqual( compareValues( actual, expected ), null, 'returns expected value' ); + + actual = [ -0 ]; + expected = '[ +0 ]'; + msg = 'Displayed return value is `[ +0 ]`, but expected `[ 0 ]` instead'; + t.strictEqual( compareValues( actual, expected ), msg, 'returns expected message' ); + + actual = [ +0 ]; + expected = '[ -0 ]'; + msg = 'Displayed return value is `[ -0 ]`, but expected `[ 0 ]` instead'; + t.strictEqual( compareValues( actual, expected ), msg, 'returns expected message' ); + + actual = new Float64Array( [ -0.0, 0.0 ] ); + expected = '[ -0.0, 0.0 ]'; + t.strictEqual( compareValues( actual, expected ), null, 'returns expected value' ); + + actual = new Float64Array( [ -0.0 ] ); + expected = '[ 0.0 ]'; + msg = 'Expected entries [0], but observed [-0.0]'; + t.strictEqual( compareValues( actual, expected ), msg, 'returns expected message' ); + + t.end(); +}); + tape( 'the function compares an array and a corresponding return annotation', function test( t ) { // eslint-disable-line max-statements var expected; var actual; From 58eedc1b9c038d20fc1bfef6971842a53fe6cd93 Mon Sep 17 00:00:00 2001 From: officiallyanee Date: Fri, 2 Oct 2026 18:44:04 +0530 Subject: [PATCH 2/2] refactor: use is-negative-zero and is-positive-zero assertions --- type: pre_commit_static_analysis_report description: Results of running static analysis checks when committing changes. report: - task: lint_filenames status: passed - task: lint_editorconfig status: skipped - task: lint_markdown_pkg_readmes status: na - task: lint_markdown_docs status: na - task: lint_markdown status: na - task: lint_package_json status: na - task: lint_repl_help status: na - task: lint_javascript_src status: passed - task: lint_javascript_cli status: na - task: lint_javascript_examples status: na - task: lint_javascript_tests status: na - task: lint_javascript_benchmarks status: na - task: lint_python status: na - task: lint_r status: na - task: lint_c_src status: na - task: lint_c_examples status: na - task: lint_c_benchmarks status: na - task: lint_c_tests_fixtures status: na - task: lint_shell status: na - task: lint_typescript_declarations status: passed - task: lint_typescript_tests status: na - task: lint_license_headers status: passed --- --- .../_tools/doctest/compare-values/lib/main.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/node_modules/@stdlib/_tools/doctest/compare-values/lib/main.js b/lib/node_modules/@stdlib/_tools/doctest/compare-values/lib/main.js index 48f9427db729..9dfbc2070811 100644 --- a/lib/node_modules/@stdlib/_tools/doctest/compare-values/lib/main.js +++ b/lib/node_modules/@stdlib/_tools/doctest/compare-values/lib/main.js @@ -22,6 +22,8 @@ // MODULES // +var isNegativeZero = require( '@stdlib/math/base/assert/is-negative-zero' ); +var isPositiveZero = require( '@stdlib/math/base/assert/is-positive-zero' ); var roundn = require( '@stdlib/math/base/special/roundn' ); var epsdiff = require( '@stdlib/math/base/utils/float64-epsilon-difference' ); var indexOf = require( '@stdlib/array/base/index-of' ); @@ -151,7 +153,7 @@ function formatValue( value ) { if ( isBigInt( value ) ) { return value.toString() + 'n'; } - if ( value === 0.0 && 1.0 / value === NINF ) { + if ( isNegativeZero( value ) ) { return '-0.0'; } return value; @@ -206,11 +208,11 @@ function checkPrimitive( actual, expected ) { return false; } } - if ( expected === 0.0 && 1.0 / expected === NINF ) { + if ( isNegativeZero( expected ) ) { expected = '-0.0'; - } else { - expected = String( expected ); } + + expected = String( expected ); if ( type === 'number' ) { if ( expected === 'Infinity' || expected === '+Infinity' ) { return actual === PINF; @@ -222,10 +224,10 @@ function checkPrimitive( actual, expected ) { return isnan( actual ); } if ( expected === '-0.0' || expected === '-0' ) { - return ( actual === 0.0 && 1.0 / actual === NINF ); + return isNegativeZero( actual ); } if ( expected === '0.0' || expected === '0' || expected === '+0.0' || expected === '+0' ) { - return ( actual === 0.0 && 1.0 / actual === PINF ); + return isPositiveZero( actual ); } if ( startsWith( expected, '~' ) ) { if ( contains( expected, 'e' ) ) {