number.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. describe('util/number', function () {
  2. var utHelper = window.utHelper;
  3. var testCase = utHelper.prepare(['echarts/src/util/number']);
  4. describe('linearMap', function () {
  5. testCase('accuracyError', function (numberUtil) {
  6. var range = [-15918.3, 17724.9];
  7. var result = numberUtil.linearMap(100, [0, 100], range, true);
  8. // Should not be 17724.899999999998.
  9. expect(result).toEqual(range[1]);
  10. var range = [-62.83, 83.56];
  11. var result = numberUtil.linearMap(100, [0, 100], range, true);
  12. // Should not be 83.55999999999999.
  13. expect(result).toEqual(range[1]);
  14. });
  15. testCase('clamp', function (numberUtil) {
  16. // (1) normal order.
  17. var range = [-15918.3, 17724.9];
  18. // bigger than max
  19. var result = numberUtil.linearMap(100.1, [0, 100], range, true);
  20. expect(result).toEqual(range[1]);
  21. // smaller than min
  22. var result = numberUtil.linearMap(-2, [0, 100], range, true);
  23. expect(result).toEqual(range[0]);
  24. // equals to max
  25. var result = numberUtil.linearMap(100, [0, 100], range, true);
  26. expect(result).toEqual(range[1]);
  27. // equals to min
  28. var result = numberUtil.linearMap(0, [0, 100], range, true);
  29. expect(result).toEqual(range[0]);
  30. // (2) inverse range
  31. var range = [17724.9, -15918.3];
  32. // bigger than max
  33. var result = numberUtil.linearMap(102, [0, 100], range, true);
  34. expect(result).toEqual(range[1]);
  35. // smaller than min
  36. var result = numberUtil.linearMap(-0.001, [0, 100], range, true);
  37. expect(result).toEqual(range[0]);
  38. // equals to max
  39. var result = numberUtil.linearMap(100, [0, 100], range, true);
  40. expect(result).toEqual(range[1]);
  41. // equals to min
  42. var result = numberUtil.linearMap(0, [0, 100], range, true);
  43. expect(result).toEqual(range[0]);
  44. // (2) inverse domain
  45. // bigger than max, inverse domain
  46. var range = [-15918.3, 17724.9];
  47. // bigger than max
  48. var result = numberUtil.linearMap(102, [100, 0], range, true);
  49. expect(result).toEqual(range[0]);
  50. // smaller than min
  51. var result = numberUtil.linearMap(-0.001, [100, 0], range, true);
  52. expect(result).toEqual(range[1]);
  53. // equals to max
  54. var result = numberUtil.linearMap(100, [100, 0], range, true);
  55. expect(result).toEqual(range[0]);
  56. // equals to min
  57. var result = numberUtil.linearMap(0, [100, 0], range, true);
  58. expect(result).toEqual(range[1]);
  59. // (3) inverse domain, inverse range
  60. var range = [17724.9, -15918.3];
  61. // bigger than max
  62. var result = numberUtil.linearMap(100.1, [100, 0], range, true);
  63. expect(result).toEqual(range[0]);
  64. // smaller than min
  65. var result = numberUtil.linearMap(-2, [100, 0], range, true);
  66. expect(result).toEqual(range[1]);
  67. // equals to max
  68. var result = numberUtil.linearMap(100, [100, 0], range, true);
  69. expect(result).toEqual(range[0]);
  70. // equals to min
  71. var result = numberUtil.linearMap(0, [100, 0], range, true);
  72. expect(result).toEqual(range[1]);
  73. });
  74. testCase('noClamp', function (numberUtil) {
  75. // (1) normal order.
  76. var range = [-15918.3, 17724.9];
  77. // bigger than max
  78. var result = numberUtil.linearMap(100.1, [0, 100], range, false);
  79. expect(result).toEqual(17758.543199999996);
  80. // smaller than min
  81. var result = numberUtil.linearMap(-2, [0, 100], range, false);
  82. expect(result).toEqual(-16591.164);
  83. // equals to max
  84. var result = numberUtil.linearMap(100, [0, 100], range, false);
  85. expect(result).toEqual(17724.9);
  86. // equals to min
  87. var result = numberUtil.linearMap(0, [0, 100], range, false);
  88. expect(result).toEqual(-15918.3);
  89. // (2) inverse range
  90. var range = [17724.9, -15918.3];
  91. // bigger than max
  92. var result = numberUtil.linearMap(102, [0, 100], range, false);
  93. expect(result).toEqual(-16591.163999999997);
  94. // smaller than min
  95. var result = numberUtil.linearMap(-0.001, [0, 100], range, false);
  96. expect(result).toEqual(17725.236432);
  97. // equals to max
  98. var result = numberUtil.linearMap(100, [0, 100], range, false);
  99. expect(result).toEqual(-15918.3);
  100. // equals to min
  101. var result = numberUtil.linearMap(0, [0, 100], range, false);
  102. expect(result).toEqual(17724.9);
  103. // (2) inverse domain
  104. // bigger than max, inverse domain
  105. var range = [-15918.3, 17724.9];
  106. // bigger than max
  107. var result = numberUtil.linearMap(102, [100, 0], range, false);
  108. expect(result).toEqual(-16591.164);
  109. // smaller than min
  110. var result = numberUtil.linearMap(-0.001, [100, 0], range, false);
  111. expect(result).toEqual(17725.236432);
  112. // equals to max
  113. var result = numberUtil.linearMap(100, [100, 0], range, false);
  114. expect(result).toEqual(-15918.3);
  115. // equals to min
  116. var result = numberUtil.linearMap(0, [100, 0], range, false);
  117. expect(result).toEqual(17724.9);
  118. // (3) inverse domain, inverse range
  119. var range = [17724.9, -15918.3];
  120. // bigger than max
  121. var result = numberUtil.linearMap(100.1, [100, 0], range, false);
  122. expect(result).toEqual(17758.5432);
  123. // smaller than min
  124. var result = numberUtil.linearMap(-2, [100, 0], range, false);
  125. expect(result).toEqual(-16591.163999999997);
  126. // equals to max
  127. var result = numberUtil.linearMap(100, [100, 0], range, false);
  128. expect(result).toEqual(17724.9);
  129. // equals to min
  130. var result = numberUtil.linearMap(0, [100, 0], range, false);
  131. expect(result).toEqual(-15918.3);
  132. });
  133. testCase('normal', function (numberUtil) {
  134. doTest(true);
  135. doTest(false);
  136. function doTest(clamp) {
  137. // normal
  138. var range = [444, 555];
  139. var result = numberUtil.linearMap(40, [0, 100], range, clamp);
  140. expect(result).toEqual(488.4);
  141. // inverse range
  142. var range = [555, 444];
  143. var result = numberUtil.linearMap(40, [0, 100], range, clamp);
  144. expect(result).toEqual(510.6);
  145. // inverse domain and range
  146. var range = [555, 444];
  147. var result = numberUtil.linearMap(40, [100, 0], range, clamp);
  148. expect(result).toEqual(488.4);
  149. // inverse domain
  150. var range = [444, 555];
  151. var result = numberUtil.linearMap(40, [100, 0], range, clamp);
  152. expect(result).toEqual(510.6);
  153. }
  154. });
  155. testCase('zeroInterval', function (numberUtil) {
  156. doTest(true);
  157. doTest(false);
  158. function doTest(clamp) {
  159. // zero domain interval
  160. var range = [444, 555];
  161. var result = numberUtil.linearMap(40, [1212222223.2323232, 1212222223.2323232], range, clamp);
  162. expect(result).toEqual(499.5); // half of range.
  163. // zero range interval
  164. var range = [1221212.1221372238, 1221212.1221372238];
  165. var result = numberUtil.linearMap(40, [0, 100], range, clamp);
  166. expect(result).toEqual(1221212.1221372238);
  167. // zero domain interval and range interval
  168. var range = [1221212.1221372238, 1221212.1221372238];
  169. var result = numberUtil.linearMap(40, [43.55454545, 43.55454545], range, clamp);
  170. expect(result).toEqual(1221212.1221372238);
  171. }
  172. });
  173. });
  174. describe('parseDate', function () {
  175. testCase('parseDate', function (numberUtil) {
  176. // Invalid Date
  177. expect('' + numberUtil.parseDate(null)).toEqual('Invalid Date');
  178. expect('' + numberUtil.parseDate(void 0)).toEqual('Invalid Date');
  179. expect('' + numberUtil.parseDate('asdf')).toEqual('Invalid Date');
  180. expect('' + numberUtil.parseDate(NaN)).toEqual('Invalid Date');
  181. expect('' + numberUtil.parseDate('-')).toEqual('Invalid Date');
  182. expect('' + numberUtil.parseDate('20120304')).toEqual('Invalid Date');
  183. // Input instance of Date or timestamp
  184. expect(+numberUtil.parseDate(new Date('2012-03-04'))).toEqual(1330819200000);
  185. expect(+numberUtil.parseDate(1330819200000)).toEqual(1330819200000);
  186. expect(+numberUtil.parseDate(1330819199999.99)).toEqual(1330819200000);
  187. expect(+numberUtil.parseDate(1330819200000.01)).toEqual(1330819200000);
  188. // ISO string
  189. expect(+numberUtil.parseDate('2012-03')).toEqual(1330531200000);
  190. expect(+numberUtil.parseDate('2012-03-04')).toEqual(1330790400000);
  191. expect(+numberUtil.parseDate('2012-03-04 05')).toEqual(1330808400000);
  192. expect(+numberUtil.parseDate('2012-03-04T05')).toEqual(1330808400000);
  193. expect(+numberUtil.parseDate('2012-03-04 05:06')).toEqual(1330808760000);
  194. expect(+numberUtil.parseDate('2012-03-04T05:06')).toEqual(1330808760000);
  195. expect(+numberUtil.parseDate('2012-03-04 05:06:07')).toEqual(1330808767000);
  196. expect(+numberUtil.parseDate('2012-03-04T05:06:07')).toEqual(1330808767000);
  197. expect(+numberUtil.parseDate('2012-03-04T05:06:07.123')).toEqual(1330808767123);
  198. expect(+numberUtil.parseDate('2012-03-04T05:06:07,123')).toEqual(1330808767123);
  199. expect(+numberUtil.parseDate('2012-03-04T05:06:07.12')).toEqual(1330808767012);
  200. expect(+numberUtil.parseDate('2012-03-04T05:06:07.1')).toEqual(1330808767001);
  201. expect(+numberUtil.parseDate('2012-03-04T05:06:07,123Z')).toEqual(1330837567123);
  202. expect(+numberUtil.parseDate('2012-03-04T05:06:07.123+0800')).toEqual(1330808767123);
  203. expect(+numberUtil.parseDate('2012-03-04T05:06:07.123+08:00')).toEqual(1330808767123);
  204. expect(+numberUtil.parseDate('2012-03-04T05:06:07.123-0700')).toEqual(1330862767123);
  205. expect(+numberUtil.parseDate('2012-03-04T05:06:07.123-07:00')).toEqual(1330862767123);
  206. // Other string
  207. expect(+numberUtil.parseDate('2012')).toEqual(1325347200000);
  208. expect(+numberUtil.parseDate('2012/03')).toEqual(1330531200000);
  209. expect(+numberUtil.parseDate('2012/03/04')).toEqual(1330790400000);
  210. expect(+numberUtil.parseDate('2012-3-4')).toEqual(1330790400000);
  211. expect(+numberUtil.parseDate('2012/3')).toEqual(1330531200000);
  212. expect(+numberUtil.parseDate('2012/3/4')).toEqual(1330790400000);
  213. expect(+numberUtil.parseDate('2012/3/4 2:05')).toEqual(1330797900000);
  214. expect(+numberUtil.parseDate('2012/03/04 2:05')).toEqual(1330797900000);
  215. expect(+numberUtil.parseDate('2012/3/4 2:05:08')).toEqual(1330797908000);
  216. expect(+numberUtil.parseDate('2012/03/04 2:05:08')).toEqual(1330797908000);
  217. expect(+numberUtil.parseDate('2012/3/4 2:05:08.123')).toEqual(1330797908123);
  218. expect(+numberUtil.parseDate('2012/03/04 2:05:08.123')).toEqual(1330797908123);
  219. });
  220. });
  221. describe('reformIntervals', function () {
  222. testCase('basic', function (numberUtil) {
  223. // all
  224. expect(numberUtil.reformIntervals([
  225. {interval: [18, 62], close: [1, 1]},
  226. {interval: [-Infinity, -70], close: [0, 0]},
  227. {interval: [-70, -26], close: [1, 1]},
  228. {interval: [-26, 18], close: [1, 1]},
  229. {interval: [62, 150], close: [1, 1]},
  230. {interval: [106, 150], close: [1, 1]},
  231. {interval: [150, Infinity], close: [0, 0]}
  232. ])).toEqual([
  233. {interval: [-Infinity, -70], close: [0, 0]},
  234. {interval: [-70, -26], close: [1, 1]},
  235. {interval: [-26, 18], close: [0, 1]},
  236. {interval: [18, 62], close: [0, 1]},
  237. {interval: [62, 150], close: [0, 1]},
  238. {interval: [150, Infinity], close: [0, 0]}
  239. ]);
  240. // remove overlap
  241. expect(numberUtil.reformIntervals([
  242. {interval: [18, 62], close: [1, 1]},
  243. {interval: [50, 150], close: [1, 1]}
  244. ])).toEqual([
  245. {interval: [18, 62], close: [1, 1]},
  246. {interval: [62, 150], close: [0, 1]}
  247. ]);
  248. // remove overlap on edge
  249. expect(numberUtil.reformIntervals([
  250. {interval: [18, 62], close: [1, 1]},
  251. {interval: [62, 150], close: [1, 1]}
  252. ])).toEqual([
  253. {interval: [18, 62], close: [1, 1]},
  254. {interval: [62, 150], close: [0, 1]}
  255. ]);
  256. // remove included interval
  257. expect(numberUtil.reformIntervals([
  258. {interval: [30, 40], close: [1, 1]},
  259. {interval: [42, 54], close: [1, 1]},
  260. {interval: [45, 60], close: [1, 1]},
  261. {interval: [18, 62], close: [1, 1]}
  262. ])).toEqual([
  263. {interval: [18, 62], close: [1, 1]}
  264. ]);
  265. // remove edge
  266. expect(numberUtil.reformIntervals([
  267. {interval: [18, 62], close: [1, 1]},
  268. {interval: [30, 62], close: [1, 1]}
  269. ])).toEqual([
  270. {interval: [18, 62], close: [1, 1]}
  271. ]);
  272. });
  273. });
  274. describe('getPrecisionSafe', function () {
  275. testCase('basic', function (numberUtil) {
  276. expect(numberUtil.getPrecisionSafe(10)).toEqual(0);
  277. expect(numberUtil.getPrecisionSafe(1)).toEqual(0);
  278. expect(numberUtil.getPrecisionSafe(0)).toEqual(0);
  279. expect(numberUtil.getPrecisionSafe(100000000000000000000000000000)).toEqual(0);
  280. expect(numberUtil.getPrecisionSafe(1e+100)).toEqual(0);
  281. expect(numberUtil.getPrecisionSafe(0.1)).toEqual(1);
  282. expect(numberUtil.getPrecisionSafe(0.100)).toEqual(1);
  283. expect(numberUtil.getPrecisionSafe(0.0032)).toEqual(4);
  284. expect(numberUtil.getPrecisionSafe(0.0000000000034)).toEqual(12);
  285. expect(numberUtil.getPrecisionSafe(3.4e-10)).toEqual(10);
  286. });
  287. });
  288. describe('getPercentWithPrecision', function () {
  289. testCase('basic', function (numberUtil) {
  290. // console.log(numberUtil.getPercentWithPrecision([-1.678, -4.783, -2.664, -0.875], 0, 2));
  291. // var arr = [49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5, 49.5];
  292. var arr = [49.5, NaN];
  293. var result = [];
  294. for (var i = 0; i < arr.length; i++) {
  295. result.push(
  296. numberUtil.getPercentWithPrecision(arr, i, 0)
  297. );
  298. }
  299. console.log(result);
  300. var sum = 0;
  301. for (var i = 0; i < result.length; i++) {
  302. sum += result[i];
  303. }
  304. console.log(sum);
  305. expect(numberUtil.getPercentWithPrecision([50.5, 49.5], 0, 0)).toEqual(51);
  306. expect(numberUtil.getPercentWithPrecision([50.5, 49.5], 1, 0)).toEqual(49);
  307. expect(numberUtil.getPercentWithPrecision([12.34, 34.56, 53.1], 0, 1)).toEqual(12.3);
  308. expect(numberUtil.getPercentWithPrecision([12.34, 34.56, 53.1], 1, 1)).toEqual(34.6);
  309. expect(numberUtil.getPercentWithPrecision([12.34, 34.56, 53.1], 2, 1)).toEqual(53.1);
  310. expect(numberUtil.getPercentWithPrecision([1.678, 4.783, 2.664, 0.875], 0, 0)).toEqual(17);
  311. expect(numberUtil.getPercentWithPrecision([1.678, 4.783, 2.664, 0.875], 1, 0)).toEqual(48);
  312. expect(numberUtil.getPercentWithPrecision([1.678, 4.783, 2.664, 0.875], 2, 0)).toEqual(26);
  313. expect(numberUtil.getPercentWithPrecision([1.678, 4.783, 2.664, 0.875], 3, 0)).toEqual(9);
  314. });
  315. testCase('NaN data', function (numberUtil) {
  316. expect(numberUtil.getPercentWithPrecision([1.678, 4.783, 2.664, 0.875, '-'], 0, 0)).toEqual(17);
  317. expect(numberUtil.getPercentWithPrecision([1.678, 4.783, 2.664, 0.875, '-'], 1, 0)).toEqual(48);
  318. expect(numberUtil.getPercentWithPrecision([1.678, 4.783, 2.664, 0.875, '-'], 2, 0)).toEqual(26);
  319. expect(numberUtil.getPercentWithPrecision([1.678, 4.783, 2.664, 0.875, '-'], 3, 0)).toEqual(9);
  320. expect(numberUtil.getPercentWithPrecision([1.678, 4.783, 2.664, 0.875, '-'], 4, 0)).toEqual(0);
  321. expect(numberUtil.getPercentWithPrecision([0, undefined, '-', null, NaN], 0, 0)).toEqual(0);
  322. expect(numberUtil.getPercentWithPrecision([0, undefined, '-', null, NaN], 1, 0)).toEqual(0);
  323. expect(numberUtil.getPercentWithPrecision([0, undefined, '-', null, NaN], 2, 0)).toEqual(0);
  324. expect(numberUtil.getPercentWithPrecision([0, undefined, '-', null, NaN], 3, 0)).toEqual(0);
  325. expect(numberUtil.getPercentWithPrecision([0, undefined, '-', null, NaN], 4, 0)).toEqual(0);
  326. });
  327. });
  328. describe('nice', function () {
  329. testCase('extreme', function (numberUtil) {
  330. // Should not be 0.30000000000000004
  331. expect(numberUtil.nice(0.3869394696651766, true)).toEqual(0.3);
  332. expect(numberUtil.nice(0.3869394696651766)).toEqual(0.5);
  333. expect(numberUtil.nice(0.00003869394696651766, true)).toEqual(0.00003);
  334. expect(numberUtil.nice(0.00003869394696651766, false)).toEqual(0.00005);
  335. expect(numberUtil.nice(0, true)).toEqual(0);
  336. expect(numberUtil.nice(0)).toEqual(0);
  337. expect(numberUtil.nice(13, true)).toEqual(10);
  338. expect(numberUtil.nice(13)).toEqual(20);
  339. expect(numberUtil.nice(3900000000000000000021, true)).toEqual(3000000000000000000000);
  340. expect(numberUtil.nice(3900000000000000000021)).toEqual(5000000000000000000000);
  341. expect(numberUtil.nice(0.00000000000000000656939, true)).toEqual(0.000000000000000005);
  342. expect(numberUtil.nice(0.00000000000000000656939)).toEqual(0.00000000000000001);
  343. expect(numberUtil.nice(0.10000000000000000656939, true)).toEqual(0.1);
  344. expect(numberUtil.nice(0.10000000000000000656939)).toEqual(0.2);
  345. });
  346. });
  347. });