File: App-PRT-Command-DeleteMethod.t

package info (click to toggle)
prt 0.22-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 404 kB
  • sloc: perl: 1,185; makefile: 3
file content (138 lines) | stat: -rw-r--r-- 3,035 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package t::App::PRT::Command::DeleteMethod;
use t::test;

sub _require : Test(startup => 1) {
    my ($self) = @_;

    use_ok 'App::PRT::Command::DeleteMethod';
}

sub instantiate : Tests {
    isa_ok App::PRT::Command::DeleteMethod->new, 'App::PRT::Command::DeleteMethod';
}

sub register : Tests {
    my $command = App::PRT::Command::DeleteMethod->new;

    $command->register('My::Food' => 'name');

    is $command->target_class_name, 'My::Food';
    is $command->target_method_name, 'name';
}

sub parse_arguments : Tests {
    subtest "when class and method specified" => sub {
        my $command = App::PRT::Command::DeleteMethod->new;
        my @args = qw(Class method a.pl lib/B.pm);


        my @args_after = $command->parse_arguments(@args);

        is $command->target_class_name, 'Class';
        is $command->target_method_name, 'method';

        cmp_deeply \@args_after, [qw(a.pl lib/B.pm)], 'parse_arguments returns rest arguments';
    };

    subtest "when arguments are not enough" => sub {
        my $command = App::PRT::Command::DeleteMethod->new;

        ok exception {
            $command->parse_arguments('Method');
        }, 'died';
    };

}

sub execute : Tests {
    my $directory = t::test::prepare_test_code('dinner');

    my $command = App::PRT::Command::DeleteMethod->new;

    $command->register('My::Human' => 'name');

    my $human_file = "$directory/lib/My/Human.pm";
    my $food_file  = "$directory/lib/My/Food.pm";

    subtest 'target file' => sub {
        ok $command->execute($human_file);

        is file($human_file)->slurp, <<'CODE', 'name removed';
package My::Human;
use strict;
use warnings;

sub new {
    my ($class, $name) = @_;

    bless {
        name => $name,
    }, $class;
}

sub eat {
    my ($self, $food) = @_;

    print "@{[ $self->name ]} is eating @{[ $food->name ]}.\n";
}

1;
CODE

        is $command->deleted_code, <<'CODE', 'deleted code stored';
sub name {
    my ($self) = @_;

    $self->{name};
}

CODE

     };


    subtest 'another file' => sub {
        my $before = file($food_file)->slurp;
        ok ! $command->execute($food_file);
        is file($food_file)->slurp, $before, 'nothing happen';
    };

}

sub execute_delete_method_and_comment : Tests {
    my $directory = t::test::prepare_test_code('method_with_comment');

    my $command = App::PRT::Command::DeleteMethod->new;

    $command->register('FoodWithComment' => 'new');

    my $file = "$directory/FoodWithComment.pm";

    $command->execute($file);

    is $command->deleted_code, <<'CODE', 'comment before method was deleted';
# create a new food
# You can use when you want to create a new instance
sub new {
    my ($class, $name) = @_;

    bless {
        name => $name,
    }, $class;
}

CODE

    $command->register('FoodWithComment' => 'name');
    $command->execute($file);
    is $command->deleted_code, <<'CODE', 'another comment was not deleted because previous token of sub name is whitespace';
sub name {
    my ($self) = @_;

    $self->{name};
}

CODE

}