File: base.t

package info (click to toggle)
libmojolicious-perl 8.12%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 3,720 kB
  • sloc: perl: 12,099; makefile: 14
file content (142 lines) | stat: -rw-r--r-- 4,555 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
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
use Mojo::Base -strict;

use Test::More;

use FindBin;
use lib "$FindBin::Bin/lib";

package Mojo::BaseTest;
use Mojo::Base -strict;

use base 'Mojo::BaseTest::Base2';

__PACKAGE__->attr(tests => 1);
__PACKAGE__->attr('name');

sub more_tests { shift->{tests} += shift // 1 }

package Mojo::BaseTestTest;
use Mojo::Base 'Mojo::BaseTest';

package Mojo::BaseTestTestTest;
use Mojo::Base "Mojo'BaseTestTest";

package Mojo::BaseTest::Weak1;
use Mojo::Base -base;

our $ONE;

has one => sub {$ONE}, weak => 1;

package Mojo::BaseTest::Weak2;
use Mojo::Base 'Mojo::BaseTest::Weak1';

our $TWO;

has ['two'] => sub {$TWO}, weak => 1;
has four => undef, weak => 1;
has 'five';

sub new { shift->SUPER::new(@_) }

package Mojo::BaseTest::Weak3;
use Mojo::Base 'Mojo::BaseTest::Weak2';

our $THREE;

has three => sub {$THREE}, weak => 1;

package main;

use Mojo::Base;
use Mojo::BaseTest::Base1;
use Mojo::BaseTest::Base2;
use Mojo::BaseTest::Base3;
use Scalar::Util 'isweak';

# Basic functionality
my $object  = Mojo::BaseTest->new->foo(23);
my $object2 = Mojo::BaseTestTest->new(foo => 24);
is $object2->foo, 24, 'right attribute value';
is $object->foo,  23, 'right attribute value';

# Instance method
$object = Mojo::BaseTestTestTest->new;
$object->attr('mojo');
is $object->mojo(23)->mojo, 23, 'object has mojo';
ok !Mojo::BaseTestTest->can('mojo'),   'base class does not have mojo';
ok !!Mojo::BaseTestTest->can('tests'), 'base class has tests';
ok !Mojo::BaseTest->can('mojo'),       'base class does not have mojo';
ok !!Mojo::BaseTest->can('tests'),     'base class has tests';

# Default value defined but false
ok defined($object->yada);
is $object->yada, 0, 'right attribute value';
is $object->yada(5)->yada, 5, 'right attribute value';

# Default value support
$object = Mojo::BaseTest->new;
isa_ok $object->name('foobarbaz'), 'Mojo::BaseTest',
  'attribute value has right class';
$object2 = Mojo::BaseTest->new->tests('3');
is $object2->tests, 3, 'right attribute value';
is $object->tests,  1, 'right attribute default value';

# Chained attributes and callback default value support
$object = Mojo::BaseTest->new;
is $object->bar, 2, 'right attribute value';
is $object->bar(6)->bar, 6, 'right chained attribute value';
is $object->baz, 2, 'right attribute value';
is $object->baz(6)->baz, 6, 'right chained attribute value';

# Tap into chain
$object = Mojo::BaseTest->new;
is $object->tap(sub { $_->name('foo') })->name, 'foo', 'right attribute value';
is $object->tap(sub { shift->name('bar')->name })->name, 'bar',
  'right attribute value';
is $object->tap('tests')->tests, 1, 'right attribute value';
is $object->more_tests, 2, 'right attribute value';
is $object->tap('more_tests')->tests, 3, 'right attribute value';
is $object->tap(more_tests => 3)->tests, 6, 'right attribute value';

# Inherit -base flag
$object = Mojo::BaseTest::Base3->new(test => 1);
is $object->test, 1,     'right attribute value';
is $object->foo,  undef, 'no attribute value';
is $object->foo(3)->foo, 3, 'right attribute value';

# Exceptions
eval { Mojo::BaseTest->attr(foo => []) };
like $@, qr/Default has to be a code reference or constant value/,
  'right error';
eval { Mojo::BaseTest->attr(23) };
like $@, qr/Attribute "23" invalid/, 'right error';
eval { Mojo::BaseTest->attr(foo => undef, fail => 1) };
like $@, qr/Unsupported attribute option/, 'right error';

# Weaken
my ($one, $two, $three) = (
  $Mojo::BaseTest::Weak1::ONE, $Mojo::BaseTest::Weak2::TWO,
  $Mojo::BaseTest::Weak3::THREE
) = ({}, {}, {});
my $weak
  = Mojo::BaseTest::Weak3->new(one => $one, two => $two, three => $three);
ok isweak($weak->{$_}), "weakened $_ ok with value" for qw(one two three);
$weak = Mojo::BaseTest::Weak3->new->tap('one')->tap('two')->tap('three');
ok isweak($weak->{$_}), "weakened $_ ok with default" for qw(one two three);
$weak = Mojo::BaseTest::Weak3->new->one($one)->two($two)->three($three);
ok isweak($weak->{$_}), "weakened $_ ok with default" for qw(one two three);
is $weak->four, undef, 'no default value';
ok isweak($weak->four($weak)->{four}), 'weakened value';
is $weak->four, $weak, 'circular reference';
ok !isweak($weak->five($weak)->{five}), 'not weakened value';
is $weak->five, $weak, 'circular reference';
$weak->attr(six => undef, weak => 1);
ok isweak($weak->six($weak)->{six}), 'weakened value';
is $weak->six, $weak, 'circular reference';
$weak = Mojo::BaseTest::Weak3->new(one => 23);
is $weak->one, 23, 'right value';
is $weak->one(24)->one,   24, 'right value';
is $weak->four(25)->four, 25, 'right value';

done_testing();