From afab14beccad1c7d6cbbfe8ac4db893c96fab70a Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Tue, 5 Apr 2011 20:57:36 -0500 Subject: initial implementation --- t/01-basic.t | 44 ++++++++++++++++++++++++++++ t/data/01/after/Foo.pm | 10 +++++++ t/data/01/after/Foo/Immutable.pm | 11 +++++++ t/data/01/before/Foo.pm | 10 +++++++ t/data/01/before/Foo/Immutable.pm | 11 +++++++ t/lib/Test/Class/Refresh.pm | 60 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 146 insertions(+) create mode 100644 t/01-basic.t create mode 100644 t/data/01/after/Foo.pm create mode 100644 t/data/01/after/Foo/Immutable.pm create mode 100644 t/data/01/before/Foo.pm create mode 100644 t/data/01/before/Foo/Immutable.pm create mode 100644 t/lib/Test/Class/Refresh.pm (limited to 't') diff --git a/t/01-basic.t b/t/01-basic.t new file mode 100644 index 0000000..ce650f3 --- /dev/null +++ b/t/01-basic.t @@ -0,0 +1,44 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use Test::More; +use lib 't/lib'; +use Test::Class::Refresh; + +use Class::Refresh; + +my $dir = prepare_temp_dir_for('01'); +push @INC, $dir->dirname; + +require Foo; +require Foo::Immutable; + +Class::Refresh->refresh; + +is_deeply([Foo->meta->get_attribute_list], ['foo'], + "correct starting attr list"); +can_ok('Foo', 'meth'); +ok(!Foo->can('other_meth'), "!Foo->can('other_meth')"); + +is_deeply([Foo::Immutable->meta->get_attribute_list], ['foo'], + "correct starting attr list"); +can_ok('Foo::Immutable', 'meth'); +ok(!Foo::Immutable->can('other_meth'), "!Foo::Immutable->can('other_meth')"); + + +sleep 2; +update_temp_dir_for('01', $dir); + +Class::Refresh->refresh; + +is_deeply([Foo->meta->get_attribute_list], ['bar'], + "correct refreshed attr list"); +can_ok('Foo', 'other_meth'); +ok(!Foo->can('meth'), "!Foo->can('meth')"); + +is_deeply([Foo::Immutable->meta->get_attribute_list], ['bar'], + "correct refreshed attr list"); +can_ok('Foo::Immutable', 'other_meth'); +ok(!Foo::Immutable->can('meth'), "!Foo::Immutable->can('meth')"); + +done_testing; diff --git a/t/data/01/after/Foo.pm b/t/data/01/after/Foo.pm new file mode 100644 index 0000000..716b5c8 --- /dev/null +++ b/t/data/01/after/Foo.pm @@ -0,0 +1,10 @@ +package Foo; +use Moose; + +has bar => (is => 'ro'); + +sub other_meth { } + +no Moose; + +1; diff --git a/t/data/01/after/Foo/Immutable.pm b/t/data/01/after/Foo/Immutable.pm new file mode 100644 index 0000000..9fad73d --- /dev/null +++ b/t/data/01/after/Foo/Immutable.pm @@ -0,0 +1,11 @@ +package Foo::Immutable; +use Moose; + +has bar => (is => 'ro'); + +sub other_meth { } + +__PACKAGE__->meta->make_immutable; +no Moose; + +1; diff --git a/t/data/01/before/Foo.pm b/t/data/01/before/Foo.pm new file mode 100644 index 0000000..a63046a --- /dev/null +++ b/t/data/01/before/Foo.pm @@ -0,0 +1,10 @@ +package Foo; +use Moose; + +has foo => (is => 'ro'); + +sub meth { } + +no Moose; + +1; diff --git a/t/data/01/before/Foo/Immutable.pm b/t/data/01/before/Foo/Immutable.pm new file mode 100644 index 0000000..df3fb53 --- /dev/null +++ b/t/data/01/before/Foo/Immutable.pm @@ -0,0 +1,11 @@ +package Foo::Immutable; +use Moose; + +has foo => (is => 'ro'); + +sub meth { } + +__PACKAGE__->meta->make_immutable; +no Moose; + +1; diff --git a/t/lib/Test/Class/Refresh.pm b/t/lib/Test/Class/Refresh.pm new file mode 100644 index 0000000..9259492 --- /dev/null +++ b/t/lib/Test/Class/Refresh.pm @@ -0,0 +1,60 @@ +package Test::Class::Refresh; +use strict; +use warnings; + +use File::Copy; +use File::Find; +use File::Temp; + +use Sub::Exporter -setup => { + exports => ['prepare_temp_dir_for', 'update_temp_dir_for'], + groups => { default => ['prepare_temp_dir_for', 'update_temp_dir_for'] }, +}; + +sub rcopy { + my ($from_dir, $to_dir) = @_; + + find( + { + no_chdir => 1, + wanted => sub { + my $from = $File::Find::name; + (my $base = $from) =~ s/^$from_dir//; + return unless length $base; + my $to = $to_dir . $base; + if (-d) { + if (!-d $to) { + mkdir $to or die "Couldn't create dir $to: $!"; + } + } + else { + copy($from, $to) or die "Couldn't copy $from to $to: $!"; + utime(undef, undef, $to) + or die "Couldn't set modification time for $to: $!"; + } + }, + }, + $from_dir + ); +} + +sub prepare_temp_dir_for { + my ($test_id) = @_; + + my $from_dir = 't/data/' . $test_id . '/before'; + my $to_dir = File::Temp->newdir; + + rcopy($from_dir, $to_dir); + + return $to_dir; +} + +sub update_temp_dir_for { + my ($test_id, $to_dir) = @_; + + my $from_dir = 't/data/' . $test_id . '/after'; + + rcopy($from_dir, $to_dir); +} + +1; -- cgit v1.2.3-54-g00ecf