Skip to content

Commit 2d30468

Browse files
committed
test: full coverage of new viewDate logic
1 parent 51930c1 commit 2d30468

File tree

4 files changed

+189
-26
lines changed

4 files changed

+189
-26
lines changed

src/hooks/useRangeViewDates.ts

Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,42 @@ import {
66
getClosingViewDate,
77
isSameYear,
88
isSameMonth,
9-
isSameDate,
9+
isSameDecade,
1010
} from '../utils/dateUtil';
1111

12-
function isClosingViewDate<DateType>(
13-
start: DateType | null,
14-
end: DateType | null,
12+
function getStartEndDistance<DateType>(
13+
startDate: DateType,
14+
endDate: DateType,
1515
picker: PickerMode,
1616
generateConfig: GenerateConfig<DateType>,
17-
) {
18-
// Skip when no compared
19-
if (!start || !end) {
20-
return true;
21-
}
22-
23-
const startPrev = getClosingViewDate(start, picker, generateConfig, -1);
24-
const startNext = getClosingViewDate(start, picker, generateConfig, 1);
25-
26-
function isSameCompare(compareFunc: (source: DateType | null) => boolean) {
27-
return [startPrev, start, startNext].some(date => compareFunc(date));
17+
): 'same' | 'closing' | 'far' {
18+
const startNext = getClosingViewDate(startDate, picker, generateConfig, 1);
19+
20+
function getDistance(
21+
compareFunc: (start: DateType | null, end: DateType | null) => boolean,
22+
) {
23+
if (compareFunc(startDate, endDate)) {
24+
return 'same';
25+
}
26+
if (compareFunc(startNext, endDate)) {
27+
return 'closing';
28+
}
29+
return 'far';
2830
}
2931

3032
switch (picker) {
3133
case 'year':
32-
return isSameCompare(source => isSameYear(generateConfig, source, end));
33-
34+
return getDistance((start, end) =>
35+
isSameDecade(generateConfig, start, end),
36+
);
3437
case 'month':
35-
return isSameCompare(source => isSameMonth(generateConfig, source, end));
36-
38+
return getDistance((start, end) =>
39+
isSameYear(generateConfig, start, end),
40+
);
3741
default:
38-
return isSameCompare(source => isSameDate(generateConfig, source, end));
42+
return getDistance((start, end) =>
43+
isSameMonth(generateConfig, start, end),
44+
);
3945
}
4046
}
4147

@@ -52,14 +58,24 @@ function getRangeViewDate<DateType>(
5258
return startDate;
5359
}
5460

55-
if (endDate) {
56-
if (!isClosingViewDate(startDate, endDate, picker, generateConfig)) {
57-
return getClosingViewDate(endDate, picker, generateConfig, -1);
61+
if (startDate && endDate) {
62+
const distance = getStartEndDistance(
63+
startDate,
64+
endDate,
65+
picker,
66+
generateConfig,
67+
);
68+
switch (distance) {
69+
case 'same':
70+
return startDate;
71+
case 'closing':
72+
return startDate;
73+
default:
74+
return getClosingViewDate(endDate, picker, generateConfig, -1);
5875
}
59-
return endDate;
6076
}
6177

62-
return null;
78+
return startDate;
6379
}
6480

6581
export default function useRangeViewDates<DateType>({

src/utils/dateUtil.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,21 @@ export function isNullEqual<T>(value1: T, value2: T): boolean | undefined {
1414
return undefined;
1515
}
1616

17+
export function isSameDecade<DateType>(
18+
generateConfig: GenerateConfig<DateType>,
19+
decade1: NullableDateType<DateType>,
20+
decade2: NullableDateType<DateType>,
21+
) {
22+
const equal = isNullEqual(decade1, decade2);
23+
if (typeof equal === 'boolean') {
24+
return equal;
25+
}
26+
27+
const num1 = Math.floor(generateConfig.getYear(decade1!) / 10);
28+
const num2 = Math.floor(generateConfig.getYear(decade2!) / 10);
29+
return num1 === num2;
30+
}
31+
1732
export function isSameYear<DateType>(
1833
generateConfig: GenerateConfig<DateType>,
1934
year1: NullableDateType<DateType>,

tests/range.spec.tsx

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -851,4 +851,122 @@ describe('Picker.Range', () => {
851851

852852
jest.useRealTimers();
853853
});
854+
855+
describe('viewDate', () => {
856+
function matchTitle(wrapper: Wrapper, title: string) {
857+
expect(
858+
wrapper
859+
.find('.rc-picker-header-view')
860+
.first()
861+
.text(),
862+
).toEqual(title);
863+
}
864+
865+
[
866+
{
867+
picker: 'year',
868+
// Default picker value
869+
defaultPickerValue: [getMoment('1990-09-03'), getMoment('2000-11-28')],
870+
defaultPickerValueTitle: ['1990-1999', '2000-2009'],
871+
// Closing value
872+
closingValue: [getMoment('1989-09-03'), getMoment('1990-11-28')],
873+
closingValueTitle: '1980-1989',
874+
// Far away value
875+
farValue: [getMoment('1989-09-03'), getMoment('2090-11-28')],
876+
farValueTitle: ['1980-1989', '2080-2089'],
877+
},
878+
{
879+
picker: 'month',
880+
// Default picker value
881+
defaultPickerValue: [getMoment('1990-09-03'), getMoment('2000-11-28')],
882+
defaultPickerValueTitle: ['1990', '2000'],
883+
// Closing value
884+
closingValue: [getMoment('1989-09-03'), getMoment('1989-10-11')],
885+
closingValueTitle: '1989',
886+
// Far away value
887+
farValue: [getMoment('1989-09-03'), getMoment('2000-10-11')],
888+
farValueTitle: ['1989', '1999'],
889+
},
890+
{
891+
picker: 'date',
892+
// Default picker value
893+
defaultPickerValue: [getMoment('1990-09-03'), getMoment('2000-11-28')],
894+
defaultPickerValueTitle: ['Sep1990', 'Nov2000'],
895+
// Closing value
896+
closingValue: [getMoment('1989-09-03'), getMoment('1989-10-11')],
897+
closingValueTitle: 'Sep1989',
898+
// Far away value
899+
farValue: [getMoment('1989-09-03'), getMoment('2000-10-11')],
900+
farValueTitle: ['Sep1989', 'Sep2000'],
901+
},
902+
].forEach(
903+
({
904+
picker,
905+
defaultPickerValue,
906+
defaultPickerValueTitle,
907+
closingValue,
908+
closingValueTitle,
909+
farValue,
910+
farValueTitle,
911+
}) => {
912+
describe(picker, () => {
913+
it('defaultPickerValue', () => {
914+
const wrapper = mount(
915+
<MomentRangePicker
916+
picker={picker as any}
917+
defaultPickerValue={defaultPickerValue as any}
918+
/>,
919+
);
920+
921+
wrapper.openPicker();
922+
matchTitle(wrapper, defaultPickerValueTitle[0]);
923+
wrapper.openPicker(1);
924+
matchTitle(wrapper, defaultPickerValueTitle[1]);
925+
});
926+
927+
it('with closing value', () => {
928+
const wrapper = mount(
929+
<MomentRangePicker
930+
picker={picker as any}
931+
value={closingValue as any}
932+
/>,
933+
);
934+
935+
wrapper.openPicker();
936+
matchTitle(wrapper, closingValueTitle);
937+
wrapper.openPicker(1);
938+
matchTitle(wrapper, closingValueTitle);
939+
});
940+
941+
it('with far value', () => {
942+
const wrapper = mount(
943+
<MomentRangePicker
944+
picker={picker as any}
945+
value={farValue as any}
946+
/>,
947+
);
948+
949+
wrapper.openPicker();
950+
matchTitle(wrapper, farValueTitle[0]);
951+
wrapper.openPicker(1);
952+
matchTitle(wrapper, farValueTitle[1]);
953+
});
954+
955+
it('no end date', () => {
956+
const wrapper = mount(
957+
<MomentRangePicker
958+
picker={picker as any}
959+
value={[closingValue[0], null]}
960+
/>,
961+
);
962+
963+
wrapper.openPicker();
964+
matchTitle(wrapper, farValueTitle[0]);
965+
wrapper.openPicker(1);
966+
matchTitle(wrapper, farValueTitle[0]);
967+
});
968+
});
969+
},
970+
);
971+
});
854972
});

tests/util.spec.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import momentGenerateConfig from '../src/generate/moment';
22
import { toArray } from '../src/utils/miscUtil';
3-
import { isSameTime } from '../src/utils/dateUtil';
3+
import { isSameTime, isSameDecade } from '../src/utils/dateUtil';
44
import { getMoment } from './util/commonUtil';
55

66
describe('Picker.Util', () => {
@@ -27,4 +27,18 @@ describe('Picker.Util', () => {
2727

2828
expect(isSameTime(momentGenerateConfig, null, null)).toBeTruthy();
2929
});
30+
31+
it('isSameDecade', () => {
32+
expect(isSameDecade(momentGenerateConfig, null, null)).toBeTruthy();
33+
expect(
34+
isSameDecade(momentGenerateConfig, getMoment('2000-01-02'), null),
35+
).toBeFalsy();
36+
expect(
37+
isSameDecade(
38+
momentGenerateConfig,
39+
getMoment('1995-01-01'),
40+
getMoment('1999-01-01'),
41+
),
42+
).toBeTruthy();
43+
});
3044
});

0 commit comments

Comments
 (0)