foo
[gitmo/Moose.git] / t / 006_recipe.t
CommitLineData
b841b2a3 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
9e93dd19 6use Test::More tests => 62;
b841b2a3 7use Test::Exception;
8
9BEGIN {
10 use_ok('Moose');
11}
e9bb8a31 12
a7d0cd00 13## Roles
14
78cd1d3b 15{
446e850f 16 package Eq;
a7d0cd00 17 use Moose::Role;
a7d0cd00 18
446e850f 19 requires 'equal_to';
a7d0cd00 20
446e850f 21 sub not_equal_to {
22 my ($self, $other) = @_;
9e93dd19 23 not $self->equal_to($other);
446e850f 24 }
a7d0cd00 25
9e93dd19 26 package Comparable;
a7d0cd00 27 use Moose::Role;
446e850f 28
29 with 'Eq';
30
31 requires 'compare';
32
33 sub equal_to {
34 my ($self, $other) = @_;
35 $self->compare($other) == 0;
36 }
37
38 sub greater_than {
39 my ($self, $other) = @_;
40 $self->compare($other) == 1;
41 }
42
43 sub less_than {
44 my ($self, $other) = @_;
45 $self->compare($other) == -1;
46 }
47
48 sub greater_than_or_equal_to {
49 my ($self, $other) = @_;
50 $self->greater_than($other) || $self->equal_to($other);
51 }
52
53 sub less_than_or_equal_to {
54 my ($self, $other) = @_;
55 $self->less_than($other) || $self->equal_to($other);
9e93dd19 56 }
57
58 package Printable;
9e93dd19 59 use Moose::Role;
60
61 requires 'to_string';
a7d0cd00 62}
63
446e850f 64## Classes
3824830b 65
a7d0cd00 66{
446e850f 67 package US::Currency;
3824830b 68 use Moose;
446e850f 69
9e93dd19 70 with 'Comparable', 'Printable';
446e850f 71
81dc201f 72 has 'amount' => (is => 'rw', isa => 'Num', default => 0);
446e850f 73
74 sub compare {
75 my ($self, $other) = @_;
76 $self->amount <=> $other->amount;
77 }
9e93dd19 78
79 sub to_string {
80 my $self = shift;
81 sprintf '$%0.2f USD' => $self->amount
82 }
446e850f 83}
3824830b 84
9e93dd19 85ok(US::Currency->does('Comparable'), '... US::Currency does Comparable');
446e850f 86ok(US::Currency->does('Eq'), '... US::Currency does Eq');
9e93dd19 87ok(US::Currency->does('Printable'), '... US::Currency does Printable');
3824830b 88
446e850f 89my $hundred = US::Currency->new(amount => 100.00);
90isa_ok($hundred, 'US::Currency');
3824830b 91
446e850f 92can_ok($hundred, 'amount');
93is($hundred->amount, 100, '... got the right amount');
3824830b 94
9e93dd19 95can_ok($hundred, 'to_string');
96is($hundred->to_string, '$100.00 USD', '... got the right stringified value');
97
98ok($hundred->does('Comparable'), '... US::Currency does Comparable');
446e850f 99ok($hundred->does('Eq'), '... US::Currency does Eq');
9e93dd19 100ok($hundred->does('Printable'), '... US::Currency does Printable');
3824830b 101
446e850f 102my $fifty = US::Currency->new(amount => 50.00);
103isa_ok($fifty, 'US::Currency');
3824830b 104
446e850f 105can_ok($fifty, 'amount');
106is($fifty->amount, 50, '... got the right amount');
3824830b 107
9e93dd19 108can_ok($fifty, 'to_string');
109is($fifty->to_string, '$50.00 USD', '... got the right stringified value');
110
446e850f 111ok($hundred->greater_than($fifty), '... 100 gt 50');
112ok($hundred->greater_than_or_equal_to($fifty), '... 100 ge 50');
113ok(!$hundred->less_than($fifty), '... !100 lt 50');
114ok(!$hundred->less_than_or_equal_to($fifty), '... !100 le 50');
115ok(!$hundred->equal_to($fifty), '... !100 eq 50');
116ok($hundred->not_equal_to($fifty), '... 100 ne 50');
3824830b 117
446e850f 118ok(!$fifty->greater_than($hundred), '... !50 gt 100');
119ok(!$fifty->greater_than_or_equal_to($hundred), '... !50 ge 100');
120ok($fifty->less_than($hundred), '... 50 lt 100');
121ok($fifty->less_than_or_equal_to($hundred), '... 50 le 100');
122ok(!$fifty->equal_to($hundred), '... !50 eq 100');
123ok($fifty->not_equal_to($hundred), '... 50 ne 100');
3824830b 124
446e850f 125ok(!$fifty->greater_than($fifty), '... !50 gt 50');
126ok($fifty->greater_than_or_equal_to($fifty), '... !50 ge 50');
127ok(!$fifty->less_than($fifty), '... 50 lt 50');
128ok($fifty->less_than_or_equal_to($fifty), '... 50 le 50');
129ok($fifty->equal_to($fifty), '... 50 eq 50');
130ok(!$fifty->not_equal_to($fifty), '... !50 ne 50');
a7d0cd00 131
446e850f 132## ... check some meta-stuff
a7d0cd00 133
446e850f 134# Eq
ef333f17 135
446e850f 136my $eq_meta = Eq->meta;
137isa_ok($eq_meta, 'Moose::Meta::Role');
a7d0cd00 138
446e850f 139ok($eq_meta->has_method('not_equal_to'), '... Eq has_method not_equal_to');
140ok($eq_meta->requires_method('equal_to'), '... Eq requires_method not_equal_to');
a7d0cd00 141
9e93dd19 142# Comparable
ef333f17 143
9e93dd19 144my $comparable_meta = Comparable->meta;
145isa_ok($comparable_meta, 'Moose::Meta::Role');
a7d0cd00 146
9e93dd19 147ok($comparable_meta->does_role('Eq'), '... Comparable does Eq');
a7d0cd00 148
446e850f 149foreach my $method_name (qw(
150 equal_to not_equal_to
151 greater_than greater_than_or_equal_to
152 less_than less_than_or_equal_to
153 )) {
9e93dd19 154 ok($comparable_meta->has_method($method_name), '... Comparable has_method ' . $method_name);
446e850f 155}
a7d0cd00 156
9e93dd19 157ok($comparable_meta->requires_method('compare'), '... Comparable requires_method compare');
158
159# Printable
160
161my $printable_meta = Printable->meta;
162isa_ok($printable_meta, 'Moose::Meta::Role');
163
164ok($printable_meta->requires_method('to_string'), '... Printable requires_method to_string');
ef333f17 165
446e850f 166# US::Currency
a7d0cd00 167
446e850f 168my $currency_meta = US::Currency->meta;
169isa_ok($currency_meta, 'Moose::Meta::Class');
a7d0cd00 170
9e93dd19 171ok($currency_meta->does_role('Comparable'), '... US::Currency does Comparable');
446e850f 172ok($currency_meta->does_role('Eq'), '... US::Currency does Eq');
9e93dd19 173ok($currency_meta->does_role('Printable'), '... US::Currency does Printable');
ef333f17 174
446e850f 175foreach my $method_name (qw(
176 amount
177 equal_to not_equal_to
178 compare
179 greater_than greater_than_or_equal_to
9e93dd19 180 less_than less_than_or_equal_to
181 to_string
446e850f 182 )) {
183 ok($currency_meta->has_method($method_name), '... US::Currency has_method ' . $method_name);
184}
a7d0cd00 185