import Vue from 'vue' describe('Global API: extend', () => { it('should correctly merge options', () => { const Test = Vue.extend({ name: 'test', a: 1, b: 2 }) expect(Test.options.a).toBe(1) expect(Test.options.b).toBe(2) expect(Test.super).toBe(Vue) const t = new Test({ a: 2 }) expect(t.$options.a).toBe(2) expect(t.$options.b).toBe(2) // inheritance const Test2 = Test.extend({ a: 2 }) expect(Test2.options.a).toBe(2) expect(Test2.options.b).toBe(2) const t2 = new Test2({ a: 3 }) expect(t2.$options.a).toBe(3) expect(t2.$options.b).toBe(2) }) it('should warn invalid names', () => { Vue.extend({ name: '123' }) expect('Invalid component name: "123"').toHaveBeenWarned() Vue.extend({ name: '_fesf' }) expect('Invalid component name: "_fesf"').toHaveBeenWarned() Vue.extend({ name: 'Some App' }) expect('Invalid component name: "Some App"').toHaveBeenWarned() }) it('should work when used as components', () => { const foo = Vue.extend({ template: 'foo' }) const bar = Vue.extend({ template: 'bar' }) const vm = new Vue({ template: '
', components: { foo, bar } }).$mount() expect(vm.$el.innerHTML).toBe('foobar') }) it('should merge lifecycle hooks', () => { const calls = [] const A = Vue.extend({ created () { calls.push(1) } }) const B = A.extend({ created () { calls.push(2) } }) new B({ created () { calls.push(3) } }) expect(calls).toEqual([1, 2, 3]) }) it('should merge methods', () => { const A = Vue.extend({ methods: { a () { return this.n } } }) const B = A.extend({ methods: { b () { return this.n + 1 } } }) const b = new B({ data: { n: 0 }, methods: { c () { return this.n + 2 } } }) expect(b.a()).toBe(0) expect(b.b()).toBe(1) expect(b.c()).toBe(2) }) it('should merge assets', () => { const A = Vue.extend({ components: { aa: { template: '
A
' } } }) const B = A.extend({ components: { bb: { template: '
B
' } } }) const b = new B({ template: '
' }).$mount() expect(b.$el.innerHTML).toBe('
A
B
') }) it('caching', () => { const options = { template: '
' } const A = Vue.extend(options) const B = Vue.extend(options) expect(A).toBe(B) }) // #4767 it('extended options should use different identify from parent', () => { const A = Vue.extend({ computed: {}}) const B = A.extend() B.options.computed.b = () => 'foo' expect(B.options.computed).not.toBe(A.options.computed) expect(A.options.computed.b).toBeUndefined() }) })