Form-Sensible-Reflector-MySQL

 view release on metacpan or  search on metacpan

lib/Form/Sensible/Reflector/MySQL.pm  view on Meta::CPAN

		$f->{upper_bound} = $mysql_type =~ /unsigned/? 4294967295 : 2147483647;
	}
	
	# Treat massive integers as strings or nothing works
	elsif ($mysql_type =~ /^bigint/){
		$f->{field_type} = 'Text';
		$f->{validation} = { code => $mysql_type =~ /unsigned/ ?
			sub { 
				use Math::BigInt;
				my $n = Math::BigInt->new( $_[0] );
				# return '_FIELDNAME_ is an invalid unsigned big integer' if $n eq 'NaN';
				return $self->i18n->{ubigint}->{nan} if $n eq 'NaN';
				return $self->i18n->{ubigint}->{not_int} if not $n->is_int;
				return $self->i18n->{ubigint}->{too_high} if $n > 8446744073709551615;
				return $self->i18n->{ubigint}->{too_low} if $n < 0;
				return 0;
			}
		:	sub { 
				use Math::BigInt ':constant';
				my $n = Math::BigInt->new( $_[0] );
				return $self->i18n->{sbigint}->{nan} if $n eq 'NaN';
				return $self->i18n->{sbigint}->{not_int} if not $n->is_int;
				return $self->i18n->{sbigint}->{too_high} if $n > 9223372036854775807;
				return $self->i18n->{sbigint}->{too_low} if $n < -9223372036854775808;
				return 0;
			}
		};
	}

	elsif ($mysql_type =~ /^(double|real)/){
		$f->{field_type} = 'Text';
		$f->{validation} = { code => sub {
				use Math::BigFloat ':constant';
				my $n = Math::BigFloat->new( $_[0] );
				return $self->i18n->{double}->{nan} if $n eq 'NaN';
				return $self->i18n->{double}->{oob}
					if ($n <= -1.7976931348623157E+308 and $n >= -2.2250738585072014E-308)
						or $n== 0
						or ($n <= 2.2250738585072014E-308 and $n >= 1.7976931348623157E+3080);
				return 0;
			}
		};
	}
	
	elsif ($mysql_type =~ /^(decimal|numeric) (?: \((\d+) (?:,(\d+))? \) )?$/x ){

t/510_floats.t  view on Meta::CPAN

	}
);

is( scalar $form->get_fields, 1, 'number of fields');

$form->field($col)->value( 'a test string' );

isnt( 
	scalar keys %{ $form->validate->error_fields }, 
	0, 
	$col.' NaN produces errors'
);

like( 
	$form->validate->error_fields->{$col}->[0],
	qr'not a valid', 'NaN'
); 


is(
	$form->field('my_floatnm')->{upper_bound},
	999.99,
	'upper bound of float'
);
is(
	$form->field('my_floatnm')->{lower_bound},

t/510_floats.t  view on Meta::CPAN


$form->field('my_floatnm')->value( 9999 );
@rv = $form->field('my_floatnm')->validate;
#like( $rv[0], qr'higher', 'float too high'); 
like( $rv[0], qr'3', 'float too high'); 

$form->field('my_floatnm')->value( 99.999 );
like( 
	$form->validate->error_fields->{$col}->[0],
	qr'3',
	'NaN error'
); 

$form->field('my_floatnm')->value( 999.99 );
is( 
	scalar (keys %{$form->validate->error_fields}),
	0,
	'no errors'
);

$form->field($col)->value( 18446744073709551615 );

t/510_floats.t  view on Meta::CPAN

	}
);

$form->field('my_floatn')->value( 'a test string' );

isnt( scalar keys %{ $form->validate->error_fields }, 0, 'has errors');

like( 
	$form->validate->error_fields->{'my_floatn'}->[0],
	qr'not a valid',
	'NaN'
); 

$form->field($col)->value( 18446744073709551615 );
isnt( 
	$form->validate->error_fields->{$col}->[0],
	'Invalid number format', 'NaN'
); 

done_testing(15);

t/540_doubles.t  view on Meta::CPAN

		{
			%$options,
			only_columns => [$col]
		}
	);
	
	$form->field($col)->value( 'a test string' );
	like( 
		$form->validate->error_fields->{$col}->[0],
		qr'is not a valid', 
		'String is NaN'
	); 

	TODO: {
		local $TODO = "TODO Math::BigInt->new( -1.7976931348623157E+309 )";
		$form->field($col)->value( Math::BigInt->new( -1.7976931348623157E+309 ));
		# TODO Bounds and out of bounds tests
		is( 
			$form->validate->error_fields->{$col}->[0],
			undef,
			'expon'

t/550_decmail.t  view on Meta::CPAN

		{
			%$options,
			only_columns => [$col]
		}
	);
	
	$form->field($col)->value( 'a test string' );
	like( 
		$form->validate->error_fields->{$col}->[0],
		qr'not a valid', 
		'String is NaN'
	); 
	
	# TODO Bounds and out of bounds tests
	$form->field($col)->value( '9' x 66 );
	like( 
		$form->validate->error_fields->{$col}->[0],
		qr'too many digits', 
		'Exceeds default'
	); 
	

t/550_decmail.t  view on Meta::CPAN

	my $form  = $reflector->reflect_from($Local::Fixtures::dbh, 
		{
			%$options,
			only_columns => [$col]
		}
	);
	$form->field($col)->value( 'a test string' );
	like( 
		$form->validate->error_fields->{$col}->[0],
		qr'not a valid', 
		'String is NaN'
	); 

	my $max = $Local::Fixtures::dbh->selectrow_array(
		"SELECT `$col` FROM $Local::Fixtures::table_name LIMIT 1"
	);

	$form->field($col)->value( $max );
	is( 
		scalar keys %{$form->validate->error_fields},
		0, 

t/560_ints.t  view on Meta::CPAN

my $form  = $reflector->reflect_from($Local::Fixtures::dbh, $options);

goto TEST;

# TINYINT S

is( $form->field('my_tinyint_s')->field_type, 'number', 'class');

$form->field('my_tinyint_s')->value( 'a test string' );
@rv = $form->field('my_tinyint_s')->validate;
like( $rv[0], qr'is not a number', 'NaN');

$form->clear_state;

$form->field('my_tinyint_s')->value( -129 );
like(  $form->validate->error_fields->{'my_tinyint_s'}->[0], qr'lower', 'lower'); 

TEST:
$form->field('my_tinyint_s')->value( -128 );
is( $form->field('my_tinyint_s')->value, -128, 'Set negative value' );

t/560_ints.t  view on Meta::CPAN


$form->set_values({ my_tinyint_s => 128 });
ok( not($form->validate->is_valid), 'tinyint s 128 ok');

# TINYINT U	

is( $form->field('my_tinyint_u')->field_type, 'number', 'class');

$form->field('my_tinyint_u')->value( 'a test string' );
@rv = $form->field('my_tinyint_u')->validate;
like( $rv[0], qr'is not a number', 'NaN');

$form->field('my_tinyint_u')->value( 256 );
like( 
	$form->validate->error_fields->{'my_tinyint_u'}->[0],
	qr'higher',
	'higher'
); 

$form->field('my_tinyint_u')->value( 255 );

t/560_ints.t  view on Meta::CPAN

) or explain $form->field('my_tinyint_u')->validate->error_fields;



# SMALLINT S

is( $form->field('my_smallint_s')->field_type, 'number', 'class');

$form->field('my_smallint_s')->value( 'a test string' );
@rv = $form->field('my_smallint_s')->validate;
like( $rv[0], qr'is not a number', 'NaN');

$form->field('my_smallint_s')->value( -32769 );
@rv = $form->field('my_smallint_s')->validate;
like( $rv[0], qr'lower', 'lower'); 

$form->field('my_smallint_s')->value( -32768 );
is( $form->field('my_smallint_s')->validate, 0, 'smallint s -32768 ok');

$form->set_values({ my_smallint_s => 32768 });
@rv = $form->field('my_smallint_s')->validate;

t/560_ints.t  view on Meta::CPAN


$form->set_values({ my_smallint_s => 0 });
ok( not($form->validate->is_valid), 'smallint s 0 ok');

# SMALLINT U	

is( $form->field('my_smallint_u')->field_type, 'number', 'class');

$form->field('my_smallint_u')->value( 'a test string' );
@rv = $form->field('my_smallint_u')->validate;
like( $rv[0], qr'not a number', 'NaN');

$form->field('my_smallint_u')->value( 65536 );
@rv = $form->field('my_smallint_u')->validate;
like( $rv[0], qr'higher', 'higher'); 

$form->field('my_smallint_u')->value( 65535 );
is( $form->field('my_smallint_u')->validate, 0, 'smallint u 255 ok' );

$form->field('my_smallint_u')->value( -1 );
@rv = $form->field('my_smallint_u')->validate;

t/560_ints.t  view on Meta::CPAN

$form->field('my_smallint_u')->value( 0 );
is( $form->field('my_smallint_u')->validate, 0, 'smallint u 0 ok' );


# MEDIUMINT S

is( $form->field('my_mediumint_s')->field_type, 'number', 'class');

$form->field('my_mediumint_s')->value( 'a test string' );
@rv = $form->field('my_mediumint_s')->validate;
like( $rv[0], qr'not a number', 'NaN');

$form->field('my_mediumint_s')->value( -8388609 );
@rv = $form->field('my_mediumint_s')->validate;
like( $rv[0], qr'lower', 'lower'); 

$form->field('my_mediumint_s')->value( -8388608 );
is( $form->field('my_mediumint_s')->validate, 0, 'mediumint s -8388608 ok');

$form->set_values({ my_mediumint_s => 8388608 });
@rv = $form->field('my_mediumint_s')->validate;

t/560_ints.t  view on Meta::CPAN


$form->set_values({ my_mediumint_s => 0 });
ok( not($form->validate->is_valid), 'mediumint s 0 ok');

# MEDIUMINT U	

is( $form->field('my_mediumint_u')->field_type, 'number', 'class');

$form->field('my_mediumint_u')->value( 'a test string' );
@rv = $form->field('my_mediumint_u')->validate;
like( $rv[0], qr'not a number', 'NaN');

$form->field('my_mediumint_u')->value( 16777216 );
@rv = $form->field('my_mediumint_u')->validate;
like( $rv[0], qr'higher'); 

$form->field('my_mediumint_u')->value( 16777215 );
is( $form->field('my_mediumint_u')->validate, 0, 'mediumint u 255 ok' );

$form->field('my_mediumint_u')->value( -1 );
@rv = $form->field('my_mediumint_u')->validate;

t/560_ints.t  view on Meta::CPAN

$form->field('my_mediumint_u')->value( 0 );
is( $form->field('my_mediumint_u')->validate, 0,  'mediumint u 0 ok' );


# INT S

is( $form->field('my_int_s')->field_type, 'number', 'class');

$form->field('my_int_s')->value( 'a test string' );
@rv = $form->field('my_int_s')->validate;
like( $rv[0], qr'not a number', 'NaN');

$form->field('my_int_s')->value( -2147483649 );
@rv = $form->field('my_int_s')->validate;
like( $rv[0], qr'lower', 'lower'); 

$form->field('my_int_s')->value( -2147483648 );
is( $form->field('my_int_s')->validate, 0, 'int s -8388608 ok');

$form->set_values({ my_int_s => 2147483648 });
@rv = $form->field('my_int_s')->validate;

t/560_ints.t  view on Meta::CPAN


$form->set_values({ my_int_s => 0 });
ok( not($form->validate->is_valid), 'int s 0 ok');

# INT U	

is( $form->field('my_int_u')->field_type, 'number', 'class');

$form->field('my_int_u')->value( 'a test string' );
@rv = $form->field('my_int_u')->validate;
like( $rv[0], qr'not a number', 'NaN');

$form->field('my_int_u')->value( 4294967296 );
@rv = $form->field('my_int_u')->validate;
like( $rv[0], qr'higher'); 

$form->field('my_int_u')->value( 4294967295 );
is( $form->field('my_int_u')->validate, 0, 'int u 255 ok' );

$form->field('my_int_u')->value( -1 );
@rv = $form->field('my_int_u')->validate;

t/560_ints.t  view on Meta::CPAN



# BIGINT S

is( $form->field('my_bigint_s')->field_type, 'Text', 'class');

$form->field('my_bigint_s')->value( 'a test string' );
like( 
	$form->validate->error_fields->{'my_bigint_s'}->[0], 
	qr'invalid',
	'NaN'
) or explain $form->validate->error_fields->{'my_bigint_s'};

$form->field('my_bigint_s')->value( -9223372036854775809 );

is( $form->field('my_bigint_s')->value, -9223372036854775809, 'big int signed');
TODO: {
	local $TODO = 'Error messages vary between versions of Form::Sensible';
	# http://www.cpantesters.org/cpan/report/3af9e5c6-520e-11e0-8a1e-03415704ce1c
	like(  
		$form->validate->error_fields->{'my_bigint_s'}->[0], 

t/560_ints.t  view on Meta::CPAN

ok( not($form->validate->is_valid), 'bigint s 0 ok');

# BIGINT U	

is( $form->field('my_bigint_u')->field_type, 'Text', 'class');

$form->field('my_bigint_u')->value( 'a test string' );
like(
	$form->validate->error_fields->{'my_bigint_u'}->[0],
	qr'invalid',
	'a test string is NaN'
);

$form->field('my_bigint_u')->value( 18446744073709551616 );
like( 
	$form->validate->error_fields->{'my_bigint_u'}->[0],
	qr'higher',
	'exceeds big int u upper bounds'
);

$form->field('my_bigint_u')->value( 255 );



( run in 0.296 second using v1.01-cache-2.11-cpan-4d50c553e7e )