better Test::Fatal tests
[gitmo/MooseX-UndefTolerant.git] / t / defaults.t
index aa8680a..6e29950 100644 (file)
-#!/usr/bin/perl
-
 use Test::More;
+use Test::Fatal;
+
+use MooseX::UndefTolerant::Attribute ();
 
-package Foo;
+{
+    package Foo;
+    use Moose;
 
-use Moose;
-use MooseX::UndefTolerant::Attribute;
+    has 'attr1' => (
+        traits => [ qw(MooseX::UndefTolerant::Attribute)],
+        is => 'ro',
+        isa => 'Num',
+        predicate => 'has_attr1',
+        default => 1,
+    );
+    has 'attr2' => (
+        is => 'ro',
+        isa => 'Num',
+        predicate => 'has_attr2',
+        default => 2,
+    );
+}
 
-has bar => (
-   is => 'rw',
-   traits => ['MooseX::UndefTolerant::Attribute'],
-   default => 'baz'
-);
+{
+    package Bar;
+    use Moose;
+    use MooseX::UndefTolerant;
+
+    has 'attr1' => (
+        is => 'ro',
+        isa => 'Num',
+        predicate => 'has_attr1',
+        default => 1,
+    );
+    has 'attr2' => (
+        is => 'ro',
+        isa => 'Num',
+        predicate => 'has_attr2',
+        default => 2,
+    );
+}
 
-1;
 
 package main;
 
-my $foo = Foo->new( bar => undef );
-is ( $foo->bar, 'baz', 'does the default value get set when passing undef in the constructor' );
+sub do_tests
+{
+    note 'Testing class with a single UndefTolerant attribute';
+    do_tests_with_class('Foo');
+
+    note '';
+    note 'Testing class with the entire class being UndefTolerant';
+    do_tests_with_class('Bar');
+}
+
+sub do_tests_with_class
+{
+    my $class = shift;
+
+    {
+        my $obj = $class->new;
+        ok($obj->has_attr1, 'attr1 has a value');
+        ok($obj->has_attr2, 'attr2 has a value');
+        is($obj->attr1, 1, 'attr1\'s value is its default');
+        is($obj->attr2, 2, 'attr2\'s value is its default');
+    }
+
+    {
+        my $obj = $class->new(attr1 => undef);
+        ok($obj->has_attr1, 'UT attr1 has a value when assigned undef in constructor');
+        is($obj->attr1, 1, 'attr1\'s value is its default');
+        is($obj->attr2, 2, 'attr2\'s value is its default');
+    }
+
+    {
+        my $obj = $class->new(attr1 => 1234, attr2 => 5678);
+        is($obj->attr1, 1234, 'assigning a defined value during construction works as normal');
+        ok($obj->has_attr1, '...and the predicate returns true as normal');
+        is($obj->attr2, 5678, 'assigning a defined value during construction works as normal');
+        ok($obj->has_attr2, '...and the predicate returns true as normal');
+    }
+}
+
+note 'Default behaviour: mutable classes';
+note '';
+do_tests;
+
+note '';
+note 'Default behaviour: immutable classes';
+note '';
+Foo->meta->make_immutable;
+Bar->meta->make_immutable;
+
+TODO: {
+    local $TODO = 'some immutable cases are not handled yet';
+    # for now, catch errors
+    is (exception { do_tests }, undef, 'tests do not die');
+
+    is(Test::More->builder->current_test, 44, 'if we got here, we can declare victory!');
+}
 
 done_testing;
+