| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- import assert from 'node:assert/strict'
- import { readFileSync } from 'node:fs'
- import test from 'node:test'
- import { parse } from '@vue/compiler-sfc'
- import ts from 'typescript'
- import { effectScope, nextTick, reactive, ref, watch } from 'vue'
- const source = parse(
- readFileSync(new URL('../src/views/m/pl/plan/PlanDateField.vue', import.meta.url), 'utf8')
- ).descriptor.scriptSetup!.content
- function harness() {
- const props = reactive({
- modelValue: '2026-10-24',
- label: '计划日期',
- clearable: true,
- required: false,
- readonly: false,
- disabled: false
- })
- const events: any[] = []
- const scope = effectScope()
- const bindings = {
- ref,
- watch,
- defineProps: () => props,
- defineEmits:
- () =>
- (...args: any[]) =>
- events.push(args)
- }
- const field = scope.run(() =>
- new Function(
- ...Object.keys(bindings),
- ts.transpile(source, { target: ts.ScriptTarget.ESNext }) +
- ';return {open,selected,openPicker,confirm,clear}'
- )(...Object.values(bindings))
- )
- return { props, events, field, scope }
- }
- test('Vant date field prefills saved date and only emits confirmed selection', () => {
- const h = harness()
- try {
- h.field.openPicker()
- assert.deepEqual(h.field.selected.value, ['2026', '10', '24'])
- h.field.selected.value = ['2026', '10', '25']
- h.field.open.value = false
- h.field.confirm({ selectedValues: ['2026', '10', '25'] })
- assert.deepEqual(h.events, [])
- h.field.openPicker()
- h.field.confirm({ selectedValues: ['2026', '10', '26'] })
- assert.deepEqual(h.events, [['update:modelValue', '2026-10-26']])
- assert.equal(h.field.open.value, false)
- } finally {
- h.scope.stop()
- }
- })
- test('readonly and disabled dates cannot open; external changes invalidate pending selection', async () => {
- const h = harness()
- try {
- h.props.readonly = true
- h.field.openPicker()
- assert.equal(h.field.open.value, false)
- h.props.readonly = false
- h.props.disabled = true
- h.field.openPicker()
- assert.equal(h.field.open.value, false)
- h.props.disabled = false
- await nextTick()
- h.field.openPicker()
- h.props.modelValue = '2026-11-01'
- await nextTick()
- assert.equal(h.field.open.value, false)
- h.field.confirm({ selectedValues: ['2026', '10', '26'] })
- assert.deepEqual(h.events, [])
- h.field.openPicker()
- assert.deepEqual(h.field.selected.value, ['2026', '11', '01'])
- } finally {
- h.scope.stop()
- }
- })
- test('date can only be cleared from an open optional editable picker', () => {
- const h = harness()
- try {
- h.field.clear()
- assert.deepEqual(h.events, [])
- for (const key of ['readonly', 'disabled', 'required'] as const) {
- h.field.open.value = true
- h.props[key] = true
- h.field.clear()
- assert.deepEqual(h.events, [])
- h.props[key] = false
- }
- h.props.clearable = false
- h.field.clear()
- assert.deepEqual(h.events, [])
- h.props.clearable = true
- h.field.openPicker()
- h.field.clear()
- assert.deepEqual(h.events, [['update:modelValue', '']])
- assert.equal(h.field.open.value, false)
- } finally {
- h.scope.stop()
- }
- })
|