]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
feat(runtime-test): triggerEvent
authorEvan You <yyx990803@gmail.com>
Sun, 28 Oct 2018 21:43:27 +0000 (17:43 -0400)
committerEvan You <yyx990803@gmail.com>
Sun, 28 Oct 2018 21:43:27 +0000 (17:43 -0400)
packages/runtime-test/__tests__/testRenderer.spec.ts
packages/runtime-test/src/index.ts
packages/runtime-test/src/nodeOps.ts
packages/runtime-test/src/patchData.ts
packages/runtime-test/src/serialize.ts
packages/runtime-test/src/triggerEvent.ts [new file with mode: 0644]

index bb42ab66d61212d2fb0913c163569a8f25bd673b..9e04db18640e42779b0eff315266ad1bbf432247 100644 (file)
@@ -11,7 +11,9 @@ import {
   nextTick,
   observable,
   resetOps,
-  serialize
+  serialize,
+  renderIntsance,
+  triggerEvent
 } from '../src'
 
 describe('test renderer', () => {
@@ -152,4 +154,27 @@ describe('test renderer', () => {
 </div>`
     )
   })
+
+  it('should be able to trigger events', async () => {
+    class App extends Component {
+      count = 0
+      inc() {
+        this.count++
+      }
+      render() {
+        return h(
+          'div',
+          {
+            onClick: this.inc
+          },
+          this.count
+        )
+      }
+    }
+    const app = renderIntsance(App)
+    triggerEvent(app.$el, 'click')
+    expect(app.count).toBe(1)
+    await nextTick()
+    expect(serialize(app.$el)).toBe(`<div>1</div>`)
+  })
 })
index 82483215944b65d237818153a01eceeffe971a78..6d50d15f229df09f58bd26723b7e6ea13ab3292e 100644 (file)
@@ -34,5 +34,6 @@ export function renderIntsance<T extends Component>(
 }
 
 export { serialize } from './serialize'
+export { triggerEvent } from './triggerEvent'
 export * from './nodeOps'
 export * from '@vue/runtime-core'
index c9bf0dd67c5a61697d55583603d3f3104c4ed86c..9b4e48462f660be139bbd24725fccf36a347fc76 100644 (file)
@@ -10,6 +10,7 @@ export interface TestElement {
   tag: string
   children: TestNode[]
   props: Record<string, any>
+  eventListeners: Record<string, Function | Function[]> | null
 }
 
 export interface TestText {
@@ -68,7 +69,8 @@ function createElement(tag: string): TestElement {
     tag,
     children: [],
     props: {},
-    parentNode: null
+    parentNode: null,
+    eventListeners: null
   }
   logNodeOp({
     type: NodeOpTypes.CREATE,
index 7f635afc1be5c1da0582da701cfd49387bda8e7f..c46f82a085f6c9052075c5b2d823268dd860ce1c 100644 (file)
@@ -1,4 +1,5 @@
 import { TestElement, logNodeOp, NodeOpTypes } from './nodeOps'
+import { isOn } from '@vue/shared'
 
 export function patchData(
   el: TestElement,
@@ -14,4 +15,8 @@ export function patchData(
     propNextValue: nextValue
   })
   el.props[key] = nextValue
+  if (isOn(key)) {
+    const event = key.slice(2).toLowerCase()
+    ;(el.eventListeners || (el.eventListeners = {}))[event] = nextValue
+  }
 }
index bfc91e66aec90254bfd8e4aadcebe8c996dbb2ae..c4ec82ea8f9db3500eed37eb891f739839724fd8 100644 (file)
@@ -1,4 +1,5 @@
 import { TestElement, TestNode, NodeTypes, TestText } from './nodeOps'
+import { isOn } from '@vue/shared'
 
 export function serialize(
   node: TestNode,
@@ -19,7 +20,7 @@ function serializeElement(
 ): string {
   const props = Object.keys(node.props)
     .map(key => {
-      return `${key}=${JSON.stringify(node.props[key])}`
+      return isOn(key) ? `` : `${key}=${JSON.stringify(node.props[key])}`
     })
     .join(' ')
   const newLine = indent ? `\n` : ``
diff --git a/packages/runtime-test/src/triggerEvent.ts b/packages/runtime-test/src/triggerEvent.ts
new file mode 100644 (file)
index 0000000..5a949f6
--- /dev/null
@@ -0,0 +1,21 @@
+import { TestElement } from './nodeOps'
+
+export function triggerEvent(
+  el: TestElement,
+  event: string,
+  payload: any[] = []
+) {
+  const { eventListeners } = el
+  if (eventListeners) {
+    const listener = eventListeners[event]
+    if (listener) {
+      if (Array.isArray(listener)) {
+        for (let i = 0; i < listener.length; i++) {
+          listener[i](...payload)
+        }
+      } else {
+        listener(...payload)
+      }
+    }
+  }
+}