diff --git a/test/unit/modules/compiler/compiler-options.spec.js b/test/unit/modules/compiler/compiler-options.spec.js
new file mode 100644
index 000000000..239362343
--- /dev/null
+++ b/test/unit/modules/compiler/compiler-options.spec.js
@@ -0,0 +1,117 @@
+import Vue from 'vue'
+import { compile } from 'entries/web-compiler'
+import { getAndRemoveAttr } from 'compiler/helpers'
+
+describe('compile options', () => {
+ it('should be compiled', () => {
+ const { render, staticRenderFns, errors } = compile(`
+
+
+
+ `, {
+ directives: {
+ validate (el, dir) {
+ if (dir.name === 'validate' && dir.arg) {
+ el.validate = {
+ field: dir.arg,
+ groups: dir.modifiers ? Object.keys(dir.modifiers) : []
+ }
+ }
+ }
+ },
+ modules: [{
+ transformNode (el) {
+ el.validators = el.validators || []
+ const validators = ['required', 'min', 'max', 'pattern', 'maxlength', 'minlength']
+ validators.forEach(name => {
+ const rule = getAndRemoveAttr(el, name)
+ if (rule !== undefined) {
+ el.validators.push({ name, rule })
+ }
+ })
+ },
+ genData (el) {
+ let data = ''
+ if (el.validate) {
+ data += `validate:${JSON.stringify(el.validate)},`
+ }
+ if (el.validators) {
+ data += `validators:${JSON.stringify(el.validators)},`
+ }
+ return data
+ },
+ transformCode (el, code) {
+ // check
+ if (!el.validate || !el.validators) {
+ return code
+ }
+ // setup validation result props
+ const result = { dirty: false } // define something other prop
+ el.validators.forEach(validator => {
+ result[validator.name] = null
+ })
+ // generate code
+ return `_h('validate',{props:{
+ field:${JSON.stringify(el.validate.field)},
+ groups:${JSON.stringify(el.validate.groups)},
+ validators:${JSON.stringify(el.validators)},
+ result:${JSON.stringify(result)},
+ child:${code}}
+ })`
+ }
+ }]
+ })
+ expect(render).not.toBeUndefined()
+ expect(staticRenderFns).toEqual([])
+ expect(errors).toEqual([])
+
+ const renderFn = new Function(render)
+ const vm = new Vue({
+ data: {
+ msg: 'hello'
+ },
+ components: {
+ validate: {
+ props: ['field', 'groups', 'validators', 'result', 'child'],
+ render (h) {
+ return this.child
+ },
+ computed: {
+ valid () {
+ let ret = true
+ for (let i = 0; i > this.validators.length; i++) {
+ const { name } = this.validators[i]
+ if (!this.result[name]) {
+ ret = false
+ break
+ }
+ }
+ return ret
+ }
+ },
+ mounted () {
+ // initialize validation
+ const value = this.$el.value
+ this.validators.forEach(validator => {
+ const ret = this[validator.name](value, validator.rule)
+ this.result[validator.name] = ret
+ })
+ },
+ methods: {
+ // something validators logic
+ required (val) {
+ return val.length > 0
+ },
+ max (val, rule) {
+ return !(parseInt(val, 10) > parseInt(rule, 10))
+ }
+ }
+ }
+ },
+ render: renderFn,
+ staticRenderFns
+ }).$mount()
+ expect(vm.$el.innerHTML).toBe('')
+ expect(vm.$children[0].valid).toBe(true)
+ })
+})