The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/local/bin/perl -w

use strict;

use Rose::HTML::Object::Errors qw(:number);

BEGIN
{
  use Test::More tests => 46;
  use_ok('Rose::HTML::Form::Field::Numeric');
}

my $field = Rose::HTML::Form::Field::Numeric->new(
  label       => 'Num', 
  description => 'Your num',
  name        => 'num',  
  value       => 123,
  default     => 456,
  maxlength   => 20);

ok(ref $field eq 'Rose::HTML::Form::Field::Numeric', 'new()');

ok($field->validate, 'validate() 0');

is($field->html_field, '<input maxlength="20" name="num" size="6" type="text" value="123">', 'html_field() 1');
is($field->xhtml_field, '<input maxlength="20" name="num" size="6" type="text" value="123" />', 'xhtml_field() 1');

$field->clear;

is($field->internal_value, undef, 'clear()');

is($field->html_field, '<input maxlength="20" name="num" size="6" type="text" value="">', 'html_field() 2');
is($field->xhtml_field, '<input maxlength="20" name="num" size="6" type="text" value="" />', 'xhtml_field() 2');

$field->reset;

is($field->internal_value, '456', 'reset()');

is($field->html_field, '<input maxlength="20" name="num" size="6" type="text" value="456">', 'html_field() 3');
is($field->xhtml_field, '<input maxlength="20" name="num" size="6" type="text" value="456" />', 'xhtml_field() 3');

$field->input_value('123.456');

$field->class('foo');
$field->id('bar');
$field->style('baz');

is($field->html_field, '<input class="foo" id="bar" maxlength="20" name="num" size="6" style="baz" type="text" value="123.456">', 'html_field() 4');
is($field->xhtml_field, '<input class="foo" id="bar" maxlength="20" name="num" size="6" style="baz" type="text" value="123.456" />', 'xhtml_field() 4');

$field->input_value('bad');  
ok(!$field->validate, 'validate() 1');
is($field->error, 'Num must be a number.', 'error() 1');
is($field->error_id, NUM_INVALID_NUMBER, 'error_id() 1');

$field->input_value('7^7');  
ok(!$field->validate, 'validate() 2');

$field->input_value('-1.23');  
ok($field->validate, 'validate() 3');

$field->input_value(' - 123.456 ');
ok($field->validate, 'validate() 4');
is($field->internal_value, '-123.456', 'internal_value() 1');

$field->input_value('   +  123.456 ');
ok($field->validate, 'validate() 4.1');
is($field->internal_value, '123.456', 'internal_value() 2');

ok(!$field->error, 'error() 2');

$field->input_value(-5);
ok($field->validate, 'validate() 5');
ok(!$field->error, 'error() 3');

$field->min(0);
ok(!$field->validate, 'validate() 6');
is($field->error, 'Num must be a positive number.', 'error() 4');
is($field->error_id, NUM_NOT_POSITIVE_NUMBER, 'error_id() 2');

$field->min(1);
ok(!$field->validate, 'validate() 7');
is($field->error, 'Num must be greater than or equal to 1.', 'error() 4');
is($field->error_id, NUM_BELOW_MIN, 'error_id() 3');

$field->max(100);
$field->input_value(100);

ok($field->validate, 'validate() 8');
ok(!$field->has_error, 'error() 4');

$field->input_value(101);
ok(!$field->validate, 'validate() 9');
is($field->error, 'Num must be less than or equal to 100.', 'error() 4');
is($field->error_id, NUM_ABOVE_MAX, 'error_id() 4');

$field->negative(1);
$field->input_value(300);
ok(!$field->validate, 'validate() 10');

$field->input_value(-300);
ok($field->validate, 'validate() 11');

$field->input_value(0);
ok($field->validate, 'validate() 12');

$field->positive(1);
ok($field->validate, 'validate() 13');

$field->input_value(-400);
ok(!$field->validate, 'validate() 14');

$field->input_value(400);
ok($field->validate, 'validate() 15');

$field->negative(0);
ok($field->validate, 'validate() 16');

$field->positive(0);
$field->input_value(-400);
ok($field->validate, 'validate() 17');
$field->input_value(400);
ok($field->validate, 'validate() 18');

$field->input_value('400a');
ok(!$field->validate, 'validate() 19');