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..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,6 +153,9 @@ function formatValue( value ) { if ( isBigInt( value ) ) { return value.toString() + 'n'; } + if ( isNegativeZero( value ) ) { + return '-0.0'; + } return value; } @@ -179,7 +184,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,6 +208,10 @@ function checkPrimitive( actual, expected ) { return false; } } + if ( isNegativeZero( expected ) ) { + expected = '-0.0'; + } + expected = String( expected ); if ( type === 'number' ) { if ( expected === 'Infinity' || expected === '+Infinity' ) { @@ -214,6 +223,12 @@ function checkPrimitive( actual, expected ) { if ( expected === 'NaN' ) { return isnan( actual ); } + if ( expected === '-0.0' || expected === '-0' ) { + return isNegativeZero( actual ); + } + if ( expected === '0.0' || expected === '0' || expected === '+0.0' || expected === '+0' ) { + return isPositiveZero( actual ); + } if ( startsWith( expected, '~' ) ) { if ( contains( expected, 'e' ) ) { dgts = indexOf( expected, 'e', 0 ) - indexOf( expected, '.', 0 ); @@ -378,11 +393,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;