Ancient
view release on metacpan or search on metacpan
t/1064-util-valid-edge-cases.t view on Meta::CPAN
};
subtest 'lazy/force - deferred evaluation' => sub {
my $computed = 0;
my $lazy_val = lazy(sub {
$computed++;
return 42;
});
is($computed, 0, 'lazy: not computed yet');
my $result = force($lazy_val);
is($computed, 1, 'lazy: computed after force');
is($result, 42, 'lazy: correct value');
# Multiple force calls don't re-evaluate
force($lazy_val);
force($lazy_val);
is($computed, 1, 'lazy: still only computed once');
# Lazy with complex computation
my $lazy_list = lazy(sub { [1, 2, 3, 4, 5] });
my $list = force($lazy_list);
is_deeply($list, [1, 2, 3, 4, 5], 'lazy: complex value');
};
subtest 'memo - memoization edge cases' => sub {
my $calls = 0;
my $memoized = memo(sub {
$calls++;
return $_[0] * 2;
});
is($memoized->(5), 10, 'memo: first call');
is($calls, 1, 'memo: called once');
is($memoized->(5), 10, 'memo: cached call');
is($calls, 1, 'memo: still called once');
is($memoized->(10), 20, 'memo: different arg');
is($calls, 2, 'memo: called again for new arg');
# String keys
my $str_memo = memo(sub { uc($_[0]) });
is($str_memo->("hello"), "HELLO", 'memo: string arg');
is($str_memo->("hello"), "HELLO", 'memo: string cached');
# Undef handling
my $undef_memo = memo(sub { defined $_[0] ? $_[0] : "default" });
is($undef_memo->(undef), "default", 'memo: undef arg');
is($undef_memo->(undef), "default", 'memo: undef cached');
};
subtest 'real-world: configuration validation' => sub {
my $config = {
port => 8080,
timeout => 30,
retries => 5,
debug => 1,
};
# Validate port in range
ok(is_between($config->{port}, 1, 65535), 'port in valid range');
# Clamp timeout to safe range
my $safe_timeout = clamp($config->{timeout}, 5, 120);
is($safe_timeout, 30, 'timeout in safe range');
# Use maybe for optional debug
my $debug_level = maybe($config->{debug}, 3);
is($debug_level, 3, 'debug level set');
# Sign for direction indicators
my $trend = -15;
is(sign($trend), -1, 'negative trend indicator');
};
subtest 'real-world: data pipeline with stubs' => sub {
# Use stubs as default callbacks
my $on_success = stub_true(); # Always succeeds
my $on_error = stub_false(); # Always fails
# Simulate processing
my @results;
for my $item (1, 2, 3) {
if ($on_success) {
push @results, $item * 2;
}
}
is_deeply(\@results, [2, 4, 6], 'stubs in pipeline');
# Empty defaults
my @default_array = stub_array();
my %default_hash = stub_hash();
push @default_array, 1, 2, 3;
$default_hash{key} = 'value';
is(scalar(@default_array), 3, 'stub_array is mutable');
is($default_hash{key}, 'value', 'stub_hash is mutable');
};
done_testing();
( run in 0.462 second using v1.01-cache-2.11-cpan-5511b514fd6 )