Affix

 view release on metacpan or  search on metacpan

t/083_pin_conventions.t  view on Meta::CPAN

    ok $addr > 0, 'Got valid address from symbol';

    # Set global to a known value
    $set->(777);
    is $get->(), 777, 'Set global to 777';

    # 3-arg pin: bind a new scalar to the raw address
    my $pin2;
    ok pin( $pin2, $addr, Int() ), '3-arg pin to global_counter address succeeded';
    is $pin2, 777, '3-arg pin reads current value (777)';

    # Write through the new pin
    $pin2 = 888;
    is $get->(), 888, 'Writing through 3-arg pin updates C global';

    # Write through C function, read through 3-arg pin
    $set->(999);
    is $pin2, 999, 'C function update visible through 3-arg pin';
    ok unpin($pin2), 'Unpinned 3-arg pin';
};
#
subtest 'pin() 4-arg: with library object' => sub {
    my $lib_obj = load_library($lib);
    ok $lib_obj, 'load_library returned library object';
    my $pinned;
    ok pin( $pinned, $lib_obj, 'global_counter', Int() ), '4-arg pin with library object succeeded';
    $pinned = 111;
    is $get->(), 111, 'Writing through pinned scalar updates C global';
    ok unpin($pinned), 'Unpinned';
};
#
subtest 'pin() 4-arg: pin array type' => sub {
    my $pinned_buf;
    ok pin( $pinned_buf, $lib, 'global_counter', Array [ Int, 1 ] ), 'Pin as Array[Int,1]';
    ok is_pin($pinned_buf),                                          'Result is a pin';
    ok unpin($pinned_buf),                                           'Unpinned array pin';
};
#
subtest 'pin() 2-arg: clone from existing pin' => sub {

    # First create a pinned scalar via 4-arg pin
    my $original;
    ok pin( $original, $lib, 'global_counter', Int() ), '4-arg pin for source';
    $original = 42;
    is $get->(), 42, 'Set global to 42 via original pin';

    # Clone via 2-arg pin
    my $cloned;
    ok pin( $cloned, $original ), '2-arg pin cloned from original';
    is $cloned, 42, 'Cloned pin reads same value';

    # Write through clone, read through original
    $cloned = 77;
    is $original, 77, 'Original sees writes through clone';

    # Write through original, read through clone
    $original = 88;
    is $cloned, 88, 'Clone sees writes through original';

    # Both update C
    is $get->(), 88, 'C global updated through either pin';
    ok unpin($cloned),   'Unpinned clone';
    ok unpin($original), 'Unpinned original';
};
#
subtest 'unpin() returns false for non-pinned scalar' => sub {
    ok !unpin(42),      'unpin returns false for plain integer';
    ok !unpin("hello"), 'unpin returns false for string';
};
#
done_testing;



( run in 2.380 seconds using v1.01-cache-2.11-cpan-bbc515a03b3 )