Skip to content

Commit ac11587

Browse files
committed
test: add unit test
1 parent 43e60c7 commit ac11587

File tree

2 files changed

+38
-6
lines changed

2 files changed

+38
-6
lines changed

src/index.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -163,12 +163,6 @@ const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
163163
SegmentedRawOption | undefined
164164
>(selected);
165165

166-
const latestVisualSelected = React.useRef(visualSelected);
167-
168-
React.useEffect(() => {
169-
latestVisualSelected.current = visualSelected;
170-
});
171-
172166
const [thumbShow, setThumbShow] = React.useState(false);
173167

174168
const doThumbAnimation = React.useCallback(
@@ -177,6 +171,10 @@ const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
177171
(n) => n.value === selectedValue,
178172
);
179173

174+
if (segmentedItemIndex < 0) {
175+
return;
176+
}
177+
180178
// find target element
181179
const toElement = containerRef.current?.querySelector(
182180
`.${prefixCls}-item:nth-child(${segmentedItemIndex + 1})`,
@@ -205,6 +203,12 @@ const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
205203
[prefixCls, segmentedOptions],
206204
);
207205

206+
// get latest version of `visualSelected`
207+
const latestVisualSelected = React.useRef(visualSelected);
208+
React.useEffect(() => {
209+
latestVisualSelected.current = visualSelected;
210+
});
211+
208212
React.useEffect(() => {
209213
// Syncing `visualSelected` when `selected` changed
210214
// and do thumb animation

tests/index.spec.tsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,34 @@ describe('rc-segmented', () => {
285285
.at(1)
286286
.simulate('change');
287287
expect(wrapper.state().value).toBe('Android');
288+
289+
// change state directly
290+
wrapper.find(Demo).setState({ value: 'Web3' });
291+
292+
// Motion end
293+
wrapper.triggerMotionEvent();
294+
act(() => {
295+
jest.runAllTimers();
296+
wrapper.update();
297+
});
298+
299+
expect(
300+
wrapper.find('.rc-segmented-item-selected').contains('Web3'),
301+
).toBeTruthy();
302+
303+
// Motion end
304+
wrapper.triggerMotionEvent();
305+
act(() => {
306+
jest.runAllTimers();
307+
wrapper.update();
308+
});
309+
310+
// change it strangely
311+
wrapper.find(Demo).setState({ value: 'Web4' });
312+
// invalid changes
313+
expect(
314+
wrapper.find('.rc-segmented-item-selected').contains('Web3'),
315+
).toBeTruthy();
288316
});
289317

290318
it('render segmented with CSSMotion', () => {

0 commit comments

Comments
 (0)