@@ -7,6 +7,7 @@ import { useInput } from './useInput';
77import { useBindToInput } from './useBindToInput' ;
88import { useSetState } from './useSetState' ;
99import { useMap } from './useMap' ;
10+ import { useSet } from './useSet' ;
1011
1112afterEach ( cleanup ) ;
1213describe ( 'useNumber array' , ( ) => {
@@ -407,6 +408,76 @@ describe('useBoolean array', () => {
407408 } ) ;
408409} ) ;
409410
411+ describe ( 'useSet array' , ( ) => {
412+ const initial = new Set ( [ 1 , 2 , 3 ] ) ;
413+
414+ it ( 'should update old value' , ( ) => {
415+ // given
416+ const { result } = renderHook ( ( ) => useSet < number > ( initial ) ) ;
417+ const [ value , { setValue } ] = result . current ;
418+
419+ expect ( value ) . toEqual ( initial ) ;
420+ // when
421+ act ( ( ) => setValue ( new Set ( [ 2 ] ) ) ) ;
422+ // then
423+ expect ( result . current [ 0 ] ) . toEqual ( new Set ( [ 2 ] ) ) ;
424+ } ) ;
425+
426+ it ( 'should add new value' , ( ) => {
427+ // given
428+ const { result } = renderHook ( ( ) => useSet < number > ( initial ) ) ;
429+ const [ , { add } ] = result . current ;
430+ // when
431+ act ( ( ) => add ( 4 ) ) ;
432+ // then
433+ expect ( result . current [ 0 ] ) . toEqual ( new Set ( [ 1 , 2 , 3 , 4 ] ) ) ;
434+ } ) ;
435+
436+ it ( 'should remove a value' , ( ) => {
437+ // given
438+ const { result } = renderHook ( ( ) => useSet < number > ( initial ) ) ;
439+ const [ , { remove } ] = result . current ;
440+ // when
441+ act ( ( ) => remove ( 2 ) ) ;
442+ // then
443+ expect ( result . current [ 0 ] ) . toEqual ( new Set ( [ 1 , 3 ] ) ) ;
444+ } ) ;
445+
446+ it ( 'should clear' , ( ) => {
447+ // given
448+ const { result } = renderHook ( ( ) => useSet < number > ( initial ) ) ;
449+ const [ , { clear } ] = result . current ;
450+ // when
451+ act ( ( ) => clear ( ) ) ;
452+ // then
453+ expect ( result . current [ 0 ] ) . toEqual ( new Set ( ) ) ;
454+ } ) ;
455+
456+ describe ( 'hooks optimizations' , ( ) => {
457+ it ( 'should change value reference equality after change' , ( ) => {
458+ // given
459+ const { result } = renderHook ( ( ) => useSet < number > ( initial ) ) ;
460+ const [ originalValueReference , actions ] = result . current ;
461+ expect ( result . current [ 0 ] ) . toBe ( originalValueReference ) ;
462+ // when
463+ act ( ( ) => actions . setValue ( new Set ( [ 1 ] ) ) ) ;
464+ // then
465+ expect ( originalValueReference ) . not . toBe ( result . current [ 0 ] ) ;
466+ } ) ;
467+
468+ it ( 'should keep actions reference equality after value change' , ( ) => {
469+ // given
470+ const { result } = renderHook ( ( ) => useSet < number > ( initial ) ) ;
471+ const [ , originalActionsReference ] = result . current ;
472+ expect ( result . current [ 1 ] ) . toBe ( originalActionsReference ) ;
473+ // when
474+ act ( ( ) => originalActionsReference . setValue ( new Set ( [ 1 ] ) ) ) ;
475+ // then
476+ expect ( originalActionsReference ) . toBe ( result . current [ 1 ] ) ;
477+ } ) ;
478+ } ) ;
479+ } ) ;
480+
410481describe ( 'useMap array' , ( ) => {
411482 describe ( 'set' , ( ) => {
412483 it ( 'should update old value' , ( ) => {
0 commit comments