File Coverage

blib/lib/Test/JSON/Type.pm
Criterion Covered Total %
statement 97 103 94.1
branch 31 34 91.1
condition n/a
subroutine 13 13 100.0
pod 2 2 100.0
total 143 152 94.0


line stmt bran cond sub pod time code
1             package Test::JSON::Type;
2              
3 4     4   90741 use base qw(Test::Builder::Module);
  4         26  
  4         1305  
4 4     4   146268 use strict;
  4         8  
  4         64  
5 4     4   16 use warnings;
  4         6  
  4         102  
6              
7 4     4   2557 use Cpanel::JSON::XS;
  4         14947  
  4         209  
8 4     4   1230 use Cpanel::JSON::XS::Type;
  4         2377  
  4         328  
9 4     4   879 use English;
  4         5857  
  4         23  
10 4     4   2846 use Error::Pure qw(err);
  4         13650  
  4         61  
11 4     4   182 use Readonly;
  4         6  
  4         131  
12 4     4   1876 use Test::Differences qw(eq_or_diff);
  4         62965  
  4         2472  
13              
14             Readonly::Array our @EXPORT => qw(cmp_json_types is_json_type);
15              
16             our $VERSION = 0.03;
17              
18             sub cmp_json_types {
19 12     12 1 24293 my ($json, $json_expected, $test_name) = @_;
20              
21 12 100       31 if (! defined $json) {
22 1         6 err 'JSON string to compare is required.';
23             }
24 11 100       22 if (! defined $json_expected) {
25 1         4 err 'Expected JSON string to compare is required.';
26             }
27              
28 10         67 my $test = __PACKAGE__->builder;
29 10         97 my $json_obj = Cpanel::JSON::XS->new;
30              
31 10         14 my $type_hr;
32 10         12 eval {
33 10         72 $json_obj->decode($json, $type_hr);
34             };
35 10 100       27 if ($EVAL_ERROR) {
36 1         3 err "JSON string isn't valid.",
37             'Error', $EVAL_ERROR,
38             ;
39             }
40 9         21 _readable_types($type_hr);
41 9         9 my $type_expected_hr;
42 9         11 eval {
43 9         37 $json_obj->decode($json_expected, $type_expected_hr);
44             };
45 9 100       24 if ($EVAL_ERROR) {
46 1         4 err "Expected JSON string isn't valid.",
47             'Error', $EVAL_ERROR,
48             ;
49             }
50 8         13 _readable_types($type_expected_hr);
51              
52 8         12 local $Test::Builder::Level = $Test::Builder::Level + 1;
53 8         16 return eq_or_diff($type_hr, $type_expected_hr, $test_name);
54             }
55              
56             sub is_json_type {
57 13     13 1 14620 my ($json, $type_expected_hr, $test_name) = @_;
58              
59 13 100       28 if (! defined $json) {
60 1         4 err 'JSON string to compare is required.';
61             }
62              
63 12         34 my $test = __PACKAGE__->builder;
64 12         103 my $json_obj = Cpanel::JSON::XS->new;
65              
66 12         15 my $type_hr;
67 12         14 my $json_hr = eval {
68 12         67 $json_obj->decode($json, $type_hr);
69             };
70 12 100       36 if ($EVAL_ERROR) {
71 1         3 err "JSON string isn't valid.",
72             'Error', $EVAL_ERROR,
73             ;
74             }
75 11         22 _readable_types($type_hr);
76              
77 11         14 local $Test::Builder::Level = $Test::Builder::Level + 1;
78 11         14 eval {
79 11         57 $json_obj->encode($json_hr, $type_expected_hr);
80             };
81 11 50       22 if ($EVAL_ERROR) {
82 0         0 $test->ok(0, $test_name);
83 0         0 $test->diag('Error: '.$EVAL_ERROR);
84 0         0 return;
85             }
86              
87 11         28 $test->ok(1, $test_name);
88 11         2629 return 1;
89             }
90              
91             sub _change_type {
92 43     43   46 my $value_sr = shift;
93              
94 43 100       42 if (${$value_sr} == JSON_TYPE_BOOL) {
  43 100       63  
    100          
    100          
    50          
95 6         8 ${$value_sr} = 'JSON_TYPE_BOOL';
  6         8  
96 37         50 } elsif (${$value_sr} == JSON_TYPE_INT) {
97 16         17 ${$value_sr} = 'JSON_TYPE_INT';
  16         21  
98 21         33 } elsif (${$value_sr} == JSON_TYPE_FLOAT) {
99 6         8 ${$value_sr} = 'JSON_TYPE_FLOAT';
  6         9  
100 15         22 } elsif (${$value_sr} == JSON_TYPE_STRING) {
101 9         11 ${$value_sr} = 'JSON_TYPE_STRING';
  9         14  
102 6         24 } elsif (${$value_sr} == JSON_TYPE_NULL) {
103 6         9 ${$value_sr} = 'JSON_TYPE_NULL';
  6         8  
104             } else {
105 0         0 err "Unsupported value '${$value_sr}'.";
  0         0  
106             }
107              
108 43         59 return;
109             }
110              
111             sub _readable_types {
112 83     83   90 my $type_r = shift;
113              
114 83 100       169 if (ref $type_r eq 'HASH') {
    100          
    50          
115 31         33 foreach my $sub_key (keys %{$type_r}) {
  31         76  
116 28 100       50 if (ref $type_r->{$sub_key}) {
117 9         23 _readable_types($type_r->{$sub_key});
118             } else {
119 19         40 _readable_types(\$type_r->{$sub_key});
120             }
121             }
122             } elsif (ref $type_r eq 'ARRAY') {
123 9         11 foreach my $sub_type (@{$type_r}) {
  9         13  
124 27 100       34 if (ref $sub_type) {
125 3         5 _readable_types($sub_type);
126             } else {
127 24         36 _readable_types(\$sub_type);
128             }
129             }
130             } elsif (ref $type_r eq 'SCALAR') {
131 43         55 _change_type($type_r);
132             } else {
133 0         0 err "Unsupported value '$type_r'.";
134             }
135              
136 83         105 return;
137             }
138              
139             1;
140              
141             __END__