#!/usr/bin/perl use strict; use warnings; use Test::More; BEGIN { eval "use Encode"; plan skip_all => "Encode is required for this test" if $@; eval "use JSON::Any"; plan skip_all => "JSON::Any is required for this test" if $@; # NOTE: # this is because JSON::XS is # the only one which really gets # utf8 correct # - SL BEGIN { $ENV{JSON_ANY_ORDER} = qw(XS); $ENV{JSON_ANY_CONFIG} = "utf8=1"; } plan tests => 16; use_ok('MooseX::Storage'); } { package Foo; use Moose; use MooseX::Storage; with Storage( 'format' => 'JSON' ); has 'utf8_string' => ( is => 'rw', isa => 'Str', default => sub { "ネットスーパー (Internet Shopping)" } ); } { my $foo = Foo->new; isa_ok( $foo, 'Foo' ); my $json = $foo->freeze; is($json, '{"__CLASS__":"Foo","utf8_string":"ネットスーパー (Internet Shopping)"}', '... got the right JSON'); my $foo2 = Foo->thaw($json); isa_ok( $foo, 'Foo' ); is($foo2->utf8_string, "ネットスーパー (Internet Shopping)", '... got the string we expected'); is($foo2->freeze, '{"__CLASS__":"Foo","utf8_string":"ネットスーパー (Internet Shopping)"}', '... got the right JSON'); } { my $test_string; { use utf8; $test_string = "ネットスーパー (Internet Shopping)"; no utf8; } ok(utf8::is_utf8($test_string), '... got a utf8 string'); ok(utf8::valid($test_string), '... got a valid utf8 string'); Encode::_utf8_off($test_string); ok(!utf8::is_utf8($test_string), '... no longer is utf8 string'); ok(utf8::valid($test_string), '... got a valid utf8 string'); my $foo = Foo->new( utf8_string => $test_string ); isa_ok( $foo, 'Foo' ); ok(!utf8::is_utf8($foo->utf8_string), '... not a utf8 string'); ok(utf8::valid($foo->utf8_string), '... but is a valid utf8 string'); my $json = $foo->freeze; ok(utf8::is_utf8($json), '... is a utf8 string now'); ok(utf8::valid($json), '... got a valid utf8 string'); is($json, '{"__CLASS__":"Foo","utf8_string":"ネットスーパー (Internet Shopping)"}', '... got the right JSON'); }