scrollList.test.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. import { clear } from 'jest-date-mock';
  2. import { BASE_CLASS_PREFIX } from '../../../semi-foundation/base/constants';
  3. import { Button } from '../../index';
  4. import ScrollList from '../index';
  5. import ScrollItem from '../scrollItem';
  6. import { genAfterEach, genBeforeEach, mount, sleep } from '../../_test_/utils';
  7. const selectedSelector = `.${BASE_CLASS_PREFIX}-scrolllist-item-selected`;
  8. const DEFAULTS = {
  9. AMPM_INDEX: 1,
  10. HOUR_INDEX: 1,
  11. MINUTE_INDEX: 1,
  12. };
  13. const ampms = [
  14. {
  15. value: 'AM',
  16. transform: () => '上午',
  17. },
  18. {
  19. value: 'PM',
  20. transform: () => `下午`,
  21. },
  22. ];
  23. const hours = new Array(12).fill(0).map((itm, index) => {
  24. return {
  25. value: index + 1,
  26. };
  27. });
  28. const minutes = new Array(60).fill(0).map((itm, index) => {
  29. return {
  30. value: index,
  31. disabled: index % 2 === 1 ? true : false,
  32. };
  33. });
  34. class Demo extends React.PureComponent {
  35. constructor(props) {
  36. super(props);
  37. }
  38. render() {
  39. const {
  40. minuteOnSelect,
  41. hourOnSelect,
  42. ampmOnSelect,
  43. mode = 'wheel',
  44. motion = true,
  45. selectedAmpmIndex = DEFAULTS.AMPM_INDEX,
  46. selectedHourIndex = DEFAULTS.HOUR_INDEX,
  47. selectedMinuteIndex = DEFAULTS.MINUTE_INDEX,
  48. } = this.props;
  49. const commonProps = {
  50. mode,
  51. cycled: false,
  52. motion,
  53. };
  54. return (
  55. <ScrollList
  56. header={'滚动列表'}
  57. footer={
  58. <Button size="small" type="primary">
  59. Ok
  60. </Button>
  61. }
  62. >
  63. <ScrollItem
  64. {...commonProps}
  65. list={ampms}
  66. type={1}
  67. selectedIndex={selectedAmpmIndex}
  68. onSelect={ampmOnSelect}
  69. />
  70. <ScrollItem
  71. {...commonProps}
  72. list={hours}
  73. type={2}
  74. selectedIndex={selectedHourIndex}
  75. onSelect={hourOnSelect}
  76. />
  77. <ScrollItem
  78. {...commonProps}
  79. list={minutes}
  80. type={3}
  81. selectedIndex={selectedMinuteIndex}
  82. onSelect={minuteOnSelect}
  83. />
  84. </ScrollList>
  85. );
  86. }
  87. }
  88. describe(`ScrollList`, () => {
  89. beforeEach(() => {
  90. clear();
  91. genBeforeEach()();
  92. });
  93. afterEach(genAfterEach());
  94. it(`test wheel mode appearance`, async () => {
  95. const listSelector = `.${BASE_CLASS_PREFIX}-scrolllist-list-outer`;
  96. const sleepMs = 200;
  97. const ampmOnSelect = sinon.spy();
  98. const hourOnSelect = sinon.spy();
  99. const minuteOnSelect = sinon.spy();
  100. const elem = mount(
  101. <Demo
  102. minuteOnSelect={minuteOnSelect}
  103. hourOnSelect={hourOnSelect}
  104. ampmOnSelect={ampmOnSelect}
  105. selectedAmpmIndex={DEFAULTS.AMPM_INDEX}
  106. />
  107. );
  108. await sleep(sleepMs);
  109. const all = elem.find(`${listSelector}`);
  110. const ampmList = all.at(0);
  111. const hourList = all.at(1);
  112. const minuteList = all.at(2);
  113. // check if has 3 lists
  114. expect(all.length).toBe(3);
  115. const minuteItems = minuteList.find(`ul li`);
  116. const firstDisabledMinuteIndex = minutes.findIndex(minute => minute.disabled);
  117. const nextEnabledMinuteIndex = minutes.findIndex((minute, index) => index > 1 && !minute.disabled);
  118. // click first disabled item
  119. minuteList.find('ul').simulate('click', {
  120. target: minuteItems.at(firstDisabledMinuteIndex).getDOMNode(),
  121. nativeEvent: null,
  122. });
  123. expect(minuteOnSelect.called).toBeFalsy();
  124. // click next enabled item
  125. minuteList.find('ul').simulate('click', {
  126. target: minuteItems.at(nextEnabledMinuteIndex).getDOMNode(),
  127. nativeEvent: null,
  128. });
  129. await sleep(sleepMs);
  130. expect(minuteOnSelect.calledOnce).toBeTruthy();
  131. // scroll minute list to disabled elem
  132. minuteList.simulate('scroll');
  133. await sleep(sleepMs);
  134. expect(minuteOnSelect.calledTwice).toBeTruthy();
  135. // scroll minute list to enabled elem
  136. // minuteList.getDOMNode().scrollTop += 2 * oneMinuteElemHeight;
  137. // await sleep(sleepMs);
  138. // expect(minuteList.getDOMNode().scrollTop).toBeGreaterThan(currentMinuteListDomScrollTop);
  139. // expect(minuteOnSelect.calledTwice).toBeTruthy();
  140. // set selected index manually
  141. // scrollTop is a not valid property
  142. const newAmpmIndex = elem.prop('selectedAmpmIndex') + ampms.length + 1;
  143. elem.setProps({ selectedAmpmIndex: newAmpmIndex });
  144. await sleep(sleepMs);
  145. const ampmScrollItem = elem.find(ScrollItem).at(0);
  146. ampmScrollItem.prop('onSelect')({});
  147. expect(ampmOnSelect.called).toBeTruthy();
  148. // scroll hour list
  149. hourList.simulate(`scroll`, {});
  150. const oneHourElemHeight = hourList
  151. .find(`li`)
  152. .at(0)
  153. .getDOMNode().scrollHeight;
  154. hourList.getDOMNode().scrollTop += oneHourElemHeight;
  155. await sleep(sleepMs);
  156. expect(hourOnSelect.called).toBeTruthy();
  157. });
  158. it(`test normal mode appearance`, async () => {
  159. const ampmOnSelect = sinon.spy();
  160. const minuteOnSelect = sinon.spy();
  161. const demo = mount(
  162. <Demo
  163. minuteOnSelect={minuteOnSelect}
  164. ampmOnSelect={ampmOnSelect}
  165. mode={'normal'}
  166. selectedAmpmIndex={DEFAULTS.AMPM_INDEX}
  167. />
  168. );
  169. const all = demo.find(`.${BASE_CLASS_PREFIX}-scrolllist-item`);
  170. const ampmList = all.at(0);
  171. const minuteList = all.at(2);
  172. // check if rendered three lists
  173. expect(all.length).toBe(3);
  174. // click next disabled item
  175. // const firstDisabledMinuteIndex = minutes.findIndex(minute => minute.disabled);
  176. const nextEnabledMinuteIndex = minutes.findIndex(
  177. (minute, index) => index > DEFAULTS.MINUTE_INDEX && !minute.disabled
  178. );
  179. const minuteItemDoms = minuteList.find(`li`);
  180. minuteItemDoms.at(nextEnabledMinuteIndex).simulate('click');
  181. expect(minuteOnSelect.called).toBeTruthy();
  182. // set AMPM
  183. const ampmItemDoms = ampmList.find(`li`);
  184. const selectedCls = `${BASE_CLASS_PREFIX}-scrolllist-item-sel`;
  185. let oldSelectedAmpmIndex = -1;
  186. let newSelectedAmpmIndex = -2;
  187. ampmItemDoms.forEach((el, index) => el.hasClass(selectedCls) && (oldSelectedAmpmIndex = index));
  188. const newAmpmIndex = demo.prop('selectedAmpmIndex') + ampms.length;
  189. demo.setProps({ selectedAmpmIndex: newAmpmIndex });
  190. ampmItemDoms.forEach((el, index) => el.hasClass(selectedCls) && (newSelectedAmpmIndex = index));
  191. expect(oldSelectedAmpmIndex === newSelectedAmpmIndex).toBeTruthy();
  192. });
  193. });