InDeltaRelative succeeds if two numbers are 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(number)
(value, delta float64)
| 319 | // number := NewNumber(t, 123.0) |
| 320 | // number.InDeltaRelative(126.5, 0.03) |
| 321 | func (n *Number) InDeltaRelative(value, delta float64) *Number { |
| 322 | opChain := n.chain.enter("InDeltaRelative()") |
| 323 | defer opChain.leave() |
| 324 | |
| 325 | if opChain.failed() { |
| 326 | return n |
| 327 | } |
| 328 | |
| 329 | if math.IsNaN(delta) || math.IsInf(delta, 0) { |
| 330 | opChain.fail(AssertionFailure{ |
| 331 | Type: AssertUsage, |
| 332 | Errors: []error{ |
| 333 | fmt.Errorf("unexpected non-number delta argument: %v", delta), |
| 334 | }, |
| 335 | }) |
| 336 | return n |
| 337 | } |
| 338 | |
| 339 | if delta < 0 { |
| 340 | opChain.fail(AssertionFailure{ |
| 341 | Type: AssertUsage, |
| 342 | Errors: []error{ |
| 343 | fmt.Errorf("unexpected negative delta argument: %v", delta), |
| 344 | }, |
| 345 | }) |
| 346 | return n |
| 347 | } |
| 348 | |
| 349 | // Fail if any of the numbers is NaN with specific error message |
| 350 | anyNumIsNaN := math.IsNaN(n.value) || math.IsNaN(value) |
| 351 | if anyNumIsNaN { |
| 352 | var assertionErrors []error |
| 353 | assertionErrors = append( |
| 354 | assertionErrors, |
| 355 | errors.New("expected: can compare values with relative delta"), |
| 356 | ) |
| 357 | if math.IsNaN(n.value) { |
| 358 | assertionErrors = append( |
| 359 | assertionErrors, |
| 360 | errors.New("actual value is NaN"), |
| 361 | ) |
| 362 | } |
| 363 | if math.IsNaN(value) { |
| 364 | assertionErrors = append( |
| 365 | assertionErrors, |
| 366 | errors.New("expected value is NaN"), |
| 367 | ) |
| 368 | } |
| 369 | opChain.fail(AssertionFailure{ |
| 370 | Type: AssertEqual, |
| 371 | Actual: &AssertionValue{n.value}, |
| 372 | Expected: &AssertionValue{value}, |
| 373 | Delta: &AssertionValue{relativeDelta(delta)}, |
| 374 | Errors: assertionErrors, |
| 375 | }) |
| 376 | return n |
| 377 | } |
| 378 |