From 5cf8173bd5b8ece6033660b17f295b4978db50a3 Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Mon, 15 Aug 2011 19:35:56 -0700 Subject: [PATCH] tests for jsx_encoder string escapes --- src/jsx_encoder.erl | 53 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/src/jsx_encoder.erl b/src/jsx_encoder.erl index db99bae..4a1e919 100644 --- a/src/jsx_encoder.erl +++ b/src/jsx_encoder.erl @@ -194,11 +194,14 @@ json_escape([$\t|Rest], Opts, Acc) -> json_escape(Rest, Opts, [$t, $\\] ++ Acc); %% other control characters json_escape(<>, Opts, Acc) when C >= 0, C < $\s -> - json_escape(Rest, Opts, <>); + json_escape(Rest, + Opts, + <> + ); json_escape([C|Rest], Opts, Acc) when C >= 0, C < $\s -> - json_escape(Rest, Opts, - lists:reverse(unicode:characters_to_list(json_escape_sequence(C))) - ++ [Acc]); + json_escape(Rest, Opts, lists:reverse(json_escape_sequence(C)) ++ Acc); %% escape forward slashes -- optionally -- to faciliate microsoft's retarded %% date format json_escape(<<$/, Rest/binary>>, Opts=#opts{escape_forward_slash=true}, Acc) -> @@ -208,7 +211,14 @@ json_escape([$/|Rest], Opts=#opts{escape_forward_slash=true}, Acc) -> %% escape u+2028 and u+2029 to avoid problems with jsonp json_escape(<>, Opts, Acc) when C == 16#2028; C == 16#2029 -> - json_escape(Rest, Opts, <>); + json_escape(Rest, + Opts, + <> + ); +json_escape([C|Rest], Opts, Acc) when C =:= 16#2028; C =:= 16#2029 -> + json_escape(Rest, Opts, lists:reverse(json_escape_sequence(C)) ++ Acc); %% any other legal codepoint json_escape(<>, Opts, Acc) -> json_escape(Rest, Opts, <>); @@ -225,7 +235,7 @@ json_escape(_, _, _) -> %% convert a codepoint to it's \uXXXX equiv. json_escape_sequence(X) -> <> = <>, - <<$\\, $u, (to_hex(A)), (to_hex(B)), (to_hex(C)), (to_hex(D))>>. + [$\\, $u, (to_hex(A)), (to_hex(B)), (to_hex(C)), (to_hex(D))]. to_hex(15) -> $f; @@ -331,7 +341,7 @@ encode_test_() -> ]. -escape_test_() -> +binary_escape_test_() -> [ {"json string escaping", ?_assert(json_escape( @@ -359,4 +369,33 @@ escape_test_() -> } ]. + +string_escape_test_() -> + [ + {"json string escaping", + ?_assert(json_escape( + "\"\\\b\f\n\r\t", #opts{} + ) =:= "\\\"\\\\\\b\\f\\n\\r\\t" + ) + }, + {"json string hex escape", + ?_assert(json_escape( + [1, 2, 3, 11, 26, 30, 31], #opts{} + ) =:= "\\u0001\\u0002\\u0003\\u000b\\u001a\\u001e\\u001f" + ) + }, + {"jsonp protection", + ?_assert(json_escape( + [16#2028, 16#2029], #opts{} + ) =:= "\\u2028\\u2029" + ) + }, + {"microsoft i hate your date format", + ?_assert(json_escape("/Date(1303502009425)/", + #opts{escape_forward_slash=true} + ) =:= "\\/Date(1303502009425)\\/" + ) + } + ]. + -endif. \ No newline at end of file