Skip to content

Commit 357d02f

Browse files
committed
feat: add tests for entries method array/fixed-endian-factory/
1 parent d0dc53c commit 357d02f

File tree

1 file changed

+241
-0
lines changed

1 file changed

+241
-0
lines changed
Lines changed: 241 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,241 @@
1+
/**
2+
* @license Apache-2.0
3+
*
4+
* Copyright (c) 2024 The Stdlib Authors.
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
'use strict';
20+
21+
// MODULES //
22+
23+
var tape = require( 'tape' );
24+
var proxyquire = require( 'proxyquire' );
25+
var hasOwnProp = require( '@stdlib/assert/has-own-property' );
26+
var ITERATOR_SYMBOL = require( '@stdlib/symbol/iterator' );
27+
var isFunction = require( '@stdlib/assert/is-function' );
28+
var isArray = require( '@stdlib/assert/is-array' );
29+
var factory = require( './../lib' );
30+
31+
32+
// TESTS //
33+
34+
tape( 'main export is a function', function test( t ) {
35+
t.ok( true, __filename );
36+
t.strictEqual( typeof factory, 'function', 'main export is a function' );
37+
t.end();
38+
});
39+
40+
tape( 'attached to the prototype of the returned function is an `entries` method', function test( t ) {
41+
var ctor = factory( 'float64' );
42+
t.strictEqual( hasOwnProp( ctor.prototype, 'entries' ), true, 'returns expected value' );
43+
t.strictEqual( isFunction( ctor.prototype.at ), true, 'returns expected value' );
44+
t.end();
45+
});
46+
47+
tape( 'the method throws an error if invoked with a `this` context which is not a typed array instance', function test( t ) {
48+
var values;
49+
var ctor;
50+
var arr;
51+
var i;
52+
53+
ctor = factory( 'float64' );
54+
arr = new ctor( 'little-endian', 5 );
55+
56+
values = [
57+
'5',
58+
5,
59+
NaN,
60+
true,
61+
false,
62+
null,
63+
void 0,
64+
{},
65+
[],
66+
function noop() {}
67+
];
68+
for ( i = 0; i < values.length; i++ ) {
69+
t.throws( badValue( values[i] ), TypeError, 'throws an error when provided '+values[i] );
70+
}
71+
t.end();
72+
73+
function badValue( value ) {
74+
return function badValue() {
75+
return arr.entries.call( value, 0 );
76+
};
77+
}
78+
});
79+
80+
tape( 'the method returns an iterator protocol-compliant object', function test( t ) {
81+
var ctor;
82+
var arr;
83+
var buf;
84+
var it;
85+
var v;
86+
var i;
87+
88+
buf = [ 1.0, 2.0, 3.0, 4.0, 5.0];
89+
ctor = factory( 'float64' );
90+
arr = new ctor( 'little-endian', buf);
91+
92+
it = arr.entries();
93+
t.strictEqual( it.next.length, 0, 'has zero arity' );
94+
95+
for ( i = 0; i < arr.length; i++ ) {
96+
v = it.next();
97+
t.strictEqual( isArray( v.value ), true, 'returns an array' );
98+
t.strictEqual( v.value[ 0 ], i, 'returns an index' );
99+
t.strictEqual( v.value[ 1 ], buf[ i ], 'returns expected value' );
100+
t.strictEqual( typeof v.done, 'boolean', 'returns a boolean' );
101+
}
102+
t.end();
103+
});
104+
105+
tape( 'the method returns an iterator which has a `return` method for closing an iterator (no argument)', function test( t ) {
106+
var ctor;
107+
var arr;
108+
var buf;
109+
var it;
110+
var v;
111+
112+
buf = [ 1.0, 2.0, 3.0, 4.0, 5.0];
113+
ctor = factory( 'float64' );
114+
arr = new ctor( 'little-endian', buf);
115+
116+
it = arr.entries();
117+
118+
v = it.next();
119+
t.strictEqual( v.value[ 1 ], buf[ 0 ], 'returns expected value' );
120+
t.strictEqual( v.done, false, 'returns expected value' );
121+
122+
v = it.next();
123+
t.strictEqual( v.value[ 1 ], buf[ 1 ], 'returns expected value' );
124+
t.strictEqual( v.done, false, 'returns expected value' );
125+
126+
v = it.return();
127+
t.strictEqual( v.value, void 0, 'returns expected value' );
128+
t.strictEqual( v.done, true, 'returns expected value' );
129+
130+
v = it.next();
131+
t.strictEqual( v.value, void 0, 'returns expected value' );
132+
t.strictEqual( v.done, true, 'returns expected value' );
133+
134+
v = it.next();
135+
t.strictEqual( v.value, void 0, 'returns expected value' );
136+
t.strictEqual( v.done, true, 'returns expected value' );
137+
138+
v = it.next();
139+
t.strictEqual( v.value, void 0, 'returns expected value' );
140+
t.strictEqual( v.done, true, 'returns expected value' );
141+
142+
t.end();
143+
});
144+
145+
tape( 'the method returns an iterator which has a `return` method for closing an iterator (argument)', function test( t ) {
146+
var ctor;
147+
var buf;
148+
var arr;
149+
var it;
150+
var v;
151+
152+
buf = [ 1.0, 2.0, 3.0, 4.0, 5.0];
153+
ctor = factory( 'float64' );
154+
arr = new ctor( 'little-endian', buf);
155+
156+
it = arr.entries();
157+
158+
v = it.next();
159+
t.strictEqual( v.value[ 1 ], buf[ 0 ], 'returns expected value' );
160+
t.strictEqual( v.done, false, 'returns expected value' );
161+
162+
v = it.next();
163+
t.strictEqual( v.value[ 1 ], buf[ 1 ], 'returns expected value' );
164+
t.strictEqual( v.done, false, 'returns expected value' );
165+
166+
v = it.return( 'finished' );
167+
t.strictEqual( v.value, 'finished', 'returns expected value' );
168+
t.strictEqual( v.done, true, 'returns expected value' );
169+
170+
v = it.next();
171+
t.strictEqual( v.value, void 0, 'returns expected value' );
172+
t.strictEqual( v.done, true, 'returns expected value' );
173+
174+
v = it.next();
175+
t.strictEqual( v.value, void 0, 'returns expected value' );
176+
t.strictEqual( v.done, true, 'returns expected value' );
177+
178+
v = it.next();
179+
t.strictEqual( v.value, void 0, 'returns expected value' );
180+
t.strictEqual( v.done, true, 'returns expected value' );
181+
182+
t.end();
183+
});
184+
185+
tape( 'if an environment supports `Symbol.iterator`, the method returns an iterable', function test( t ) {
186+
var factory;
187+
var ctor;
188+
var arr;
189+
var buf;
190+
var it1;
191+
var it2;
192+
var v1;
193+
var v2;
194+
var i;
195+
196+
factory = proxyquire( './../lib/main.js', {
197+
'@stdlib/symbol/iterator': '__ITERATOR_SYMBOL__'
198+
});
199+
200+
buf = [ 1.0, 2.0, 3.0, 4.0, 5.0];
201+
ctor = factory( 'float64' );
202+
arr = new ctor( 'little-endian', buf);
203+
204+
it1 = arr.entries();
205+
t.strictEqual( typeof it1[ '__ITERATOR_SYMBOL__' ], 'function', 'has method' );
206+
t.strictEqual( it1[ '__ITERATOR_SYMBOL__' ].length, 0, 'has zero arity' );
207+
208+
it2 = it1[ '__ITERATOR_SYMBOL__' ]();
209+
t.strictEqual( typeof it2, 'object', 'returns an object' );
210+
t.strictEqual( typeof it2.next, 'function', 'has `next` method' );
211+
t.strictEqual( typeof it2.return, 'function', 'has `return` method' );
212+
213+
for ( i = 0; i < arr.length; i++ ) {
214+
v1 = it1.next().value;
215+
v2 = it2.next().value;
216+
t.strictEqual( v1[ 0 ], v2[ 0 ], 'returns expected value' );
217+
t.strictEqual( v1[ 1 ], v2[ 1 ], 'returns expected value' );
218+
}
219+
t.end();
220+
});
221+
222+
tape( 'if an environment does not support `Symbol.iterator`, the method does not return an "iterable"', function test( t ) {
223+
var factory;
224+
var ctor;
225+
var arr;
226+
var buf;
227+
var it;
228+
229+
factory = proxyquire( './../lib/main.js', {
230+
'@stdlib/symbol/iterator': false
231+
});
232+
233+
buf = [ 1.0, 2.0, 3.0, 4.0, 5.0];
234+
ctor = factory( 'float64' );
235+
arr = new ctor( 'little-endian', buf);
236+
237+
it = arr.entries();
238+
t.strictEqual( it[ ITERATOR_SYMBOL ], void 0, 'does not have property' );
239+
240+
t.end();
241+
});

0 commit comments

Comments
 (0)