11const test = require ( 'tape' )
22const AKM = require ( './main.js' )
3+ const assert = require ( 'assert' )
34
45test ( 'empty' , ( t ) => {
56 const p = new AKM ( )
@@ -244,41 +245,60 @@ test('iterators', (t) => {
244245 const value4 = 'ba'
245246 p . set ( key4 , value4 )
246247
247- // Note that entries 3 and 4 come in the opposite order in every iterator.
248- // This is OK, because this module doesn't guarantee iteration order.
248+ // We don't guarantee any particular order in which entries are emitted by
249+ // iterators. So to make this test work even if the implementation changes,
250+ // we specifically disregard order when checking them.
251+ function containsAllOf ( t , array , expectedItems ) {
252+ t . same (
253+ array . length ,
254+ expectedItems . length ,
255+ 'Iterator has right number of elements' )
256+
257+ expectedItems . forEach ( expectedItem => {
258+ const wasFound = array . some ( actualItem => {
259+ try {
260+ assert . deepStrictEqual ( actualItem , expectedItem )
261+ } catch ( e ) {
262+ if ( e instanceof assert . AssertionError ) return false
263+ else throw e
264+ }
265+ return true
266+ } )
267+ t . ok ( wasFound , `Iterator contains ${ JSON . stringify ( expectedItem ) } ` )
268+ } )
269+ }
270+
249271 test ( 'entries' , ( t ) => {
250- const iterator = p . entries ( )
251- t . same ( iterator . next ( ) . value , [ key1 , value1 ] )
252- t . same ( iterator . next ( ) . value , [ key2 , value2 ] )
253- t . same ( iterator . next ( ) . value , [ key4 , value4 ] )
254- t . same ( iterator . next ( ) . value , [ key3 , value3 ] )
272+ containsAllOf ( t , [ ...p . entries ( ) ] , [
273+ [ key1 , value1 ] ,
274+ [ key2 , value2 ] ,
275+ [ key3 , value3 ] ,
276+ [ key4 , value4 ]
277+ ] )
255278 t . end ( )
256279 } )
257280
258281 test ( '@@iterator' , ( t ) => {
259- const a = Array . from ( p )
260- t . same ( a [ 0 ] , [ key1 , value1 ] )
261- t . same ( a [ 1 ] , [ key2 , value2 ] )
262- t . same ( a [ 2 ] , [ key4 , value4 ] )
263- t . same ( a [ 3 ] , [ key3 , value3 ] )
282+ containsAllOf ( t , Array . from ( p ) , [
283+ [ key1 , value1 ] ,
284+ [ key2 , value2 ] ,
285+ [ key3 , value3 ] ,
286+ [ key4 , value4 ]
287+ ] )
264288 t . end ( )
265289 } )
266290
267291 test ( 'keys' , ( t ) => {
268- const iterator = p . keys ( )
269- t . same ( iterator . next ( ) . value , key1 )
270- t . same ( iterator . next ( ) . value , key2 )
271- t . same ( iterator . next ( ) . value , key4 )
272- t . same ( iterator . next ( ) . value , key3 )
292+ containsAllOf ( t , [ ...p . keys ( ) ] , [
293+ key1 , key2 , key3 , key4
294+ ] )
273295 t . end ( )
274296 } )
275297
276298 test ( 'values' , ( t ) => {
277- const iterator = p . values ( )
278- t . same ( iterator . next ( ) . value , value1 )
279- t . same ( iterator . next ( ) . value , value2 )
280- t . same ( iterator . next ( ) . value , value4 )
281- t . same ( iterator . next ( ) . value , value3 )
299+ containsAllOf ( t , [ ...p . values ( ) ] , [
300+ value1 , value2 , value3 , value4
301+ ] )
282302 t . end ( )
283303 } )
284304
@@ -291,7 +311,7 @@ test('iterators', (t) => {
291311 } ,
292312 thisValue )
293313 t . same ( forEachReturnValue , undefined )
294- t . same ( kvs , [
314+ containsAllOf ( t , kvs , [
295315 { thisValue : thisValue , args : [ value1 , key1 , p ] } ,
296316 { thisValue : thisValue , args : [ value2 , key2 , p ] } ,
297317 { thisValue : thisValue , args : [ value4 , key4 , p ] } ,
0 commit comments