forked from JuliaIO/JSON.jl
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserializer.jl
More file actions
102 lines (86 loc) · 2.34 KB
/
serializer.jl
File metadata and controls
102 lines (86 loc) · 2.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
module TestSerializer
using JSON
using Test
# to define a new serialization behaviour, import these first
import JSON.Serializations: CommonSerialization, StandardSerialization
import JSON: StructuralContext
# those names are long so we can define some type aliases
const CS = CommonSerialization
const SC = StructuralContext
# for test harness purposes
function sprint_kwarg(f, args...; kwargs...)
b = IOBuffer()
f(b, args...; kwargs...)
String(take!(b))
end
# issue #168: Print NaN and Inf as Julia would
struct NaNSerialization <: CS end
JSON.show_json(io::SC, ::NaNSerialization, f::AbstractFloat) = Base.print(io, f)
@test sprint(JSON.show_json, NaNSerialization(), [NaN, Inf, -Inf, 0.0]) ==
"[NaN,Inf,-Inf,0.0]"
@test sprint_kwarg(
JSON.show_json,
NaNSerialization(),
[NaN, Inf, -Inf, 0.0];
indent=4
) == """
[
NaN,
Inf,
-Inf,
0.0
]
"""
# issue #170: Print JavaScript functions directly
struct JSSerialization <: CS end
struct JSFunction
data::String
end
function JSON.show_json(io::SC, ::JSSerialization, f::JSFunction)
first = true
for line in split(f.data, '\n')
if !first
JSON.indent(io)
end
first = false
Base.print(io, line)
end
end
@test sprint_kwarg(JSON.show_json, JSSerialization(), Any[
1,
2,
JSFunction("function test() {\n return 1;\n}")
]; indent=2) == """
[
1,
2,
function test() {
return 1;
}
]
"""
# test serializing a type without any fields
struct SingletonType end
@test_throws ErrorException json(SingletonType())
# test printing to stdout
let filename = tempname()
open(filename, "w") do f
redirect_stdout(f) do
JSON.print(Any[1, 2, 3.0])
end
end
@test read(filename, String) == "[1,2,3.0]"
rm(filename)
end
# test convenience printing to file
let filename = tempname()
JSON.printfile(filename, Any[1, 2, 3.0])
@test read(filename, String) == "[1,2,3.0]"
rm(filename)
end
# issue #184: serializing a 0-dimensional array
@test sprint(JSON.show_json, JSON.StandardSerialization(), view([184], 1)) == "184"
# test serializing with a JSONText object
@test json([JSONText("{\"bar\": [3,4,5]}"),314159]) == "[{\"bar\": [3,4,5]},314159]"
@test json([JSONText("{\"bar\": [3,4,5]}"),314159], 1) == "[\n {\n \"bar\": [\n 3,\n 4,\n 5\n ]\n },\n 314159\n]\n"
end