import { clear } from 'jest-date-mock'; import { BASE_CLASS_PREFIX } from '../../../semi-foundation/base/constants'; import { Button } from '../../index'; import ScrollList from '../index'; import ScrollItem from '../scrollItem'; import { genAfterEach, genBeforeEach, mount, sleep } from '../../_test_/utils'; const selectedSelector = `.${BASE_CLASS_PREFIX}-scrolllist-item-selected`; const DEFAULTS = { AMPM_INDEX: 1, HOUR_INDEX: 1, MINUTE_INDEX: 1, }; const ampms = [ { value: 'AM', transform: () => '上午', }, { value: 'PM', transform: () => `下午`, }, ]; const hours = new Array(12).fill(0).map((itm, index) => { return { value: index + 1, }; }); const minutes = new Array(60).fill(0).map((itm, index) => { return { value: index, disabled: index % 2 === 1 ? true : false, }; }); class Demo extends React.PureComponent { constructor(props) { super(props); } render() { const { minuteOnSelect, hourOnSelect, ampmOnSelect, mode = 'wheel', motion = true, selectedAmpmIndex = DEFAULTS.AMPM_INDEX, selectedHourIndex = DEFAULTS.HOUR_INDEX, selectedMinuteIndex = DEFAULTS.MINUTE_INDEX, } = this.props; const commonProps = { mode, cycled: false, motion, }; return ( Ok } > ); } } describe(`ScrollList`, () => { beforeEach(() => { clear(); genBeforeEach()(); }); afterEach(genAfterEach()); it(`test wheel mode appearance`, async () => { const listSelector = `.${BASE_CLASS_PREFIX}-scrolllist-list-outer`; const sleepMs = 200; const ampmOnSelect = sinon.spy(); const hourOnSelect = sinon.spy(); const minuteOnSelect = sinon.spy(); const elem = mount( ); await sleep(sleepMs); const all = elem.find(`${listSelector}`); const ampmList = all.at(0); const hourList = all.at(1); const minuteList = all.at(2); // check if has 3 lists expect(all.length).toBe(3); const minuteItems = minuteList.find(`ul li`); const firstDisabledMinuteIndex = minutes.findIndex(minute => minute.disabled); const nextEnabledMinuteIndex = minutes.findIndex((minute, index) => index > 1 && !minute.disabled); // click first disabled item minuteList.find('ul').simulate('click', { target: minuteItems.at(firstDisabledMinuteIndex).getDOMNode(), nativeEvent: null, }); expect(minuteOnSelect.called).toBeFalsy(); // click next enabled item minuteList.find('ul').simulate('click', { target: minuteItems.at(nextEnabledMinuteIndex).getDOMNode(), nativeEvent: null, }); await sleep(sleepMs); expect(minuteOnSelect.calledOnce).toBeTruthy(); // scroll minute list to disabled elem minuteList.simulate('scroll'); await sleep(sleepMs); expect(minuteOnSelect.calledTwice).toBeTruthy(); // scroll minute list to enabled elem // minuteList.getDOMNode().scrollTop += 2 * oneMinuteElemHeight; // await sleep(sleepMs); // expect(minuteList.getDOMNode().scrollTop).toBeGreaterThan(currentMinuteListDomScrollTop); // expect(minuteOnSelect.calledTwice).toBeTruthy(); // set selected index manually // scrollTop is a not valid property const newAmpmIndex = elem.prop('selectedAmpmIndex') + ampms.length + 1; elem.setProps({ selectedAmpmIndex: newAmpmIndex }); await sleep(sleepMs); const ampmScrollItem = elem.find(ScrollItem).at(0); ampmScrollItem.prop('onSelect')({}); expect(ampmOnSelect.called).toBeTruthy(); // scroll hour list hourList.simulate(`scroll`, {}); const oneHourElemHeight = hourList .find(`li`) .at(0) .getDOMNode().scrollHeight; hourList.getDOMNode().scrollTop += oneHourElemHeight; await sleep(sleepMs); expect(hourOnSelect.called).toBeTruthy(); }); it(`test normal mode appearance`, async () => { const ampmOnSelect = sinon.spy(); const minuteOnSelect = sinon.spy(); const demo = mount( ); const all = demo.find(`.${BASE_CLASS_PREFIX}-scrolllist-item`); const ampmList = all.at(0); const minuteList = all.at(2); // check if rendered three lists expect(all.length).toBe(3); // click next disabled item // const firstDisabledMinuteIndex = minutes.findIndex(minute => minute.disabled); const nextEnabledMinuteIndex = minutes.findIndex( (minute, index) => index > DEFAULTS.MINUTE_INDEX && !minute.disabled ); const minuteItemDoms = minuteList.find(`li`); minuteItemDoms.at(nextEnabledMinuteIndex).simulate('click'); expect(minuteOnSelect.called).toBeTruthy(); // set AMPM const ampmItemDoms = ampmList.find(`li`); const selectedCls = `${BASE_CLASS_PREFIX}-scrolllist-item-sel`; let oldSelectedAmpmIndex = -1; let newSelectedAmpmIndex = -2; ampmItemDoms.forEach((el, index) => el.hasClass(selectedCls) && (oldSelectedAmpmIndex = index)); const newAmpmIndex = demo.prop('selectedAmpmIndex') + ampms.length; demo.setProps({ selectedAmpmIndex: newAmpmIndex }); ampmItemDoms.forEach((el, index) => el.hasClass(selectedCls) && (newSelectedAmpmIndex = index)); expect(oldSelectedAmpmIndex === newSelectedAmpmIndex).toBeTruthy(); }); });