You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

129 lines
4.0 KiB

#! /usr/bin/env escript
% This file is part of Jiffy released under the MIT license.
% See the LICENSE file for more information.
main([]) ->
code:add_pathz("ebin"),
code:add_pathz("test"),
etap:plan(116),
util:test_good(good()),
util:test_good(uescaped(), [uescape]),
util:test_errors(errors()),
test_utf8(utf8_cases()),
etap:end_tests().
good() ->
[
{<<"\"\"">>, <<"">>},
{<<"\"0\"">>, <<"0">>},
{<<"\"foo\"">>, <<"foo">>},
{<<"\"\\\"foobar\\\"\"">>, <<"\"foobar\"">>},
{<<"\"\\n\\n\\n\"">>, <<"\n\n\n">>},
{<<"\"\\\" \\b\\f\\r\\n\\t\\\"\"">>, <<"\" \b\f\r\n\t\"">>},
{<<"\"foo\\u0005bar\"">>, <<"foo", 5, "bar">>},
{
<<"\"\\uD834\\uDD1E\"">>,
<<240, 157, 132, 158>>,
<<34, 240, 157, 132, 158, 34>>
}
].
uescaped() ->
[
{
<<"\"\\u8CA8\\u5481\\u3002\\u0091\\u0091\"">>,
<<232,178,168,229,146,129,227,128,130,194,145,194,145>>
},
{
<<"\"\\uD834\\uDD1E\"">>,
<<240, 157, 132, 158>>
},
{
<<"\"\\uD83D\\uDE0A\"">>,
<<240, 159, 152, 138>>
}
].
errors() ->
[
<<"\"foo">>,
<<"\"", 0, "\"">>,
<<"\"\\g\"">>,
<<"\"\\uFFFF\"">>,
<<"\"\\uFFFE\"">>,
<<"\"\\uD834foo\\uDD1E\"">>,
% CouchDB-345
<<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, 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,
(catch 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>>, <<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>>, <<16#EF, 16#BF, 16#BD>>},
{<<237, 160, 129>>, <<16#EF, 16#BF, 16#BD>>},
% Not enough extension bytes
{<<16#C0>>, <<16#EF, 16#BF, 16#BD>>},
{<<16#E0>>, <<16#EF, 16#BF, 16#BD>>},
{<<16#E0, 16#80>>, <<16#EF, 16#BF, 16#BD>>},
{<<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#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#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>>, <<"\"\\u0000\"">>},
{<<16#C1, 16#80>>, <<"\"\\u0000\"">>},
{<<16#E0, 16#80, 16#80>>, <<"\"\\u0000\"">>},
{<<16#E0, 16#90, 16#80>>, <<"\"\\u0000\"">>},
{<<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>>, <<"\"\\u0000\"">>},
{<<16#F8, 16#84, 16#80, 16#80, 16#80>>, <<"\"\\u0000\"">>},
{<<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\"">>}
].