oj 2.18.3 → 3.13.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1324 -0
  3. data/README.md +51 -204
  4. data/RELEASE_NOTES.md +61 -0
  5. data/ext/oj/buf.h +49 -72
  6. data/ext/oj/cache.c +326 -0
  7. data/ext/oj/cache.h +21 -0
  8. data/ext/oj/cache8.c +61 -64
  9. data/ext/oj/cache8.h +12 -39
  10. data/ext/oj/circarray.c +37 -68
  11. data/ext/oj/circarray.h +16 -42
  12. data/ext/oj/code.c +221 -0
  13. data/ext/oj/code.h +40 -0
  14. data/ext/oj/compat.c +231 -107
  15. data/ext/oj/custom.c +1125 -0
  16. data/ext/oj/debug.c +132 -0
  17. data/ext/oj/dump.c +935 -2513
  18. data/ext/oj/dump.h +108 -0
  19. data/ext/oj/dump_compat.c +936 -0
  20. data/ext/oj/dump_leaf.c +164 -0
  21. data/ext/oj/dump_object.c +761 -0
  22. data/ext/oj/dump_strict.c +410 -0
  23. data/ext/oj/encode.h +7 -42
  24. data/ext/oj/encoder.c +43 -0
  25. data/ext/oj/err.c +40 -54
  26. data/ext/oj/err.h +52 -46
  27. data/ext/oj/extconf.rb +21 -30
  28. data/ext/oj/fast.c +1097 -1080
  29. data/ext/oj/intern.c +301 -0
  30. data/ext/oj/intern.h +26 -0
  31. data/ext/oj/mimic_json.c +893 -0
  32. data/ext/oj/object.c +549 -620
  33. data/ext/oj/odd.c +155 -167
  34. data/ext/oj/odd.h +37 -63
  35. data/ext/oj/oj.c +1661 -2063
  36. data/ext/oj/oj.h +341 -270
  37. data/ext/oj/parse.c +974 -737
  38. data/ext/oj/parse.h +105 -97
  39. data/ext/oj/parser.c +1526 -0
  40. data/ext/oj/parser.h +90 -0
  41. data/ext/oj/rails.c +1504 -0
  42. data/ext/oj/rails.h +18 -0
  43. data/ext/oj/reader.c +141 -163
  44. data/ext/oj/reader.h +75 -113
  45. data/ext/oj/resolve.c +45 -93
  46. data/ext/oj/resolve.h +7 -34
  47. data/ext/oj/rxclass.c +143 -0
  48. data/ext/oj/rxclass.h +26 -0
  49. data/ext/oj/saj.c +447 -511
  50. data/ext/oj/saj2.c +348 -0
  51. data/ext/oj/scp.c +91 -138
  52. data/ext/oj/sparse.c +793 -644
  53. data/ext/oj/stream_writer.c +331 -0
  54. data/ext/oj/strict.c +145 -109
  55. data/ext/oj/string_writer.c +493 -0
  56. data/ext/oj/trace.c +72 -0
  57. data/ext/oj/trace.h +28 -0
  58. data/ext/oj/usual.c +1254 -0
  59. data/ext/oj/util.c +136 -0
  60. data/ext/oj/util.h +20 -0
  61. data/ext/oj/val_stack.c +62 -70
  62. data/ext/oj/val_stack.h +95 -129
  63. data/ext/oj/validate.c +51 -0
  64. data/ext/oj/wab.c +622 -0
  65. data/lib/oj/bag.rb +1 -0
  66. data/lib/oj/easy_hash.rb +17 -8
  67. data/lib/oj/error.rb +10 -11
  68. data/lib/oj/json.rb +176 -0
  69. data/lib/oj/mimic.rb +158 -19
  70. data/lib/oj/state.rb +132 -0
  71. data/lib/oj/version.rb +2 -2
  72. data/lib/oj.rb +1 -31
  73. data/pages/Advanced.md +22 -0
  74. data/pages/Compatibility.md +25 -0
  75. data/pages/Custom.md +23 -0
  76. data/pages/Encoding.md +65 -0
  77. data/pages/JsonGem.md +94 -0
  78. data/pages/Modes.md +161 -0
  79. data/pages/Options.md +327 -0
  80. data/pages/Parser.md +309 -0
  81. data/pages/Rails.md +167 -0
  82. data/pages/Security.md +20 -0
  83. data/pages/WAB.md +13 -0
  84. data/test/activerecord/result_test.rb +32 -0
  85. data/test/activesupport4/decoding_test.rb +108 -0
  86. data/test/activesupport4/encoding_test.rb +531 -0
  87. data/test/activesupport4/test_helper.rb +41 -0
  88. data/test/activesupport5/abstract_unit.rb +45 -0
  89. data/test/activesupport5/decoding_test.rb +133 -0
  90. data/test/activesupport5/encoding_test.rb +500 -0
  91. data/test/activesupport5/encoding_test_cases.rb +98 -0
  92. data/test/activesupport5/test_helper.rb +72 -0
  93. data/test/activesupport5/time_zone_test_helpers.rb +39 -0
  94. data/test/activesupport6/abstract_unit.rb +44 -0
  95. data/test/activesupport6/decoding_test.rb +133 -0
  96. data/test/activesupport6/encoding_test.rb +507 -0
  97. data/test/activesupport6/encoding_test_cases.rb +98 -0
  98. data/test/activesupport6/test_common.rb +17 -0
  99. data/test/activesupport6/test_helper.rb +163 -0
  100. data/test/activesupport6/time_zone_test_helpers.rb +39 -0
  101. data/test/activesupport7/abstract_unit.rb +49 -0
  102. data/test/activesupport7/decoding_test.rb +125 -0
  103. data/test/activesupport7/encoding_test.rb +486 -0
  104. data/test/activesupport7/encoding_test_cases.rb +104 -0
  105. data/test/activesupport7/time_zone_test_helpers.rb +47 -0
  106. data/test/bar.rb +9 -0
  107. data/test/baz.rb +16 -0
  108. data/test/bug.rb +11 -46
  109. data/test/foo.rb +69 -16
  110. data/test/helper.rb +10 -1
  111. data/test/isolated/shared.rb +12 -8
  112. data/test/isolated/test_mimic_rails_after.rb +3 -3
  113. data/test/isolated/test_mimic_rails_before.rb +3 -3
  114. data/test/json_gem/json_addition_test.rb +216 -0
  115. data/test/json_gem/json_common_interface_test.rb +153 -0
  116. data/test/json_gem/json_encoding_test.rb +107 -0
  117. data/test/json_gem/json_ext_parser_test.rb +20 -0
  118. data/test/json_gem/json_fixtures_test.rb +35 -0
  119. data/test/json_gem/json_generator_test.rb +397 -0
  120. data/test/json_gem/json_generic_object_test.rb +90 -0
  121. data/test/json_gem/json_parser_test.rb +470 -0
  122. data/test/json_gem/json_string_matching_test.rb +42 -0
  123. data/test/json_gem/test_helper.rb +26 -0
  124. data/test/mem.rb +33 -0
  125. data/test/perf.rb +1 -1
  126. data/test/perf_compat.rb +30 -28
  127. data/test/perf_dump.rb +50 -0
  128. data/test/perf_object.rb +1 -1
  129. data/test/perf_once.rb +58 -0
  130. data/test/perf_parser.rb +189 -0
  131. data/test/perf_scp.rb +11 -10
  132. data/test/perf_strict.rb +30 -19
  133. data/test/perf_wab.rb +131 -0
  134. data/test/prec.rb +23 -0
  135. data/test/sample.rb +0 -1
  136. data/test/sample_json.rb +1 -1
  137. data/test/test_compat.rb +219 -102
  138. data/test/test_custom.rb +533 -0
  139. data/test/test_fast.rb +107 -35
  140. data/test/test_file.rb +19 -25
  141. data/test/test_generate.rb +21 -0
  142. data/test/test_hash.rb +11 -1
  143. data/test/test_integer_range.rb +72 -0
  144. data/test/test_null.rb +376 -0
  145. data/test/test_object.rb +357 -70
  146. data/test/test_parser.rb +27 -0
  147. data/test/test_parser_saj.rb +245 -0
  148. data/test/test_parser_usual.rb +217 -0
  149. data/test/test_rails.rb +35 -0
  150. data/test/test_saj.rb +1 -1
  151. data/test/test_scp.rb +39 -2
  152. data/test/test_strict.rb +186 -7
  153. data/test/test_various.rb +160 -774
  154. data/test/test_wab.rb +307 -0
  155. data/test/test_writer.rb +90 -2
  156. data/test/tests.rb +24 -0
  157. data/test/tests_mimic.rb +14 -0
  158. data/test/tests_mimic_addition.rb +7 -0
  159. data/test/zoo.rb +13 -0
  160. metadata +194 -56
  161. data/ext/oj/hash.c +0 -163
  162. data/ext/oj/hash.h +0 -46
  163. data/ext/oj/hash_test.c +0 -512
  164. data/test/activesupport_datetime_test.rb +0 -23
  165. data/test/bug2.rb +0 -10
  166. data/test/bug3.rb +0 -46
  167. data/test/bug_fast.rb +0 -32
  168. data/test/bug_load.rb +0 -24
  169. data/test/crash.rb +0 -111
  170. data/test/curl/curl_oj.rb +0 -46
  171. data/test/curl/get_oj.rb +0 -24
  172. data/test/curl/just_curl.rb +0 -31
  173. data/test/curl/just_oj.rb +0 -51
  174. data/test/example.rb +0 -11
  175. data/test/io.rb +0 -48
  176. data/test/isolated/test_mimic_rails_datetime.rb +0 -27
  177. data/test/mod.rb +0 -16
  178. data/test/rails.rb +0 -50
  179. data/test/russian.rb +0 -18
  180. data/test/struct.rb +0 -29
  181. data/test/test_serializer.rb +0 -59
  182. data/test/write_timebars.rb +0 -31
data/test/test_wab.rb ADDED
@@ -0,0 +1,307 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.dirname(__FILE__)
5
+ $oj_dir = File.dirname(File.expand_path(File.dirname(__FILE__)))
6
+ %w(lib ext).each do |dir|
7
+ $: << File.join($oj_dir, dir)
8
+ end
9
+
10
+ require 'minitest'
11
+ require 'minitest/autorun'
12
+ require 'stringio'
13
+ require 'date'
14
+ require 'bigdecimal'
15
+ require 'uri'
16
+ require 'oj'
17
+
18
+ # Simple version of WAB::UUID for testing.
19
+ module WAB
20
+ class UUID
21
+ attr_reader :id
22
+ def initialize(id)
23
+ @id = id.downcase
24
+ raise Exception.new("Invalid UUID format.") if /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/.match(@id).nil?
25
+ end
26
+ def to_s
27
+ @id
28
+ end
29
+ def ==(other)
30
+ other.is_a?(self.class) && @id == other.id
31
+ end
32
+ end # UUID
33
+ end # WAB
34
+
35
+
36
+ class WabJuice < Minitest::Test
37
+
38
+ module TestModule
39
+ end
40
+
41
+ def test_nil
42
+ dump_and_load(nil, false)
43
+ end
44
+
45
+ def test_true
46
+ dump_and_load(true, false)
47
+ end
48
+
49
+ def test_false
50
+ dump_and_load(false, false)
51
+ end
52
+
53
+ def test_fixnum
54
+ dump_and_load(0, false)
55
+ dump_and_load(12345, false)
56
+ dump_and_load(-54321, false)
57
+ dump_and_load(1, false)
58
+ end
59
+
60
+ def test_float
61
+ dump_and_load(0.0, false)
62
+ dump_and_load(12345.6789, false)
63
+ dump_and_load(70.35, false)
64
+ dump_and_load(-54321.012, false)
65
+ dump_and_load(1.7775, false)
66
+ dump_and_load(2.5024, false)
67
+ dump_and_load(2.48e16, false)
68
+ dump_and_load(2.48e100 * 1.0e10, false)
69
+ dump_and_load(-2.48e100 * 1.0e10, false)
70
+ end
71
+
72
+ def test_nan_dump
73
+ assert_raises() { Oj.dump(0/0.0, mode: :wab) }
74
+ end
75
+
76
+ def test_infinity_dump
77
+ assert_raises() { Oj.dump(1/0.0, mode: :wab) }
78
+ end
79
+
80
+ def test_neg_infinity_dump
81
+ assert_raises() { Oj.dump(-1/0.0, mode: :wab) }
82
+ end
83
+
84
+ def test_string
85
+ dump_and_load('', false)
86
+ dump_and_load('abc', false)
87
+ dump_and_load("abc\ndef", false)
88
+ dump_and_load("a\u0041", false)
89
+ end
90
+
91
+ def test_encode
92
+ dump_and_load("ぴーたー", false)
93
+ end
94
+
95
+ def test_array
96
+ dump_and_load([], false)
97
+ dump_and_load([true, false], false)
98
+ dump_and_load(['a', 1, nil], false)
99
+ dump_and_load([[nil]], false)
100
+ dump_and_load([[nil], 58], false)
101
+ end
102
+
103
+ def test_array_deep
104
+ dump_and_load([1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,[15,[16,[17,[18,[19,[20]]]]]]]]]]]]]]]]]]]], false)
105
+ end
106
+
107
+ def test_deep_nest
108
+ begin
109
+ n = 10000
110
+ Oj.wab_load('[' * n + ']' * n)
111
+ rescue Exception => e
112
+ assert(false, e.message)
113
+ end
114
+ end
115
+
116
+ # Hash
117
+ def test_hash
118
+ dump_and_load({}, false)
119
+ dump_and_load({ true: true, false: false}, false)
120
+ dump_and_load({ true: true, array: [], hash: { }}, false)
121
+ end
122
+
123
+ def test_hash_non_sym_keys
124
+ assert_raises() { Oj.dump({ 'true' => true}, mode: :wab) }
125
+ end
126
+
127
+ def test_hash_deep
128
+ dump_and_load({x1: {
129
+ x2: {
130
+ x3: {
131
+ x4: {
132
+ x5: {
133
+ x6: {
134
+ x7: {
135
+ x8: {
136
+ x9: {
137
+ x10: {
138
+ x11: {
139
+ x12: {
140
+ x13: {
141
+ x14: {
142
+ x15: {
143
+ x16: {
144
+ x17: {
145
+ x18: {
146
+ x19: {
147
+ x20: {}}}}}}}}}}}}}}}}}}}}}, false)
148
+ end
149
+
150
+ def test_non_str_hash
151
+ assert_raises() { Oj.dump({ 1 => true, 0 => false }, mode: :wab) }
152
+ end
153
+
154
+ def test_bignum_object
155
+ dump_and_load(7 ** 55, false)
156
+ end
157
+
158
+ # BigDecimal
159
+ def test_bigdecimal_wab
160
+ dump_and_load(BigDecimal('3.14159265358979323846'), false)
161
+ end
162
+
163
+ def test_bigdecimal_load
164
+ orig = BigDecimal('80.51')
165
+ json = Oj.dump(orig, mode: :wab)
166
+ bg = Oj.load(json, :mode => :wab, :bigdecimal_load => true)
167
+ assert_equal(BigDecimal, bg.class)
168
+ assert_equal(orig, bg)
169
+ end
170
+
171
+ def test_range
172
+ assert_raises() { Oj.dump(1..7, mode: :wab) }
173
+ end
174
+
175
+ # Stream IO
176
+ def test_io_string
177
+ json = %{{
178
+ "x":true,
179
+ "y":58,
180
+ "z": [1,2,3]
181
+ }
182
+ }
183
+ input = StringIO.new(json)
184
+ obj = Oj.wab_load(input)
185
+ assert_equal({ x: true, y: 58, z: [1, 2, 3]}, obj)
186
+ end
187
+
188
+ def test_io_file
189
+ filename = File.join(File.dirname(__FILE__), 'open_file_test.json')
190
+ File.open(filename, 'w') { |f| f.write(%{{
191
+ "x":true,
192
+ "y":58,
193
+ "z": [1,2,3]
194
+ }
195
+ }) }
196
+ f = File.new(filename)
197
+ obj = Oj.wab_load(f)
198
+ f.close()
199
+ assert_equal({ x: true, y: 58, z: [1, 2, 3]}, obj)
200
+ end
201
+
202
+ def test_symbol
203
+ json = Oj.dump(:abc, mode: :wab)
204
+ assert_equal('"abc"', json)
205
+ end
206
+
207
+ def test_time
208
+ t = Time.gm(2017, 1, 5, 23, 58, 7, 123456.789)
209
+ json = Oj.dump(t, mode: :wab)
210
+ assert_equal('"2017-01-05T23:58:07.123456789Z"', json)
211
+ # must load and convert to json as the Time#== does not match identical
212
+ # times due to the way it tracks fractional seconds.
213
+ loaded = Oj.wab_load(json);
214
+ assert_equal(json, Oj.dump(loaded, mode: :wab), "json mismatch after load")
215
+ end
216
+
217
+ def test_uuid
218
+ u = ::WAB::UUID.new('123e4567-e89b-12d3-a456-426655440000')
219
+ json = Oj.dump(u, mode: :wab)
220
+ assert_equal('"123e4567-e89b-12d3-a456-426655440000"', json)
221
+ dump_and_load(u, false)
222
+ end
223
+
224
+ def test_uri
225
+ u = URI('http://opo.technology/sample')
226
+ json = Oj.dump(u, mode: :wab)
227
+ assert_equal('"http://opo.technology/sample"', json)
228
+ dump_and_load(u, false)
229
+ end
230
+
231
+ def test_class
232
+ assert_raises() { Oj.dump(WabJuice, mode: :wab) }
233
+ end
234
+
235
+ def test_module
236
+ assert_raises() { Oj.dump(TestModule, mode: :wab) }
237
+ end
238
+
239
+ # symbol_keys option
240
+ def test_symbol_keys
241
+ json = %{{
242
+ "x":true,
243
+ "y":58,
244
+ "z": [1,2,3]
245
+ }
246
+ }
247
+ obj = Oj.wab_load(json, :symbol_keys => true)
248
+ assert_equal({ x: true, y: 58, z: [1, 2, 3]}, obj)
249
+ end
250
+
251
+ # comments
252
+ def test_comment_slash
253
+ json = %{{
254
+ "x":true,//three
255
+ "y":58,
256
+ "z": [1,2,
257
+ 3 // six
258
+ ]}
259
+ }
260
+ obj = Oj.wab_load(json)
261
+ assert_equal({ x: true, y: 58, z: [1, 2, 3]}, obj)
262
+ end
263
+
264
+ def test_comment_c
265
+ json = %{{
266
+ "x"/*one*/:/*two*/true,
267
+ "y":58,
268
+ "z": [1,2,3]}
269
+ }
270
+ obj = Oj.wab_load(json)
271
+ assert_equal({ x: true, y: 58, z: [1, 2, 3]}, obj)
272
+ end
273
+
274
+ def test_comment
275
+ json = %{{
276
+ "x"/*one*/:/*two*/true,//three
277
+ "y":58/*four*/,
278
+ "z": [1,2/*five*/,
279
+ 3 // six
280
+ ]
281
+ }
282
+ }
283
+ obj = Oj.wab_load(json)
284
+ assert_equal({ x: true, y: 58, z: [1, 2, 3]}, obj)
285
+ end
286
+
287
+ def test_double
288
+ json = %{{ "x": 1}{ "y": 2}}
289
+ results = []
290
+ Oj.load(json, :mode => :wab) { |x| results << x }
291
+
292
+ assert_equal([{ x: 1 }, { y: 2 }], results)
293
+ end
294
+
295
+ def dump_and_load(obj, trace=false)
296
+ json = Oj.dump(obj, mode: :wab, indent: 2)
297
+ puts json if trace
298
+ loaded = Oj.wab_load(json);
299
+ if obj.nil?
300
+ assert_nil(loaded)
301
+ else
302
+ assert_equal(obj, loaded)
303
+ end
304
+ loaded
305
+ end
306
+
307
+ end
data/test/test_writer.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- # encoding: UTF-8
2
+ # encoding: utf-8
3
3
 
4
4
  $: << File.dirname(__FILE__)
5
5
 
@@ -44,6 +44,14 @@ class OjWriter < Minitest::Test
44
44
  assert_equal("{}\n", w.to_s)
45
45
  end
46
46
 
47
+ def test_string_writer_push_null_value_with_key
48
+ w = Oj::StringWriter.new(:indent => 0, :mode => :compat)
49
+ w.push_object()
50
+ w.push_value(nil, 'nothing')
51
+ w.pop()
52
+ assert_equal(%|{"nothing":null}\n|, w.to_s)
53
+ end
54
+
47
55
  def test_string_writer_nested_object
48
56
  w = Oj::StringWriter.new(:indent => 0)
49
57
  w.push_object()
@@ -219,6 +227,22 @@ class OjWriter < Minitest::Test
219
227
 
220
228
  # Stream Writer
221
229
 
230
+ class SString < ::String
231
+ alias :write :concat
232
+ end
233
+
234
+ def test_stream_writer_encoding
235
+ output = SString.new.force_encoding(::Encoding::UTF_8)
236
+ w = Oj::StreamWriter.new(output, :indent => 0)
237
+ # Oddly enough, when pushing ASCII characters with UTF-8 encoding or even
238
+ # ASCII-8BIT does not change the output encoding. Pushing any non-ASCII no
239
+ # matter what the encoding changes the output encoding to ASCII-8BIT.
240
+ x = "香港" # Hong Kong
241
+ x = x.force_encoding('ASCII-8BIT')
242
+ w.push_value(x)
243
+ assert_equal(::Encoding::UTF_8, output.encoding)
244
+ end
245
+
222
246
  def test_stream_writer_empty_array
223
247
  output = StringIO.open("", "w+")
224
248
  w = Oj::StreamWriter.new(output, :indent => 0)
@@ -243,7 +267,8 @@ class OjWriter < Minitest::Test
243
267
  w.push_object("a3")
244
268
  w.pop()
245
269
  w.pop()
246
- assert_equal(%|{"a1":{},"a2":{"b":[7,true,"string"]},"a3":{}}\n|, output.string())
270
+ result = output.string()
271
+ assert_equal(%|{"a1":{},"a2":{"b":[7,true,"string"]},"a3":{}}\n|, result)
247
272
  end
248
273
 
249
274
  def test_stream_writer_mixed_file
@@ -289,4 +314,67 @@ class OjWriter < Minitest::Test
289
314
  assert_equal(%|{"a1":{},"a2":{"b":{}},"a3":{"a4":37}}\n|, output.string())
290
315
  end
291
316
 
317
+ def push_stuff(w, pop_all=true)
318
+ w.push_object()
319
+ w.push_object("a1")
320
+ w.pop()
321
+ w.push_object("a2")
322
+ w.push_array("b")
323
+ w.push_value(7)
324
+ w.push_value(true)
325
+ w.push_value("string")
326
+ w.pop()
327
+ w.pop()
328
+ w.push_object("a3")
329
+ if pop_all
330
+ w.pop_all()
331
+ else
332
+ w.pop()
333
+ w.pop()
334
+ end
335
+ end
336
+
337
+ def test_stream_writer_buf_small
338
+ output = StringIO.open("", "w+")
339
+ w = Oj::StreamWriter.new(output, :indent => 0, :buffer_size => 20)
340
+ push_stuff(w)
341
+ assert_equal(%|{"a1":{},"a2":{"b":[7,true,"string"]},"a3":{}}\n|, output.string())
342
+ end
343
+
344
+ def test_stream_writer_buf_large
345
+ output = StringIO.open("", "w+")
346
+ w = Oj::StreamWriter.new(output, :indent => 0, :buffer_size => 16000)
347
+ push_stuff(w)
348
+ assert_equal(%|{"a1":{},"a2":{"b":[7,true,"string"]},"a3":{}}\n|, output.string())
349
+ end
350
+
351
+ def test_stream_writer_buf_flush
352
+ output = StringIO.open("", "w+")
353
+ w = Oj::StreamWriter.new(output, :indent => 0, :buffer_size => 4096)
354
+ push_stuff(w, false)
355
+ # no flush so nothing should be in the output yet
356
+ assert_equal("", output.string())
357
+ w.flush()
358
+ assert_equal(%|{"a1":{},"a2":{"b":[7,true,"string"]},"a3":{}}\n|, output.string())
359
+ end
360
+
361
+ def test_stream_writer_buf_flush_small
362
+ output = StringIO.open("", "w+")
363
+ w = Oj::StreamWriter.new(output, :indent => 0, :buffer_size => 30)
364
+ push_stuff(w, false)
365
+ # flush should be called at 30 bytes but since the writes are chunky flush
366
+ # is called after adding "string".
367
+ assert_equal(%|{"a1":{},"a2":{"b":[7,true,"string"|, output.string())
368
+ w.flush()
369
+ assert_equal(%|{"a1":{},"a2":{"b":[7,true,"string"]},"a3":{}}\n|, output.string())
370
+ end
371
+
372
+ def test_stream_writer_push_null_value_with_key
373
+ output = StringIO.open("", "w+")
374
+ w = Oj::StreamWriter.new(output, :indent => 0)
375
+ w.push_object()
376
+ w.push_value(nil, 'nothing')
377
+ w.pop()
378
+ assert_equal(%|{"nothing":null}\n|, output.string())
379
+ end
292
380
  end # OjWriter
data/test/tests.rb ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.dirname(__FILE__)
5
+ $oj_dir = File.dirname(File.expand_path(File.dirname(__FILE__)))
6
+ %w(lib ext).each do |dir|
7
+ $: << File.join($oj_dir, dir)
8
+ end
9
+
10
+ require 'test_compat'
11
+ require 'test_custom'
12
+ require 'test_fast'
13
+ require 'test_file'
14
+ require 'test_gc'
15
+ require 'test_hash'
16
+ require 'test_null'
17
+ require 'test_object'
18
+ require 'test_saj'
19
+ require 'test_scp'
20
+ require 'test_strict'
21
+ require 'test_rails'
22
+ require 'test_wab'
23
+ require 'test_writer'
24
+ require 'test_integer_range'
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.dirname(__FILE__)
5
+ $: << File.join(File.dirname(__FILE__), 'json_gem')
6
+
7
+ require 'json_common_interface_test'
8
+ require 'json_encoding_test'
9
+ require 'json_ext_parser_test'
10
+ require 'json_fixtures_test'
11
+ require 'json_generator_test'
12
+ require 'json_generic_object_test'
13
+ require 'json_parser_test'
14
+ require 'json_string_matching_test'
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.dirname(__FILE__)
5
+ $: << File.join(File.dirname(__FILE__), 'json_gem')
6
+
7
+ require 'json_addition_test'
data/test/zoo.rb ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #require 'json'
4
+
5
+ $: << File.dirname(__FILE__)
6
+ require 'helper'
7
+ require 'oj'
8
+
9
+ Oj.mimic_JSON
10
+ puts "\u3074"
11
+
12
+ puts JSON.dump(["\u3074"])
13
+ puts JSON.generate(["\u3074"])