App-mdee
view release on metacpan or search on metacpan
t/02_colorize.t view on Meta::CPAN
use strict;
use warnings;
use Test::More;
use open qw(:std :encoding(utf-8));
use lib '.';
use t::Util;
# Test that module loads
use_ok('App::Greple::md');
my $test_md = 't/test.md';
SKIP: {
skip "$test_md not found", 12 unless -f $test_md;
# Basic output test
my $r = run("-Mmd $test_md");
my $out = $r->stdout;
ok(length($out) > 0, "greple -Mmd produces output");
# Output should contain ANSI escape sequences
like($out, qr/\e\[/, "output contains ANSI color sequences");
# Dark mode should also work
my $dark = run("'-Mmd::config(mode=dark)' $test_md")->stdout;
ok(length($dark) > 0, "dark mode produces output");
like($dark, qr/\e\[/, "dark mode contains ANSI sequences");
# --cm override should work
my $override = run("-Mmd --cm h1=RD -- $test_md")->stdout;
ok(length($override) > 0, "--cm override produces output");
# OSC 8 test: output should contain OSC 8 sequences for links
like($out, qr/\e\]8;;/, "output contains OSC 8 hyperlink sequences");
# ;sub{...} text transformation (hashed theme)
my $hashed = run("-Mmd --cm 'h3=RD;sub{s/(?<!#)\$/ ###/r}' -- $test_md")->stdout;
my $strip = sub { local $_ = shift; s/\e\[[0-9;]*[mK]//g; $_ };
my ($h3_line) = map { $strip->($_) } grep { /Heading 3/ } split /\n/, $hashed;
like($h3_line, qr/### Heading 3 ###/, "sub{} appends closing hashes to h3");
my ($h4_line) = map { $strip->($_) } grep { /Heading 4/ } split /\n/, $hashed;
unlike($h4_line, qr/####$/, "sub{} on h3 does not affect h4");
# Empty ;sub{} suffix should not break colorization
my $no_sub = run("-Mmd --cm 'h3=RD' -- $test_md")->stdout;
my ($h3_plain) = map { $strip->($_) } grep { /Heading 3/ } split /\n/, $no_sub;
unlike($h3_plain, qr/### Heading 3 ###/, "no sub{} means no closing hashes");
# Multi-backtick code span: spaces should be stripped (CommonMark)
my ($multi_bt) = map { $strip->($_) } grep { /Multi-backtick/ } split /\n/, $out;
like($multi_bt, qr/\`\`\*\*\`\N{ACUTE ACCENT}/, "multi-backtick strips spaces around content");
unlike($multi_bt, qr/\` \`\*\*\`\N{ACUTE ACCENT} \`/, "multi-backtick does not preserve inner spaces");
# Code span protection: bold/strike not processed inside code spans
my ($code_prot) = grep { /inline code with/ } split /\n/, $out;
unlike($code_prot, qr/\e\[1m/, "bold not applied inside inline code");
# Word boundary: underscore emphasis not applied inside words (CommonMark)
my ($wb_line) = map { $strip->($_) } grep { /Word boundaries/ } split /\n/, $out;
like($wb_line, qr/abc_def_ghi/, "_ not applied inside word abc_def_ghi");
like($wb_line, qr/foo__bar__baz/, "__ not applied inside word foo__bar__baz");
like($wb_line, qr/x___y___z/, "___ not applied inside word x___y___z");
}
done_testing;
( run in 0.566 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )