json_pure 1.4.6 → 2.8.1

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 (123) hide show
  1. checksums.yaml +7 -0
  2. data/BSDL +22 -0
  3. data/CHANGES.md +544 -0
  4. data/COPYING +14 -16
  5. data/LEGAL +60 -0
  6. data/README.md +219 -0
  7. data/json_pure.gemspec +39 -0
  8. data/lib/json/pure.rb +3 -76
  9. metadata +45 -165
  10. data/CHANGES +0 -179
  11. data/GPL +0 -340
  12. data/README +0 -356
  13. data/Rakefile +0 -292
  14. data/TODO +0 -1
  15. data/VERSION +0 -1
  16. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkComparison.log +0 -52
  17. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast-autocorrelation.dat +0 -1000
  18. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast.dat +0 -1001
  19. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty-autocorrelation.dat +0 -900
  20. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty.dat +0 -901
  21. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe-autocorrelation.dat +0 -1000
  22. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe.dat +0 -1001
  23. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt.log +0 -261
  24. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast-autocorrelation.dat +0 -1000
  25. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast.dat +0 -1001
  26. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty-autocorrelation.dat +0 -1000
  27. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty.dat +0 -1001
  28. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe-autocorrelation.dat +0 -1000
  29. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe.dat +0 -1001
  30. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure.log +0 -262
  31. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator-autocorrelation.dat +0 -1000
  32. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator.dat +0 -1001
  33. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails.log +0 -82
  34. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkComparison.log +0 -34
  35. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser-autocorrelation.dat +0 -900
  36. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser.dat +0 -901
  37. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt.log +0 -81
  38. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser-autocorrelation.dat +0 -1000
  39. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser.dat +0 -1001
  40. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure.log +0 -82
  41. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser-autocorrelation.dat +0 -1000
  42. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser.dat +0 -1001
  43. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails.log +0 -82
  44. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser-autocorrelation.dat +0 -1000
  45. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser.dat +0 -1001
  46. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML.log +0 -82
  47. data/benchmarks/generator2_benchmark.rb +0 -222
  48. data/benchmarks/generator_benchmark.rb +0 -224
  49. data/benchmarks/ohai.json +0 -1216
  50. data/benchmarks/ohai.ruby +0 -1
  51. data/benchmarks/parser2_benchmark.rb +0 -251
  52. data/benchmarks/parser_benchmark.rb +0 -259
  53. data/bin/edit_json.rb +0 -9
  54. data/bin/prettify_json.rb +0 -75
  55. data/data/example.json +0 -1
  56. data/data/index.html +0 -38
  57. data/data/prototype.js +0 -4184
  58. data/ext/json/ext/generator/extconf.rb +0 -20
  59. data/ext/json/ext/generator/generator.c +0 -1417
  60. data/ext/json/ext/generator/generator.h +0 -197
  61. data/ext/json/ext/parser/extconf.rb +0 -15
  62. data/ext/json/ext/parser/parser.c +0 -1935
  63. data/ext/json/ext/parser/parser.h +0 -71
  64. data/ext/json/ext/parser/parser.rl +0 -792
  65. data/install.rb +0 -26
  66. data/lib/json/Array.xpm +0 -21
  67. data/lib/json/FalseClass.xpm +0 -21
  68. data/lib/json/Hash.xpm +0 -21
  69. data/lib/json/Key.xpm +0 -73
  70. data/lib/json/NilClass.xpm +0 -21
  71. data/lib/json/Numeric.xpm +0 -28
  72. data/lib/json/String.xpm +0 -96
  73. data/lib/json/TrueClass.xpm +0 -21
  74. data/lib/json/add/core.rb +0 -148
  75. data/lib/json/add/rails.rb +0 -58
  76. data/lib/json/common.rb +0 -391
  77. data/lib/json/editor.rb +0 -1371
  78. data/lib/json/ext.rb +0 -15
  79. data/lib/json/json.xpm +0 -1499
  80. data/lib/json/pure/generator.rb +0 -439
  81. data/lib/json/pure/parser.rb +0 -309
  82. data/lib/json/version.rb +0 -8
  83. data/lib/json.rb +0 -10
  84. data/tests/fixtures/fail1.json +0 -1
  85. data/tests/fixtures/fail10.json +0 -1
  86. data/tests/fixtures/fail11.json +0 -1
  87. data/tests/fixtures/fail12.json +0 -1
  88. data/tests/fixtures/fail13.json +0 -1
  89. data/tests/fixtures/fail14.json +0 -1
  90. data/tests/fixtures/fail18.json +0 -1
  91. data/tests/fixtures/fail19.json +0 -1
  92. data/tests/fixtures/fail2.json +0 -1
  93. data/tests/fixtures/fail20.json +0 -1
  94. data/tests/fixtures/fail21.json +0 -1
  95. data/tests/fixtures/fail22.json +0 -1
  96. data/tests/fixtures/fail23.json +0 -1
  97. data/tests/fixtures/fail24.json +0 -1
  98. data/tests/fixtures/fail25.json +0 -1
  99. data/tests/fixtures/fail27.json +0 -2
  100. data/tests/fixtures/fail28.json +0 -2
  101. data/tests/fixtures/fail3.json +0 -1
  102. data/tests/fixtures/fail4.json +0 -1
  103. data/tests/fixtures/fail5.json +0 -1
  104. data/tests/fixtures/fail6.json +0 -1
  105. data/tests/fixtures/fail7.json +0 -1
  106. data/tests/fixtures/fail8.json +0 -1
  107. data/tests/fixtures/fail9.json +0 -1
  108. data/tests/fixtures/pass1.json +0 -56
  109. data/tests/fixtures/pass15.json +0 -1
  110. data/tests/fixtures/pass16.json +0 -1
  111. data/tests/fixtures/pass17.json +0 -1
  112. data/tests/fixtures/pass2.json +0 -1
  113. data/tests/fixtures/pass26.json +0 -1
  114. data/tests/fixtures/pass3.json +0 -6
  115. data/tests/test_json.rb +0 -394
  116. data/tests/test_json_addition.rb +0 -162
  117. data/tests/test_json_encoding.rb +0 -68
  118. data/tests/test_json_fixtures.rb +0 -34
  119. data/tests/test_json_generate.rb +0 -181
  120. data/tests/test_json_rails.rb +0 -144
  121. data/tests/test_json_unicode.rb +0 -76
  122. data/tools/fuzz.rb +0 -139
  123. data/tools/server.rb +0 -61
@@ -1,181 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # -*- coding: utf-8 -*-
3
-
4
- require 'test/unit'
5
- case ENV['JSON']
6
- when 'pure' then require 'json/pure'
7
- when 'ext' then require 'json/ext'
8
- else require 'json'
9
- end
10
-
11
- class TC_JSONGenerate < Test::Unit::TestCase
12
- include JSON
13
-
14
- def setup
15
- @hash = {
16
- 'a' => 2,
17
- 'b' => 3.141,
18
- 'c' => 'c',
19
- 'd' => [ 1, "b", 3.14 ],
20
- 'e' => { 'foo' => 'bar' },
21
- 'g' => "\"\0\037",
22
- 'h' => 1000.0,
23
- 'i' => 0.001
24
- }
25
- @json2 = '{"a":2,"b":3.141,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},' +
26
- '"g":"\\"\\u0000\\u001f","h":1000.0,"i":0.001}'
27
- @json3 = <<'EOT'.chomp
28
- {
29
- "a": 2,
30
- "b": 3.141,
31
- "c": "c",
32
- "d": [
33
- 1,
34
- "b",
35
- 3.14
36
- ],
37
- "e": {
38
- "foo": "bar"
39
- },
40
- "g": "\"\u0000\u001f",
41
- "h": 1000.0,
42
- "i": 0.001
43
- }
44
- EOT
45
- end
46
-
47
- def test_generate
48
- json = generate(@hash)
49
- assert_equal(JSON.parse(@json2), JSON.parse(json))
50
- parsed_json = parse(json)
51
- assert_equal(@hash, parsed_json)
52
- json = generate({1=>2})
53
- assert_equal('{"1":2}', json)
54
- parsed_json = parse(json)
55
- assert_equal({"1"=>2}, parsed_json)
56
- assert_raise(GeneratorError) { generate(666) }
57
- end
58
-
59
- def test_generate_pretty
60
- json = pretty_generate(@hash)
61
- assert_equal(JSON.parse(@json3), JSON.parse(json))
62
- parsed_json = parse(json)
63
- assert_equal(@hash, parsed_json)
64
- json = pretty_generate({1=>2})
65
- assert_equal(<<'EOT'.chomp, json)
66
- {
67
- "1": 2
68
- }
69
- EOT
70
- parsed_json = parse(json)
71
- assert_equal({"1"=>2}, parsed_json)
72
- assert_raise(GeneratorError) { pretty_generate(666) }
73
- end
74
-
75
- def test_fast_generate
76
- json = fast_generate(@hash)
77
- assert_equal(JSON.parse(@json2), JSON.parse(json))
78
- parsed_json = parse(json)
79
- assert_equal(@hash, parsed_json)
80
- json = fast_generate({1=>2})
81
- assert_equal('{"1":2}', json)
82
- parsed_json = parse(json)
83
- assert_equal({"1"=>2}, parsed_json)
84
- assert_raise(GeneratorError) { fast_generate(666) }
85
- end
86
-
87
- def test_states
88
- json = generate({1=>2}, nil)
89
- assert_equal('{"1":2}', json)
90
- s = JSON.state.new
91
- assert s.check_circular?
92
- assert s[:check_circular?]
93
- h = { 1=>2 }
94
- h[3] = h
95
- assert_raises(JSON::NestingError) { generate(h) }
96
- assert_raises(JSON::NestingError) { generate(h, s) }
97
- s = JSON.state.new
98
- a = [ 1, 2 ]
99
- a << a
100
- assert_raises(JSON::NestingError) { generate(a, s) }
101
- assert s.check_circular?
102
- assert s[:check_circular?]
103
- end
104
-
105
- def test_pretty_state
106
- state = PRETTY_STATE_PROTOTYPE.dup
107
- assert_equal({
108
- :allow_nan => false,
109
- :array_nl => "\n",
110
- :ascii_only => false,
111
- :depth => 0,
112
- :indent => " ",
113
- :max_nesting => 19,
114
- :object_nl => "\n",
115
- :space => " ",
116
- :space_before => "",
117
- }.sort_by { |n,| n.to_s }, state.to_h.sort_by { |n,| n.to_s })
118
- end
119
-
120
- def test_safe_state
121
- state = SAFE_STATE_PROTOTYPE.dup
122
- assert_equal({
123
- :allow_nan => false,
124
- :array_nl => "",
125
- :ascii_only => false,
126
- :depth => 0,
127
- :indent => "",
128
- :max_nesting => 19,
129
- :object_nl => "",
130
- :space => "",
131
- :space_before => "",
132
- }.sort_by { |n,| n.to_s }, state.to_h.sort_by { |n,| n.to_s })
133
- end
134
-
135
- def test_fast_state
136
- state = FAST_STATE_PROTOTYPE.dup
137
- assert_equal({
138
- :allow_nan => false,
139
- :array_nl => "",
140
- :ascii_only => false,
141
- :depth => 0,
142
- :indent => "",
143
- :max_nesting => 0,
144
- :object_nl => "",
145
- :space => "",
146
- :space_before => "",
147
- }.sort_by { |n,| n.to_s }, state.to_h.sort_by { |n,| n.to_s })
148
- end
149
-
150
- def test_allow_nan
151
- assert_raises(GeneratorError) { generate([JSON::NaN]) }
152
- assert_equal '[NaN]', generate([JSON::NaN], :allow_nan => true)
153
- assert_raises(GeneratorError) { fast_generate([JSON::NaN]) }
154
- assert_raises(GeneratorError) { pretty_generate([JSON::NaN]) }
155
- assert_equal "[\n NaN\n]", pretty_generate([JSON::NaN], :allow_nan => true)
156
- assert_raises(GeneratorError) { generate([JSON::Infinity]) }
157
- assert_equal '[Infinity]', generate([JSON::Infinity], :allow_nan => true)
158
- assert_raises(GeneratorError) { fast_generate([JSON::Infinity]) }
159
- assert_raises(GeneratorError) { pretty_generate([JSON::Infinity]) }
160
- assert_equal "[\n Infinity\n]", pretty_generate([JSON::Infinity], :allow_nan => true)
161
- assert_raises(GeneratorError) { generate([JSON::MinusInfinity]) }
162
- assert_equal '[-Infinity]', generate([JSON::MinusInfinity], :allow_nan => true)
163
- assert_raises(GeneratorError) { fast_generate([JSON::MinusInfinity]) }
164
- assert_raises(GeneratorError) { pretty_generate([JSON::MinusInfinity]) }
165
- assert_equal "[\n -Infinity\n]", pretty_generate([JSON::MinusInfinity], :allow_nan => true)
166
- end
167
-
168
- def test_depth
169
- ary = []; ary << ary
170
- assert_equal 0, JSON::SAFE_STATE_PROTOTYPE.depth
171
- assert_raises(JSON::NestingError) { JSON.generate(ary) }
172
- assert_equal 0, JSON::SAFE_STATE_PROTOTYPE.depth
173
- assert_equal 0, JSON::PRETTY_STATE_PROTOTYPE.depth
174
- assert_raises(JSON::NestingError) { JSON.pretty_generate(ary) }
175
- assert_equal 0, JSON::PRETTY_STATE_PROTOTYPE.depth
176
- s = JSON.state.new
177
- assert_equal 0, s.depth
178
- assert_raises(JSON::NestingError) { ary.to_json(s) }
179
- assert_equal 19, s.depth
180
- end
181
- end
@@ -1,144 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # -*- coding: utf-8 -*-
3
-
4
- require 'test/unit'
5
- case ENV['JSON']
6
- when 'pure' then require 'json/pure'
7
- when 'ext' then require 'json/ext'
8
- else require 'json'
9
- end
10
- require 'json/add/rails'
11
- require 'date'
12
-
13
- class TC_JSONRails < Test::Unit::TestCase
14
- include JSON
15
-
16
- class A
17
- def initialize(a)
18
- @a = a
19
- end
20
-
21
- attr_reader :a
22
-
23
- def ==(other)
24
- a == other.a
25
- end
26
-
27
- def self.json_create(object)
28
- new(*object['args'])
29
- end
30
-
31
- def to_json(*args)
32
- {
33
- 'json_class' => self.class.name,
34
- 'args' => [ @a ],
35
- }.to_json(*args)
36
- end
37
- end
38
-
39
- class B
40
- def self.json_creatable?
41
- false
42
- end
43
-
44
- def to_json(*args)
45
- {
46
- 'json_class' => self.class.name,
47
- }.to_json(*args)
48
- end
49
- end
50
-
51
- class C
52
- def to_json(*args)
53
- {
54
- 'json_class' => 'TC_JSONRails::Nix',
55
- }.to_json(*args)
56
- end
57
- end
58
-
59
- class D
60
- def initialize
61
- @foo = 666
62
- end
63
-
64
- attr_reader :foo
65
-
66
- def ==(other)
67
- foo == other.foo
68
- end
69
- end
70
-
71
- def test_extended_json
72
- a = A.new(666)
73
- assert A.json_creatable?
74
- assert_equal 666, a.a
75
- json = generate(a)
76
- a_again = JSON.parse(json)
77
- assert_kind_of a.class, a_again
78
- assert_equal a, a_again
79
- assert_equal 666, a_again.a
80
- end
81
-
82
- def test_extended_json_generic_object
83
- d = D.new
84
- assert D.json_creatable?
85
- assert_equal 666, d.foo
86
- json = generate(d)
87
- d_again = JSON.parse(json)
88
- assert_kind_of d.class, d_again
89
- assert_equal d, d_again
90
- assert_equal 666, d_again.foo
91
- end
92
-
93
- def test_extended_json_disabled
94
- a = A.new(666)
95
- assert A.json_creatable?
96
- json = generate(a)
97
- a_again = JSON.parse(json, :create_additions => true)
98
- assert_kind_of a.class, a_again
99
- assert_equal a, a_again
100
- a_hash = JSON.parse(json, :create_additions => false)
101
- assert_kind_of Hash, a_hash
102
- assert_equal(
103
- {"args"=>[666], "json_class"=>"TC_JSONRails::A"}.sort_by { |k,| k },
104
- a_hash.sort_by { |k,| k }
105
- )
106
- end
107
-
108
- def test_extended_json_fail1
109
- b = B.new
110
- assert !B.json_creatable?
111
- json = generate(b)
112
- assert_equal({ 'json_class' => B.name }, JSON.parse(json))
113
- end
114
-
115
- def test_extended_json_fail2
116
- c = C.new # with rails addition all objects are theoretically creatable
117
- assert C.json_creatable?
118
- json = generate(c)
119
- assert_raises(ArgumentError, NameError) { JSON.parse(json) }
120
- end
121
-
122
- def test_raw_strings
123
- raw = ''
124
- raw.respond_to?(:encode!) and raw.encode!(Encoding::ASCII_8BIT)
125
- raw_array = []
126
- for i in 0..255
127
- raw << i
128
- raw_array << i
129
- end
130
- json = raw.to_json_raw
131
- json_raw_object = raw.to_json_raw_object
132
- hash = { 'json_class' => 'String', 'raw'=> raw_array }
133
- assert_equal hash, json_raw_object
134
- assert_match /\A\{.*\}\Z/, json
135
- assert_match /"json_class":"String"/, json
136
- assert_match /"raw":\[0,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,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255\]/, json
137
- raw_again = JSON.parse(json)
138
- assert_equal raw, raw_again
139
- end
140
-
141
- def test_symbol
142
- assert_equal '"foo"', :foo.to_json # we don't want an object here
143
- end
144
- end
@@ -1,76 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # -*- coding: utf-8 -*-
3
-
4
- require 'test/unit'
5
- case ENV['JSON']
6
- when 'pure' then require 'json/pure'
7
- when 'ext' then require 'json/ext'
8
- else require 'json'
9
- end
10
-
11
- class TC_JSONUnicode < Test::Unit::TestCase
12
- include JSON
13
-
14
- def test_unicode
15
- assert_equal '""', ''.to_json
16
- assert_equal '"\\b"', "\b".to_json
17
- assert_equal '"\u0001"', 0x1.chr.to_json
18
- assert_equal '"\u001f"', 0x1f.chr.to_json
19
- assert_equal '" "', ' '.to_json
20
- assert_equal "\"#{0x7f.chr}\"", 0x7f.chr.to_json
21
- utf8 = [ "© ≠ €! \01" ]
22
- json = '["© ≠ €! \u0001"]'
23
- assert_equal json, utf8.to_json(:ascii_only => false)
24
- assert_equal utf8, parse(json)
25
- json = '["\u00a9 \u2260 \u20ac! \u0001"]'
26
- assert_equal json, utf8.to_json(:ascii_only => true)
27
- assert_equal utf8, parse(json)
28
- utf8 = ["\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212"]
29
- json = "[\"\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212\"]"
30
- assert_equal utf8, parse(json)
31
- assert_equal json, utf8.to_json(:ascii_only => false)
32
- utf8 = ["\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212"]
33
- assert_equal utf8, parse(json)
34
- json = "[\"\\u3042\\u3044\\u3046\\u3048\\u304a\"]"
35
- assert_equal json, utf8.to_json(:ascii_only => true)
36
- assert_equal utf8, parse(json)
37
- utf8 = ['საქართველო']
38
- json = '["საქართველო"]'
39
- assert_equal json, utf8.to_json(:ascii_only => false)
40
- json = "[\"\\u10e1\\u10d0\\u10e5\\u10d0\\u10e0\\u10d7\\u10d5\\u10d4\\u10da\\u10dd\"]"
41
- assert_equal json, utf8.to_json(:ascii_only => true)
42
- assert_equal utf8, parse(json)
43
- assert_equal '["Ã"]', JSON.generate(["Ã"], :ascii_only => false)
44
- assert_equal '["\\u00c3"]', JSON.generate(["Ã"], :ascii_only => true)
45
- assert_equal ["€"], JSON.parse('["\u20ac"]')
46
- utf8 = ["\xf0\xa0\x80\x81"]
47
- json = "[\"\xf0\xa0\x80\x81\"]"
48
- assert_equal json, JSON.generate(utf8, :ascii_only => false)
49
- assert_equal utf8, JSON.parse(json)
50
- json = '["\ud840\udc01"]'
51
- assert_equal json, JSON.generate(utf8, :ascii_only => true)
52
- assert_equal utf8, JSON.parse(json)
53
- end
54
-
55
- def test_chars
56
- (0..0x7f).each do |i|
57
- json = '["\u%04x"]' % i
58
- if RUBY_VERSION >= "1.9."
59
- i = i.chr
60
- end
61
- assert_equal i, JSON.parse(json).first[0]
62
- if i == ?\b
63
- generated = JSON.generate(["" << i])
64
- assert '["\b"]' == generated || '["\10"]' == generated
65
- elsif [?\n, ?\r, ?\t, ?\f].include?(i)
66
- assert_equal '[' << ('' << i).dump << ']', JSON.generate(["" << i])
67
- elsif i.chr < 0x20.chr
68
- assert_equal json, JSON.generate(["" << i])
69
- end
70
- end
71
- assert_raise(JSON::GeneratorError) do
72
- JSON.generate(["\x80"], :ascii_only => true)
73
- end
74
- assert_equal "\302\200", JSON.parse('["\u0080"]').first
75
- end
76
- end
data/tools/fuzz.rb DELETED
@@ -1,139 +0,0 @@
1
- require 'json'
2
-
3
- require 'iconv'
4
- ISO_8859_1_TO_UTF8 = Iconv.new('utf-8', 'iso-8859-15')
5
- class ::String
6
- def to_utf8
7
- ISO_8859_1_TO_UTF8.iconv self
8
- end
9
- end
10
-
11
- class Fuzzer
12
- def initialize(n, freqs = {})
13
- sum = freqs.inject(0.0) { |s, x| s + x.last }
14
- freqs.each_key { |x| freqs[x] /= sum }
15
- s = 0.0
16
- freqs.each_key do |x|
17
- freqs[x] = s .. (s + t = freqs[x])
18
- s += t
19
- end
20
- @freqs = freqs
21
- @n = n
22
- @alpha = (0..0xff).to_a
23
- end
24
-
25
- def random_string
26
- s = ''
27
- 30.times { s << @alpha[rand(@alpha.size)] }
28
- s.to_utf8
29
- end
30
-
31
- def pick
32
- r = rand
33
- found = @freqs.find { |k, f| f.include? rand }
34
- found && found.first
35
- end
36
-
37
- def make_pick
38
- k = pick
39
- case
40
- when k == Hash, k == Array
41
- k.new
42
- when k == true, k == false, k == nil
43
- k
44
- when k == String
45
- random_string
46
- when k == Fixnum
47
- rand(2 ** 30) - 2 ** 29
48
- when k == Bignum
49
- rand(2 ** 70) - 2 ** 69
50
- end
51
- end
52
-
53
- def fuzz(current = nil)
54
- if @n > 0
55
- case current
56
- when nil
57
- @n -= 1
58
- current = fuzz [ Hash, Array ][rand(2)].new
59
- when Array
60
- while @n > 0
61
- @n -= 1
62
- current << case p = make_pick
63
- when Array, Hash
64
- fuzz(p)
65
- else
66
- p
67
- end
68
- end
69
- when Hash
70
- while @n > 0
71
- @n -= 1
72
- current[random_string] = case p = make_pick
73
- when Array, Hash
74
- fuzz(p)
75
- else
76
- p
77
- end
78
- end
79
- end
80
- end
81
- current
82
- end
83
- end
84
-
85
- class MyState < JSON.state
86
- WS = " \r\t\n"
87
-
88
- def initialize
89
- super(
90
- :indent => make_spaces,
91
- :space => make_spaces,
92
- :space_before => make_spaces,
93
- :object_nl => make_spaces,
94
- :array_nl => make_spaces,
95
- :max_nesting => false
96
- )
97
- end
98
-
99
- def make_spaces
100
- s = ''
101
- rand(1).times { s << WS[rand(WS.size)] }
102
- s
103
- end
104
- end
105
-
106
- n = (ARGV.shift || 500).to_i
107
- loop do
108
- fuzzer = Fuzzer.new(n,
109
- Hash => 25,
110
- Array => 25,
111
- String => 10,
112
- Fixnum => 10,
113
- Bignum => 10,
114
- nil => 5,
115
- true => 5,
116
- false => 5
117
- )
118
- o1 = fuzzer.fuzz
119
- json = JSON.generate o1, MyState.new
120
- if $DEBUG
121
- puts "-" * 80
122
- puts json, json.size
123
- else
124
- puts json.size
125
- end
126
- begin
127
- o2 = JSON.parse(json, :max_nesting => false)
128
- rescue JSON::ParserError => e
129
- puts "Caught #{e.class}: #{e.message}\n#{e.backtrace * "\n"}"
130
- puts "o1 = #{o1.inspect}", "json = #{json}", "json_str = #{json.inspect}"
131
- puts "locals = #{local_variables.inspect}"
132
- exit
133
- end
134
- if o1 != o2
135
- puts "mismatch", "o1 = #{o1.inspect}", "o2 = #{o2.inspect}",
136
- "json = #{json}", "json_str = #{json.inspect}"
137
- puts "locals = #{local_variables.inspect}"
138
- end
139
- end
data/tools/server.rb DELETED
@@ -1,61 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'webrick'
4
- include WEBrick
5
- $:.unshift 'ext'
6
- $:.unshift 'lib'
7
- require 'json'
8
-
9
- class JSONServlet < HTTPServlet::AbstractServlet
10
- @@count = 1
11
-
12
- def do_GET(req, res)
13
- obj = {
14
- "TIME" => Time.now.strftime("%FT%T"),
15
- "foo" => "Bär",
16
- "bar" => "© ≠ €!",
17
- 'a' => 2,
18
- 'b' => 3.141,
19
- 'COUNT' => @@count += 1,
20
- 'c' => 'c',
21
- 'd' => [ 1, "b", 3.14 ],
22
- 'e' => { 'foo' => 'bar' },
23
- 'g' => "松本行弘",
24
- 'h' => 1000.0,
25
- 'i' => 0.001,
26
- 'j' => "\xf0\xa0\x80\x81",
27
- }
28
- res.body = JSON.generate obj
29
- res['Content-Type'] = "application/json"
30
- end
31
- end
32
-
33
- def create_server(err, dir, port)
34
- dir = File.expand_path(dir)
35
- err.puts "Surf to:", "http://#{Socket.gethostname}:#{port}"
36
-
37
- s = HTTPServer.new(
38
- :Port => port,
39
- :DocumentRoot => dir,
40
- :Logger => WEBrick::Log.new(err),
41
- :AccessLog => [
42
- [ err, WEBrick::AccessLog::COMMON_LOG_FORMAT ],
43
- [ err, WEBrick::AccessLog::REFERER_LOG_FORMAT ],
44
- [ err, WEBrick::AccessLog::AGENT_LOG_FORMAT ]
45
- ]
46
- )
47
- s.mount("/json", JSONServlet)
48
- s
49
- end
50
-
51
- default_dir = File.expand_path(File.join(File.dirname(__FILE__), '..', 'data'))
52
- dir = ARGV.shift || default_dir
53
- port = (ARGV.shift || 6666).to_i
54
- s = create_server(STDERR, dir, 6666)
55
- t = Thread.new { s.start }
56
- trap(:INT) do
57
- s.shutdown
58
- t.join
59
- exit
60
- end
61
- sleep