@ -6,7 +6,7 @@ main([]) ->
code:add_pathz ( "ebin" ) ,
code:add_pathz ( "test" ) ,
etap:plan ( 87 ) ,
etap:plan ( 116 ) ,
util:test_good ( good ( ) ) ,
util:test_good ( uescaped ( ) , [ uescape ] ) ,
util:test_errors ( errors ( ) ) ,
@ -61,12 +61,17 @@ errors() ->
test_utf8 ( [] ) - >
ok ;
test_utf8 ( [ Case | Rest ] ) - >
test_utf8 ( [ { Case , Fixed } | Rest ] ) - >
etap:fun_is (
fun ( { error , invalid_string } ) - > true ; ( Else ) - > Else end ,
( catch jiffy:encode ( Case ) ) ,
lists:flatten ( io_lib:format ( "Invalid utf-8: ~p" , [ Case ] ) )
) ,
etap:fun_is (
fun ( Fixed ) - > true ; ( Else ) - > Else end ,
jiffy:encode ( Case , [ force_utf8 ] ) ,
lists:flatten ( io_lib:format ( "Fixed correctly: ~p" , [ Fixed ] ) )
) ,
Case2 = << 34 , Case / binary , 34 >> ,
etap:fun_is (
fun ( { error , { _ , invalid_string } } ) - > true ; ( Else ) - > Else end ,
@ -78,47 +83,47 @@ test_utf8([Case | Rest]) ->
utf8_cases ( ) - >
[
% Stray continuation byte
<< 16 #C2, 16#81, 16#80>>,
<< "foo" , 16 #80, "bar">>,
{ << 16 #C2, 16#81, 16#80>>, <<16#C2, 16#81, 16#EF, 16#BF, 16#BD>>} ,
{ << "foo" , 16 #80, "bar">>, <<"foo", 16#EF, 16#BF, 16#BD, "bar">>} ,
% Invalid Unicode code points
<< 239 , 191 , 190 >> ,
<< 237 , 160 , 129 >> ,
{ << 239 , 191 , 190 >> , << 16 #EF, 16#BF, 16#BD>>},
{ << 237 , 160 , 129 >> , << 16 #EF, 16#BF, 16#BD>>},
% Not enough extension bytes
<<16#C0> > ,
{ <<16#C0> > , << 16 #EF, 16#BF, 16#BD>>},
<<16#E0> > ,
<< 16 #E0, 16#80>>,
{ <<16#E0> > , << 16 #EF, 16#BF, 16#BD>>},
{ << 16 #E0, 16#80>>, <<16#EF, 16#BF, 16#BD>>} ,
<<16#F0> > ,
<< 16 #F0, 16#80>>,
<< 16 #F0, 16#80, 16#80>>,
{ <<16#F0> > , << 16 #EF, 16#BF, 16#BD>>},
{ << 16 #F0, 16#80>>, <<16#EF, 16#BF, 16#BD>>} ,
{ << 16 #F0, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>} ,
<<16#F8> > ,
<< 16 #F8, 16#80>>,
<< 16 #F8, 16#80, 16#80>>,
<< 16 #F8, 16#80, 16#80, 16#80>>,
{ <<16#F8> > , << 16 #EF, 16#BF, 16#BD>>},
{ << 16 #F8, 16#80>>, <<16#EF, 16#BF, 16#BD>>} ,
{ << 16 #F8, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>} ,
{ << 16 #F8, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>} ,
<<16#FC> > ,
<< 16 #FC, 16#80>>,
<< 16 #FC, 16#80, 16#80>>,
<< 16 #FC, 16#80, 16#80, 16#80>>,
<< 16 #FC, 16#80, 16#80, 16#80, 16#80>>,
{ <<16#FC> > , << 16 #EF, 16#BF, 16#BD>>},
{ << 16 #FC, 16#80>>, <<16#EF, 16#BF, 16#BD>>} ,
{ << 16 #FC, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>} ,
{ << 16 #FC, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>} ,
{ << 16 #FC, 16#80, 16#80, 16#80, 16#80>>, <<16#EF, 16#BF, 16#BD>>} ,
% No data in high bits .
<< 16 #C0, 16#80>>,
<< 16 #C1, 16#80>>,
{ << 16 #C0, 16#80>>, <<"\"\\u0000\"">>} ,
{ << 16 #C1, 16#80>>, <<"\"\\u0000\"">>} ,
<< 16 #E0, 16#80, 16#80>>,
<< 16 #E0, 16#90, 16#80>>,
{ << 16 #E0, 16#80, 16#80>>, <<"\"\\u0000\"">>} ,
{ << 16 #E0, 16#90, 16#80>>, <<"\"\\u0000\"">>} ,
<< 16 #F0, 16#80, 16#80, 16#80>>,
<< 16 #F0, 16#88, 16#80, 16#80>>,
{ << 16 #F0, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>} ,
{ << 16 #F0, 16#88, 16#80, 16#80>>, <<"\"\\u0000\"">>} ,
<< 16 #F8, 16#80, 16#80, 16#80, 16#80>>,
<< 16 #F8, 16#84, 16#80, 16#80, 16#80>>,
{ << 16 #F8, 16#80, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>} ,
{ << 16 #F8, 16#84, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>} ,
<< 16 #FC, 16#80, 16#80, 16#80, 16#80, 16#80>>,
<< 16 #FC, 16#82, 16#80, 16#80, 16#80, 16#80>>
{ << 16 #FC, 16#80, 16#80, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>} ,
{ << 16 #FC, 16#82, 16#80, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>}
] .