import Vue from '@vue/compat'
import {
  DeprecationTypes,
  toggleDeprecationWarning
} from '../../runtime-core/src/compat/compatConfig'
import { createApp } from '../src/esm-index'
import { triggerEvent } from './utils'
beforeEach(() => {
  toggleDeprecationWarning(false)
  Vue.configureCompat({ MODE: 2 })
})
afterEach(() => {
  Vue.configureCompat({ MODE: 3 })
  toggleDeprecationWarning(false)
})
// only testing config options that affect runtime behavior.
test('GLOBAL_KEY_CODES', () => {
  Vue.config.keyCodes = {
    foo: 86,
    bar: [38, 87]
  }
  const onFoo = jest.fn()
  const onBar = jest.fn()
  const el = document.createElement('div')
  new Vue({
    el,
    template: ``,
    methods: {
      onFoo,
      onBar
    }
  })
  triggerEvent(el.children[0], 'keyup', e => {
    e.key = '_'
    e.keyCode = 86
  })
  expect(onFoo).toHaveBeenCalledTimes(1)
  expect(onBar).toHaveBeenCalledTimes(0)
  triggerEvent(el.children[0], 'keyup', e => {
    e.key = '_'
    e.keyCode = 38
  })
  expect(onFoo).toHaveBeenCalledTimes(1)
  expect(onBar).toHaveBeenCalledTimes(1)
  triggerEvent(el.children[0], 'keyup', e => {
    e.key = '_'
    e.keyCode = 87
  })
  expect(onFoo).toHaveBeenCalledTimes(1)
  expect(onBar).toHaveBeenCalledTimes(2)
})
test('GLOBAL_IGNORED_ELEMENTS', () => {
  Vue.config.ignoredElements = [/^v-/, 'foo']
  const el = document.createElement('div')
  new Vue({
    el,
    template: ``
  })
  expect(el.innerHTML).toBe(``)
})
test('singleton config should affect apps created with createApp()', () => {
  Vue.config.ignoredElements = [/^v-/, 'foo']
  const el = document.createElement('div')
  createApp({
    template: ``
  }).mount(el)
  expect(el.innerHTML).toBe(``)
})
test('config.optionMergeStrategies', () => {
  toggleDeprecationWarning(true)
  expect(typeof Vue.config.optionMergeStrategies.created).toBe('function')
  expect(DeprecationTypes.CONFIG_OPTION_MERGE_STRATS).toHaveBeenWarned()
})