Aion
view release on metacpan or search on metacpan
t/aion/types.t view on Meta::CPAN
use common::sense; use open qw/:std :utf8/; use Carp qw//; use Cwd qw//; use File::Basename qw//; use File::Find qw//; use File::Slurper qw//; use File::Spec qw//; use File::Path qw//; use Scalar::Util qw//; use Test::More 0.98; use String::Diff q...
# # NAME
#
# Aion::Types - библиоÑека ÑÑандаÑÑнÑÑ
валидаÑоÑов и ÑлÑÐ¶Ð¸Ñ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²ÑÑ
валидаÑоÑов
#
# # SYNOPSIS
#
subtest 'SYNOPSIS' => sub {
use Aion::Types;
BEGIN {
subtype SpeakOfKitty => as StrMatch[qr/\bkitty\b/i],
message { "Speak is'nt included kitty!" };
}
local ($::_g0 = do {"Kitty!" ~~ SpeakOfKitty}, $::_e0 = do {1}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '"Kitty!" ~~ SpeakOfKitty # -> 1' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {"abc" ~~ SpeakOfKitty}, $::_e0 = do {""}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '"abc" ~~ SpeakOfKitty # -> ""' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
eval {SpeakOfKitty->validate("abc", "This")}; local ($::_g0 = $@, $::_e0 = 'Speak is\'nt included kitty!'); ok defined($::_g0) && $::_g0 =~ /^${\quotemeta $::_e0}/, 'SpeakOfKitty->validate("abc", "This") # @-> Speak is\'nt included kitty!' or ::diag ...
BEGIN {
subtype IntOrArrayRef => as (Int | ArrayRef);
}
local ($::_g0 = do {[] ~~ IntOrArrayRef}, $::_e0 = do {1}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '[] ~~ IntOrArrayRef # -> 1' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {35 ~~ IntOrArrayRef}, $::_e0 = do {1}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '35 ~~ IntOrArrayRef # -> 1' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {"" ~~ IntOrArrayRef}, $::_e0 = do {""}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '"" ~~ IntOrArrayRef # -> ""' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
coerce IntOrArrayRef, from Num, via { int($_ + .5) };
local ($::_g0 = do {IntOrArrayRef->coerce(5.5)}, $::_e0 = "6"); ::ok $::_g0 eq $::_e0, 'IntOrArrayRef->coerce(5.5) # => 6' or ::diag ::_string_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
#
# # DESCRIPTION
#
# ÐÑÐ¾Ñ Ð¼Ð¾Ð´ÑÐ»Ñ ÑкÑпоÑÑиÑÑÐµÑ Ð¿Ð¾Ð´Ð¿ÑогÑаммÑ:
#
# * `subtype`, `as`, `init_where`, `where`, `awhere`, `message` â Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ð°Ð»Ð¸Ð´Ð°ÑоÑов.
# * `SELF`, `ARGS`, `A`, `B`, `C`, `D`, `M`, `N` â Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² валидаÑоÑаÑ
Ñипа и его аÑгÑменÑов.
# * `coerce`, `from`, `via` â Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ð²ÐµÑÑоÑа знаÑений из одного клаÑÑа в дÑÑгой.
#
# ÐеÑаÑÑ
Ð¸Ñ Ð²Ð°Ð»Ð¸Ð´Ð°ÑоÑов:
#
# Any
# Control
# Union[A, B...]
# Intersection[A, B...]
# Exclude[A...]
# Option[A]
# Wantarray[A, B]
# Item
# External[type]
# Bool
# BoolLike
# Enum[e...]
# Maybe[A]
# Undef
# Defined
# Value
# Version
# Str
# Uni
# Bin
# NonEmptyStr
# StartsWith[start]
# EndsWith[end]
# Email
# Tel
# Url
# Path
# Html
# StrDate
# StrDateTime
# StrMatch[regexp]
# ClassName
# RoleName
t/aion/types.t view on Meta::CPAN
# Ref
# Tied`[class]
# LValueRef
# FormatRef
# CodeRef
# NamedCode[subname]
# ProtoCode[prototype]
# ForwardRef
# ImplementRef
# Isa[A...]
# RegexpRef
# ValueRef`[A]
# ScalarRef`[A]
# RefRef`[A]
# GlobRef
# FileHandle
# ArrayRef`[A]
# HashRef`[A]
# Object`[class]
# Me
# Rat
# Map[A => B]
# Tuple[A...]
# CycleTuple[A...]
# Dict[k => A, ...]
# RegexpLike
# CodeLike
# ArrayLike`[A]
# Lim[from, to?]
# HashLike`[A]
# HasProp[p...]
# LimKeys[from, to?]
# Like
# HasMethods[m...]
# Overload`[m...]
# InstanceOf[class...]
# ConsumerOf[role...]
# StrLike
# Len[from, to?]
# NumLike
# Float
# Double
# Range[from, to]
# Bytes[n]
# PositiveBytes[n]
#
# # SUBROUTINES
#
# ## subtype ($name, @paraphernalia)
#
# СоздаÑÑ Ð½Ð¾Ð²Ñй Ñип.
#
::done_testing; }; subtest 'subtype ($name, @paraphernalia)' => sub {
BEGIN {
subtype One => where { $_ == 1 } message { "Actual 1 only!" };
}
local ($::_g0 = do {1 ~~ One}, $::_e0 = do {1}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '1 ~~ One # -> 1' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {0 ~~ One}, $::_e0 = do {""}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '0 ~~ One # -> ""' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
::like scalar do {eval { One->validate(0) }; $@}, qr{Actual 1 only\!}, 'eval { One->validate(0) }; $@ # ~> Actual 1 only!'; undef $::_g0; undef $::_e0;
#
# `where` и `message` â ÑÑо ÑинÑакÑиÑеÑкий ÑаÑ
аÑ, а `subtype` можно иÑполÑзоваÑÑ Ð±ÐµÐ· ниÑ
.
#
BEGIN {
subtype Many => (where => sub { $_ > 1 });
}
local ($::_g0 = do {2 ~~ Many}, $::_e0 = do {1}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '2 ~~ Many # -> 1' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
::like scalar do {eval { subtype Many => (where1 => sub { $_ > 1 }) }; $@}, qr{subtype Many unused keys left: where1}, 'eval { subtype Many => (where1 => sub { $_ > 1 }) }; $@ # ~> subtype Many unused keys left: where1'; undef $::_g0; undef $::_e0;
::like scalar do {eval { subtype 'Many' }; $@}, qr{subtype Many: main::Many exists\!}, 'eval { subtype \'Many\' }; $@ # ~> subtype Many: main::Many exists!'; undef $::_g0; undef $::_e0;
#
# ## as ($super_type)
#
# ÐÑполÑзÑеÑÑÑ Ñ `subtype` Ð´Ð»Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ñоздаваемого Ñипа `$super_type`.
#
# ## init_where ($code)
#
# ÐниÑиализиÑÑÐµÑ Ñип Ñ Ð½Ð¾Ð²Ñми аÑгÑменÑами. ÐÑполÑзÑеÑÑÑ Ñ `subtype`.
#
::done_testing; }; subtest 'init_where ($code)' => sub {
BEGIN {
subtype 'LessThen[n]',
init_where { Num->validate(A, "Argument LessThen[n]") }
where { $_ < A };
}
local ($::_g0 = do {eval { LessThen["string"] }; $@}, $::_e0 = "Argument LessThen[n]"); ::ok $::_g0 =~ /^${\quotemeta $::_e0}/, 'eval { LessThen["string"] }; $@ # ^=> Argument LessThen[n]' or ::diag ::_string_diff($::_g0, $::_e0, 1); undef $::_g0; u...
local ($::_g0 = do {5 ~~ LessThen[5]}, $::_e0 = do {""}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '5 ~~ LessThen[5] # -> ""' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
#
# ## where ($code)
#
# ÐÑполÑзÑÐµÑ `$code` как ÑеÑÑ. ÐнаÑение Ð´Ð»Ñ ÑеÑÑа пеÑедаÑÑÑÑ Ð² `$_`.
#
::done_testing; }; subtest 'where ($code)' => sub {
BEGIN {
subtype 'Two',
where { $_ == 2 };
}
local ($::_g0 = do {2 ~~ Two}, $::_e0 = do {1}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '2 ~~ Two # -> 1' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {3 ~~ Two}, $::_e0 = do {""}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '3 ~~ Two # -> ""' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
#
# ## awhere ($code)
#
# ÐÑполÑзÑеÑÑÑ Ñ `subtype`.
#
# ÐÑли Ñип Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñ Ð°ÑгÑменÑами и без, Ñо иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿ÑовеÑки набоÑа Ñ Ð°ÑгÑменÑами, а `where` â без.
#
::done_testing; }; subtest 'awhere ($code)' => sub {
BEGIN {
subtype 'GreatThen`[num]',
where { $_ > 0 }
awhere { $_ > A }
;
}
local ($::_g0 = do {0 ~~ GreatThen}, $::_e0 = do {""}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '0 ~~ GreatThen # -> ""' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {1 ~~ GreatThen}, $::_e0 = do {1}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '1 ~~ GreatThen # -> 1' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {3 ~~ GreatThen[3]}, $::_e0 = do {""}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '3 ~~ GreatThen[3] # -> ""' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
local ($::_g0 = do {4 ~~ GreatThen[3]}, $::_e0 = do {1}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '4 ~~ GreatThen[3] # -> 1' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
#
# ÐеобÑ
одимо, еÑли аÑгÑменÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑ.
#
eval {subtype 'Ex`[a]', where {}}; local ($::_g0 = $@, $::_e0 = 'subtype Ex`[a]: needs an awhere'); ok defined($::_g0) && $::_g0 =~ /^${\quotemeta $::_e0}/, 'subtype \'Ex`[a]\', where {} # @-> subtype Ex`[a]: needs an awhere' or ::diag ::_string_diff...
eval {subtype 'Ex', awhere {}}; local ($::_g0 = $@, $::_e0 = 'subtype Ex: awhere is excess'); ok defined($::_g0) && $::_g0 =~ /^${\quotemeta $::_e0}/, 'subtype \'Ex\', awhere {} # @-> subtype Ex: awhere is excess' or ::diag ::_string_diff($::_g0, $::...
BEGIN {
subtype 'MyEnum`[item...]',
as Str,
awhere { $_ ~~ scalar ARGS }
;
}
local ($::_g0 = do {"ab" ~~ MyEnum[qw/ab cd/]}, $::_e0 = do {1}); ::ok defined($::_g0) == defined($::_e0) && $::_g0 eq $::_e0, '"ab" ~~ MyEnum[qw/ab cd/] # -> 1' or ::diag ::_struct_diff($::_g0, $::_e0); undef $::_g0; undef $::_e0;
#
# ## SELF
( run in 1.052 second using v1.01-cache-2.11-cpan-5837b0d9d2c )