Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-validator

Typed fluent validation rules for Pudu

0.1.1Apache-2.01

InstallClose

DecimalBudgetTest.pudu

Pudu43 lines2.3 KB

GitHub ↗
1/** @Test.Validation.DecimalBudget.Suite — checks reserved integer digits */2module PuduLangValidator.DecimalBudgetTest34import Std.Test as Test5import PuduLangValidator.Result as Validation6import PuduLangValidator.Rule as Rule7import PuduLangValidator.Rules.Decimal as DecimalRule8import PuduLangValidator.Validator as Validator910type Model = { amount: Decimal }1112fn validate(amount: Decimal, precision: Int, scale: Int, ignoreZeros: Bool) -> Validation.ValidationResult {13  let builder = DecimalRule.precisionScale(14    Rule.ruleFor("amount", |item: Model| item.amount), precision, scale, ignoreZeros)15  let validator = Validator.add(Validator.create(), Rule.build(builder))16  Validator.validate(&validator, Model{amount: amount})17}1819fn main() -> Int {20  let named = Rule.withMessage(DecimalRule.precisionScale(21      Rule.ruleFor("amount", |item: Model| item.amount), 3, 1, false),22    "p=\{ExpectedPrecision\} s=\{ExpectedScale\} d=\{Digits\} a=\{ActualScale\}")23  let namedResult = Validator.validate(&Validator.add(Validator.create(), Rule.build(named)),24    Model{amount: 100d})25  let checks = Test.suite("DecimalBudget", &[26      Test.that("two whole digits fit reserved scale", validate(99d, 3, 1, false).isValid),27      Test.that("three whole digits exceed reserved scale", !validate(100d, 3, 1, false).isValid),28      Test.that("negative boundary fits", validate(-99.9d, 3, 1, false).isValid),29      Test.that("negative whole overflow fails", !validate(-100d, 3, 1, false).isValid),30      Test.that("zero fits all fractional budget", validate(0d, 1, 1, false).isValid),31      Test.that("exact fractional boundary fits", validate(9.99d, 4, 2, false).isValid),32      Test.that("excess scale fails", !validate(9.999d, 4, 2, false).isValid),33      Test.that("retained trailing zeroes fail strict scale", !validate(9.9900d, 4, 2, false).isValid),34      Test.that("ignored trailing zeroes fit", validate(9.9900d, 4, 2, true).isValid),35      Test.that("zero precision fails", !validate(0d, 0, 0, false).isValid),36      Test.that("negative scale fails", !validate(1d, 3, -1, false).isValid),37      Test.that("scale beyond precision fails", !validate(1d, 2, 3, false).isValid),38      Test.equals("captured shape arguments match tested value", &namedResult.errors[0].errorMessage,39          &"p=3 s=1 d=3 a=0")40    ])41  Test.report(&Test.run(&checks))42}43