|
|
@ -4,9 +4,12 @@ main([]) -> |
|
|
|
code:add_pathz("ebin"), |
|
|
|
code:add_pathz("test"), |
|
|
|
|
|
|
|
etap:plan(21), |
|
|
|
etap:plan(75), |
|
|
|
util:test_good(good()), |
|
|
|
util:test_errors(errors()), |
|
|
|
|
|
|
|
test_utf8(utf8_cases()), |
|
|
|
|
|
|
|
etap:end_tests(). |
|
|
|
|
|
|
|
good() -> |
|
|
@ -32,5 +35,65 @@ errors() -> |
|
|
|
<<"\"\\uFFFF\"">>, |
|
|
|
<<"\"\\uD834foo\\uDD1E\"">>, |
|
|
|
% CouchDB-345 |
|
|
|
<<"\"",78,69,73,77,69,78,32,70,216,82,82,32,70,65,69,78,33,"\"">> |
|
|
|
<<34,78,69,73,77,69,78,32,70,216,82,82,32,70,65,69,78,33,34>> |
|
|
|
]. |
|
|
|
|
|
|
|
test_utf8([]) -> |
|
|
|
ok; |
|
|
|
test_utf8([Case | Rest]) -> |
|
|
|
etap:fun_is( |
|
|
|
fun({error, invalid_string}) -> true; (Else) -> Else end, |
|
|
|
jiffy:encode(Case), |
|
|
|
lists:flatten(io_lib:format("Invalid utf-8: ~p", [Case])) |
|
|
|
), |
|
|
|
Case2 = <<34, Case/binary, 34>>, |
|
|
|
etap:fun_is( |
|
|
|
fun({error, {_, invalid_string}}) -> true; (Else) -> Else end, |
|
|
|
jiffy:decode(Case2), |
|
|
|
lists:flatten(io_lib:format("Invalid utf-8: ~p", [Case2])) |
|
|
|
), |
|
|
|
test_utf8(Rest). |
|
|
|
|
|
|
|
utf8_cases() -> |
|
|
|
[ |
|
|
|
% Stray continuation byte |
|
|
|
<<16#C2, 16#81, 16#80>>, |
|
|
|
<<"foo", 16#80, "bar">>, |
|
|
|
|
|
|
|
% Not enough extension bytes |
|
|
|
<<16#C0>>, |
|
|
|
|
|
|
|
<<16#E0>>, |
|
|
|
<<16#E0, 16#80>>, |
|
|
|
|
|
|
|
<<16#F0>>, |
|
|
|
<<16#F0, 16#80>>, |
|
|
|
<<16#F0, 16#80, 16#80>>, |
|
|
|
|
|
|
|
<<16#F8>>, |
|
|
|
<<16#F8, 16#80>>, |
|
|
|
<<16#F8, 16#80, 16#80>>, |
|
|
|
<<16#F8, 16#80, 16#80, 16#80>>, |
|
|
|
|
|
|
|
<<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>>, |
|
|
|
|
|
|
|
% No data in high bits. |
|
|
|
<<16#C0, 16#80>>, |
|
|
|
<<16#C1, 16#80>>, |
|
|
|
|
|
|
|
<<16#E0, 16#80, 16#80>>, |
|
|
|
<<16#E0, 16#90, 16#80>>, |
|
|
|
|
|
|
|
<<16#F0, 16#80, 16#80, 16#80>>, |
|
|
|
<<16#F0, 16#88, 16#80, 16#80>>, |
|
|
|
|
|
|
|
<<16#F8, 16#80, 16#80, 16#80, 16#80>>, |
|
|
|
<<16#F8, 16#84, 16#80, 16#80, 16#80>>, |
|
|
|
|
|
|
|
<<16#FC, 16#80, 16#80, 16#80, 16#80, 16#80>>, |
|
|
|
<<16#FC, 16#82, 16#80, 16#80, 16#80, 16#80>> |
|
|
|
]. |