Ancient

 view release on metacpan or  search on metacpan

t/4009-object-accessor-behavior.t  view on Meta::CPAN

#!/usr/bin/env perl
use strict;
use warnings;
use Test::More;

use object;

# ==== Accessor Return Values ====

subtest 'getter returns current value' => sub {
    object::define('GetterTest', 'val:Str');

    my $obj = new GetterTest val => 'initial';
    is($obj->val, 'initial', 'getter returns value');

    # Chained assignment
    my $ret = $obj->val('updated');
    is($ret, 'updated', 'setter returns new value');
    is($obj->val, 'updated', 'value was actually set');
};

subtest 'method chaining' => sub {
    object::define('ChainTest', 'a:Str', 'b:Int', 'c:Num');

    my $obj = new ChainTest a => '', b => 0, c => 0.0;

    # Value is returned, allowing use in expressions
    my $res = $obj->a('hello');
    is($res, 'hello', 'setter returns value for chaining');
};

# ==== Constructor Variations ====

subtest 'new with hash' => sub {
    object::define('HashNew', 'x:Int', 'y:Int');

    my %args = (x => 10, y => 20);
    my $obj = new HashNew %args;
    is($obj->x, 10, 'hash args x');
    is($obj->y, 20, 'hash args y');
};

subtest 'new with partial args' => sub {
    object::define('PartialNew',
        'required:Str:required',
        'optional:Str:default(none)',
    );

    my $obj = new PartialNew required => 'yes';
    is($obj->required, 'yes', 'required field set');
    is($obj->optional, 'none', 'optional uses default');
};

# ==== Error Message Quality ====

subtest 'type error messages' => sub {
    object::define('ErrorMsg', 'num:Int');

    eval { new ErrorMsg num => 'not a number' };
    like($@, qr/Int/, 'error mentions expected type');
    like($@, qr/num/, 'error mentions property name');
};

subtest 'required field error' => sub {
    object::define('RequiredError', 'must_have:Str:required');

    eval { new RequiredError };
    like($@, qr/required|must_have/i, 'error for missing required field');
};

subtest 'readonly error' => sub {
    object::define('ReadonlyError', 'fixed:Str:readonly');

    my $obj = new ReadonlyError fixed => 'immutable';
    eval { $obj->fixed('change') };
    like($@, qr/readonly|cannot|modify/i, 'error for modifying readonly');
};

# ==== Property Name Edge Cases ====



( run in 0.957 second using v1.01-cache-2.11-cpan-df04353d9ac )