Chandra

 view release on metacpan or  search on metacpan

t/34_socket_edge.t  view on Meta::CPAN

}

# === encode_frame / decode_frames with empty data ===
{
    my $frame = Chandra::Socket::Connection->encode_frame({ channel => 'empty', data => {} });
    my @decoded = Chandra::Socket::Connection->decode_frames($frame);
    is(scalar @decoded, 1, 'empty data decoded');
    is_deeply($decoded[0]->{data}, {}, 'empty data preserved');
}

# === encode_frame / decode_frames with unicode ===
{
    my $frame = Chandra::Socket::Connection->encode_frame({ channel => 'unicode', data => { text => "日本語" } });
    my @decoded = Chandra::Socket::Connection->decode_frames($frame);
    is($decoded[0]->{data}{text}, "日本語", 'unicode preserved through encode/decode');
}

# === decode_frames with empty buffer ===
{
    my @decoded = Chandra::Socket::Connection->decode_frames('');
    is(scalar @decoded, 0, 'empty buffer returns no messages');
}

# === decode_frames with incomplete length header ===
{

t/36_tray_edge.t  view on Meta::CPAN

	my $ret = $tray->update_item('B', label => 'C');
	is($ret, $tray, 'update_item with unknown label returns self');
	is($tray->items->[0]{label}, 'A', 'original item unchanged');
}

# --- Unicode labels ---
{
	my $tray = Chandra::Tray->new;
	$tray->add_item("\x{2603} Snowman" => sub {});
	my $items = $tray->items;
	is($items->[0]{label}, "\x{2603} Snowman", 'unicode label preserved');
}

# --- add_submenu with empty array ---
{
	my $tray = Chandra::Tray->new;
	my $ret = $tray->add_submenu('Empty', []);
	is($ret, $tray, 'empty submenu returns self');
	is($tray->item_count, 1, 'empty submenu added');
	is(scalar @{$tray->items->[0]{submenu}}, 0, 'submenu is empty array');
}

t/46_assets_edge.t  view on Meta::CPAN


    eval { $a->inline_image('nonexistent.png') };
    like($@, qr/Cannot read/, 'inline_image on missing file croaks');
}

# ---- Unicode filename ----

{
    my $a = Chandra::Assets->new(root => $dir);
    my $uname = "caf\xc3\xa9.txt";  # UTF-8 bytes for café
    eval { _write("$dir/$uname", "unicode content") };

    SKIP: {
        skip "filesystem doesn't support unicode", 2 if $@ || !-f "$dir/$uname";
        ok($a->exists($uname), 'unicode filename exists');
        is($a->read($uname), "unicode content", 'read unicode filename');
    }
}

# ---- Deeply nested path ----

{
    my $a = Chandra::Assets->new(root => $dir);
    is($a->read('sub/deep/a.css'), 'a {}', 'read deeply nested file');
    ok($a->exists('sub/deep/a.css'), 'deeply nested file exists');
}

t/50_dragdrop_edge.t  view on Meta::CPAN

    $dd->_dispatch($json);
    is(scalar @got, 50, '50 files handled');
}

# ---- Unicode file paths ----
{
    my $dd = Chandra::DragDrop->new;
    my @got;
    $dd->on_file_drop(sub { @got = @{$_[0]} });
    $dd->_dispatch('{"type":"file_drop","files":["/tmp/caf\u00e9.txt","/tmp/\u2603.png"],"target":{"id":"","class":"","tag":"BODY"}}');
    is(scalar @got, 2, 'unicode paths parsed');
    like($got[0], qr/caf/, 'unicode path content');
}

# ---- Empty text drop ----
{
    my $dd = Chandra::DragDrop->new;
    my $got_text;
    $dd->on_text_drop(sub { $got_text = $_[0] });
    $dd->_dispatch('{"type":"text_drop","text":"","target":{"id":"","class":"","tag":"BODY"}}');
    is($got_text, '', 'empty text drop delivered');
}

t/52_contextmenu_edge.t  view on Meta::CPAN

}

# ---- Unicode labels ----
{
    my $cm = Chandra::ContextMenu->new(
        items => [
            { label => "\x{2603} Snowman", action => sub {} },
            { label => "Caf\x{e9}", action => sub {} },
        ],
    );
    like($cm->items->[0]{label}, qr/Snowman/, 'unicode label stored');
    $cm->attach('#x');
    my $js = $cm->js_code;
    like($js, qr/Snowman/, 'unicode in JS output');
}

# ---- Many items ----
{
    my @items = map { { label => "Item $_", action => sub {} } } 1..100;
    my $cm = Chandra::ContextMenu->new(items => \@items);
    is(scalar @{$cm->items}, 100, '100 items stored');
    $cm->attach('#x');
    my $js = $cm->js_code;
    like($js, qr/Item 100/, 'all items in JS');

t/58_log_edge.t  view on Meta::CPAN

    is($captured[0]{message}, '', 'empty string message preserved');
}

# ---- Unicode message ----
{
    my @captured;
    my $log = Chandra::Log->new(
        output => { callback => sub { push @captured, $_[0] } },
    );
    $log->info("Hello \x{263A} world");
    like($captured[0]{message}, qr/Hello.*world/, 'unicode message logged');
}

# ---- Very long message ----
{
    my @captured;
    my $log = Chandra::Log->new(
        output => { callback => sub { push @captured, $_[0] } },
    );
    my $long = 'x' x 100_000;
    $log->info($long);

t/68_bridge_ext_edge.t  view on Meta::CPAN

    eval { Chandra::Bridge::Extension->register('bad.name', 'return {};'); };
    like($@, qr/invalid character/i, 'dot in name rejected');

    eval { Chandra::Bridge::Extension->register('bad name', 'return {};'); };
    like($@, qr/invalid character/i, 'space in name rejected');

    eval { Chandra::Bridge::Extension->register('', 'return {};'); };
    like($@, qr/must not be empty/i, 'empty name rejected');
}

# ---- unicode in JS source ----
{
    Chandra::Bridge::Extension->clear;
    my $unicode_src = 'return { emoji: "\x{2603}\x{1F600}" };';
    Chandra::Bridge::Extension->register('uniext', $unicode_src);
    my $src = Chandra::Bridge::Extension->source('uniext');
    like($src, qr/emoji/, 'unicode source stored');
}

# ---- deeply nested dependency chain ----
{
    Chandra::Bridge::Extension->clear;
    Chandra::Bridge::Extension->register('d0', 'return { level: 0 };');
    for my $i (1..10) {
        my $prev = 'd' . ($i - 1);
        Chandra::Bridge::Extension->register("d$i", "return { level: $i };",
            depends => [$prev]);



( run in 0.696 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )