Skip to content

Commit 7e4deda

Browse files
committed
refactor: add native tests from test.pmf.js
--- 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: na - 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: na ---
1 parent d9eb485 commit 7e4deda

File tree

1 file changed

+119
-56
lines changed
  • lib/node_modules/@stdlib/stats/base/dists/hypergeometric/pmf/test

1 file changed

+119
-56
lines changed

lib/node_modules/@stdlib/stats/base/dists/hypergeometric/pmf/test/test.native.js

Lines changed: 119 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ var tape = require( 'tape' );
2525
var tryRequire = require( '@stdlib/utils/try-require' );
2626
var isnan = require( '@stdlib/math/base/assert/is-nan' );
2727
var abs = require( '@stdlib/math/base/special/abs' );
28+
var PINF = require( '@stdlib/constants/float64/pinf' );
29+
var NINF = require( '@stdlib/constants/float64/ninf' );
30+
var EPS = require( '@stdlib/constants/float64/eps' );
2831

2932

3033
// VARIABLES //
@@ -35,85 +38,145 @@ var opts = {
3538
};
3639

3740

41+
// FIXTURES //
42+
43+
var data = require( './fixtures/julia/data.json' );
44+
45+
3846
// TESTS //
3947

40-
tape('main export is a function', opts, function test(t) {
41-
t.ok(true, __filename);
42-
t.strictEqual(typeof pmf, 'function', 'main export is a function');
48+
tape( 'main export is a function', opts, function test( t ) {
49+
t.ok( true, __filename );
50+
t.strictEqual( typeof pmf, 'function', 'main export is a function' );
4351
t.end();
4452
});
4553

46-
tape('if provided `NaN` for any parameter, the function returns `NaN`', opts, function test(t) {
47-
var v;
54+
tape( 'if provided `NaN` for any parameter, the function returns `NaN`', opts, function test( t ) {
55+
var y = pmf( NaN, 10, 10, 5 );
56+
t.equal( isnan( y ), true, 'returns NaN' );
57+
y = pmf( 0.0, NaN, 10, 5 );
58+
t.equal( isnan( y ), true, 'returns NaN' );
59+
y = pmf( 0.0, 10, NaN, 5 );
60+
t.equal( isnan( y ), true, 'returns NaN' );
61+
y = pmf( 0.0, 10, 10, NaN );
62+
t.equal( isnan( y ), true, 'returns NaN' );
63+
t.end();
64+
});
4865

49-
v = pmf(NaN, 10, 5, 2);
50-
t.equal(isnan(v), true, 'returns NaN');
66+
tape( 'if provided an integer `x` greater than `min( n, K )`, the function returns `0` (provided all parameters are valid)', opts, function test( t ) {
67+
var y = pmf( PINF, 20, 20, 10 );
68+
t.equal( y, 0.0, 'returns 0' );
5169

52-
v = pmf(2, NaN, 5, 2);
53-
t.equal(isnan(v), true, 'returns NaN');
70+
y = pmf( 11, 20, 20, 10 );
71+
t.equal( y, 0.0, 'returns 0' );
5472

55-
v = pmf(2, 10, NaN, 2);
56-
t.equal(isnan(v), true, 'returns NaN');
73+
y = pmf( 100, 20, 20, 10 );
74+
t.equal( y, 0.0, 'returns 0' );
5775

58-
v = pmf(2, 10, 5, NaN);
59-
t.equal(isnan(v), true, 'returns NaN');
76+
t.end();
77+
});
78+
79+
tape( 'if provided an integer for `x` smaller than `max( 0, n + K - N )`, the function returns `0`', opts, function test( t ) {
80+
var y = pmf( NINF, 40, 20, 10 );
81+
t.equal( y, 0.0, 'returns 0' );
82+
83+
y = pmf( -1.0, 40, 20, 10 );
84+
t.equal( y, 0.0, 'returns 0' );
85+
86+
y = pmf( -2.0, 30, 20, 20 );
87+
t.equal( y, 0.0, 'returns 0' );
6088

6189
t.end();
6290
});
6391

64-
tape('if provided invalid inputs, the function returns `NaN`', opts, function test(t) {
65-
var v;
92+
tape( 'if provided an `N` which is not a nonnegative integer, the function returns `NaN`', opts, function test( t ) {
93+
var y;
94+
95+
y = pmf( 2.0, 30.5, 20, 10 );
96+
t.equal( isnan( y ), true, 'returns NaN' );
97+
98+
y = pmf( 2.0, -2, 20, 10 );
99+
t.equal( isnan( y ), true, 'returns NaN' );
100+
101+
y = pmf( 2.0, -1, 20, 10 );
102+
t.equal( isnan( y ), true, 'returns NaN' );
66103

67-
v = pmf(2, -10, 5, 2);
68-
t.equal(isnan(v), true, 'returns NaN');
104+
y = pmf( 0.0, 20.5, 20, 10 );
105+
t.equal( isnan( y ), true, 'returns NaN' );
69106

70-
v = pmf(2, 10.5, 5, 2);
71-
t.equal(isnan(v), true, 'returns NaN');
107+
y = pmf( 0.0, PINF, 20, 10 );
108+
t.equal( isnan( y ), true, 'returns NaN' );
72109

73-
v = pmf(2, 10, -5, 2);
74-
t.equal(isnan(v), true, 'returns NaN');
110+
t.end();
111+
});
112+
113+
tape( 'if provided a `K` which is not a nonnegative integer, the function returns `NaN`', opts, function test( t ) {
114+
var y;
115+
116+
y = pmf( 2.0, 20, 3.5, 10 );
117+
t.equal( isnan( y ), true, 'returns NaN' );
75118

76-
v = pmf(2, 10, 5.5, 2);
77-
t.equal(isnan(v), true, 'returns NaN');
119+
y = pmf( 2.0, 20, -2, 10 );
120+
t.equal( isnan( y ), true, 'returns NaN' );
78121

79-
v = pmf(2, 10, 5, -2);
80-
t.equal(isnan(v), true, 'returns NaN');
122+
y = pmf( 2.0, 20, -1, 10 );
123+
t.equal( isnan( y ), true, 'returns NaN' );
81124

82-
v = pmf(2, 10, 5, 2.5);
83-
t.equal(isnan(v), true, 'returns NaN');
125+
y = pmf( 0.0, 20, 2.5, 10 );
126+
t.equal( isnan( y ), true, 'returns NaN' );
127+
128+
y = pmf( 0.0, 20, PINF, 10 );
129+
t.equal( isnan( y ), true, 'returns NaN' );
84130

85131
t.end();
86132
});
87133

88-
tape('the function evaluates the PMF for a hypergeometric distribution', opts, function test(t) {
89-
var testCases = [{
90-
'x': 1.0,
91-
'N': 8,
92-
'K': 4,
93-
'n': 2,
94-
'expected': 0.571
95-
},
96-
{
97-
'x': 2.0,
98-
'N': 8,
99-
'K': 4,
100-
'n': 2,
101-
'expected': 0.214
102-
},
103-
{
104-
'x': 0.0,
105-
'N': 8,
106-
'K': 4,
107-
'n': 2,
108-
'expected': 0.214
109-
}];
110-
var tol = 1e-3;
111-
112-
testCases.forEach(function evaluateTestCase(testCase) {
113-
var computedPMF = pmf(testCase.x, testCase.N, testCase.K, testCase.n);
114-
var delta = abs(computedPMF - testCase.expected);
115-
t.ok(delta <= tol, 'within tolerance. x: ' + testCase.x + ', N: ' + testCase.N + ', K: ' + testCase.K + ', n: ' + testCase.n + ', y: ' + computedPMF + ', expected: ' + testCase.expected + ', Δ: ' + delta + ', tol: ' + tol);
116-
});
134+
tape( 'if provided an `n` which is not a nonnegative integer, the function returns `NaN`', opts, function test( t ) {
135+
var y;
136+
137+
y = pmf( 2.0, 40, 20, 3.5 );
138+
t.equal( isnan( y ), true, 'returns NaN' );
139+
140+
y = pmf( 2.0, 40, 20, -2 );
141+
t.equal( isnan( y ), true, 'returns NaN' );
142+
143+
y = pmf( 2.0, 40, 20, -1 );
144+
t.equal( isnan( y ), true, 'returns NaN' );
145+
146+
y = pmf( 0.0, 40, 20, 2.5 );
147+
t.equal( isnan( y ), true, 'returns NaN' );
148+
149+
y = pmf( 0.0, 40, 20, PINF );
150+
t.equal( isnan( y ), true, 'returns NaN' );
151+
152+
t.end();
153+
});
117154

155+
tape( 'the function evaluates the pmf for `x`', opts, function test( t ) {
156+
var expected;
157+
var delta;
158+
var tol;
159+
var x;
160+
var N;
161+
var K;
162+
var n;
163+
var y;
164+
var i;
165+
166+
expected = data.expected;
167+
x = data.x;
168+
N = data.N;
169+
K = data.K;
170+
n = data.n;
171+
for ( i = 0; i < x.length; i++ ) {
172+
y = pmf( x[i], N[i], K[i], n[i] );
173+
if ( y === expected[i] ) {
174+
t.equal( y, expected[i], 'x: '+x[i]+', N: '+N[i]+', K: '+K[i]+', n: '+n[i]+', y: '+y+', expected: '+expected[i] );
175+
} else {
176+
delta = abs( y - expected[ i ] );
177+
tol = 1040.0 * EPS * abs( expected[ i ] );
178+
t.ok( delta <= tol, 'within tolerance. x: '+x[i]+'. N: '+N[i]+'. K: '+K[i]+'. n: '+n[i]+'. y: '+y+'. E: '+expected[ i ]+'. Δ: '+delta+'. tol: '+tol+'.' );
179+
}
180+
}
118181
t.end();
119182
});

0 commit comments

Comments
 (0)