JSON-Structure

 view release on metacpan or  search on metacpan

t/05_format_validation.t  view on Meta::CPAN

# Int64 Type Tests (as string for large values)
#
subtest 'Int64 type validation with string representation' => sub {
    my $s = schema(type => 'int64');
    my $validator = JSON::Structure::InstanceValidator->new(schema => $s);
    
    # Valid int64 values
    ok($validator->validate(0)->is_valid, 'valid int64: 0');
    ok($validator->validate(100)->is_valid, 'valid int64: 100');
    ok($validator->validate(-100)->is_valid, 'valid int64: -100');
    
    # String representation for large values beyond JS safe integer
    ok($validator->validate('9007199254740993')->is_valid, 'valid int64 string: beyond JS safe integer');
    ok($validator->validate('-9007199254740993')->is_valid, 'valid int64 string: negative beyond safe');
    ok($validator->validate('9223372036854775807')->is_valid, 'valid int64 string: max int64');
    ok($validator->validate('-9223372036854775808')->is_valid, 'valid int64 string: min int64');
    
    # Invalid
    ok(!$validator->validate('not-a-number')->is_valid, 'invalid: text');
    ok(!$validator->validate(3.14)->is_valid, 'invalid: float');
};

#
# Uint64 Type Tests
#
subtest 'Uint64 type validation' => sub {
    my $s = schema(type => 'uint64');
    my $validator = JSON::Structure::InstanceValidator->new(schema => $s);
    
    # Valid uint64 values
    ok($validator->validate(0)->is_valid, 'valid uint64: 0');
    ok($validator->validate('18446744073709551615')->is_valid, 'valid uint64 string: max value');
    ok($validator->validate('9007199254740993')->is_valid, 'valid uint64 string: beyond JS safe');
    
    # Invalid
    ok(!$validator->validate(-1)->is_valid, 'invalid uint64: negative');
    ok(!$validator->validate('-1')->is_valid, 'invalid uint64 string: negative');
    ok(!$validator->validate(3.14)->is_valid, 'invalid: float');
};

#
# Float/Double Type Tests
#
subtest 'Float and Double type validation' => sub {
    my $sf = schema(type => 'float');
    my $sd = schema(type => 'double');
    my $vf = JSON::Structure::InstanceValidator->new(schema => $sf);
    my $vd = JSON::Structure::InstanceValidator->new(schema => $sd);
    
    # Valid floats
    ok($vf->validate(3.14)->is_valid, 'valid float: 3.14');
    ok($vf->validate(0)->is_valid, 'valid float: 0');
    ok($vf->validate(-3.14)->is_valid, 'valid float: negative');
    ok($vf->validate(1.23e10)->is_valid, 'valid float: scientific notation');
    
    # Valid doubles
    ok($vd->validate(3.141592653589793)->is_valid, 'valid double: pi');
    ok($vd->validate(1.7976931348623157e308)->is_valid, 'valid double: large');
    
    # Special values as strings
    ok($vf->validate('NaN')->is_valid || !$vf->validate('NaN')->is_valid, 'NaN handling defined');
    ok($vf->validate('Infinity')->is_valid || !$vf->validate('Infinity')->is_valid, 'Infinity handling defined');
    
    # Invalid
    ok(!$vf->validate('hello')->is_valid, 'invalid float: text');
    ok(!$vd->validate([1, 2, 3])->is_valid, 'invalid double: array');
};

#
# Pattern Validation Tests
#
subtest 'Pattern validation' => sub {
    my $s = schema(
        type => 'string',
        pattern => '^[A-Z][a-z]+$'
    );
    my $validator = JSON::Structure::InstanceValidator->new(schema => $s, extended => 1);
    
    # Valid patterns
    ok($validator->validate('Hello')->is_valid, 'valid: matches pattern');
    ok($validator->validate('World')->is_valid, 'valid: matches pattern');
    ok($validator->validate('Ab')->is_valid, 'valid: minimal match');
    
    # Invalid patterns
    my $result = $validator->validate('hello');
    ok(!$result->is_valid, 'invalid: lowercase start');
    ok(scalar(grep { $_->code eq INSTANCE_STRING_PATTERN_MISMATCH } @{$result->errors}), 'reports pattern mismatch');
    
    ok(!$validator->validate('HELLO')->is_valid, 'invalid: all uppercase');
    ok(!$validator->validate('Hello123')->is_valid, 'invalid: contains numbers');
    ok(!$validator->validate('')->is_valid, 'invalid: empty string');
};

#
# Number Constraints Tests
#
subtest 'Number constraints validation' => sub {
    my $s = schema(
        type => 'number',
        minimum => 0,
        maximum => 100,
        exclusiveMinimum => 0,
        exclusiveMaximum => 100
    );
    my $validator = JSON::Structure::InstanceValidator->new(schema => $s, extended => 1);
    
    # Valid values
    ok($validator->validate(50)->is_valid, 'valid: middle of range');
    ok($validator->validate(1)->is_valid, 'valid: just above exclusive min');
    ok($validator->validate(99)->is_valid, 'valid: just below exclusive max');
    ok($validator->validate(0.001)->is_valid, 'valid: just above 0');
    ok($validator->validate(99.999)->is_valid, 'valid: just below 100');
    
    # Invalid values
    ok(!$validator->validate(0)->is_valid, 'invalid: equals exclusive minimum');
    ok(!$validator->validate(100)->is_valid, 'invalid: equals exclusive maximum');
    ok(!$validator->validate(-1)->is_valid, 'invalid: below minimum');
    ok(!$validator->validate(101)->is_valid, 'invalid: above maximum');
};

#



( run in 0.962 second using v1.01-cache-2.11-cpan-39bf76dae61 )