NotInDeltaRelative succeeds if two numbers aren't within relative delta of each other. The relative delta is expressed as a decimal. For example, to determine if a number and a value are within 1% of each other, use 0.01. A number and a value are within relative delta if Abs(number-value) / Abs(nu
(value, delta float64)
| 436 | // number := NewNumber(t, 123.0) |
| 437 | // number.NotInDeltaRelative(126.5, 0.01) |
| 438 | func (n *Number) NotInDeltaRelative(value, delta float64) *Number { |
| 439 | opChain := n.chain.enter("NotInDeltaRelative()") |
| 440 | defer opChain.leave() |
| 441 | |
| 442 | if opChain.failed() { |
| 443 | return n |
| 444 | } |
| 445 | |
| 446 | if math.IsNaN(delta) || math.IsInf(delta, 0) { |
| 447 | opChain.fail(AssertionFailure{ |
| 448 | Type: AssertUsage, |
| 449 | Errors: []error{ |
| 450 | fmt.Errorf("unexpected non-number delta argument: %v", delta), |
| 451 | }, |
| 452 | }) |
| 453 | return n |
| 454 | } |
| 455 | |
| 456 | if delta < 0 { |
| 457 | opChain.fail(AssertionFailure{ |
| 458 | Type: AssertUsage, |
| 459 | Errors: []error{ |
| 460 | fmt.Errorf("unexpected negative delta argument: %v", delta), |
| 461 | }, |
| 462 | }) |
| 463 | return n |
| 464 | } |
| 465 | |
| 466 | // Fail if any of the numbers is NaN with specific error message |
| 467 | anyNumIsNaN := math.IsNaN(n.value) || math.IsNaN(value) |
| 468 | if anyNumIsNaN { |
| 469 | var assertionErrors []error |
| 470 | assertionErrors = append( |
| 471 | assertionErrors, |
| 472 | errors.New("expected: can compare values with relative delta"), |
| 473 | ) |
| 474 | if math.IsNaN(n.value) { |
| 475 | assertionErrors = append( |
| 476 | assertionErrors, |
| 477 | errors.New("actual value is NaN"), |
| 478 | ) |
| 479 | } |
| 480 | if math.IsNaN(value) { |
| 481 | assertionErrors = append( |
| 482 | assertionErrors, |
| 483 | errors.New("expected value is NaN"), |
| 484 | ) |
| 485 | } |
| 486 | opChain.fail(AssertionFailure{ |
| 487 | Type: AssertEqual, |
| 488 | Actual: &AssertionValue{n.value}, |
| 489 | Expected: &AssertionValue{value}, |
| 490 | Delta: &AssertionValue{relativeDelta(delta)}, |
| 491 | Errors: assertionErrors, |
| 492 | }) |
| 493 | return n |
| 494 | } |
| 495 |