Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-validator

Typed fluent validation rules for Pudu

0.1.1Apache-2.01

InstallClose

WildcardNestedTest.pudu

Pudu45 lines1.9 KB

GitHub ↗
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