Fix triggers to pass old value along with new.
[gitmo/MooseX-ClassAttribute.git] / t / lib / SharedTests.pm
index 0e972c6..b2f542b 100644 (file)
@@ -6,23 +6,13 @@ use warnings;
 use Scalar::Util qw( isweak );
 use Test::More;
 
-my $HasMXAH;
-BEGIN
-{
-    if ( eval 'use MooseX::AttributeHelpers 0.12; 1;' )
-    {
-        $HasMXAH = 1;
-    }
-}
-
-plan tests => 25;
-
 
 {
     package HasClassAttribute;
 
     use Moose qw( has );
     use MooseX::ClassAttribute;
+    use MooseX::AttributeHelpers;
 
     use vars qw($Lazy);
     $Lazy = 0;
@@ -67,24 +57,40 @@ plan tests => 25;
         ( is      => 'rw',
           isa     => 'Delegatee',
           handles => [ 'units', 'color' ],
+          # if it's not lazy it makes a new object before we define
+          # Delegatee's attributes.
+          lazy    => 1,
           default => sub { Delegatee->new() },
         );
 
-    if ($HasMXAH)
-    {
-        class_has 'Mapping' =>
-            ( metaclass => 'Collection::Hash',
-              is        => 'rw',
-              isa       => 'HashRef[Str]',
-              default   => sub { {} },
-              provides  =>
-              { exists => 'ExistsInMapping',
-                keys   => 'IdsInMapping',
-                get    => 'GetMapping',
-                set    => 'SetMapping',
-              },
-            );
-    }
+    class_has 'Mapping' =>
+        ( metaclass => 'Collection::Hash',
+          is        => 'rw',
+          isa       => 'HashRef[Str]',
+          default   => sub { {} },
+          provides  =>
+          { exists => 'ExistsInMapping',
+            keys   => 'IdsInMapping',
+            get    => 'GetMapping',
+            set    => 'SetMapping',
+          },
+        );
+
+    class_has 'Built' =>
+        ( is      => 'ro',
+          builder => '_BuildIt',
+        );
+
+    class_has 'LazyBuilt' =>
+        ( is      => 'ro',
+          lazy    => 1,
+          builder => '_BuildIt',
+        );
+
+    class_has 'Triggerish' =>
+        ( is      => 'rw',
+          trigger => sub { shift->_CallTrigger(@_) },
+        );
 
     has 'size' =>
         ( is      => 'rw',
@@ -93,7 +99,6 @@ plan tests => 25;
         );
 
     no Moose;
-    no MooseX::ClassAttribute;
 
     sub BUILD
     {
@@ -102,12 +107,19 @@ plan tests => 25;
         $self->ObjectCount( $self->ObjectCount() + 1 );
     }
 
+    sub _BuildIt { 42 }
+
+    our @Triggered;
+    sub _CallTrigger
+    {
+        push @Triggered, [@_];
+    }
+
     sub make_immutable
     {
         my $class = shift;
 
         $class->meta()->make_immutable();
-        MooseX::ClassAttribute::container_class()->meta()->make_immutable();
         Delegatee->meta()->make_immutable();
     }
 }
@@ -126,6 +138,8 @@ plan tests => 25;
         ( is      => 'ro',
           default => 'blue',
         );
+
+    no Moose;
 }
 
 {
@@ -138,10 +152,19 @@ plan tests => 25;
 
     class_has '+ReadOnlyAttribute' =>
         ( default => 30 );
+
+    class_has 'YetAnotherAttribute' =>
+        ( is      => 'ro',
+          default => 'thing',
+        );
+
+    no Moose;
 }
 
 sub run_tests
 {
+    plan tests => 30;
+
     local $Test::Builder::Level = $Test::Builder::Level + 1;
 
     {
@@ -229,15 +252,6 @@ sub run_tests
     }
 
     {
-        ok( ! HasClassAttribute->can('class_has'),
-            q{'no MooseX::ClassAttribute' remove class_has from HasClassAttribute} );
-    }
-
- SKIP:
-    {
-        skip 'These tests require MooseX::AttributeHelpers', 4
-            unless $HasMXAH;
-
         my @ids = HasClassAttribute->IdsInMapping();
         is( scalar @ids, 0,
             'there are no keys in the mapping yet' );
@@ -253,6 +267,29 @@ sub run_tests
         is( HasClassAttribute->GetMapping('a'), 20,
             'value for a in mapping is 20' );
     }
+
+    {
+        is( HasClassAttribute->Built(), 42,
+            'attribute with builder works' );
+
+        is( HasClassAttribute->LazyBuilt(), 42,
+            'attribute with lazy builder works' );
+    }
+
+    {
+        HasClassAttribute->Triggerish(42);
+        is( scalar @HasClassAttribute::Triggered, 1, 'trigger was called' );
+        is( HasClassAttribute->Triggerish(), 42, 'Triggerish is now 42' );
+
+        HasClassAttribute->Triggerish(84);
+        is( HasClassAttribute->Triggerish(), 84, 'Triggerish is now 84' );
+
+        is_deeply( \@HasClassAttribute::Triggered,
+                   [ [ qw( HasClassAttribute 42 ) ],
+                     [ qw( HasClassAttribute 84 42 ) ],
+                   ],
+                   'trigger passes old value correctly' );
+    }
 }