
WildcardNestedTest.pudu
Pudu45 lines1.9 KB
1/** @Test.Validation.WildcardNested.Suite — checks multi-level collection selection */2module PuduLangValidator.WildcardNestedTest34import Std.Test as Test5import PuduLangValidator.Result as Validation6import PuduLangValidator.Rule as Rule7import PuduLangValidator.Rules.Child as Child8import PuduLangValidator.Rules.Text as Text9import PuduLangValidator.Validator as Validator1011type Item = { code: Str, note: Str }12type Group = { items: Array[Item] }13type Root = { groups: Array[Group] }1415fn itemRules() -> Validator.Validator[Item] {16 let code = Rule.build(Text.notEmpty(Rule.ruleFor("code", |item: Item| item.code)))17 let note = Rule.build(Text.notEmpty(Rule.ruleFor("note", |item: Item| item.note)))18 Validator.add(Validator.add(Validator.create(), code), note)19}2021fn groupRules() -> Validator.Validator[Group] {22 Validator.add(Validator.create(), Child.forEachValidator("items", |group: Group| group.items, itemRules()))23}2425fn rootRules() -> Validator.Validator[Root] {26 Validator.add(Validator.create(), Child.forEachValidator("groups", |root: Root| root.groups, groupRules()))27}2829fn main() -> Int {30 let validator = rootRules()31 let item = Item{code: "", note: ""}32 let root = Root{groups: [Group{items: [item, item]}, Group{items: [item]}]}33 let selected = Validator.validateWith(&validator, root,34 Validator.includeProperties(Validator.defaults(), ["groups[].items[].code"]))35 let exact = Validator.validateWith(&validator, root,36 Validator.includeProperties(Validator.defaults(), ["groups[0].items[1].code"]))37 let checks = Test.suite("WildcardNested", &[38 Test.equals("nested wildcards select each code", &selected.errors.map(|failure: Validation.Failure| failure.propertyName),39 &["groups[0].items[0].code", "groups[0].items[1].code", "groups[1].items[0].code"]),40 Test.equals("explicit nested indices select one code", &exact.errors.map(|failure: Validation.Failure| failure.propertyName),41 &["groups[0].items[1].code"])42 ])43 Test.report(&Test.run(&checks))44}45