1
1
import React from 'react' ;
2
2
import { render , act , fireEvent } from '@testing-library/react' ;
3
3
import Segmented from '../src' ;
4
- import type { SegmentedValue } from '../src' ;
5
4
6
5
jest . mock ( 'rc-motion/lib/util/motion' , ( ) => {
7
6
return {
@@ -24,6 +23,15 @@ describe('rc-segmented', () => {
24
23
} ) ;
25
24
}
26
25
26
+ function exceptThumbHaveStyle ( container : HTMLElement , matchStyle : object ) {
27
+ const styleText = container
28
+ . querySelector ( '.rc-segmented-thumb' )
29
+ ?. getAttribute ( 'data-test-style' ) ;
30
+ const style = JSON . parse ( styleText ! ) || { } ;
31
+
32
+ expect ( style ) . toMatchObject ( matchStyle ) ;
33
+ }
34
+
27
35
beforeEach ( ( ) => {
28
36
jest . useFakeTimers ( ) ;
29
37
} ) ;
@@ -260,105 +268,133 @@ describe('rc-segmented', () => {
260
268
container . querySelector ( '.rc-segmented-item-selected' ) ?. textContent ,
261
269
) . toContain ( 'Web3' ) ;
262
270
263
- // Motion end
264
- fireEvent . animationEnd ( container . querySelector ( '.rc-segmented-thumb' ) ! ) ;
265
- act ( ( ) => {
266
- jest . runAllTimers ( ) ;
267
- } ) ;
268
-
269
271
// change it strangely
270
272
fireEvent . change ( container . querySelector ( '.control' ) ! , {
271
273
target : { value : 'Web4' } ,
272
274
} ) ;
273
275
274
- // invalid changes
275
- expect (
276
- container . querySelector ( '.rc-segmented-item-selected' ) ?. textContent ,
277
- ) . toContain ( 'Web3' ) ;
276
+ // invalid changes: Should not active any item to make sure it's single source of truth
277
+ expect ( container . querySelector ( '.rc-segmented-item-selected' ) ) . toBeFalsy ( ) ;
278
278
} ) ;
279
279
280
- it ( 'render segmented with CSSMotion' , ( ) => {
281
- const handleValueChange = jest . fn ( ) ;
282
- const { container, asFragment } = render (
283
- < Segmented
284
- options = { [ 'iOS' , 'Android' , 'Web3' ] }
285
- onChange = { ( value ) => handleValueChange ( value ) }
286
- /> ,
287
- ) ;
288
- expect ( asFragment ( ) . firstChild ) . toMatchSnapshot ( ) ;
289
-
290
- expectMatchChecked ( container , [ true , false , false ] ) ;
291
- expect ( container . querySelectorAll ( '.rc-segmented-item' ) [ 0 ] ) . toHaveClass (
292
- 'rc-segmented-item-selected' ,
293
- ) ;
280
+ describe ( 'render segmented with CSSMotion' , ( ) => {
281
+ it ( 'basic' , ( ) => {
282
+ const handleValueChange = jest . fn ( ) ;
283
+ const { container, asFragment } = render (
284
+ < Segmented
285
+ options = { [ 'iOS' , 'Android' , 'Web3' ] }
286
+ onChange = { ( value ) => handleValueChange ( value ) }
287
+ /> ,
288
+ ) ;
289
+ expect ( asFragment ( ) . firstChild ) . toMatchSnapshot ( ) ;
294
290
295
- fireEvent . click ( container . querySelectorAll ( '.rc-segmented-item-input' ) [ 2 ] ) ;
296
- expect ( handleValueChange ) . toBeCalledWith ( 'Web3' ) ;
297
- expectMatchChecked ( container , [ false , false , true ] ) ;
291
+ expectMatchChecked ( container , [ true , false , false ] ) ;
292
+ expect ( container . querySelectorAll ( '.rc-segmented-item' ) [ 0 ] ) . toHaveClass (
293
+ 'rc-segmented-item-selected' ,
294
+ ) ;
298
295
299
- expect ( container . querySelectorAll ( '.rc-segmented-thumb' ) [ 0 ] ) . toHaveClass (
300
- 'rc-segmented-thumb-motion' ,
301
- ) ;
296
+ // >>> Click: Web3
297
+ fireEvent . click (
298
+ container . querySelectorAll ( '.rc-segmented-item-input' ) [ 2 ] ,
299
+ ) ;
300
+ expect ( handleValueChange ) . toBeCalledWith ( 'Web3' ) ;
301
+ expectMatchChecked ( container , [ false , false , true ] ) ;
302
302
303
- // thumb appeared at `iOS`
304
- expect ( container . querySelectorAll ( '.rc-segmented-thumb' ) [ 0 ] ) . toHaveStyle ( {
305
- transform : 'translateX(0px)' ,
306
- width : '62px' ,
307
- } ) ;
303
+ expect ( container . querySelectorAll ( '.rc-segmented-thumb' ) [ 0 ] ) . toHaveClass (
304
+ 'rc-segmented-thumb-motion' ,
305
+ ) ;
308
306
309
- // Motion => active
310
- act ( ( ) => {
311
- jest . runAllTimers ( ) ;
312
- } ) ;
307
+ // thumb appeared at `iOS`
308
+ exceptThumbHaveStyle ( container , {
309
+ '--thumb-start-left' : '0px' ,
310
+ '--thumb-start-width' : '62px' ,
311
+ } ) ;
312
+
313
+ // Motion => active
314
+ act ( ( ) => {
315
+ jest . runAllTimers ( ) ;
316
+ } ) ;
317
+
318
+ // Motion enter end
319
+ fireEvent . animationEnd ( container . querySelector ( '.rc-segmented-thumb' ) ! ) ;
320
+ act ( ( ) => {
321
+ jest . runAllTimers ( ) ;
322
+ } ) ;
323
+
324
+ // thumb should disappear
325
+ expect ( container . querySelector ( '.rc-segmented-thumb' ) ) . toBeFalsy ( ) ;
326
+
327
+ // >>> Click: Android
328
+ fireEvent . click (
329
+ container . querySelectorAll ( '.rc-segmented-item-input' ) [ 1 ] ,
330
+ ) ;
331
+ expect ( handleValueChange ) . toBeCalledWith ( 'Android' ) ;
332
+ expectMatchChecked ( container , [ false , true , false ] ) ;
313
333
314
- // Motion enter end
315
- fireEvent . animationEnd ( container . querySelector ( '.rc-segmented-thumb' ) ! ) ;
316
- act ( ( ) => {
317
- jest . runAllTimers ( ) ;
318
- } ) ;
334
+ // thumb should move
335
+ expect ( container . querySelector ( '.rc-segmented-thumb' ) ) . toHaveClass (
336
+ 'rc-segmented-thumb-motion' ,
337
+ ) ;
319
338
320
- // Motion leave end
321
- fireEvent . animationEnd ( container . querySelector ( '.rc-segmented-thumb' ) ! ) ;
322
- act ( ( ) => {
323
- jest . runAllTimers ( ) ;
339
+ // thumb appeared at `Web3`
340
+ exceptThumbHaveStyle ( container , {
341
+ '--thumb-start-left' : '180px' ,
342
+ '--thumb-start-width' : '76px' ,
343
+ } ) ;
344
+
345
+ // Motion appear end
346
+ act ( ( ) => {
347
+ jest . runAllTimers ( ) ;
348
+ } ) ;
349
+ exceptThumbHaveStyle ( container , {
350
+ '--thumb-active-left' : '62px' ,
351
+ '--thumb-active-width' : '118px' ,
352
+ } ) ;
353
+ fireEvent . animationEnd ( container . querySelector ( '.rc-segmented-thumb' ) ! ) ;
354
+ act ( ( ) => {
355
+ jest . runAllTimers ( ) ;
356
+ } ) ;
357
+
358
+ // thumb should disappear
359
+ expect ( container . querySelector ( '.rc-segmented-thumb' ) ) . toBeFalsy ( ) ;
324
360
} ) ;
325
361
326
- // thumb should disappear
327
- expect ( container . querySelector ( '.rc-segmented-thumb' ) ) . toBeFalsy ( ) ;
362
+ it ( 'quick switch' , ( ) => {
363
+ const { container } = render (
364
+ < Segmented
365
+ options = { [ 'IOS' , 'Android' , 'Web3' ] }
366
+ defaultValue = "Android"
367
+ /> ,
368
+ ) ;
328
369
329
- // change selection again
330
- fireEvent . click ( container . querySelectorAll ( '.rc-segmented-item-input' ) [ 1 ] ) ;
331
- expect ( handleValueChange ) . toBeCalledWith ( 'Android' ) ;
332
- expectMatchChecked ( container , [ false , true , false ] ) ;
370
+ // >>> Click: Web3
371
+ fireEvent . click (
372
+ container . querySelectorAll ( '.rc-segmented-item-input' ) [ 2 ] ,
373
+ ) ;
333
374
334
- // thumb should move
335
- expect ( container . querySelector ( '.rc-segmented-thumb' ) ) . toHaveClass (
336
- 'rc-segmented-thumb-motion' ,
337
- ) ;
375
+ // Motion to active
376
+ act ( ( ) => {
377
+ jest . runAllTimers ( ) ;
378
+ } ) ;
379
+ expect ( container . querySelector ( '.rc-segmented-thumb' ) ) . toHaveClass (
380
+ 'rc-segmented-thumb-motion-appear-active' ,
381
+ ) ;
338
382
339
- // thumb appeared at `Web3`
340
- expect ( container . querySelector ( '.rc-segmented-thumb' ) ) . toHaveStyle ( {
341
- transform : 'translateX(180px)' ,
342
- width : '76px' ,
343
- } ) ;
383
+ exceptThumbHaveStyle ( container , {
384
+ '--thumb-active-left' : '180px' ,
385
+ '--thumb-active-width' : '76px' ,
386
+ } ) ;
344
387
345
- // Motion enter end
346
- act ( ( ) => {
347
- jest . runAllTimers ( ) ;
348
- } ) ;
349
- fireEvent . animationEnd ( container . querySelector ( '.rc-segmented-thumb' ) ! ) ;
350
- act ( ( ) => {
351
- jest . runAllTimers ( ) ;
352
- } ) ;
388
+ // >>> Click: IOS
389
+ fireEvent . click (
390
+ container . querySelectorAll ( '.rc-segmented-item-input' ) [ 0 ] ,
391
+ ) ;
353
392
354
- // Motion leave end
355
- fireEvent . animationEnd ( container . querySelector ( '.rc-segmented -thumb' ) ! ) ;
356
- act ( ( ) => {
357
- jest . runAllTimers ( ) ;
393
+ exceptThumbHaveStyle ( container , {
394
+ '- -thumb-active-left' : '0px' ,
395
+ '--thumb-active-width' : '62px' ,
396
+ } ) ;
358
397
} ) ;
359
-
360
- // thumb should disappear
361
- expect ( container . querySelector ( '.rc-segmented-thumb' ) ) . toBeFalsy ( ) ;
362
398
} ) ;
363
399
364
400
it ( 'render segmented with options null/undefined' , ( ) => {
0 commit comments