NAME
    Test::JSON::Type - Test JSON data with types.

SYNOPSIS
     use Test::JSON::Type;

     cmp_json_types($json, $json_expected, $test_name);
     is_json_type($json, $expected_type_hr, $test_name);

SUBROUTINES
  "cmp_json_types"
     cmp_json_types($json, $json_expected, $test_name);

    This decodes $json and $json_expected JSON strings to Perl structure and
    return data type structure defined by Cpanel::JSON::XS::Type. And
    compare these structures, if are same.

    Result is success or failure of this comparison. In case of failure
    print difference in test.

  "is_json_type"
     is_json_type($json, $expected_type_hr, $test_name);

    This decoded $json JSON string to Perl structure and return data type
    structure defined by Cpanel::JSON::XS::Type. Compare this structure with
    $expected_type_hr, if are same.

    Result is success or failure of this comparison. In case of failure
    print difference in test.

ERRORS
     cmp_json_types():
             JSON string isn't valid.
                     Error: %s
             JSON string to compare is required.
             Expected JSON string isn't valid.
                     Error: %s
             Expected JSON string to compare is required.
     is_json_type():
             JSON string isn't valid.
                     Error: %s
             JSON string to compare is required.

EXAMPLE1
     use strict;
     use warnings;

     use Test::JSON::Type;
     use Test::More 'tests' => 2;

     my $json_blank1 = '{}';
     my $json_blank2 = '{}';
     cmp_json_types($json_blank1, $json_blank2, 'Blank JSON strings.');

     my $json_struct1 = <<'END';
     {
       "bool": true,
       "float": 0.23,
       "int": 1,
       "null": null,
       "string": "bar"
     }
     END
     my $json_struct2 = <<'END';
     {
       "bool": false,
       "float": 1.23,
       "int": 2,
       "null": null,
       "string": "foo"
     }
     END
     cmp_json_types($json_struct1, $json_struct2, 'Structured JSON strings.');

     # Output:
     # 1..2
     # ok 1 - Blank JSON strings.
     # ok 2 - Structured JSON strings.

EXAMPLE2
     use strict;
     use warnings;

     use Test::JSON::Type;
     use Test::More 'tests' => 1;

     my $json_struct_err1 = <<'END';
     {
       "int": 1,
       "string": "1"
     }
     END
     my $json_struct_err2 = <<'END';
     {
       "int": 1,
       "string": 1
     }
     END
     cmp_json_types($json_struct_err1, $json_struct_err2, 'Structured JSON strings with error.');

     # Output:
     # 1..1
     # not ok 1 - Structured JSON strings with error.
     # #   Failed test 'Structured JSON strings with error.'
     # #   at ./ex2.pl line 21.
     # # +----+--------------------------------+-----------------------------+
     # # | Elt|Got                             |Expected                     |
     # # +----+--------------------------------+-----------------------------+
     # # |   0|{                               |{                            |
     # # |   1|  int => 'JSON_TYPE_INT',       |  int => 'JSON_TYPE_INT',    |
     # # *   2|  string => 'JSON_TYPE_STRING'  |  string => 'JSON_TYPE_INT'  *
     # # |   3|}                               |}                            |
     # # +----+--------------------------------+-----------------------------+
     # # Looks like you failed 1 test of 1.

EXAMPLE3
     use strict;
     use warnings;

     use Test::JSON::Type;
     use Test::More 'tests' => 1;

     my $json_struct_err1 = <<'END';
     {
       "int": 1,
       "array": ["1", 1]
     }
     END
     my $json_struct_err2 = <<'END';
     {
       "int": 1,
       "array": 1
     }
     END
     cmp_json_types($json_struct_err1, $json_struct_err2, 'Structured JSON strings with error.');

     # Output:
     # 1..1
     # not ok 1 - Structured JSON strings with error.
     # #   Failed test 'Structured JSON strings with error.'
     # #   at ./ex3.pl line 21.
     # # +----+--------------------------+----+-----------------------------+
     # # | Elt|Got                       | Elt|Expected                     |
     # # +----+--------------------------+----+-----------------------------+
     # # |   0|{                         |   0|{                            |
     # # *   1|  array => [              *   1|  array => 'JSON_TYPE_INT',  *
     # # *   2|    'JSON_TYPE_STRING',   *    |                             |
     # # *   3|    'JSON_TYPE_INT'       *    |                             |
     # # *   4|  ],                      *    |                             |
     # # |   5|  int => 'JSON_TYPE_INT'  |   2|  int => 'JSON_TYPE_INT'     |
     # # |   6|}                         |   3|}                            |
     # # +----+--------------------------+----+-----------------------------+
     # # Looks like you failed 1 test of 1.

EXAMPLE4
     use strict;
     use warnings;

     use Cpanel::JSON::XS::Type;
     use Test::JSON::Type;
     use Test::More 'tests' => 2;

     my $json_struct1 = <<'END';
     {
       "bool": true,
       "float": 0.23,
       "int": 1,
       "null": null,
       "string": "bar"
     }
     END
     my $json_struct2 = <<'END';
     {
       "bool": false,
       "float": 1.23,
       "int": 2,
       "null": null,
       "string": "foo"
     }
     END
     my $expected_type_hr = {
       'bool' => JSON_TYPE_BOOL,
       'float' => JSON_TYPE_FLOAT,
       'int' => JSON_TYPE_INT,
       'null' => JSON_TYPE_NULL,
       'string' => JSON_TYPE_STRING,
     };
     is_json_type($json_struct1, $expected_type_hr, 'Test JSON type #1.');
     is_json_type($json_struct2, $expected_type_hr, 'Test JSON type #2.');

     # Output:
     # 1..2
     # ok 1 - Test JSON type \#1.
     # ok 2 - Test JSON type \#2.

EXAMPLE5
     use strict;
     use warnings;

     use Cpanel::JSON::XS::Type;
     use Test::JSON::Type;
     use Test::More 'tests' => 2;

     my $json_struct = <<'END';
     {
       "array": [1,2,3]
     }
     END
     my $expected_type1_hr = {
       'array' => json_type_arrayof(JSON_TYPE_INT),
     };
     my $expected_type2_hr = {
       'array' => [
         JSON_TYPE_INT,
         JSON_TYPE_INT,
         JSON_TYPE_INT,
       ],
     };
     is_json_type($json_struct, $expected_type1_hr, 'Test JSON type (multiple integers).');
     is_json_type($json_struct, $expected_type2_hr, 'Test JSON type (three integers)');

     # Output:
     # 1..2
     # ok 1 - Test JSON type (multiple integers).
     # ok 2 - Test JSON type (three integers)

DEPENDENCIES
    Cpanel::JSON::XS, Cpanel::JSON::XS::Type, English, Error::Pure,
    Readonly, Test::Builder::Module, Test::Differences.

SEE ALSO
    Test::JSON
        Test JSON data

    Test::JSON::More
        JSON Test Utility

REPOSITORY
    <https://github.com/michal-josef-spacek/Test-JSON-Type>

AUTHOR
    Michal Josef Špaček <mailto:skim@cpan.org>

    <http://skim.cz>

LICENSE AND COPYRIGHT
    © 2021-2022 Michal Josef Špaček

    BSD 2-Clause License

VERSION
    0.04

