晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /usr/share/doc/perl-Sub-Exporter/t/ |
Upload File : |
#!/usr/bin/perl -T
use strict;
use warnings;
=head1 TEST PURPOSE
These tests exercise the handling of collections in the exporter option lists.
=cut
use Test::More tests => 8;
use Data::OptList qw(mkopt_hash);
BEGIN { use_ok('Sub::Exporter'); }
sub is_defined {
my ($class, $value, $arg) = @_;
return defined $value;
}
my $config = {
exports => [
qw(circsaw drill handsaw nailgun),
hammer => sub { sub { print "BANG BANG BANG\n" } },
],
groups => {
default => [
'handsaw',
'hammer' => { claw => 1 },
],
cutters => [ qw(circsaw handsaw), circsaw => { as => 'buzzsaw' } ],
},
collectors => [
'defaults',
brand_preference => sub { 0 },
model_preference => sub { 1 },
sets_own_value => sub { $_[0] = { foo => 10 } },
definedp => \'is_defined',
]
};
$config->{$_} = mkopt_hash($config->{$_})
for qw(exports collectors);
{
my $collection = Sub::Exporter::_collect_collections(
$config,
[ [ circsaw => undef ], [ defaults => { foo => 1, bar => 2 } ] ],
'main',
);
is_deeply(
$collection,
{ defaults => { foo => 1, bar => 2 } },
"collection returned properly from collector",
);
}
{
my $collection = Sub::Exporter::_collect_collections(
$config,
[ [ sets_own_value => undef ] ],
'main',
);
is_deeply(
$collection,
{ sets_own_value => { foo => 10} },
"a collector can alter the stack to change its own value",
);
}
{
my $arg = [ [ defaults => [ 1 ] ], [ defaults => { foo => 1, bar => 2 } ] ];
eval { Sub::Exporter::_collect_collections($config, $arg, 'main'); };
like(
$@,
qr/collection \S+ provided multiple/,
"can't provide multiple collection values",
);
}
{
# because the brand_preference validator always fails, this should die
my $arg = [ [ brand_preference => [ 1, 2, 3 ] ] ];
eval { Sub::Exporter::_collect_collections($config, $arg, 'main') };
like(
$@,
qr/brand_preference failed validation/,
"collector validator prevents bad export"
);
}
{
# the definedp collector should require a defined value; this should be ok
my $arg = [ [ definedp => {} ] ];
my $collection = Sub::Exporter::_collect_collections($config, $arg, 'main');
is_deeply(
$collection,
{ definedp => {} },
"collector validator allows collection"
);
}
{
# the definedp collector should require a defined value; this should die
my $arg = [ [ definedp => undef ] ];
eval { Sub::Exporter::_collect_collections($config, $arg, 'main') };
like(
$@,
qr/definedp failed validation/,
"collector validator prevents bad export"
);
}
{
my $arg = [ [ model_preference => [ 1, 2, 3 ] ] ];
my $collection = Sub::Exporter::_collect_collections($config, $arg, 'main');
is_deeply(
$collection,
{ model_preference => [ 1, 2, 3 ] },
"true-returning validator allows collection",
);
}