File: Reload.pm

package info (click to toggle)
libmason-perl 2.24-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 748 kB
  • sloc: perl: 4,882; makefile: 7
file content (105 lines) | stat: -rw-r--r-- 3,430 bytes parent folder | download | duplicates (3)
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
package Mason::t::Reload;
$Mason::t::Reload::VERSION = '2.24';
use Test::Class::Most parent => 'Mason::Test::Class';

sub test_reload : Tests {
    my $self = shift;
    my $class;

    $self->add_comp(
        path => "/reload.mc",
        src  => <<'EOF',
<%class>
sub foo { 'foo' }
sub baz { 'baz1' }
</%class>
Foo
EOF
    );
    is( $self->interp->run("/reload")->output, "Foo\n", "before reload" );
    $class = $self->interp->load("/reload.mc");
    is( $class->foo(), 'foo',  "method foo" );
    is( $class->baz(), 'baz1', "method baz" );
    ok( $class->can('foo'),  "can call foo before reload" );
    ok( !$class->can('bar'), "cannot call bar before reload" );
    ok( $class->can('baz'),  "can call baz before reload" );

    sleep(1);    # so timestamp will be different

    $self->add_comp(
        path => "/reload.mc",
        src  => <<'EOF',
<%class>
sub bar { 'bar' }
sub baz { 'baz2' }
</%class>
Bar
EOF
    );
    is( $self->interp->run("/reload")->output, "Bar\n", "after reload" );
    is( $class->bar(),                         'bar',   "method bar" );
    is( $class->baz(),                         'baz2',  "method baz" );
    ok( $class->can('bar'),  "can call bar after reload" );
    ok( !$class->can('foo'), "cannot call foo after reload" );
    ok( $class->can('baz'),  "can call baz after reload" );
}

sub test_reload_parent : Tests {
    my $self   = shift;
    my $interp = $self->interp;

    $self->add_comp( path => '/foo/bar/baz.mc', src => '<% $.num1 %> <% $.num2 %>' );
    $self->add_comp( path => '/foo/Base.mc',    src => '<%class>method num1 { 5 }</%class>' );
    $self->add_comp( path => '/Base.mc',        src => '<%class>method num2 { 6 }</%class>' );

    $self->test_existing_comp( path => '/foo/bar/baz.mc', expect => '5 6' );

    $self->interp->_flush_load_cache();
    sleep(1);

    $self->add_comp( path => '/foo/Base.mc', src => "<%class>method num1 { 7 }</%class>" );
    $self->add_comp( path => '/Base.mc',     src => "<%class>method num2 { 8 }</%class>" );
    $self->test_existing_comp( path => '/foo/bar/baz.mc', expect => '7 8' );

    $self->interp->_flush_load_cache();
    sleep(1);

    $self->add_comp(
        path => '/Base.mc',
        src  => "<%class>method num1 { 10 }\nmethod num2 { 11 }\n</%class>"
    );
    $self->test_existing_comp( path => '/foo/bar/baz.mc', expect => '7 11' );

    $self->interp->_flush_load_cache();
    sleep(1);

    $self->remove_comp( path => '/foo/Base.mc' );
    $self->test_existing_comp( path => '/foo/bar/baz.mc', expect => '10 11' );

    $self->interp->_flush_load_cache();
    sleep(1);

    $self->remove_comp( path => '/foo/Base.mc' );
    $self->add_comp( path => '/foo/bar/baz.mc', src => 'hi' );
    $self->add_comp( path => '/Base.mp',        src => 'method wrap { print "wrap1" }' );
    $self->test_existing_comp( path => '/foo/bar/baz.mc', expect => 'wrap1' );

    $self->interp->_flush_load_cache();
    sleep(1);

    $self->add_comp( path => '/Base.mp', src => 'method wrap { print "wrap2" }' );
    $self->test_existing_comp( path => '/foo/bar/baz.mc', expect => 'wrap2' );
}

sub test_no_unnecessary_reload : Tests {
    my $self   = shift;
    my $interp = $self->interp;

    $self->add_comp( path => '/foo.mc', src => ' ' );
    my $id1 = $interp->load('/foo.mc')->cmeta->id;
    $self->interp->_flush_load_cache();
    my $id2 = $interp->load('/foo.mc')->cmeta->id;
    ok( $id1 == $id2 );
}

1;