import { expect, test } from "vitest" import { FormInputorController, NumberInputorController, TextInputorController, } from "#Source/form/index.ts" const createItems = (): { name: TextInputorController age: NumberInputorController } => { return { name: new TextInputorController({ id: "form-name-id", value: "alpha", }), age: new NumberInputorController({ id: "form-age-id", value: 1, min: 0, max: 99, }), } } test("FormInputorController.updateValue decodes external values into child items", async () => { const items = createItems() const controller = new FormInputorController< { name: string | undefined; age: number | undefined }, typeof items >({ id: "form-id", value: { name: "alpha", age: 1, }, items, encodeValue: (schemaDict) => { return { name: schemaDict.name.value, age: schemaDict.age.value, } }, decodeValue: (value) => { return { name: value.name, age: value.age, } }, }) await Promise.all([ items.name.waitForReady(), items.age.waitForReady(), controller.waitForReady(), ]) await controller.updateValue({ name: "beta", age: 8, }) expect((await items.name.getSchema()).value).toBe("beta") expect((await items.age.getSchema()).value).toBe(8) expect((await controller.getSchema()).value).toEqual({ name: "beta", age: 8, }) }) test("FormInputorController reacts to child schema changes through encodeValue", async () => { const items = createItems() const controller = new FormInputorController< { name: string | undefined; age: number | undefined }, typeof items >({ id: "form-id", value: { name: "alpha", age: 1, }, items, encodeValue: (schemaDict) => { return { name: schemaDict.name.value, age: schemaDict.age.value, } }, decodeValue: (value) => { return { name: value.name, age: value.age, } }, }) await Promise.all([ items.name.waitForReady(), items.age.waitForReady(), controller.waitForReady(), ]) await Promise.resolve() const nextFormValue = new Promise<{ name: string | undefined; age: number | undefined }>( (resolve) => { controller.subscribeValueChange((context) => { resolve(context.newValue) }) }, ) await items.name.updateValue("gamma") expect(await nextFormValue).toEqual({ name: "gamma", age: 1, }) expect((await controller.getSchema()).value).toEqual({ name: "gamma", age: 1, }) })