Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-validator

Typed fluent validation rules for Pudu

0.1.1Apache-2.01

InstallClose

RegexArgumentTest.pudu

Pudu47 lines2.2 KB

GitHub ↗
1/** @Test.Validation.RegexArgument.Suite — checks regex message metadata */2module PuduLangValidator.RegexArgumentTest34import Std.Test as Test5import PuduLangValidator.Rule as Rule6import PuduLangValidator.Rules.Text as TextRule7import PuduLangValidator.Validator as Validator89type Model = { text: Str }1011fn validator(pattern: Str) -> Validator.Validator[Model] {12  let built = TextRule.matches(Rule.ruleFor("text", |model: Model| model.text), pattern)13  match built {14    case Ok(rule) => Validator.add(Validator.create(),15      Rule.build(Rule.withMessage(rule, "Pattern \{RegularExpression\} rejected \{PropertyPath\}.")))16    case Err(_problem) => panic("expected valid regex")17  }18}1920fn main() -> Int {21  let substring = validator("ab")22  let anchored = validator("^ab$")23  let quantified = validator("^[A-Z]\{2\}-[0-9]\{4\}$")24  let failed = Validator.validate(&substring, Model{text: "zz"})25  let anchoredFailed = Validator.validate(&anchored, Model{text: "zab"})26  let invalid = TextRule.matches(Rule.ruleFor("text", |model: Model| model.text), "[")27  let invalidPattern = match invalid {28    case Ok(_rule) => false29    case Err(_problem) => true30  }31  let checks = Test.suite("RegexArgument", &[32      Test.that("substring match succeeds", Validator.validate(&substring, Model{text: "zabz"}).isValid),33      Test.that("substring mismatch fails", !failed.isValid),34      Test.equals("pattern argument renders original text", &failed.errors[0].errorMessage,35          &"Pattern ab rejected text."),36      Test.equals("regex rule reports stable code", &failed.errors[0].errorCode, &"Matches"),37      Test.that("anchored exact value succeeds", Validator.validate(&anchored, Model{text: "ab"}).isValid),38      Test.that("anchored rule rejects surrounding text", !anchoredFailed.isValid),39      Test.equals("anchored pattern remains literal in message", &anchoredFailed.errors[0].errorMessage,40          &"Pattern ^ab$ rejected text."),41      Test.that("escaped braces match a quantifier", Validator.validate(&quantified, Model{text: "AB-1234"}).isValid),42      Test.that("escaped braces reject a short code", !Validator.validate(&quantified, Model{text: "A-123"}).isValid),43      Test.that("invalid pattern fails rule construction", invalidPattern)44    ])45  Test.report(&Test.run(&checks))46}47