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 )