text: /*
   * 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.
   */
  import { expect } from 'chai'
  
  import vanilla from '../../../frameworks/vanilla'
  import runtime from '../../../runtime'
  
  // clear ref property in vdom
  function clearRefs (json) {
    delete json.ref
    if (json.children) {
      json.children.forEach(clearRefs)
    }
  }
  
  describe('vanilla test', () => {
    it('standard APIs', () => {
      expect(vanilla.init).to.be.a('function')
      expect(vanilla.createInstance).to.be.a('function')
      expect(vanilla.destroyInstance).to.be.a('function')
      expect(vanilla.getRoot).to.be.a('function')
      expect(vanilla.receiveTasks).to.be.a('function')
    })
  
    it('create & destroy instance', () => {
      const id = 'basic-demo'
      vanilla.init(runtime.config)
      vanilla.createInstance(id, `
        var body = document.createBody()
        var div = document.createElement('div')
        body.appendChild(div)
      `, {})
      vanilla.destroyInstance(id)
    })
  
    it('getRoot', () => {
      const id = 'sample-demo'
      const code = `
        var body = document.createBody()
        var div = document.createElement('div')
        div.setStyle('color', 'red')
        var span = document.createElement('span')
        span.setAttr('value', 'text node')
        div.appendChild(span)
        body.appendChild(div)
      `
      vanilla.init(runtime.config)
      vanilla.createInstance(id, code, {})
  
      const vdom = vanilla.getRoot(id)
      clearRefs(vdom)
      expect(vdom).to.deep.equal({
        // ref: '_root',
        type: 'div',
        attr: {},
        style: {},
        children: [
          {
            // ref: '8',
            type: 'div',
            attr: {},
            style: {
              color: 'red'
            },
            children: [
              {
                // ref: '9',
                type: 'span',
                attr: {
                  value: 'text node'
                },
                style: {}
              }
            ]
          }
        ]
      })
  
      vanilla.destroyInstance(id)
    })
  
    describe('receiveTasks', () => {
      const id = 'task-demo'
  
      before(() => {
        vanilla.init(runtime.config)
        vanilla.createInstance(id, `
          var body = document.createBody()
          body.addEvent('click', function() {
            this.setStyle('width', '200')
          })
          document.addCallback(function(message) {
            body.setAttr('from', message)
          })
          `, {})
      })
  
      after(() => {
        vanilla.destroyInstance(id)
      })
  
      it('initial state', () => {
        // initial style and attr in empty
        expect(vanilla.getRoot(id).style).to.deep.equal({})
        expect(vanilla.getRoot(id).attr).to.deep.equal({})
  
        // empty task
        vanilla.receiveTasks(id, [])
      })
  
      it('invalid tasks', () => {
        vanilla.receiveTasks('invalid id', [])
        vanilla.receiveTasks(id, {})
        vanilla.receiveTasks(id, [{
          method: 'whatever',
          args: []
        }])
      })
  
      it('fireEvent', () => {
        vanilla.receiveTasks(id, [{
          method: 'fireEvent',
          args: ['_root', 'click']
        }])
        expect(vanilla.getRoot(id).style).to.deep.equal({ width: '200' })
      })
  
      it('callback', () => {
        vanilla.receiveTasks(id, [{
          method: 'callback',
          args: ['1', 'callback']
        }])
        expect(vanilla.getRoot(id).attr).to.deep.equal({ from: 'callback' })
  
        // last callback
        vanilla.receiveTasks(id, [{
          method: 'callback',
          args: ['1', 'last message', true]
        }])
        expect(vanilla.getRoot(id).attr).to.deep.equal({ from: 'last message' })
      })
    })
  })
  