The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
=head1 PURPOSE

Testing required versus optional properties.

=cut

use Test::More;
use strict;
use warnings;
use JSON::Schema;

my $schema1 = JSON::Schema->new({
    type => 'object',
    properties => {
        mynumber => { required => 1 }
    },
	 additionalProperties => {},
});

my $schema2 = JSON::Schema->new({
    type => 'object',
    properties => {
        mynumber => { required => 0 }
    },
	 additionalProperties => {},
});

my $schema3 = JSON::Schema->new({
    type => 'object',
    properties => {
        mynumber => { optional => 1 }
    },
	 additionalProperties => {},
});

my $schema4 = JSON::Schema->new({
    type => 'object',
    properties => {
        mynumber => { optional => 0 }
    },
	 additionalProperties => {},
});

my $data1 = { mynumber => 1 };
my $data2 = { mynumbre => 1 };

my $result = $schema1->validate($data1);
ok $result, 'A'
  or map { diag "reason: $_" } $result->errors;

$result = $schema1->validate($data2);
ok !$result, 'B'
  or map { diag "reason: $_" } $result->errors;

$result = $schema2->validate($data1);
ok $result, 'C'
  or map { diag "reason: $_" } $result->errors;

$result = $schema2->validate($data2);
ok $result, 'D'
  or map { diag "reason: $_" } $result->errors;

$result = $schema3->validate($data1);
ok $result, 'E'
  or map { diag "reason: $_" } $result->errors;

$result = $schema3->validate($data2);
ok $result, 'F'
  or map { diag "reason: $_" } $result->errors;

$result = $schema4->validate($data1);
ok $result, 'G'
  or map { diag "reason: $_" } $result->errors;

$result = $schema4->validate($data2);
ok !$result, 'H'
  or map { diag "reason: $_" } $result->errors;

done_testing;