]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
test: test for mixins
authorEvan You <yyx990803@gmail.com>
Thu, 18 Oct 2018 23:15:17 +0000 (19:15 -0400)
committerEvan You <yyx990803@gmail.com>
Thu, 18 Oct 2018 23:15:17 +0000 (19:15 -0400)
packages/core/__tests__/mixins.spec.ts

index b7a1bc407ad07e3940db7f2fba3bcfabb6e0fd4f..5b70da88c6eb9093c32bd1f1895e751abc056ad5 100644 (file)
@@ -1,7 +1,295 @@
+import { Component, ComponentClass, mixins } from '@vue/core'
+import { createInstance } from '@vue/renderer-test'
+
+const calls: string[] = []
+
+beforeEach(() => {
+  calls.length = 0
+})
+
+class ClassMixinA extends Component<{ p1: string }, { d11: number }> {
+  // props
+  static props = {
+    p1: String
+  }
+
+  // data
+  d1 = 1
+  data() {
+    return {
+      d11: 2
+    }
+  }
+
+  // computed
+  get c1() {
+    return this.d1 + this.d11
+  }
+
+  // lifecycle
+  created() {
+    calls.push('created from mixin A')
+  }
+
+  // methods
+  foo() {
+    return this.d1
+  }
+}
+
+class ClassMixinB extends Component<{ p2: string }, { d21: number }> {
+  // props
+  static props = {
+    p2: String
+  }
+
+  // data
+  d2 = 1
+  data() {
+    return {
+      d21: 2
+    }
+  }
+
+  get c2() {
+    return this.d2 + this.d21
+  }
+
+  // lifecycle
+  created() {
+    calls.push('created from mixin B')
+  }
+
+  // methods
+  bar() {
+    return this.d2
+  }
+}
+
+const ObjectMixinA = {
+  props: {
+    p1: String
+  },
+  data() {
+    return {
+      d1: 1,
+      d11: 2
+    }
+  },
+  computed: {
+    c1() {
+      return this.d1 + this.d11
+    }
+  },
+  created() {
+    calls.push('created from mixin A')
+  },
+  methods: {
+    foo() {
+      return this.d1
+    }
+  }
+}
+
+const ObjectMixinB = {
+  props: {
+    p2: String
+  },
+  data() {
+    return {
+      d2: 1,
+      d21: 2
+    }
+  },
+  computed: {
+    c2() {
+      return this.d2 + this.d21
+    }
+  },
+  created() {
+    calls.push('created from mixin B')
+  },
+  methods: {
+    bar() {
+      return this.d2
+    }
+  }
+}
+
+function assertMixins(Test: any) {
+  const instance = createInstance(Test, {
+    p1: '1',
+    p2: '2',
+    p3: '3'
+  }) as any
+
+  // data
+  expect(instance.d1).toBe(1)
+  expect(instance.d11).toBe(2)
+  expect(instance.d2).toBe(1)
+  expect(instance.d21).toBe(2)
+  expect(instance.d3).toBe(1)
+  expect(instance.d31).toBe(2)
+
+  // props
+  expect(instance.p1).toBe('1')
+  expect(instance.p2).toBe('2')
+  expect(instance.p3).toBe('3')
+  expect(instance.$props.p1).toBe('1')
+  expect(instance.$props.p2).toBe('2')
+  expect(instance.$props.p3).toBe('3')
+
+  // computed
+  expect(instance.c1).toBe(3)
+  expect(instance.c2).toBe(3)
+  expect(instance.c3).toBe(3)
+
+  // lifecycle
+  expect(calls).toEqual([
+    'created from mixin A',
+    'created from mixin B',
+    'created from Test'
+  ])
+
+  // methods
+  expect(instance.foo()).toBe(1)
+  expect(instance.bar()).toBe(1)
+  expect(instance.baz()).toBe(1)
+}
+
 describe('mixins', () => {
-  it('should work with classes', () => {})
+  it('should work with classes', () => {
+    class Test extends mixins(ClassMixinA, ClassMixinB)<
+      { p3: string },
+      { d31: number }
+    > {
+      static props = {
+        p3: String
+      }
+
+      d3 = 1
+      data(): any {
+        return {
+          d31: 2
+        }
+      }
+
+      get c3() {
+        return this.d3 + this.d31
+      }
+
+      created() {
+        calls.push('created from Test')
+      }
+
+      baz() {
+        return this.d3
+      }
+    }
+
+    const instance = createInstance(Test, {
+      p1: '1',
+      p2: '2',
+      p3: '3'
+    })
+
+    // we duplicate the assertions because they serve as type tests as well
+
+    // data
+    expect(instance.d1).toBe(1)
+    expect(instance.d11).toBe(2)
+    expect(instance.d2).toBe(1)
+    expect(instance.d21).toBe(2)
+    expect(instance.d3).toBe(1)
+    expect(instance.d31).toBe(2)
+
+    // props
+    expect(instance.p1).toBe('1')
+    expect(instance.p2).toBe('2')
+    expect(instance.p3).toBe('3')
+    expect(instance.$props.p1).toBe('1')
+    expect(instance.$props.p2).toBe('2')
+    expect(instance.$props.p3).toBe('3')
+
+    // computed
+    expect(instance.c1).toBe(3)
+    expect(instance.c2).toBe(3)
+    expect(instance.c3).toBe(3)
+
+    // lifecycle
+    expect(calls).toEqual([
+      'created from mixin A',
+      'created from mixin B',
+      'created from Test'
+    ])
+
+    // methods
+    expect(instance.foo()).toBe(1)
+    expect(instance.bar()).toBe(1)
+    expect(instance.baz()).toBe(1)
+  })
+
+  it('should work with objects', () => {
+    class Test extends ((mixins as any)(
+      ObjectMixinA,
+      ObjectMixinB
+    ) as ComponentClass)<{ p3: string }, { d31: number }> {
+      static props = {
+        p3: String
+      }
+
+      d3 = 1
+      data(): any {
+        return {
+          d31: 2
+        }
+      }
+
+      get c3() {
+        return this.d3 + this.d31
+      }
+
+      created() {
+        calls.push('created from Test')
+      }
+
+      baz() {
+        return this.d3
+      }
+    }
+
+    assertMixins(Test)
+  })
+
+  it('should work with a mix of objects and classes', () => {
+    class Test extends ((mixins as any)(
+      ClassMixinA,
+      ObjectMixinB
+    ) as ComponentClass)<{ p3: string }, { d31: number }> {
+      static props = {
+        p3: String
+      }
+
+      d3 = 1
+      data(): any {
+        return {
+          d31: 2
+        }
+      }
+
+      get c3() {
+        return this.d3 + this.d31
+      }
+
+      created() {
+        calls.push('created from Test')
+      }
 
-  it('should work with objects', () => {})
+      baz() {
+        return this.d3
+      }
+    }
 
-  it('should work with a mix of objects and classes', () => {})
+    assertMixins(Test)
+  })
 })