xyc
2025-02-21 664db98c9e8595ce4dd636a27f480e3a08b81ff5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/**
 * Checks that the first two arguments are equal, or are numbers close enough to be considered equal
 * based on a specified maximum allowable difference.
 *
 * @example assert.close(3.141, Math.PI, 0.001);
 *
 * @param {Float} actual
 * @param {Float} expected
 * @param {Float} maxDifference (the maximum inclusive difference allowed between the actual and expected numbers)
 * @param {string} [message] Defaults to structured message
 * @returns {undefined}
 */
function close (actual, expected, maxDifference, message) {
  const actualDiff = (actual === expected) ? 0 : Math.abs(actual - expected),
    result = actualDiff <= maxDifference;
  message = message || (actual + ' should be within ' + maxDifference + ' (inclusive) of ' + expected + (result ? '' : '. Actual: ' + actualDiff));
  this.pushResult({result, actual, expected, message});
}
 
/**
 * Checks that the first two arguments are equal, or are numbers close enough to be considered equal
 * based on a specified maximum allowable difference percentage.
 *
 * @example assert.close.percent(155, 150, 3.4);  // Difference is ~3.33%
 *
 * @param {Float} actual
 * @param {Float} expected
 * @param {Float} maxPercentDifference (the maximum inclusive difference percentage allowed between the actual and expected numbers)
 * @param {string} [message] Defaults to a structured message
 * @returns {undefined}
 */
function closePercent (actual, expected, maxPercentDifference, message) {
  let actualDiff, result;
  if (actual === expected) {
    actualDiff = 0;
    result = actualDiff <= maxPercentDifference;
  } else if (actual !== 0 && expected !== 0 && expected !== Infinity && expected !== -Infinity) {
    actualDiff = Math.abs(100 * (actual - expected) / expected);
    result = actualDiff <= maxPercentDifference;
  } else {
    // Dividing by zero (0)!  Should return `false` unless the max percentage was `Infinity`
    actualDiff = Infinity;
    result = maxPercentDifference === Infinity;
  }
  message = message || (actual + ' should be within ' + maxPercentDifference + '% (inclusive) of ' + expected + (result ? '' : '. Actual: ' + actualDiff + '%'));
 
  this.pushResult(result, actual, expected, message);
}
 
/**
 * Checks that the first two arguments are numbers with differences greater than the specified
 * minimum difference.
 *
 * @example assert.notClose(3.1, Math.PI, 0.001);
 *
 * @param {Float} actual
 * @param {Float} expected
 * @param {Float} minDifference (the minimum exclusive difference allowed between the actual and expected numbers)
 * @param {string} [message] Defaults to structured message
 * @returns {undefined}
 */
function notClose (actual, expected, minDifference, message) {
  const actualDiff = Math.abs(actual - expected),
    result = actualDiff > minDifference;
  message = message || (actual + ' should not be within ' + minDifference + ' (exclusive) of ' + expected + (result ? '' : '. Actual: ' + actualDiff));
  this.pushResult(result, actual, expected, message);
}
 
/**
 * Checks that the first two arguments are numbers with differences greater than the specified
 * minimum difference percentage.
 *
 * @example assert.notClose.percent(156, 150, 3.5);  // Difference is 4.0%
 *
 * @param {Float} actual
 * @param {Float} expected
 * @param {Float} minPercentDifference (the minimum exclusive difference percentage allowed between the actual and expected numbers)
 * @param {string} [message] Defaults to a structured message
 * @returns {undefined}
 */
function notClosePercent (actual, expected, minPercentDifference, message) {
  let actualDiff, result;
  if (actual === expected) {
    actualDiff = 0;
    result = actualDiff > minPercentDifference;
  } else if (actual !== 0 && expected !== 0 && expected !== Infinity && expected !== -Infinity) {
    actualDiff = Math.abs(100 * (actual - expected) / expected);
    result = actualDiff > minPercentDifference;
  } else {
    // Dividing by zero (0)!  Should only return `true` if the min percentage was `Infinity`
    actualDiff = Infinity;
    result = minPercentDifference !== Infinity;
  }
  message = message || (actual + ' should not be within ' + minPercentDifference + '% (exclusive) of ' + expected + (result ? '' : '. Actual: ' + actualDiff + '%'));
 
  this.pushResult({result, actual, expected, message});
}
 
export default function extend (QUnit) {
  QUnit.extend(QUnit.assert, {
    close,
    closePercent,
    notClose,
    notClosePercent
  });
  return QUnit;
}