Skip to content

Commit 0d3b6c2

Browse files
committed
feat: add support for comparing complex number entries
--- 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: passed - 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: na - task: lint_typescript_tests status: na - task: lint_license_headers status: passed --- --- type: pre_push_report description: Results of running various checks prior to pushing changes. report: - task: run_javascript_examples status: na - task: run_c_examples status: na - task: run_cpp_examples status: na - task: run_javascript_readme_examples status: na - task: run_c_benchmarks status: na - task: run_cpp_benchmarks status: na - task: run_fortran_benchmarks status: na - task: run_javascript_benchmarks status: na - task: run_julia_benchmarks status: na - task: run_python_benchmarks status: na - task: run_r_benchmarks status: na - task: run_javascript_tests status: passed ---
1 parent 9943326 commit 0d3b6c2

File tree

2 files changed

+117
-11
lines changed
  • lib/node_modules/@stdlib/_tools/doctest/compare-values

2 files changed

+117
-11
lines changed

lib/node_modules/@stdlib/_tools/doctest/compare-values/lib/main.js

Lines changed: 83 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ var deepEqual = require( '@stdlib/assert/deep-equal' );
3030
var isArray = require( '@stdlib/assert/is-array' );
3131
var isArrayBuffer = require( '@stdlib/assert/is-arraybuffer' );
3232
var isBigInt = require( '@stdlib/assert/is-bigint' );
33+
var isBigInt64Array = require( '@stdlib/assert/is-bigint64array' );
34+
var isBigUint64Array = require( '@stdlib/assert/is-biguint64array' );
3335
var isBoolean = require( '@stdlib/assert/is-boolean' );
3436
var isBooleanArray = require( '@stdlib/assert/is-booleanarray' );
3537
var isBoxedPrimitive = require( '@stdlib/assert/is-boxed-primitive' );
@@ -44,7 +46,12 @@ var isDateObject = require( '@stdlib/assert/is-date-object' );
4446
var isEmptyString = require( '@stdlib/assert/is-empty-string' );
4547
var isError = require( '@stdlib/assert/is-error' );
4648
var isEvalError = require( '@stdlib/assert/is-eval-error' );
49+
var isFloat32Array = require( '@stdlib/assert/is-float32array' );
50+
var isFloat64Array = require( '@stdlib/assert/is-float64array' );
4751
var isFunction = require( '@stdlib/assert/is-function' );
52+
var isInt8Array = require( '@stdlib/assert/is-int8array' );
53+
var isInt16Array = require( '@stdlib/assert/is-int16array' );
54+
var isInt32Array = require( '@stdlib/assert/is-int32array' );
4855
var isMultiSlice = require( '@stdlib/assert/is-multi-slice' );
4956
var isndarrayLike = require( '@stdlib/assert/is-ndarray-like' );
5057
var isNull = require( '@stdlib/assert/is-null' );
@@ -62,6 +69,10 @@ var isSymbol = require( '@stdlib/assert/is-symbol' );
6269
var isSyntaxError = require( '@stdlib/assert/is-syntax-error' );
6370
var isTypedArray = require( '@stdlib/assert/is-typed-array' );
6471
var isTypeError = require( '@stdlib/assert/is-type-error' );
72+
var isUint8Array = require( '@stdlib/assert/is-uint8array' );
73+
var isUint8ClampedArray = require( '@stdlib/assert/is-uint8clampedarray' );
74+
var isUint16Array = require( '@stdlib/assert/is-uint16array' );
75+
var isUint32Array = require( '@stdlib/assert/is-uint32array' );
6576
var isUndefined = require( '@stdlib/assert/is-undefined' );
6677
var isURIError = require( '@stdlib/assert/is-uri-error' );
6778

@@ -74,6 +85,10 @@ var replace = require( '@stdlib/string/replace' );
7485
var trim = require( '@stdlib/string/trim' );
7586
var PINF = require( '@stdlib/constants/float64/pinf' );
7687
var NINF = require( '@stdlib/constants/float64/ninf' );
88+
var real = require( '@stdlib/complex/float64/real' );
89+
var imag = require( '@stdlib/complex/float64/imag' );
90+
var realf = require( '@stdlib/complex/float32/real' );
91+
var imagf = require( '@stdlib/complex/float32/imag' );
7792
var reinterpretComplex = require( '@stdlib/strided/base/reinterpret-complex' );
7893
var copyArray = require( '@stdlib/array/base/copy' );
7994
var createAnnotationValue = require( '@stdlib/_tools/doctest/create-annotation-value' );
@@ -182,9 +197,15 @@ function checkForPlaceholders( actual, expected ) {
182197
return isArrayBuffer( actual );
183198
case '<BigInt>':
184199
return isBigInt( actual );
200+
case '<BigInt64Array>':
201+
return isBigInt64Array( actual );
202+
case '<BigUint64Array>':
203+
return isBigUint64Array( actual );
185204
case '<boolean>':
186205
case '<Boolean>':
187206
return isBoolean( actual );
207+
case '<BooleanArray>':
208+
return isBooleanArray( actual );
188209
case '<Buffer>':
189210
return isBuffer( actual );
190211
case '<Complex64>':
@@ -203,8 +224,18 @@ function checkForPlaceholders( actual, expected ) {
203224
return isError( actual );
204225
case '<EvalError>':
205226
return isEvalError( actual );
227+
case '<Float32Array>':
228+
return isFloat32Array( actual );
229+
case '<Float64Array>':
230+
return isFloat64Array( actual );
206231
case '<Function>':
207232
return isFunction( actual );
233+
case '<Int8Array>':
234+
return isInt8Array( actual );
235+
case '<Int16Array>':
236+
return isInt16Array( actual );
237+
case '<Int32Array>':
238+
return isInt32Array( actual );
208239
case '<MultiSlice>':
209240
return isMultiSlice( actual );
210241
case '<ndarray>':
@@ -237,12 +268,20 @@ function checkForPlaceholders( actual, expected ) {
237268
return isTypeError( actual );
238269
case '<TypedArray>':
239270
return isTypedArray( actual );
271+
case '<Uint8Array>':
272+
return isUint8Array( actual );
273+
case '<Uint8ClampedArray>':
274+
return isUint8ClampedArray( actual );
275+
case '<Uint16Array>':
276+
return isUint16Array( actual );
277+
case '<Uint32Array>':
278+
return isUint32Array( actual );
240279
case '<URIError>':
241280
return isURIError( actual );
242281
default:
243282
// Unknown type, let it slide...
244283

245-
// FIXME: should we compare constructor names here at a minimum?
284+
// TODO: should we compare constructor names here at a minimum?
246285
return true;
247286
}
248287
}
@@ -269,12 +308,50 @@ function compareEntries( actual, expected ) {
269308
}
270309

271310
/**
272-
* For a typed array, if the return annotation asserts deep instance equality, check whether it corresponds to the actual value; otherwise, check whether the return annotation signals the correct type.
311+
* Checks whether a complex number matches the expected return annotation.
273312
*
274313
* @private
275314
* @param {*} actual - actual return value
276315
* @param {string} expected - return value annotation
277-
* @returns {(string|null)} error message in case the annotation and value do not match, `null` otherwise
316+
* @returns {(string|null)} error message or null
317+
*/
318+
function checkComplex( actual, expected ) {
319+
var entries;
320+
var match;
321+
var type;
322+
323+
match = RE_INSTANCE_ANNOTATION.exec( expected );
324+
if ( match ) {
325+
type = match[ 1 ];
326+
entries = match[ 2 ];
327+
if ( actual.constructor.name !== type ) {
328+
return 'Expected instance type <'+actual.constructor.name+'>, but observed <'+type+'>';
329+
}
330+
if ( entries ) {
331+
if ( isComplex128( actual ) ) {
332+
actual = [ real( actual ), imag( actual ) ];
333+
} else if ( isComplex64( actual ) ) {
334+
actual = [ realf( actual ), imagf( actual ) ];
335+
}
336+
return compareEntries( actual, parse( entries ) );
337+
}
338+
return null;
339+
}
340+
return 'Complex numbers should be documented using instance annotation';
341+
}
342+
343+
/**
344+
* Checks whether a typed array matches the expected return annotation.
345+
*
346+
* ## Notes
347+
*
348+
* - If the return annotation asserts deep instance equality, check whether it corresponds to the actual value.
349+
* - Otherwise, check whether the return annotation signals the correct type.
350+
*
351+
* @private
352+
* @param {*} actual - actual return value
353+
* @param {string} expected - return value annotation
354+
* @returns {(string|null)} error message or null
278355
*/
279356
function checkTypedArrays( actual, expected ) {
280357
var entries;
@@ -455,6 +532,9 @@ function compareValues( actual, expected ) {
455532
}
456533
return null;
457534
}
535+
if ( isComplex64( actual ) || isComplex128( actual ) ) {
536+
return checkComplex( actual, expected );
537+
}
458538
if ( isRegExp( actual ) ) {
459539
actual = actual.toString();
460540
if ( actual !== expected ) {

lib/node_modules/@stdlib/_tools/doctest/compare-values/test/test.js

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,40 @@ tape( 'the function compares a typed array and a corresponding return annotation
329329
t.end();
330330
});
331331

332+
tape( 'the function compares a complex number and a corresponding return annotation', function test( t ) {
333+
var expected;
334+
var actual;
335+
var msg;
336+
337+
actual = new Complex64( 2.0, 3.0 );
338+
expected = '<Complex64>';
339+
t.strictEqual( compareValues( actual, expected ), null, 'returns null' );
340+
341+
actual = new Complex64( 2.0, 3.0 );
342+
expected = '<Complex64>[ 2.0, 3.0 ]';
343+
t.strictEqual( compareValues( actual, expected ), null, 'returns null' );
344+
345+
actual = new Complex64( 2.0, 3.0 );
346+
expected = '<Complex64>[ 2.0, 4.0 ]';
347+
msg = 'Expected array entries [2,4], but observed [2,3]';
348+
t.strictEqual( compareValues( actual, expected ), msg, 'returns expected message' );
349+
350+
actual = new Complex128( 2.0, 3.0 );
351+
expected = '<Complex128>';
352+
t.strictEqual( compareValues( actual, expected ), null, 'returns null' );
353+
354+
actual = new Complex128( 2.0, 3.0 );
355+
expected = '<Complex128>[ 2.0, 3.0 ]';
356+
t.strictEqual( compareValues( actual, expected ), null, 'returns null' );
357+
358+
actual = new Complex128( 2.0, 3.0 );
359+
expected = '<Complex128>[ 2.0, 4.0 ]';
360+
msg = 'Expected array entries [2,4], but observed [2,3]';
361+
t.strictEqual( compareValues( actual, expected ), msg, 'returns expected message' );
362+
363+
t.end();
364+
});
365+
332366
tape( 'the function compares a value with a type equality return annotation', function test( t ) {
333367
var expected;
334368
var actual;
@@ -362,14 +396,6 @@ tape( 'the function compares a value with a type equality return annotation', fu
362396
msg = 'Expected a <boolean>, but received: `0`';
363397
t.strictEqual( compareValues( actual, expected ), msg, 'returns expected message' );
364398

365-
actual = new Complex64( 2.0, 3.0 );
366-
expected = '<Complex64>';
367-
t.strictEqual( compareValues( actual, expected ), null, 'returns null' );
368-
369-
actual = new Complex128( 2.0, 3.0 );
370-
expected = '<Complex128>';
371-
t.strictEqual( compareValues( actual, expected ), null, 'returns null' );
372-
373399
actual = new ArrayBuffer( 10 );
374400
expected = '<ArrayBuffer>';
375401
t.strictEqual( compareValues( actual, expected ), null, 'returns null' );

0 commit comments

Comments
 (0)