xref: /openbsd-src/gnu/usr.bin/perl/cpan/JSON-PP/t/119_incr_parse_utf8.t (revision f2a19305cfc49ea4d1a5feb55cd6c283c6f1e031)
1use strict;
2use warnings;
3use Test::More tests => 24;
4
5use utf8;
6use JSON::PP;
7use Encode;
8use charnames qw< :full >;
9
10use vars qw< @vs >;
11
12############################################################
13###  These first tests mimic the ones in `t/001_utf8.t`  ###
14############################################################
15
16scalar eval { JSON::PP->new->allow_nonref (1)->utf8 (1)->incr_parse ('"ü"') };
17like $@, qr/malformed UTF-8/;
18
19ok (JSON::PP->new->allow_nonref (1)->incr_parse ('"ü"') eq "ü");
20ok (JSON::PP->new->allow_nonref (1)->incr_parse ('"\u00fc"') eq "ü");
21ok (JSON::PP->new->allow_nonref (1)->incr_parse ('"\ud801\udc02' . "\x{10204}\"") eq "\x{10402}\x{10204}");
22ok (JSON::PP->new->allow_nonref (1)->incr_parse ('"\"\n\\\\\r\t\f\b"') eq "\"\012\\\015\011\014\010");
23
24
25my $JSON_TXT = <<JSON_TXT;
26{ "a": "1" }
27{ "b": "\N{BULLET}" }
28{ "c": "3" }
29JSON_TXT
30
31#######################
32###  With '->utf8'  ###
33#######################
34
35@vs = eval { JSON::PP->new->utf8->incr_parse( $JSON_TXT ) };
36like $@, qr/Wide character in subroutine entry/;
37
38
39@vs = eval { JSON::PP->new->utf8->incr_parse( encode 'UTF-8' => $JSON_TXT ) };
40
41ok( !$@ );
42ok( scalar @vs == 3 );
43
44is_deeply( \@vs, [ { a => "1" }, { b => "\N{BULLET}" }, { c => "3" } ] );
45is_deeply( $vs[0], { a => "1" } );
46is_deeply( $vs[1], { b => "\N{BULLET}" } );
47is_deeply( $vs[2], { c => "3" } );
48
49
50# Double-Encoded => "You Get What You Ask For"
51
52@vs = eval { JSON::PP->new->utf8->incr_parse( encode 'UTF-8' => ( encode 'UTF-8' => $JSON_TXT ) ) };
53
54ok( !$@ );
55ok( scalar @vs == 3 );
56
57is_deeply( \@vs, [ { a => "1" }, { b => "\x{E2}\x{80}\x{A2}" }, { c => "3" } ] );
58is_deeply( $vs[0], { a => "1" } );
59is_deeply( $vs[1], { b => "\x{E2}\x{80}\x{A2}" } );
60is_deeply( $vs[2], { c => "3" } );
61
62
63##########################
64###  Without '->utf8'  ###
65##########################
66
67@vs = eval { JSON::PP->new->incr_parse( $JSON_TXT ) };
68
69ok( !$@ );
70ok( scalar @vs == 3 );
71
72is_deeply( \@vs, [ { a => "1" }, { b => "\N{BULLET}" }, { c => "3" } ] );
73is_deeply( $vs[0], { a => "1" } );
74is_deeply( $vs[1], { b => "\N{BULLET}" } );
75is_deeply( $vs[2], { c => "3" } );
76