File: worm.t

package info (click to toggle)
libmoosex-setonce-perl 0.100471-1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 108 kB
  • ctags: 6
  • sloc: perl: 62; makefile: 2
file content (80 lines) | stat: -rw-r--r-- 1,426 bytes parent folder | download
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
use strict;
use warnings;
use Test::More;
use Try::Tiny;

use lib 'lib';
require MooseX::SetOnce;

{
  package Apple;
  use Moose;

  has color => (
    is     => 'rw',
    traits => [ qw(SetOnce) ],
  );
}

{
  package Orange;
  use Moose;

  has color => (
    reader => 'get_color',
    writer => 'set_color',
    traits => [ qw(SetOnce) ],
  );
}

for my $set (
  [ Apple   => qw(    color     color) ],
  [ Orange  => qw(get_color set_color) ],
) {
  my ($class, $getter, $setter) = @$set;
  my $object = $class->new;

  {
    my $error;
    my $died = try {
      $object->$setter('green');
      return;
    } catch {
      $error = $_;
      return 1;
    };

    ok( ! $died, "can set a SetOnce attr once") or diag $error;
    is($object->$getter, 'green', "it has the first value we set");
  }

  {
    my $error;
    my $died = try {
      $object->$setter('blue');
      return;
    } catch {
      $error = $_;
      return 1;
    };

    ok( $died, "can't set a SetOnce attr twice (via $setter)");
    is($object->$getter, 'green', "it has the first value we set");
  }

  {
    my $error;
    my $died = try {
      $object->meta->get_attribute('color')->set_value($object, 'yellow');
      return;
    } catch {
      $error = $_;
      return 1;
    };

    ok( $died, "can't set a SetOnce attr twice (via set_value)");
    is($object->$getter, 'green', "it has the first value we set");
  }
}

done_testing;