data.convert-spec.ts 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. import { c3, initChart } from './c3-helper'
  2. const $$ = c3.chart.internal.fn
  3. $$.d3 = require('d3')
  4. describe('data.convert', () => {
  5. describe('$$.convertColumnsToData', () => {
  6. it('converts column data to normalized data', () => {
  7. const data = $$.convertColumnsToData([
  8. ['cat1', 'a', 'b', 'c', 'd'],
  9. ['data1', 30, 200, 100, 400],
  10. ['cat2', 'b', 'a', 'c', 'd', 'e', 'f'],
  11. ['data2', 400, 60, 200, 800, 10, 10]
  12. ])
  13. expect(data).toEqual({
  14. keys: ['cat1', 'data1', 'cat2', 'data2'],
  15. rows: [
  16. {
  17. cat1: 'a',
  18. data1: 30,
  19. cat2: 'b',
  20. data2: 400
  21. },
  22. {
  23. cat1: 'b',
  24. data1: 200,
  25. cat2: 'a',
  26. data2: 60
  27. },
  28. {
  29. cat1: 'c',
  30. data1: 100,
  31. cat2: 'c',
  32. data2: 200
  33. },
  34. {
  35. cat1: 'd',
  36. data1: 400,
  37. cat2: 'd',
  38. data2: 800
  39. },
  40. {
  41. cat2: 'e',
  42. data2: 10
  43. },
  44. {
  45. cat2: 'f',
  46. data2: 10
  47. }
  48. ]
  49. })
  50. })
  51. it('throws when the column data contains undefined', () => {
  52. expect(() =>
  53. $$.convertColumnsToData([
  54. ['cat1', 'a', 'b', 'c', 'd'],
  55. ['data1', undefined]
  56. ])
  57. ).toThrowError(Error, /Source data is missing a component/)
  58. })
  59. })
  60. describe('$$.convertRowsToData', () => {
  61. it('converts the row data to normalized data', () => {
  62. const data = $$.convertRowsToData([
  63. ['data1', 'data2', 'data3'],
  64. [90, 120, 300],
  65. [40, 160, 240],
  66. [50, 200, 290],
  67. [120, 160, 230],
  68. [80, 130, 300],
  69. [90, 220, 320]
  70. ])
  71. expect(data).toEqual({
  72. keys: ['data1', 'data2', 'data3'],
  73. rows: [
  74. {
  75. data1: 90,
  76. data2: 120,
  77. data3: 300
  78. },
  79. {
  80. data1: 40,
  81. data2: 160,
  82. data3: 240
  83. },
  84. {
  85. data1: 50,
  86. data2: 200,
  87. data3: 290
  88. },
  89. {
  90. data1: 120,
  91. data2: 160,
  92. data3: 230
  93. },
  94. {
  95. data1: 80,
  96. data2: 130,
  97. data3: 300
  98. },
  99. {
  100. data1: 90,
  101. data2: 220,
  102. data3: 320
  103. }
  104. ]
  105. })
  106. })
  107. it('throws when the row data contains undefined', () => {
  108. expect(() =>
  109. $$.convertRowsToData([
  110. ['data1', 'data2', 'data3'],
  111. [40, 160, 240],
  112. [90, 120, undefined]
  113. ])
  114. ).toThrowError(Error, /Source data is missing a component/)
  115. })
  116. })
  117. describe('$$.convertXsvToData', () => {
  118. it('converts the csv data to normalized data', () => {
  119. const data = [
  120. {
  121. data1: '90',
  122. data2: '120',
  123. data3: '300'
  124. },
  125. {
  126. data1: '40',
  127. data2: '160',
  128. data3: '240'
  129. },
  130. {
  131. data1: '50',
  132. data2: '200',
  133. data3: '290'
  134. },
  135. {
  136. data1: '120',
  137. data2: '160',
  138. data3: '230'
  139. },
  140. {
  141. data1: '80',
  142. data2: '130',
  143. data3: '300'
  144. },
  145. {
  146. data1: '90',
  147. data2: '220',
  148. data3: '320'
  149. }
  150. ]
  151. ;(data as any).columns = ['data1', 'data2', 'data3']
  152. expect($$.convertXsvToData(data)).toEqual({
  153. keys: ['data1', 'data2', 'data3'],
  154. rows: [
  155. {
  156. data1: '90',
  157. data2: '120',
  158. data3: '300'
  159. },
  160. {
  161. data1: '40',
  162. data2: '160',
  163. data3: '240'
  164. },
  165. {
  166. data1: '50',
  167. data2: '200',
  168. data3: '290'
  169. },
  170. {
  171. data1: '120',
  172. data2: '160',
  173. data3: '230'
  174. },
  175. {
  176. data1: '80',
  177. data2: '130',
  178. data3: '300'
  179. },
  180. {
  181. data1: '90',
  182. data2: '220',
  183. data3: '320'
  184. }
  185. ]
  186. })
  187. })
  188. it('converts one lined CSV data', () => {
  189. const data = []
  190. ;(data as any).columns = ['data1', 'data2', 'data3']
  191. expect($$.convertXsvToData(data)).toEqual({
  192. keys: ['data1', 'data2', 'data3'],
  193. rows: [
  194. {
  195. data1: null,
  196. data2: null,
  197. data3: null
  198. }
  199. ]
  200. })
  201. })
  202. })
  203. describe('$$.convertDataToTargets', () => {
  204. beforeEach(() => {
  205. $$.cache = {}
  206. $$.data = {
  207. xs: []
  208. }
  209. $$.config = {
  210. data_idConverter: v => v
  211. }
  212. })
  213. it('converts the legacy data format into targets', () => {
  214. const targets = $$.convertDataToTargets([
  215. {
  216. data1: 90,
  217. data2: 120,
  218. data3: 300
  219. },
  220. {
  221. data1: 40,
  222. data2: 160,
  223. data3: 240
  224. }
  225. ])
  226. expect(targets).toEqual([
  227. {
  228. id: 'data1',
  229. id_org: 'data1',
  230. values: [
  231. { x: 0, value: 90, id: 'data1', index: 0 },
  232. { x: 1, value: 40, id: 'data1', index: 1 }
  233. ]
  234. },
  235. {
  236. id: 'data2',
  237. id_org: 'data2',
  238. values: [
  239. { x: 0, value: 120, id: 'data2', index: 0 },
  240. { x: 1, value: 160, id: 'data2', index: 1 }
  241. ]
  242. },
  243. {
  244. id: 'data3',
  245. id_org: 'data3',
  246. values: [
  247. { x: 0, value: 300, id: 'data3', index: 0 },
  248. { x: 1, value: 240, id: 'data3', index: 1 }
  249. ]
  250. }
  251. ])
  252. })
  253. it('converts the data into targets', () => {
  254. const targets = $$.convertDataToTargets({
  255. keys: ['data1', 'data2', 'data3'],
  256. rows: [
  257. {
  258. data1: 90,
  259. data2: 120,
  260. data3: 300
  261. },
  262. {
  263. data1: 40,
  264. data2: 160,
  265. data3: 240
  266. }
  267. ]
  268. })
  269. expect(targets).toEqual([
  270. {
  271. id: 'data1',
  272. id_org: 'data1',
  273. values: [
  274. { x: 0, value: 90, id: 'data1', index: 0 },
  275. { x: 1, value: 40, id: 'data1', index: 1 }
  276. ]
  277. },
  278. {
  279. id: 'data2',
  280. id_org: 'data2',
  281. values: [
  282. { x: 0, value: 120, id: 'data2', index: 0 },
  283. { x: 1, value: 160, id: 'data2', index: 1 }
  284. ]
  285. },
  286. {
  287. id: 'data3',
  288. id_org: 'data3',
  289. values: [
  290. { x: 0, value: 300, id: 'data3', index: 0 },
  291. { x: 1, value: 240, id: 'data3', index: 1 }
  292. ]
  293. }
  294. ])
  295. })
  296. })
  297. describe('$$.convertJsonToData', () => {
  298. it('converts JSON as object (no keys provided)', () => {
  299. const data = $$.convertJsonToData({
  300. data1: [90, 40, 50, 120, 80, 90],
  301. data2: [120, 160, 200, 160, 130, 220],
  302. data3: [300, 240, 290, 230, 300, 320]
  303. })
  304. expect(data).toEqual({
  305. keys: ['data1', 'data2', 'data3'],
  306. rows: [
  307. {
  308. data1: 90,
  309. data2: 120,
  310. data3: 300
  311. },
  312. {
  313. data1: 40,
  314. data2: 160,
  315. data3: 240
  316. },
  317. {
  318. data1: 50,
  319. data2: 200,
  320. data3: 290
  321. },
  322. {
  323. data1: 120,
  324. data2: 160,
  325. data3: 230
  326. },
  327. {
  328. data1: 80,
  329. data2: 130,
  330. data3: 300
  331. },
  332. {
  333. data1: 90,
  334. data2: 220,
  335. data3: 320
  336. }
  337. ]
  338. })
  339. })
  340. it('converts JSON as rows (keys provided)', () => {
  341. const data = $$.convertJsonToData(
  342. [
  343. {
  344. data1: 90,
  345. data2: 120,
  346. data3: 300,
  347. unused: 42
  348. },
  349. {
  350. data1: 40,
  351. data2: 160,
  352. data3: 240,
  353. unused: 42
  354. },
  355. {
  356. data1: 50,
  357. data2: 200,
  358. data3: 290,
  359. unused: 42
  360. },
  361. {
  362. data1: 120,
  363. data2: 160,
  364. data3: 230,
  365. unused: 42
  366. },
  367. {
  368. data1: 80,
  369. data2: 130,
  370. data3: 300,
  371. unused: 42
  372. },
  373. {
  374. data1: 90,
  375. data2: 220,
  376. data3: 320,
  377. unused: 42
  378. }
  379. ],
  380. {
  381. value: ['data1', 'data2', 'data3']
  382. }
  383. )
  384. expect(data).toEqual({
  385. keys: ['data1', 'data2', 'data3'],
  386. rows: [
  387. {
  388. data1: 90,
  389. data2: 120,
  390. data3: 300
  391. },
  392. {
  393. data1: 40,
  394. data2: 160,
  395. data3: 240
  396. },
  397. {
  398. data1: 50,
  399. data2: 200,
  400. data3: 290
  401. },
  402. {
  403. data1: 120,
  404. data2: 160,
  405. data3: 230
  406. },
  407. {
  408. data1: 80,
  409. data2: 130,
  410. data3: 300
  411. },
  412. {
  413. data1: 90,
  414. data2: 220,
  415. data3: 320
  416. }
  417. ]
  418. })
  419. })
  420. })
  421. })