api.data-spec.ts 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. import { d3, initChart } from './c3-helper'
  2. describe('c3 api data', function() {
  3. 'use strict'
  4. var chart
  5. var args: any = {
  6. data: {
  7. columns: [
  8. ['data1', 30, 200, 100, 400, 150, 250],
  9. ['data2', 5000, 2000, 1000, 4000, 1500, 2500]
  10. ],
  11. names: {
  12. data1: 'Data Name 1',
  13. data2: 'Data Name 2'
  14. },
  15. colors: {
  16. data1: '#FF0000',
  17. data2: '#00FF00'
  18. },
  19. axes: {
  20. data1: 'y',
  21. data2: 'y2'
  22. }
  23. },
  24. axis: {
  25. y2: {
  26. show: true
  27. }
  28. }
  29. }
  30. beforeEach(function(done) {
  31. jasmine.addMatchers(customMatchers as any)
  32. chart = initChart(chart, args, done)
  33. })
  34. describe('data()', function() {
  35. it('should return all of data if no argument given', function() {
  36. var results = chart.data(),
  37. expected = ['data1', 'data2']
  38. results.forEach(function(result, i) {
  39. expect(result.id).toBe(expected[i])
  40. })
  41. })
  42. it('should return specified data if string argument given', function() {
  43. var results = chart.data('data1')
  44. expect(results.length).toBe(1)
  45. expect(results[0].id).toBe('data1')
  46. })
  47. it('should return specified data if array argument given', function() {
  48. var results = chart.data(['data1', 'data2'])
  49. expect(results.length).toBe(2)
  50. expect(results[0].id).toBe('data1')
  51. expect(results[1].id).toBe('data2')
  52. })
  53. })
  54. describe('data.shown()', function() {
  55. it('should return only shown targets', function() {
  56. var results
  57. chart.hide('data1')
  58. results = chart.data.shown()
  59. expect(results.length).toBe(1)
  60. expect(results[0].id).toBe('data2')
  61. })
  62. })
  63. describe('data.values()', function() {
  64. it('should return values for specified target', function() {
  65. var values = chart.data.values('data1'),
  66. expectedValues = [30, 200, 100, 400, 150, 250]
  67. expect(values.length).toBe(6)
  68. values.forEach(function(v, i) {
  69. expect(v).toBe(expectedValues[i])
  70. })
  71. })
  72. it('should return null when no args', function() {
  73. var values = chart.data.values()
  74. expect(values).toBeNull()
  75. })
  76. })
  77. describe('data.names()', function() {
  78. it('should return data.names specified as argument', function() {
  79. var results = chart.data.names()
  80. expect(results.data1).toBe('Data Name 1')
  81. expect(results.data2).toBe('Data Name 2')
  82. })
  83. it('should return data.names specified as api', function() {
  84. var results = chart.data.names({
  85. data1: 'New Data Name 1',
  86. data2: 'New Data Name 2'
  87. })
  88. expect(results.data1).toBe('New Data Name 1')
  89. expect(results.data2).toBe('New Data Name 2')
  90. })
  91. it('should set data.names specified as api', function() {
  92. expect(d3.select('.c3-legend-item-data1 text').text()).toBe(
  93. 'New Data Name 1'
  94. )
  95. expect(d3.select('.c3-legend-item-data2 text').text()).toBe(
  96. 'New Data Name 2'
  97. )
  98. })
  99. })
  100. describe('data.colors()', function() {
  101. it('should return data.colors specified as argument', function() {
  102. var results = chart.data.colors()
  103. ;(expect(results.data1) as any).toBeHexOrRGB('#FF0000')
  104. ;(expect(results.data2) as any).toBeHexOrRGB('#00FF00')
  105. })
  106. it('should return data.colors specified as api', function() {
  107. var results = chart.data.colors({
  108. data1: '#00FF00',
  109. data2: '#FF0000'
  110. })
  111. ;(expect(results.data1) as any).toBeHexOrRGB('#00FF00')
  112. ;(expect(results.data2) as any).toBeHexOrRGB('#FF0000')
  113. })
  114. it('should set data.colors specified as api', function() {
  115. ;(expect(
  116. d3.select('.c3-line-data1').style('stroke')
  117. ) as any).toBeHexOrRGB('#00ff00')
  118. ;(expect(
  119. d3.select('.c3-line-data2').style('stroke')
  120. ) as any).toBeHexOrRGB('#ff0000')
  121. ;(expect(
  122. d3.select('.c3-legend-item-data1 .c3-legend-item-tile').style('stroke')
  123. ) as any).toBeHexOrRGB('#00ff00')
  124. ;(expect(
  125. d3.select('.c3-legend-item-data2 .c3-legend-item-tile').style('stroke')
  126. ) as any).toBeHexOrRGB('#ff0000')
  127. })
  128. })
  129. describe('data.axes()', function() {
  130. it('should return data.axes specified as argument', function() {
  131. var results = chart.data.axes()
  132. expect(results.data1).toBe('y')
  133. expect(results.data2).toBe('y2')
  134. expect(d3.select('.c3-axis-y g.tick text').text()).toBe('0')
  135. expect(d3.select('.c3-axis-y2 g.tick text').text()).toBe('1000')
  136. })
  137. it('should return data.axes specified as api', function() {
  138. var results = chart.data.axes({
  139. data1: 'y2',
  140. data2: 'y'
  141. })
  142. expect(results.data1).toBe('y2')
  143. expect(results.data2).toBe('y')
  144. expect(d3.select('.c3-axis-y g.tick text').text()).toBe('1000')
  145. expect(d3.select('.c3-axis-y2 g.tick text').text()).toBe('0')
  146. })
  147. })
  148. describe('data.stackNormalized()', function() {
  149. beforeEach(function(done) {
  150. args = {
  151. data: {
  152. columns: [
  153. ['data1', 30, 200, 100, 400, 150, 250],
  154. ['data2', 500, 850, 1000, 200, 350, 100]
  155. ],
  156. groups: [['data1', 'data2']],
  157. stack: {
  158. normalize: true
  159. }
  160. }
  161. }
  162. chart = initChart(chart, args, done)
  163. })
  164. it('can toggle option', function(done) {
  165. expect(chart.data.stackNormalized()).toBe(true)
  166. expect(chart.internal.y.domain()).toEqual([0, 100])
  167. chart.data.stackNormalized(false)
  168. setTimeout(function() {
  169. expect(chart.data.stackNormalized()).toBe(false)
  170. expect(chart.internal.y.domain()).toEqual([0, 1200])
  171. done()
  172. }, 100)
  173. })
  174. })
  175. })
  176. describe('c3 api data.x', function() {
  177. 'use strict'
  178. var chart
  179. var args = {
  180. data: {
  181. x: 'x',
  182. columns: [
  183. ['x', 10, 30, 45, 50, 70, 100],
  184. ['data1', 30, 200, 100, 400, 150, 250],
  185. ['data2', 20, 180, 240, 100, 190]
  186. ]
  187. }
  188. }
  189. beforeEach(function(done) {
  190. chart = initChart(chart, args, done)
  191. })
  192. it('should return values for target data1', function() {
  193. var values = chart.data.values('data1'),
  194. expectedValues = [30, 200, 100, 400, 150, 250]
  195. expect(values.length).toBe(6)
  196. values.forEach(function(v, i) {
  197. expect(v).toBe(expectedValues[i])
  198. })
  199. })
  200. it('should return null when no args', function() {
  201. var values = chart.data.values()
  202. expect(values).toBeNull()
  203. })
  204. it('should return data values for data if string argument given', function() {
  205. var results = chart.data('data1')
  206. expect(results.length).toBe(1)
  207. expect(results[0].id).toBe('data1')
  208. })
  209. it('should return specified data if array argument given', function() {
  210. var results = chart.data(['data1', 'data2'])
  211. expect(results.length).toBe(2)
  212. expect(results[0].id).toBe('data1')
  213. expect(results[1].id).toBe('data2')
  214. })
  215. })
  216. describe('c3 api data.xs', function() {
  217. 'use strict'
  218. var chart
  219. var args = {
  220. data: {
  221. xs: {
  222. data1: 'x1',
  223. data2: 'x2'
  224. },
  225. columns: [
  226. ['x1', 10, 30, 45, 50, 70, 100],
  227. ['x2', 30, 50, 75, 100, 120],
  228. ['data1', 30, 200, 100, 400, 150, 250],
  229. ['data2', 20, 180, 240, 100, 190]
  230. ]
  231. }
  232. }
  233. beforeEach(function(done) {
  234. chart = initChart(chart, args, done)
  235. })
  236. it('should return values for target data1', function() {
  237. var values = chart.data.values('data1'),
  238. expectedValues = [30, 200, 100, 400, 150, 250]
  239. expect(values.length).toBe(6)
  240. values.forEach(function(v, i) {
  241. expect(v).toBe(expectedValues[i])
  242. })
  243. })
  244. it('should return null when no args', function() {
  245. var values = chart.data.values()
  246. expect(values).toBeNull()
  247. })
  248. it('should return data values for data if string argument given', function() {
  249. var results = chart.data('data1')
  250. expect(results.length).toBe(1)
  251. expect(results[0].id).toBe('data1')
  252. })
  253. it('should return specified data if array argument given', function() {
  254. var results = chart.data(['data1', 'data2'])
  255. expect(results.length).toBe(2)
  256. expect(results[0].id).toBe('data1')
  257. expect(results[1].id).toBe('data2')
  258. })
  259. })
  260. var customMatchers = {
  261. toBeHexOrRGB: function(util, customEqualityTesters) {
  262. 'use strict'
  263. function rgb2hex(rgb) {
  264. rgb = rgb.match(
  265. /^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i
  266. )
  267. return rgb && rgb.length === 4
  268. ? '#' +
  269. ('0' + parseInt(rgb[1], 10).toString(16)).slice(-2) +
  270. ('0' + parseInt(rgb[2], 10).toString(16)).slice(-2) +
  271. ('0' + parseInt(rgb[3], 10).toString(16)).slice(-2)
  272. : ''
  273. }
  274. return {
  275. compare: function(actual, expected) {
  276. if (expected === undefined) {
  277. expected = ''
  278. }
  279. var result: any = {}
  280. actual = actual.match('rgb') ? rgb2hex(actual) : actual
  281. expected = expected.match('rgb') ? rgb2hex(expected) : expected
  282. result.pass = util.equals(actual, expected, customEqualityTesters)
  283. if (result.pass) {
  284. result.message = 'Expected ' + actual + ' not to be quite so goofy'
  285. } else {
  286. result.message =
  287. 'Expected ' + actual + ' to be goofy, but it was not very goofy'
  288. }
  289. return result
  290. }
  291. }
  292. }
  293. }