jest
  .dontMock('../mixins/delegate')
  .dontMock('../mixins/events')
  .dontMock('../util/mixin')

Events = require('../mixins/events')
$ = require('jquery')

describe 'Events', ->
  class Stub extends Events
    constructor: (el) ->
      @element = $(el)

  childEl = $('<div></div>')
  wrapperEl = $('<div></div>')
  wrapperEl.append(childEl)

  child = new Stub(childEl)
  wrapper = new Stub(wrapperEl)

  it 'listens to events on itself and its children', ->
    count = 0
    inc = -> count++

    wrapper.on('inc', inc)
    wrapper.emit('inc')
    child.emit('inc')
    child.emit('inc')

    expect(count).toEqual(3)

    wrapper.off('inc', inc)

  it 'also listens to events from its parent', ->
    count = 0
    inc = -> count++

    child.on('inc', inc)
    wrapper.emit('inc')

    expect(count).toEqual(1)
    wrapper.off('inc', inc)

  it 'can listen to single events', ->
    count = 0
    inc = -> count++

    wrapper.once('inc', inc)
    child.emit('inc')
    child.emit('inc')

    expect(count).toEqual(1)
    wrapper.off('inc', inc)

  it 'can turn off elements', ->
    count = 0
    inc = -> count++

    wrapper.on('inc', inc)
    child.emit('inc')
    wrapper.off('inc', inc)
    child.emit('inc')
    child.emit('inc')

    expect(count).toEqual(1)
