slider.spec.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. import { createTest, createVue, triggerEvent, destroyVM, waitImmediate } from '../util';
  2. import Slider from 'packages/slider';
  3. describe('Slider', () => {
  4. let vm;
  5. afterEach(() => {
  6. destroyVM(vm);
  7. });
  8. it('create', () => {
  9. vm = createTest(Slider);
  10. expect(vm.value).to.equal(0);
  11. });
  12. it('should not exceed min and max', done => {
  13. vm = createVue({
  14. template: `
  15. <div>
  16. <el-slider v-model="value" :min="50">
  17. </el-slider>
  18. </div>
  19. `,
  20. data() {
  21. return {
  22. value: 50
  23. };
  24. }
  25. }, true);
  26. setTimeout(() => {
  27. vm.value = 40;
  28. vm.$nextTick(() => {
  29. expect(vm.value).to.equal(50);
  30. vm.value = 120;
  31. vm.$nextTick(() => {
  32. expect(vm.value).to.equal(100);
  33. done();
  34. });
  35. });
  36. }, 10);
  37. });
  38. it('show tooltip', () => {
  39. vm = createVue({
  40. template: `
  41. <div>
  42. <el-slider v-model="value">
  43. </el-slider>
  44. </div>
  45. `,
  46. data() {
  47. return {
  48. value: 0
  49. };
  50. }
  51. }, true);
  52. const slider = vm.$children[0].$children[0];
  53. slider.handleMouseEnter();
  54. expect(slider.$refs.tooltip.showPopper).to.true;
  55. slider.handleMouseLeave();
  56. expect(slider.$refs.tooltip.showPopper).to.false;
  57. });
  58. it('hide tooltip', () => {
  59. vm = createVue({
  60. template: `
  61. <div>
  62. <el-slider v-model="value" :show-tooltip="false">
  63. </el-slider>
  64. </div>
  65. `,
  66. data() {
  67. return {
  68. value: 0
  69. };
  70. }
  71. }, true);
  72. const slider = vm.$children[0].$children[0];
  73. expect(slider.$refs.tooltip.disabled).to.true;
  74. });
  75. it('format tooltip', async() => {
  76. vm = createVue({
  77. template: `
  78. <div>
  79. <el-slider ref="slider" v-model="value" :format-tooltip="formatTooltip">
  80. </el-slider>
  81. </div>
  82. `,
  83. data() {
  84. return {
  85. value: 0
  86. };
  87. },
  88. methods: {
  89. formatTooltip(val) {
  90. return '$' + val;
  91. }
  92. }
  93. }, true);
  94. const sliderButton = vm.$refs.slider.$children[0];
  95. await waitImmediate();
  96. expect(sliderButton.formatValue).to.equal('$0');
  97. });
  98. it('drag', done => {
  99. vm = createVue({
  100. template: `
  101. <div>
  102. <el-slider v-model="value" :vertical="vertical"></el-slider>
  103. </div>
  104. `,
  105. data() {
  106. return {
  107. vertical: false,
  108. value: 0
  109. };
  110. }
  111. }, true);
  112. const slider = vm.$children[0].$children[0];
  113. slider.onButtonDown({ clientX: 0, preventDefault() {} });
  114. slider.onDragging({ clientX: 100 });
  115. slider.onDragEnd();
  116. setTimeout(() => {
  117. expect(vm.value > 0).to.true;
  118. vm.vertical = true;
  119. vm.value = 0;
  120. vm.$nextTick(() => {
  121. expect(vm.value === 0).to.true;
  122. slider.onButtonDown({ clientY: 0, preventDefault() {} });
  123. slider.onDragging({ clientY: -100 });
  124. slider.onDragEnd();
  125. setTimeout(() => {
  126. expect(vm.value > 0).to.true;
  127. done();
  128. }, 10);
  129. });
  130. }, 10);
  131. });
  132. it('accessibility', done => {
  133. vm = createVue({
  134. template: `
  135. <div>
  136. <el-slider v-model="value"></el-slider>
  137. </div>
  138. `,
  139. data() {
  140. return {
  141. value: 0.1
  142. };
  143. }
  144. }, true);
  145. const slider = vm.$children[0].$children[0];
  146. slider.onRightKeyDown();
  147. setTimeout(() => {
  148. expect(vm.value).to.equal(1);
  149. slider.onLeftKeyDown();
  150. setTimeout(() => {
  151. expect(vm.value).to.equal(0);
  152. done();
  153. }, 10);
  154. }, 10);
  155. });
  156. it('step', done => {
  157. vm = createVue({
  158. template: `
  159. <div style="width: 200px;">
  160. <el-slider v-model="value" :min="0" :max="1" :step="0.1"></el-slider>
  161. </div>
  162. `,
  163. data() {
  164. return {
  165. value: 0
  166. };
  167. }
  168. }, true);
  169. const slider = vm.$children[0].$children[0];
  170. slider.onButtonDown({ clientX: 0, preventDefault() {} });
  171. slider.onDragging({ clientX: 100 });
  172. slider.onDragEnd();
  173. setTimeout(() => {
  174. expect(vm.value > 0.4 && vm.value < 0.6).to.true;
  175. done();
  176. }, 10);
  177. });
  178. it('click', done => {
  179. vm = createVue({
  180. template: `
  181. <div>
  182. <el-slider v-model="value"></el-slider>
  183. </div>
  184. `,
  185. data() {
  186. return {
  187. value: 0
  188. };
  189. }
  190. }, true);
  191. const slider = vm.$children[0];
  192. setTimeout(() => {
  193. slider.onSliderClick({ clientX: 100 });
  194. setTimeout(() => {
  195. expect(vm.value > 0).to.true;
  196. done();
  197. }, 10);
  198. }, 10);
  199. });
  200. it('change event', done => {
  201. vm = createVue({
  202. template: `
  203. <div>
  204. <el-slider v-model="value" @change="onChange">
  205. </el-slider>
  206. </div>
  207. `,
  208. data() {
  209. return {
  210. data: 0,
  211. value: 0
  212. };
  213. },
  214. methods: {
  215. onChange(val) {
  216. this.data = val;
  217. }
  218. }
  219. }, true);
  220. const slider = vm.$children[0];
  221. vm.value = 10;
  222. setTimeout(() => {
  223. expect(vm.data).to.equal(0);
  224. slider.onSliderClick({ clientX: 100 });
  225. setTimeout(() => {
  226. expect(vm.data > 0).to.true;
  227. done();
  228. }, 10);
  229. }, 10);
  230. });
  231. it('disabled', done => {
  232. vm = createVue({
  233. template: `
  234. <div>
  235. <el-slider v-model="value" disabled></el-slider>
  236. </div>
  237. `,
  238. data() {
  239. return {
  240. value: 0
  241. };
  242. }
  243. }, true);
  244. const slider = vm.$children[0].$children[0];
  245. slider.onButtonDown({ clientX: 0 });
  246. slider.onDragging({ clientX: 100 });
  247. slider.onDragEnd();
  248. setTimeout(() => {
  249. expect(vm.value).to.equal(0);
  250. done();
  251. }, 10);
  252. });
  253. it('show input', done => {
  254. vm = createVue({
  255. template: `
  256. <div>
  257. <el-slider v-model="value" show-input></el-slider>
  258. </div>
  259. `,
  260. data() {
  261. return {
  262. value: 0
  263. };
  264. }
  265. }, true);
  266. setTimeout(() => {
  267. triggerEvent(vm.$el.querySelector('.el-input-number'), 'keyup');
  268. const inputNumber = vm.$el.querySelector('.el-input-number').__vue__;
  269. inputNumber.setCurrentValue(40);
  270. setTimeout(() => {
  271. expect(vm.value).to.equal(40);
  272. done();
  273. }, 10);
  274. }, 10);
  275. });
  276. it('show stops', () => {
  277. vm = createTest(Slider, {
  278. showStops: true,
  279. step: 10
  280. }, true);
  281. const stops = vm.$el.querySelectorAll('.el-slider__stop');
  282. expect(stops.length).to.equal(9);
  283. });
  284. it('vertical mode', done => {
  285. vm = createVue({
  286. template: `
  287. <div>
  288. <el-slider vertical v-model="value" height="200px"></el-slider>
  289. </div>
  290. `,
  291. data() {
  292. return {
  293. value: 0
  294. };
  295. }
  296. }, true);
  297. const slider = vm.$children[0];
  298. setTimeout(() => {
  299. slider.onSliderClick({ clientY: 100 });
  300. setTimeout(() => {
  301. expect(vm.value > 0).to.true;
  302. done();
  303. }, 10);
  304. }, 10);
  305. });
  306. describe('range', () => {
  307. it('basic ranged slider', () => {
  308. vm = createVue({
  309. template: `
  310. <div>
  311. <el-slider v-model="value" range></el-slider>
  312. </div>
  313. `,
  314. data() {
  315. return {
  316. value: [10, 20]
  317. };
  318. }
  319. }, true);
  320. const buttons = vm.$children[0].$children;
  321. expect(buttons.length).to.equal(2);
  322. });
  323. it('should not exceed min and max', done => {
  324. vm = createVue({
  325. template: `
  326. <div>
  327. <el-slider v-model="value" range :min="50">
  328. </el-slider>
  329. </div>
  330. `,
  331. data() {
  332. return {
  333. value: [50, 60]
  334. };
  335. }
  336. }, true);
  337. setTimeout(() => {
  338. vm.value = [40, 60];
  339. setTimeout(() => {
  340. expect(vm.value).to.deep.equal([50, 60]);
  341. vm.value = [50, 120];
  342. setTimeout(() => {
  343. expect(vm.value).to.deep.equal([50, 100]);
  344. done();
  345. }, 10);
  346. }, 10);
  347. }, 10);
  348. });
  349. it('click', done => {
  350. vm = createVue({
  351. template: `
  352. <div style="width: 200px;">
  353. <el-slider range v-model="value"></el-slider>
  354. </div>
  355. `,
  356. data() {
  357. return {
  358. value: [0, 100]
  359. };
  360. }
  361. }, true);
  362. const slider = vm.$children[0];
  363. setTimeout(() => {
  364. slider.onSliderClick({ clientX: 100 });
  365. setTimeout(() => {
  366. expect(vm.value[0] > 0).to.true;
  367. expect(vm.value[1]).to.equal(100);
  368. done();
  369. }, 10);
  370. }, 10);
  371. });
  372. it('responsive to dynamic min and max', done => {
  373. vm = createVue({
  374. template: `
  375. <div>
  376. <el-slider v-model="value" range :min="min" :max="max">
  377. </el-slider>
  378. </div>
  379. `,
  380. data() {
  381. return {
  382. min: 0,
  383. max: 100,
  384. value: [50, 80]
  385. };
  386. }
  387. }, true);
  388. setTimeout(() => {
  389. vm.min = 60;
  390. setTimeout(() => {
  391. expect(vm.value).to.deep.equal([60, 80]);
  392. vm.min = 30;
  393. vm.max = 40;
  394. setTimeout(() => {
  395. expect(vm.value).to.deep.equal([40, 40]);
  396. done();
  397. }, 10);
  398. }, 10);
  399. }, 10);
  400. });
  401. it('show stops', done => {
  402. vm = createVue({
  403. template: `
  404. <div>
  405. <el-slider
  406. v-model="value"
  407. range
  408. :step="10"
  409. show-stops></el-slider>
  410. </div>
  411. `,
  412. data() {
  413. return {
  414. value: [30, 60]
  415. };
  416. }
  417. }, true);
  418. setTimeout(() => {
  419. const stops = vm.$el.querySelectorAll('.el-slider__stop');
  420. expect(stops.length).to.equal(5);
  421. done();
  422. }, 10);
  423. });
  424. it('marks', async() => {
  425. vm = createVue({
  426. template: `
  427. <div>
  428. <el-slider
  429. v-model="value"
  430. range
  431. :step="10"
  432. :marks="marks"
  433. :min="20"
  434. show-stops></el-slider>
  435. </div>
  436. `,
  437. data() {
  438. return {
  439. value: [30, 60],
  440. marks: {
  441. 0: '0°C',
  442. 8: '8°C',
  443. 37: '37°C',
  444. 50: {
  445. style: {
  446. color: '#f50'
  447. },
  448. label: <strong>50°C</strong>
  449. }
  450. }
  451. };
  452. }
  453. }, true);
  454. waitImmediate();
  455. const stops = vm.$el.querySelectorAll('.el-slider__marks-stop.el-slider__stop');
  456. const marks = vm.$el.querySelectorAll('.el-slider__marks .el-slider__marks-text');
  457. expect(marks.length).to.equal(2);
  458. expect(stops.length).to.equal(2);
  459. });
  460. });
  461. });