import { d3, initChart } from './c3-helper'

describe('c3 chart', function() {
  'use strict'

  var chart

  var args: any = {
    svg: {
      classname: 'customclass'
    },
    data: {
      columns: [
        ['data1', 30, 200, 100, 400, 150, 250],
        ['data2', 50, 20, 10, 40, 15, 25],
        ['data3', 150, 120, 110, 140, 115, 125]
      ]
    }
  }

  beforeEach(function(done) {
    chart = initChart(chart, args, done)
  })

  describe('init', function() {
    it('should be created', function() {
      var svg = d3.select('#chart svg')
      expect(svg).not.toBeNull()
    })

    it('should bind to window focus event', done => {
      const addEventListener = window.addEventListener
      window.addEventListener = (event, handler) => {
        if (event === 'focus') {
          setTimeout(() => {
            expect(handler).toBe(chart.internal.windowFocusHandler)
            window.addEventListener = addEventListener // restore the original
            done()
          }, 10)
        }
      }
      chart = initChart(chart, args, () => {})
    })

    describe('should set 3rd party property to Function', function() {
      beforeAll(function() {
        ;(Function.prototype as any).$extIsFunction = true
      })

      it('should be created even if 3rd party property has been set', function() {
        var svg = d3.select('#chart svg')
        expect(svg).not.toBeNull()
      })

      it('should be created with a custom class', function() {
        var svg = d3.select('#chart svg')
        expect(svg.attr('class')).not.toBeNull()
        expect(svg.attr('class')).toBe('customclass')
      })
    })
  })

  describe('size', function() {
    it('should have same width', function() {
      var svg = d3.select('#chart svg')
      expect(+svg.attr('width')).toBe(640)
    })

    it('should have same height', function() {
      var svg = d3.select('#chart svg')
      expect(+svg.attr('height')).toBe(480)
    })
  })

  describe('call resize and resized callbacks', function() {
    beforeAll(function() {
      args.bindto = '#chart'
      args.axis = {
        rotated: true
      }
      args.resize_var = false
      args.resized_var = false

      args.onresize = function() {
        args.resize_var = true
      }
      args.onresized = function() {
        args.resized_var = true
      }
    })

    it('arbitrary parameters should be false before resize', function() {
      expect(args.resize_var).toBe(false)
      expect(args.resized_var).toBe(false)
    })

    it('arbitrary parameters should be true after resize', function() {
      window.dispatchEvent(new Event('resize'))
      expect(args.resize_var).toBe(true)
      expect(args.resized_var).toBe(true)
    })
  })

  describe('bindto', function() {
    describe('selector', function() {
      beforeAll(function() {
        d3.select('#chart').html('')
        args.bindto = '#chart'
      })

      it('should be created', function() {
        var svg = d3.select('#chart svg')
        expect(svg.size()).toBe(1)
      })
    })

    describe('d3.selection object', function() {
      beforeAll(function() {
        d3.select('#chart').html('')
        args.bindto = d3.select('#chart')
      })
      it('should be created', function() {
        var svg = d3.select('#chart svg')
        expect(svg.size()).toBe(1)
      })
    })

    describe('null', function() {
      beforeAll(function() {
        d3.select('#chart').html('')
        args.bindto = null
      })

      it('should not be created', function() {
        var svg = d3.select('#chart svg')
        expect(svg.size()).toBe(0)
      })
    })

    describe('empty string', function() {
      beforeAll(function() {
        d3.select('#chart').html('')
        args.bindto = ''
      })

      it('should not be created', function() {
        var svg = d3.select('#chart svg')
        expect(svg.size()).toBe(0)
      })
    })
    describe('bind to selector with rotated axis', function() {
      beforeAll(function() {
        args.bindto = '#chart'
        args.axis = {
          rotated: true
        }
      })

      it('should be created', function() {
        var svg = d3.select('#chart svg')
        expect(svg.size()).toBe(1)
      })
    })
  })

  describe('empty data', function() {
    beforeAll(function() {
      args = {
        data: {
          columns: [['data1'], ['data2']]
        }
      }
    })

    it('should generate a chart', function() {
      var ticks = chart.internal.main.select('.c3-axis-x').selectAll('g.tick')
      expect(ticks.size()).toBe(0)
    })

    describe('more empty data', function() {
      beforeAll(function() {
        args = {
          data: {
            x: 'x',
            columns: [['x'], ['data1'], ['data2']]
          },
          axis: {
            x: {
              type: 'timeseries'
            }
          }
        }
      })

      it('should generate a chart', function() {
        var ticks = chart.internal.main.select('.c3-axis-x').selectAll('g.tick')
        expect(ticks.size()).toBe(0)
      })
    })
  })
})
