import Formulate from '../src/Formulate.js'

test('can merge simple object', () => {
  let a = {
    optionA: true,
    optionB: '1234'
  }
  let b = {
    optionA: false
  }
  expect(Formulate.merge(a, b)).toEqual({
    optionA: false,
    optionB: '1234'
  })
})

test('can add to simple array', () => {
  let a = {
    optionA: true,
    optionB: ['first', 'second']
  }
  let b = {
    optionB: ['third']
  }
  expect(Formulate.merge(a, b, true)).toEqual({
    optionA: true,
    optionB: ['first', 'second', 'third']
  })
})

test('can merge recursively', () => {
  let a = {
    optionA: true,
    optionC: {
      first: '123',
      third: {
        a: 'b'
      }
    },
    optionB: '1234'
  }
  let b = {
    optionB: '567',
    optionC: {
      first: '1234',
      second: '789',
    }
  }
  expect(Formulate.merge(a, b)).toEqual({
    optionA: true,
    optionC: {
      first: '1234',
      third: {
        a: 'b'
      },
      second: '789'
    },
    optionB: '567'
  })
})

test('installs on vue instance', () => {
  const components = [
    'FormulateForm',
    'FormulateInput',
    'FormulateInputErrors',
    'FormulateInputBox',
    'FormulateInputText',
    'FormulateInputFile',
    'FormulateInputGroup',
    'FormulateInputButton',
    'FormulateInputSelect',
    'FormulateInputSlider',
    'FormulateInputTextArea'
  ]
  const registry = []
  function Vue () {}
  Vue.component = function (name, instance) {
    registry.push(name)
  }
  Formulate.install(Vue, { extended: true })
  expect(Vue.prototype.$formulate).toBe(Formulate)
  expect(registry).toEqual(components)
})

test('can extend instance in a plugin', () => {
  function Vue () {}
  Vue.component = function (name, instance) {}
  const plugin = function (i) {
    i.extend({
      rules: {
        testRule: () => false
      }
    })
  }
  Formulate.install(Vue, {
    plugins: [ plugin ]
  })

  expect(typeof Vue.prototype.$formulate.options.rules.testRule).toBe('function')
})