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 )