Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

assert.equal(0/0, 0/0) fails despite both being NaN #30350

Closed
balupton opened this issue Nov 10, 2019 · 3 comments
Closed

assert.equal(0/0, 0/0) fails despite both being NaN #30350

balupton opened this issue Nov 10, 2019 · 3 comments
Labels
assert Issues and PRs related to the assert subsystem.

Comments

@balupton
Copy link

balupton commented Nov 10, 2019

  • Version: v12.12.0
  • Platform: Darwin balupton-macbook.local 19.0.0 Darwin Kernel Version 19.0.0: Thu Oct 17 16:17:15 PDT 2019; root:xnu-6153.41.3~29/RELEASE_X86_64 x86_64
  • Subsystem: 64-bit
const assert = require('assert')
function log(fn) {
	try {
		fn()
	} catch (e) {
		console.error('---')
		console.error(fn.toString())
		console.error(e)
		console.error('\n')
	}
}

// nan value
log(() => assert.equal(0 / 0, 0 / 0))
log(() => assert.deepEqual(0 / 0, 0 / 0))

// nan reference
const nan = 0 / 0
log(() => assert.equal(nan, nan))
log(() => assert.deepEqual(nan, nan))

// object value
log(() => assert.deepEqual({ p: nan }, { p: nan }))

// object reference
const o = { p: nan }
log(() => assert.equal(o, o))
log(() => assert.deepEqual(o, o))
---
() => assert.equal(0 / 0, 0 / 0)
AssertionError [ERR_ASSERTION]: NaN == NaN
    at /Users/balupton/Projects/batches/obligations/promises/normalify/node-issue-30350.js:14:18
    at log (/Users/balupton/Projects/batches/obligations/promises/normalify/node-issue-30350.js:4:3)
    at Object.<anonymous> (/Users/balupton/Projects/batches/obligations/promises/normalify/node-issue-30350.js:14:1)
    at Module._compile (internal/modules/cjs/loader.js:956:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)
    at Module.load (internal/modules/cjs/loader.js:812:32)
    at Function.Module._load (internal/modules/cjs/loader.js:724:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)
    at internal/main/run_main_module.js:17:11 {
  generatedMessage: true,
  code: 'ERR_ASSERTION',
  actual: NaN,
  expected: NaN,
  operator: '=='
}


---
() => assert.deepEqual(0 / 0, 0 / 0)
AssertionError [ERR_ASSERTION]: Expected values to be loosely deep-equal:

NaN

should loosely deep-equal

NaN
    at /Users/balupton/Projects/batches/obligations/promises/normalify/node-issue-30350.js:15:18
    at log (/Users/balupton/Projects/batches/obligations/promises/normalify/node-issue-30350.js:4:3)
    at Object.<anonymous> (/Users/balupton/Projects/batches/obligations/promises/normalify/node-issue-30350.js:15:1)
    at Module._compile (internal/modules/cjs/loader.js:956:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)
    at Module.load (internal/modules/cjs/loader.js:812:32)
    at Function.Module._load (internal/modules/cjs/loader.js:724:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)
    at internal/main/run_main_module.js:17:11 {
  generatedMessage: true,
  code: 'ERR_ASSERTION',
  actual: NaN,
  expected: NaN,
  operator: 'deepEqual'
}


---
() => assert.equal(nan, nan)
AssertionError [ERR_ASSERTION]: NaN == NaN
    at /Users/balupton/Projects/batches/obligations/promises/normalify/node-issue-30350.js:19:18
    at log (/Users/balupton/Projects/batches/obligations/promises/normalify/node-issue-30350.js:4:3)
    at Object.<anonymous> (/Users/balupton/Projects/batches/obligations/promises/normalify/node-issue-30350.js:19:1)
    at Module._compile (internal/modules/cjs/loader.js:956:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)
    at Module.load (internal/modules/cjs/loader.js:812:32)
    at Function.Module._load (internal/modules/cjs/loader.js:724:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)
    at internal/main/run_main_module.js:17:11 {
  generatedMessage: true,
  code: 'ERR_ASSERTION',
  actual: NaN,
  expected: NaN,
  operator: '=='
}


---
() => assert.deepEqual(nan, nan)
AssertionError [ERR_ASSERTION]: Expected values to be loosely deep-equal:

NaN

should loosely deep-equal

NaN
    at /Users/balupton/Projects/batches/obligations/promises/normalify/node-issue-30350.js:20:18
    at log (/Users/balupton/Projects/batches/obligations/promises/normalify/node-issue-30350.js:4:3)
    at Object.<anonymous> (/Users/balupton/Projects/batches/obligations/promises/normalify/node-issue-30350.js:20:1)
    at Module._compile (internal/modules/cjs/loader.js:956:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)
    at Module.load (internal/modules/cjs/loader.js:812:32)
    at Function.Module._load (internal/modules/cjs/loader.js:724:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)
    at internal/main/run_main_module.js:17:11 {
  generatedMessage: true,
  code: 'ERR_ASSERTION',
  actual: NaN,
  expected: NaN,
  operator: 'deepEqual'
}


---
() => assert.deepEqual({ p: nan }, { p: nan })
AssertionError [ERR_ASSERTION]: Expected values to be loosely deep-equal:

{
  p: NaN
}

should loosely deep-equal

{
  p: NaN
}
    at /Users/balupton/Projects/batches/obligations/promises/normalify/node-issue-30350.js:23:18
    at log (/Users/balupton/Projects/batches/obligations/promises/normalify/node-issue-30350.js:4:3)
    at Object.<anonymous> (/Users/balupton/Projects/batches/obligations/promises/normalify/node-issue-30350.js:23:1)
    at Module._compile (internal/modules/cjs/loader.js:956:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)
    at Module.load (internal/modules/cjs/loader.js:812:32)
    at Function.Module._load (internal/modules/cjs/loader.js:724:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)
    at internal/main/run_main_module.js:17:11 {
  generatedMessage: true,
  code: 'ERR_ASSERTION',
  actual: [Object],
  expected: [Object],
  operator: 'deepEqual'
}
@targos
Copy link
Member

targos commented Nov 10, 2019

assert.equal uses the == operator to compare values.
In JavaScript, this operator always returns false with NaN.
We recommend to use assert.strictEqual instead, which handles NaN as you would like.

@targos targos closed this as completed Nov 10, 2019
@targos targos added the assert Issues and PRs related to the assert subsystem. label Nov 10, 2019
@balupton
Copy link
Author

ok thanks

@addaleax
Copy link
Member

I do feel like assert.equal() should never fail when assert.strictEqual() succeeds, though?

BridgeAR added a commit to BridgeAR/node that referenced this issue Dec 2, 2019
This aligns the `equal` and `deepEqual()` implementations with the
strict versions by accepting `NaN` as being identical in case both
sides are NaN.

Refs: nodejs#30350 (comment)
BridgeAR added a commit that referenced this issue Dec 6, 2019
This aligns the `equal` and `deepEqual()` implementations with the
strict versions by accepting `NaN` as being identical in case both
sides are NaN.

Refs: #30350 (comment)

PR-URL: #30766
Reviewed-By: James M Snell <[email protected]>
Reviewed-By: Denys Otrishko <[email protected]>
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: David Carlier <[email protected]>
Reviewed-By: Rich Trott <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
assert Issues and PRs related to the assert subsystem.
Projects
None yet
Development

No branches or pull requests

3 participants