Ancient

 view release on metacpan or  search on metacpan

t/8014-file-xs-api.t  view on Meta::CPAN

    # Clear hooks
    file_api_test::clear_hook('read');
    ok(!file_api_test::has_hook('read'), 'read hook cleared via C');

    file_api_test::clear_hook('write');
    ok(!file_api_test::has_hook('write'), 'write hook cleared via C');
};

# ============================================
# Test C hooks with actual file I/O
# ============================================

subtest 'C read hook with file I/O' => sub {
    file::clear_hooks('read');

    my $testfile = "$tempdir/c_read_hook.txt";
    file::spew($testfile, "hello world");

    # Install uppercase hook from C
    file_api_test::install_uppercase_hook('read');

    my $content = file::slurp($testfile);
    is($content, 'HELLO WORLD', 'C read hook transforms file content');

    file_api_test::clear_hook('read');
};

subtest 'C write hook with file I/O' => sub {
    file::clear_hooks('write');

    # Install lowercase hook from C
    file_api_test::install_lowercase_hook('write');

    my $testfile = "$tempdir/c_write_hook.txt";
    file::spew($testfile, "HELLO WORLD");

    file_api_test::clear_hook('write');

    my $content = file::slurp($testfile);
    is($content, 'hello world', 'C write hook transforms before writing');
};

# ============================================
# Test encoding simulation with reverse hooks
# ============================================

subtest 'encoding simulation with C hooks' => sub {
    file::clear_hooks('read');
    file::clear_hooks('write');

    # Install reverse on both read and write
    file_api_test::install_reverse_hook('write');
    file_api_test::install_reverse_hook('read');

    my $testfile = "$tempdir/encoding_test.txt";
    my $original = "Hello, World!";

    file::spew($testfile, $original);

    # Reading should reverse the reversed content back to original
    my $decoded = file::slurp($testfile);
    is($decoded, $original, 'reverse encoding round-trip works');

    # Check what's actually on disk (clear read hook)
    file_api_test::clear_hook('read');
    my $on_disk = file::slurp($testfile);
    is($on_disk, '!dlroW ,olleH', 'data reversed on disk');

    file_api_test::clear_hook('write');
};

# ============================================
# Test hook pointer retrieval
# ============================================

subtest 'hook pointer retrieval' => sub {
    file::clear_hooks('read');

    ok(!defined(file_api_test::get_hook_ptr('read')), 'no hook ptr when not set');

    file_api_test::install_uppercase_hook('read');
    my $ptr1 = file_api_test::get_hook_ptr('read');
    # Note: ptr can be negative when large addresses are cast to signed IV
    ok(defined($ptr1) && $ptr1 != 0, 'hook ptr returned when set');

    file_api_test::install_lowercase_hook('read');
    my $ptr2 = file_api_test::get_hook_ptr('read');
    ok(defined($ptr2) && $ptr2 != 0, 'different hook ptr after change');
    isnt($ptr1, $ptr2, 'hook ptrs are different');

    file_api_test::clear_hook('read');
};

# ============================================
# Test interop between Perl and C hooks
# ============================================

subtest 'Perl and C hook interop' => sub {
    file::clear_hooks('read');

    # Set hook via C
    file_api_test::install_uppercase_hook('read');
    ok(file::has_hooks('read'), 'Perl sees C-installed hook');

    # Clear via Perl
    file::clear_hooks('read');
    ok(!file_api_test::has_hook('read'), 'C sees Perl-cleared hook');

    # Set via Perl callback
    file::register_read_hook(sub { lc($_[1]) });
    ok(file::has_hooks('read'), 'Perl hook registered');

    # Note: C simple hooks and Perl hooks use different mechanisms
    # The C file_get_read_hook only sees file_set_read_hook() hooks
    # Perl register_read_hook uses the hook list

    file::clear_hooks('read');
};

# ============================================
# Edge cases
# ============================================



( run in 0.905 second using v1.01-cache-2.11-cpan-ecdf5575e8d )