/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
/*global Event*/
// import * as animations from '../../../../render/vue/modules/animation'
import animation from '../../../../render/vue/modules/animation'
describe('animation module', () => {
  weex.install(animation)
  const animationModule = weex.requireModule('animation')
  it('should transition be worked', (done) => {
    const { transition } = animationModule
    const config = {
      duration: 100,
      timingFunction: 'ease',
      delay: 100,
      styles: {
        position: 'absolute',
        'align-items': 'center',
        flex: 3,
        width: '100%',
        transform: 'translate(10px, 6px, 0)',
        'border-top-width': '1px',
        top: 0,
        'margin-left': '-10px'
      }
    }
    const vnode = {
      $el: document.createElement('div')
    }
    const callback = sinon.spy()
    const transitionValue = `all ${config.duration}ms ${config.timingFunction} ${config.delay}ms`
    transition([vnode], config, callback)
    expect(vnode.$el.style.transition).to.be.equal(transitionValue)
    vnode.$el.dispatchEvent(new Event('transitionend'))
    expect(vnode.$el.style.transition).to.be.equal('')
    expect(callback.called).to.be.true
    setTimeout(() => {
      expect(vnode.$el.style.position).to.be.equal(config.styles.position)
      expect(vnode.$el.style['-webkit-box-align']).to.be.equal(config.styles['align-items'])
      expect(vnode.$el.style['-webkit-align-items']).to.be.equal(config.styles['align-items'])
      expect(vnode.$el.style['-webkit-box-flex']).to.be.equal(config.styles.flex + '')
      expect(vnode.$el.style['margin-left']).to.be.equal(-10 * weex.config.env.scale + 'px')
      done()
    }, 100)
  })
})
