Ancient

 view release on metacpan or  search on metacpan

t/8001-file-callbacks.t  view on Meta::CPAN

# 2: banana
# 3: (empty)
# 4: cherry
# 5:    (3 spaces - whitespace only, counts as blank)
# 6: # this is a comment
# 7: date
# 8: # another comment
# 9: elderberry
file::spew($test_file, "apple\nbanana\n\ncherry\n   \n# this is a comment\ndate\n# another comment\nelderberry\n");

# ============================================
# each_line tests
# ============================================

subtest 'each_line with shift' => sub {
    my @collected;
    file::each_line($test_file, sub {
        push @collected, shift;
    });

    is(scalar(@collected), 9, 'collected all lines');
    is($collected[0], 'apple', 'first line correct');
    is($collected[2], '', 'empty line preserved');
    is($collected[5], '# this is a comment', 'comment line preserved');
};

subtest 'each_line with $_' => sub {
    my @collected;
    file::each_line($test_file, sub {
        push @collected, $_;
    });

    is(scalar(@collected), 9, 'collected all lines via $_');
    is($collected[0], 'apple', 'first line via $_ correct');
    is($collected[3], 'cherry', 'fourth line via $_ correct');
};

subtest 'each_line with both shift and $_' => sub {
    my @from_shift;
    my @from_defvar;
    file::each_line($test_file, sub {
        push @from_shift, shift;
        push @from_defvar, $_;
    });

    is_deeply(\@from_shift, \@from_defvar, 'shift and $_ give same values');
};

subtest 'each_line preserves $_ outside' => sub {
    $_ = "original";
    file::each_line($test_file, sub { });
    is($_, "original", '$_ restored after each_line');
};

subtest 'each_line empty file' => sub {
    my $empty = "$tmpdir/empty.txt";
    file::spew($empty, "");

    my $count = 0;
    file::each_line($empty, sub { $count++ });
    is($count, 0, 'no iterations for empty file');
};

subtest 'each_line nonexistent file' => sub {
    my @collected;
    file::each_line("$tmpdir/nonexistent.txt", sub {
        push @collected, shift;
    });
    is(scalar(@collected), 0, 'no lines from nonexistent file');
};

# ============================================
# grep_lines tests
# ============================================

subtest 'grep_lines with coderef (shift)' => sub {
    my $result = file::grep_lines($test_file, sub {
        length(shift) > 5;
    });

    is(ref($result), 'ARRAY', 'returns arrayref');
    is(scalar(@$result), 5, 'correct count of lines > 5 chars');
    ok((grep { $_ eq 'banana' } @$result), 'banana included');
    ok((grep { $_ eq 'cherry' } @$result), 'cherry included');
    ok((grep { $_ eq 'elderberry' } @$result), 'elderberry included');
};

subtest 'grep_lines with coderef ($_)' => sub {
    my $result = file::grep_lines($test_file, sub {
        /^[aeiou]/i;  # starts with vowel
    });

    is(scalar(@$result), 2, 'two lines start with vowel');
    is($result->[0], 'apple', 'apple matches');
    is($result->[1], 'elderberry', 'elderberry matches');
};

subtest 'grep_lines with builtin is_not_blank' => sub {
    my $result = file::grep_lines($test_file, 'is_not_blank');

    # Non-blank lines: apple, banana, cherry, # comment, date, # comment, elderberry
    is(scalar(@$result), 7, 'correct non-blank count');
    ok(!(grep { $_ eq '' } @$result), 'no empty lines');
    ok(!(grep { /^\s+$/ } @$result), 'no whitespace-only lines');
};

subtest 'grep_lines with builtin not_blank' => sub {
    my $result = file::grep_lines($test_file, 'not_blank');
    is(scalar(@$result), 7, 'not_blank alias works');
};

subtest 'grep_lines with builtin is_blank' => sub {
    my $result = file::grep_lines($test_file, 'is_blank');
    # Blank = empty or whitespace-only: line 3 ("") and line 5 ("   ")
    is(scalar(@$result), 2, 'two blank lines');
};

subtest 'grep_lines with builtin is_not_empty' => sub {
    my $result = file::grep_lines($test_file, 'is_not_empty');
    # Non-empty = has at least one char (includes whitespace-only): 8 lines
    is(scalar(@$result), 8, 'correct non-empty count');



( run in 0.475 second using v1.01-cache-2.11-cpan-71847e10f99 )