From 29811d1fe8b6de93eb4ae77cd6a57d85668f16a0 Mon Sep 17 00:00:00 2001 From: likui <2218301630@qq.com> Date: Wed, 16 Oct 2019 13:47:58 +0800 Subject: [PATCH] test(compiler-dom): add test for vModel transform (#289) --- .../__snapshots__/vModel.spec.ts.snap | 192 ++++++++++++++++++ .../__tests__/transforms/vModel.spec.ts | 122 ++++++++++- 2 files changed, 305 insertions(+), 9 deletions(-) create mode 100644 packages/compiler-dom/__tests__/transforms/__snapshots__/vModel.spec.ts.snap diff --git a/packages/compiler-dom/__tests__/transforms/__snapshots__/vModel.spec.ts.snap b/packages/compiler-dom/__tests__/transforms/__snapshots__/vModel.spec.ts.snap new file mode 100644 index 000000000..968a19db9 --- /dev/null +++ b/packages/compiler-dom/__tests__/transforms/__snapshots__/vModel.spec.ts.snap @@ -0,0 +1,192 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`compiler: transform v-model modifiers .lazy 1`] = ` +"const _Vue = Vue + +return function render() { + with (this) { + const { vModelText: _vModelText, createVNode: _createVNode, applyDirectives: _applyDirectives, createBlock: _createBlock, openBlock: _openBlock } = _Vue + + return (_openBlock(), _applyDirectives(_createBlock(\\"input\\", { + modelValue: model, + \\"onUpdate:modelValue\\": $event => (model = $event) + }, null, 8 /* PROPS */, [\\"modelValue\\", \\"onUpdate:modelValue\\"]), [ + [ + _vModelText, + model, + void 0, + { lazy: true } + ] + ])) + } +}" +`; + +exports[`compiler: transform v-model modifiers .number 1`] = ` +"const _Vue = Vue + +return function render() { + with (this) { + const { vModelText: _vModelText, createVNode: _createVNode, applyDirectives: _applyDirectives, createBlock: _createBlock, openBlock: _openBlock } = _Vue + + return (_openBlock(), _applyDirectives(_createBlock(\\"input\\", { + modelValue: model, + \\"onUpdate:modelValue\\": $event => (model = $event) + }, null, 8 /* PROPS */, [\\"modelValue\\", \\"onUpdate:modelValue\\"]), [ + [ + _vModelText, + model, + void 0, + { number: true } + ] + ])) + } +}" +`; + +exports[`compiler: transform v-model modifiers .trim 1`] = ` +"const _Vue = Vue + +return function render() { + with (this) { + const { vModelText: _vModelText, createVNode: _createVNode, applyDirectives: _applyDirectives, createBlock: _createBlock, openBlock: _openBlock } = _Vue + + return (_openBlock(), _applyDirectives(_createBlock(\\"input\\", { + modelValue: model, + \\"onUpdate:modelValue\\": $event => (model = $event) + }, null, 8 /* PROPS */, [\\"modelValue\\", \\"onUpdate:modelValue\\"]), [ + [ + _vModelText, + model, + void 0, + { trim: true } + ] + ])) + } +}" +`; + +exports[`compiler: transform v-model simple expression 1`] = ` +"const _Vue = Vue + +return function render() { + with (this) { + const { vModelText: _vModelText, createVNode: _createVNode, applyDirectives: _applyDirectives, createBlock: _createBlock, openBlock: _openBlock } = _Vue + + return (_openBlock(), _applyDirectives(_createBlock(\\"input\\", { + modelValue: model, + \\"onUpdate:modelValue\\": $event => (model = $event) + }, null, 8 /* PROPS */, [\\"modelValue\\", \\"onUpdate:modelValue\\"]), [ + [_vModelText, model] + ])) + } +}" +`; + +exports[`compiler: transform v-model simple expression for input (checkbox) 1`] = ` +"const _Vue = Vue + +return function render() { + with (this) { + const { vModelCheckbox: _vModelCheckbox, createVNode: _createVNode, applyDirectives: _applyDirectives, createBlock: _createBlock, openBlock: _openBlock } = _Vue + + return (_openBlock(), _applyDirectives(_createBlock(\\"input\\", { + type: \\"checkbox\\", + modelValue: model, + \\"onUpdate:modelValue\\": $event => (model = $event) + }, null, 8 /* PROPS */, [\\"modelValue\\", \\"onUpdate:modelValue\\"]), [ + [_vModelCheckbox, model] + ])) + } +}" +`; + +exports[`compiler: transform v-model simple expression for input (dynamic type) 1`] = ` +"const _Vue = Vue + +return function render() { + with (this) { + const { vModelDynamic: _vModelDynamic, createVNode: _createVNode, applyDirectives: _applyDirectives, resolveDirective: _resolveDirective, createBlock: _createBlock, openBlock: _openBlock } = _Vue + + const _directive_bind = _resolveDirective(\\"bind\\") + + return (_openBlock(), _applyDirectives(_createBlock(\\"input\\", { + modelValue: model, + \\"onUpdate:modelValue\\": $event => (model = $event) + }, null, 8 /* PROPS */, [\\"modelValue\\", \\"onUpdate:modelValue\\"]), [ + [_directive_bind, foo, \\"type\\"], + [_vModelDynamic, model] + ])) + } +}" +`; + +exports[`compiler: transform v-model simple expression for input (radio) 1`] = ` +"const _Vue = Vue + +return function render() { + with (this) { + const { vModelRadio: _vModelRadio, createVNode: _createVNode, applyDirectives: _applyDirectives, createBlock: _createBlock, openBlock: _openBlock } = _Vue + + return (_openBlock(), _applyDirectives(_createBlock(\\"input\\", { + type: \\"radio\\", + modelValue: model, + \\"onUpdate:modelValue\\": $event => (model = $event) + }, null, 8 /* PROPS */, [\\"modelValue\\", \\"onUpdate:modelValue\\"]), [ + [_vModelRadio, model] + ])) + } +}" +`; + +exports[`compiler: transform v-model simple expression for input (text) 1`] = ` +"const _Vue = Vue + +return function render() { + with (this) { + const { vModelText: _vModelText, createVNode: _createVNode, applyDirectives: _applyDirectives, createBlock: _createBlock, openBlock: _openBlock } = _Vue + + return (_openBlock(), _applyDirectives(_createBlock(\\"input\\", { + type: \\"text\\", + modelValue: model, + \\"onUpdate:modelValue\\": $event => (model = $event) + }, null, 8 /* PROPS */, [\\"modelValue\\", \\"onUpdate:modelValue\\"]), [ + [_vModelText, model] + ])) + } +}" +`; + +exports[`compiler: transform v-model simple expression for select 1`] = ` +"const _Vue = Vue + +return function render() { + with (this) { + const { vModelSelect: _vModelSelect, createVNode: _createVNode, applyDirectives: _applyDirectives, createBlock: _createBlock, openBlock: _openBlock } = _Vue + + return (_openBlock(), _applyDirectives(_createBlock(\\"select\\", { + modelValue: model, + \\"onUpdate:modelValue\\": $event => (model = $event) + }, null, 8 /* PROPS */, [\\"modelValue\\", \\"onUpdate:modelValue\\"]), [ + [_vModelSelect, model] + ])) + } +}" +`; + +exports[`compiler: transform v-model simple expression for textarea 1`] = ` +"const _Vue = Vue + +return function render() { + with (this) { + const { vModelText: _vModelText, createVNode: _createVNode, applyDirectives: _applyDirectives, createBlock: _createBlock, openBlock: _openBlock } = _Vue + + return (_openBlock(), _applyDirectives(_createBlock(\\"textarea\\", { + modelValue: model, + \\"onUpdate:modelValue\\": $event => (model = $event) + }, null, 8 /* PROPS */, [\\"modelValue\\", \\"onUpdate:modelValue\\"]), [ + [_vModelText, model] + ])) + } +}" +`; diff --git a/packages/compiler-dom/__tests__/transforms/vModel.spec.ts b/packages/compiler-dom/__tests__/transforms/vModel.spec.ts index 2ed15283e..393b62d91 100644 --- a/packages/compiler-dom/__tests__/transforms/vModel.spec.ts +++ b/packages/compiler-dom/__tests__/transforms/vModel.spec.ts @@ -1,7 +1,14 @@ -import { parse, transform, CompilerOptions } from '@vue/compiler-core' +import { parse, transform, CompilerOptions, generate } from '@vue/compiler-core' import { transformModel } from '../../src/transforms/vModel' import { transformElement } from '../../../compiler-core/src/transforms/transformElement' import { DOMErrorCodes } from '../../src/errors' +import { + V_MODEL_CHECKBOX, + V_MODEL_DYNAMIC, + V_MODEL_RADIO, + V_MODEL_SELECT, + V_MODEL_TEXT +} from '../../src/runtimeHelpers' function transformWithModel(template: string, options: CompilerOptions = {}) { const ast = parse(template) @@ -15,14 +22,111 @@ function transformWithModel(template: string, options: CompilerOptions = {}) { return ast } -describe('compiler: v-model transform', () => { - it('should raise error if used file input element', () => { - const onError = jest.fn() - transformWithModel(``, { - onError +describe('compiler: transform v-model', () => { + test('simple expression', () => { + const root = transformWithModel('') + + expect(root.helpers).toContain(V_MODEL_TEXT) + expect(generate(root).code).toMatchSnapshot() + }) + + test('simple expression for input (text)', () => { + const root = transformWithModel('') + + expect(root.helpers).toContain(V_MODEL_TEXT) + expect(generate(root).code).toMatchSnapshot() + }) + + test('simple expression for input (radio)', () => { + const root = transformWithModel('') + + expect(root.helpers).toContain(V_MODEL_RADIO) + expect(generate(root).code).toMatchSnapshot() + }) + + test('simple expression for input (checkbox)', () => { + const root = transformWithModel('') + + expect(root.helpers).toContain(V_MODEL_CHECKBOX) + expect(generate(root).code).toMatchSnapshot() + }) + + test('simple expression for input (dynamic type)', () => { + const root = transformWithModel('') + + expect(root.helpers).toContain(V_MODEL_DYNAMIC) + expect(generate(root).code).toMatchSnapshot() + }) + + test('simple expression for select', () => { + const root = transformWithModel('