json-maglev- 1.5.4

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 (139) hide show
  1. data/CHANGES +200 -0
  2. data/COPYING +58 -0
  3. data/COPYING-json-jruby +57 -0
  4. data/GPL +340 -0
  5. data/Gemfile +7 -0
  6. data/README-json-jruby.markdown +33 -0
  7. data/README.rdoc +358 -0
  8. data/Rakefile +407 -0
  9. data/TODO +1 -0
  10. data/VERSION +1 -0
  11. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkComparison.log +52 -0
  12. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast-autocorrelation.dat +1000 -0
  13. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast.dat +1001 -0
  14. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty-autocorrelation.dat +900 -0
  15. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty.dat +901 -0
  16. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe-autocorrelation.dat +1000 -0
  17. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe.dat +1001 -0
  18. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt.log +261 -0
  19. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast-autocorrelation.dat +1000 -0
  20. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast.dat +1001 -0
  21. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty-autocorrelation.dat +1000 -0
  22. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty.dat +1001 -0
  23. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe-autocorrelation.dat +1000 -0
  24. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe.dat +1001 -0
  25. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure.log +262 -0
  26. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator-autocorrelation.dat +1000 -0
  27. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator.dat +1001 -0
  28. data/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails.log +82 -0
  29. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkComparison.log +34 -0
  30. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser-autocorrelation.dat +900 -0
  31. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser.dat +901 -0
  32. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt.log +81 -0
  33. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser-autocorrelation.dat +1000 -0
  34. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser.dat +1001 -0
  35. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure.log +82 -0
  36. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser-autocorrelation.dat +1000 -0
  37. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser.dat +1001 -0
  38. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails.log +82 -0
  39. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser-autocorrelation.dat +1000 -0
  40. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser.dat +1001 -0
  41. data/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML.log +82 -0
  42. data/benchmarks/generator2_benchmark.rb +222 -0
  43. data/benchmarks/generator_benchmark.rb +224 -0
  44. data/benchmarks/ohai.json +1216 -0
  45. data/benchmarks/ohai.ruby +1 -0
  46. data/benchmarks/parser2_benchmark.rb +251 -0
  47. data/benchmarks/parser_benchmark.rb +259 -0
  48. data/bin/edit_json.rb +9 -0
  49. data/bin/prettify_json.rb +48 -0
  50. data/data/example.json +1 -0
  51. data/data/index.html +38 -0
  52. data/data/prototype.js +4184 -0
  53. data/ext/json/ext/generator/extconf.rb +20 -0
  54. data/ext/json/ext/generator/generator.c +1414 -0
  55. data/ext/json/ext/generator/generator.h +196 -0
  56. data/ext/json/ext/parser/extconf.rb +16 -0
  57. data/ext/json/ext/parser/parser.c +1996 -0
  58. data/ext/json/ext/parser/parser.h +82 -0
  59. data/ext/json/ext/parser/parser.rl +853 -0
  60. data/install.rb +26 -0
  61. data/java/lib/bytelist-1.0.6.jar +0 -0
  62. data/java/lib/jcodings.jar +0 -0
  63. data/java/src/json/ext/ByteListTranscoder.java +167 -0
  64. data/java/src/json/ext/Generator.java +437 -0
  65. data/java/src/json/ext/GeneratorMethods.java +232 -0
  66. data/java/src/json/ext/GeneratorService.java +43 -0
  67. data/java/src/json/ext/GeneratorState.java +473 -0
  68. data/java/src/json/ext/OptionsReader.java +119 -0
  69. data/java/src/json/ext/Parser.java +2314 -0
  70. data/java/src/json/ext/Parser.rl +844 -0
  71. data/java/src/json/ext/ParserService.java +35 -0
  72. data/java/src/json/ext/RuntimeInfo.java +121 -0
  73. data/java/src/json/ext/StringDecoder.java +166 -0
  74. data/java/src/json/ext/StringEncoder.java +106 -0
  75. data/java/src/json/ext/Utils.java +89 -0
  76. data/json-java.gemspec +22 -0
  77. data/json.gemspec +41 -0
  78. data/json_pure.gemspec +46 -0
  79. data/lib/json.rb +62 -0
  80. data/lib/json/Array.xpm +21 -0
  81. data/lib/json/FalseClass.xpm +21 -0
  82. data/lib/json/Hash.xpm +21 -0
  83. data/lib/json/Key.xpm +73 -0
  84. data/lib/json/NilClass.xpm +21 -0
  85. data/lib/json/Numeric.xpm +28 -0
  86. data/lib/json/String.xpm +96 -0
  87. data/lib/json/TrueClass.xpm +21 -0
  88. data/lib/json/add/core.rb +243 -0
  89. data/lib/json/add/rails.rb +8 -0
  90. data/lib/json/common.rb +423 -0
  91. data/lib/json/editor.rb +1369 -0
  92. data/lib/json/ext.rb +28 -0
  93. data/lib/json/json.xpm +1499 -0
  94. data/lib/json/pure.rb +15 -0
  95. data/lib/json/pure/generator.rb +442 -0
  96. data/lib/json/pure/parser.rb +320 -0
  97. data/lib/json/version.rb +8 -0
  98. data/tests/fixtures/fail1.json +1 -0
  99. data/tests/fixtures/fail10.json +1 -0
  100. data/tests/fixtures/fail11.json +1 -0
  101. data/tests/fixtures/fail12.json +1 -0
  102. data/tests/fixtures/fail13.json +1 -0
  103. data/tests/fixtures/fail14.json +1 -0
  104. data/tests/fixtures/fail18.json +1 -0
  105. data/tests/fixtures/fail19.json +1 -0
  106. data/tests/fixtures/fail2.json +1 -0
  107. data/tests/fixtures/fail20.json +1 -0
  108. data/tests/fixtures/fail21.json +1 -0
  109. data/tests/fixtures/fail22.json +1 -0
  110. data/tests/fixtures/fail23.json +1 -0
  111. data/tests/fixtures/fail24.json +1 -0
  112. data/tests/fixtures/fail25.json +1 -0
  113. data/tests/fixtures/fail27.json +2 -0
  114. data/tests/fixtures/fail28.json +2 -0
  115. data/tests/fixtures/fail3.json +1 -0
  116. data/tests/fixtures/fail4.json +1 -0
  117. data/tests/fixtures/fail5.json +1 -0
  118. data/tests/fixtures/fail6.json +1 -0
  119. data/tests/fixtures/fail7.json +1 -0
  120. data/tests/fixtures/fail8.json +1 -0
  121. data/tests/fixtures/fail9.json +1 -0
  122. data/tests/fixtures/pass1.json +56 -0
  123. data/tests/fixtures/pass15.json +1 -0
  124. data/tests/fixtures/pass16.json +1 -0
  125. data/tests/fixtures/pass17.json +1 -0
  126. data/tests/fixtures/pass2.json +1 -0
  127. data/tests/fixtures/pass26.json +1 -0
  128. data/tests/fixtures/pass3.json +6 -0
  129. data/tests/setup_variant.rb +11 -0
  130. data/tests/test_json.rb +424 -0
  131. data/tests/test_json_addition.rb +167 -0
  132. data/tests/test_json_encoding.rb +65 -0
  133. data/tests/test_json_fixtures.rb +35 -0
  134. data/tests/test_json_generate.rb +180 -0
  135. data/tests/test_json_string_matching.rb +40 -0
  136. data/tests/test_json_unicode.rb +72 -0
  137. data/tools/fuzz.rb +139 -0
  138. data/tools/server.rb +61 -0
  139. metadata +265 -0
@@ -0,0 +1,167 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding:utf-8 -*-
3
+
4
+ require 'test/unit'
5
+ require File.join(File.dirname(__FILE__), 'setup_variant')
6
+ load 'json/add/core.rb'
7
+ require 'date'
8
+
9
+ class TC_JSONAddition < Test::Unit::TestCase
10
+ include JSON
11
+
12
+ class A
13
+ def initialize(a)
14
+ @a = a
15
+ end
16
+
17
+ attr_reader :a
18
+
19
+ def ==(other)
20
+ a == other.a
21
+ end
22
+
23
+ def self.json_create(object)
24
+ new(*object['args'])
25
+ end
26
+
27
+ def to_json(*args)
28
+ {
29
+ 'json_class' => self.class.name,
30
+ 'args' => [ @a ],
31
+ }.to_json(*args)
32
+ end
33
+ end
34
+
35
+ class A2 < A
36
+ def to_json(*args)
37
+ {
38
+ 'json_class' => self.class.name,
39
+ 'args' => [ @a ],
40
+ }.to_json(*args)
41
+ end
42
+ end
43
+
44
+ class B
45
+ def self.json_creatable?
46
+ false
47
+ end
48
+
49
+ def to_json(*args)
50
+ {
51
+ 'json_class' => self.class.name,
52
+ }.to_json(*args)
53
+ end
54
+ end
55
+
56
+ class C
57
+ def self.json_creatable?
58
+ false
59
+ end
60
+
61
+ def to_json(*args)
62
+ {
63
+ 'json_class' => 'TC_JSONAddition::Nix',
64
+ }.to_json(*args)
65
+ end
66
+ end
67
+
68
+ def test_extended_json
69
+ a = A.new(666)
70
+ assert A.json_creatable?
71
+ json = generate(a)
72
+ a_again = JSON.parse(json)
73
+ assert_kind_of a.class, a_again
74
+ assert_equal a, a_again
75
+ end
76
+
77
+ def test_extended_json_disabled
78
+ a = A.new(666)
79
+ assert A.json_creatable?
80
+ json = generate(a)
81
+ a_again = JSON.parse(json, :create_additions => true)
82
+ assert_kind_of a.class, a_again
83
+ assert_equal a, a_again
84
+ a_hash = JSON.parse(json, :create_additions => false)
85
+ assert_kind_of Hash, a_hash
86
+ assert_equal(
87
+ {"args"=>[666], "json_class"=>"TC_JSONAddition::A"}.sort_by { |k,| k },
88
+ a_hash.sort_by { |k,| k }
89
+ )
90
+ end
91
+
92
+ def test_extended_json_fail1
93
+ b = B.new
94
+ assert !B.json_creatable?
95
+ json = generate(b)
96
+ assert_equal({ "json_class"=>"TC_JSONAddition::B" }, JSON.parse(json))
97
+ end
98
+
99
+ def test_extended_json_fail2
100
+ c = C.new
101
+ assert !C.json_creatable?
102
+ json = generate(c)
103
+ assert_raises(ArgumentError, NameError) { JSON.parse(json) }
104
+ end
105
+
106
+ def test_raw_strings
107
+ raw = ''
108
+ raw.respond_to?(:encode!) and raw.encode!(Encoding::ASCII_8BIT)
109
+ raw_array = []
110
+ for i in 0..255
111
+ raw << i
112
+ raw_array << i
113
+ end
114
+ json = raw.to_json_raw
115
+ json_raw_object = raw.to_json_raw_object
116
+ hash = { 'json_class' => 'String', 'raw'=> raw_array }
117
+ assert_equal hash, json_raw_object
118
+ assert_match(/\A\{.*\}\Z/, json)
119
+ assert_match(/"json_class":"String"/, json)
120
+ 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)
121
+ raw_again = JSON.parse(json)
122
+ assert_equal raw, raw_again
123
+ end
124
+
125
+ MyJsonStruct = Struct.new 'MyJsonStruct', :foo, :bar
126
+
127
+ def test_core
128
+ t = Time.now
129
+ assert_equal t.inspect, JSON(JSON(t)).inspect
130
+ d = Date.today
131
+ assert_equal d, JSON(JSON(d))
132
+ d = DateTime.civil(2007, 6, 14, 14, 57, 10, Rational(1, 12), 2299161)
133
+ assert_equal d, JSON(JSON(d))
134
+ assert_equal 1..10, JSON(JSON(1..10))
135
+ assert_equal 1...10, JSON(JSON(1...10))
136
+ assert_equal "a".."c", JSON(JSON("a".."c"))
137
+ assert_equal "a"..."c", JSON(JSON("a"..."c"))
138
+ s = MyJsonStruct.new 4711, 'foot'
139
+ assert_equal s, JSON(JSON(s))
140
+ struct = Struct.new :foo, :bar
141
+ s = struct.new 4711, 'foot'
142
+ assert_raises(JSONError) { JSON(s) }
143
+ begin
144
+ raise TypeError, "test me"
145
+ rescue TypeError => e
146
+ e_json = JSON.generate e
147
+ e_again = JSON e_json
148
+ assert_kind_of TypeError, e_again
149
+ assert_equal e.message, e_again.message
150
+ assert_equal e.backtrace, e_again.backtrace
151
+ end
152
+ assert_equal(/foo/, JSON(JSON(/foo/)))
153
+ assert_equal(/foo/i, JSON(JSON(/foo/i)))
154
+ end
155
+
156
+ def test_utc_datetime
157
+ now = Time.now
158
+ d = DateTime.parse(now.to_s) # usual case
159
+ assert_equal d, JSON.parse(d.to_json)
160
+ d = DateTime.parse(now.utc.to_s) # of = 0
161
+ assert_equal d, JSON.parse(d.to_json)
162
+ d = DateTime.civil(2008, 6, 17, 11, 48, 32, Rational(1,24))
163
+ assert_equal d, JSON.parse(d.to_json)
164
+ d = DateTime.civil(2008, 6, 17, 11, 48, 32, Rational(12,24))
165
+ assert_equal d, JSON.parse(d.to_json)
166
+ end
167
+ end
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+
4
+ require 'test/unit'
5
+ require File.join(File.dirname(__FILE__), 'setup_variant')
6
+
7
+ class TC_JSONEncoding < Test::Unit::TestCase
8
+ include JSON
9
+
10
+ def setup
11
+ @utf_8 = '["© ≠ €!"]'
12
+ @parsed = [ "© ≠ €!" ]
13
+ @generated = '["\u00a9 \u2260 \u20ac!"]'
14
+ if String.method_defined?(:encode)
15
+ @utf_16_data = [@parsed.first.encode('utf-16be', 'utf-8')]
16
+ @utf_8_ascii_8bit = @utf_8.dup.force_encoding(Encoding::ASCII_8BIT)
17
+ @utf_16be = @utf_8.encode('utf-16be', 'utf-8')
18
+ @utf_16be_ascii_8bit = @utf_16be.dup.force_encoding(Encoding::ASCII_8BIT)
19
+ @utf_16le = @utf_8.encode('utf-16le', 'utf-8')
20
+ @utf_16le_ascii_8bit = @utf_16le.dup.force_encoding(Encoding::ASCII_8BIT)
21
+ @utf_32be = @utf_8.encode('utf-32be', 'utf-8')
22
+ @utf_32be_ascii_8bit = @utf_32be.dup.force_encoding(Encoding::ASCII_8BIT)
23
+ @utf_32le = @utf_8.encode('utf-32le', 'utf-8')
24
+ @utf_32le_ascii_8bit = @utf_32le.dup.force_encoding(Encoding::ASCII_8BIT)
25
+ else
26
+ require 'iconv'
27
+ @utf_16_data = Iconv.iconv('utf-16be', 'utf-8', @parsed.first)
28
+ @utf_8_ascii_8bit = @utf_8.dup
29
+ @utf_16be, = Iconv.iconv('utf-16be', 'utf-8', @utf_8)
30
+ @utf_16be_ascii_8bit = @utf_16be.dup
31
+ @utf_16le, = Iconv.iconv('utf-16le', 'utf-8', @utf_8)
32
+ @utf_16le_ascii_8bit = @utf_16le.dup
33
+ @utf_32be, = Iconv.iconv('utf-32be', 'utf-8', @utf_8)
34
+ @utf_32be_ascii_8bit = @utf_32be.dup
35
+ @utf_32le, = Iconv.iconv('utf-32le', 'utf-8', @utf_8)
36
+ @utf_32le_ascii_8bit = @utf_32le.dup
37
+ end
38
+ end
39
+
40
+ def test_parse
41
+ assert_equal @parsed, JSON.parse(@utf_8)
42
+ assert_equal @parsed, JSON.parse(@utf_16be)
43
+ assert_equal @parsed, JSON.parse(@utf_16le)
44
+ assert_equal @parsed, JSON.parse(@utf_32be)
45
+ assert_equal @parsed, JSON.parse(@utf_32le)
46
+ end
47
+
48
+ def test_parse_ascii_8bit
49
+ assert_equal @parsed, JSON.parse(@utf_8_ascii_8bit)
50
+ assert_equal @parsed, JSON.parse(@utf_16be_ascii_8bit)
51
+ assert_equal @parsed, JSON.parse(@utf_16le_ascii_8bit)
52
+ assert_equal @parsed, JSON.parse(@utf_32be_ascii_8bit)
53
+ assert_equal @parsed, JSON.parse(@utf_32le_ascii_8bit)
54
+ end
55
+
56
+ def test_generate
57
+ assert_equal @generated, JSON.generate(@parsed, :ascii_only => true)
58
+ if defined?(::Encoding)
59
+ assert_equal @generated, JSON.generate(@utf_16_data, :ascii_only => true)
60
+ else
61
+ # XXX checking of correct utf8 data is not as strict (yet?) without :ascii_only
62
+ assert_raises(JSON::GeneratorError) { JSON.generate(@utf_16_data, :ascii_only => true) }
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+
4
+ require 'test/unit'
5
+ require File.join(File.dirname(__FILE__), 'setup_variant')
6
+
7
+ class TC_JSONFixtures < Test::Unit::TestCase
8
+ def setup
9
+ fixtures = File.join(File.dirname(__FILE__), 'fixtures/*.json')
10
+ passed, failed = Dir[fixtures].partition { |f| f['pass'] }
11
+ @passed = passed.inject([]) { |a, f| a << [ f, File.read(f) ] }.sort
12
+ @failed = failed.inject([]) { |a, f| a << [ f, File.read(f) ] }.sort
13
+ end
14
+
15
+ def test_passing
16
+ for name, source in @passed
17
+ begin
18
+ assert JSON.parse(source),
19
+ "Did not pass for fixture '#{name}': #{source.inspect}"
20
+ rescue => e
21
+ warn "\nCaught #{e.class}(#{e}) for fixture '#{name}': #{source.inspect}\n#{e.backtrace * "\n"}"
22
+ raise e
23
+ end
24
+ end
25
+ end
26
+
27
+ def test_failing
28
+ for name, source in @failed
29
+ assert_raises(JSON::ParserError, JSON::NestingError,
30
+ "Did not fail for fixture '#{name}': #{source.inspect}") do
31
+ JSON.parse(source)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,180 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+
4
+ require 'test/unit'
5
+ require File.join(File.dirname(__FILE__), 'setup_variant')
6
+
7
+ class TC_JSONGenerate < Test::Unit::TestCase
8
+ include JSON
9
+
10
+ def setup
11
+ @hash = {
12
+ 'a' => 2,
13
+ 'b' => 3.141,
14
+ 'c' => 'c',
15
+ 'd' => [ 1, "b", 3.14 ],
16
+ 'e' => { 'foo' => 'bar' },
17
+ 'g' => "\"\0\037",
18
+ 'h' => 1000.0,
19
+ 'i' => 0.001
20
+ }
21
+ @json2 = '{"a":2,"b":3.141,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},' +
22
+ '"g":"\\"\\u0000\\u001f","h":1000.0,"i":0.001}'
23
+ @json3 = <<'EOT'.chomp
24
+ {
25
+ "a": 2,
26
+ "b": 3.141,
27
+ "c": "c",
28
+ "d": [
29
+ 1,
30
+ "b",
31
+ 3.14
32
+ ],
33
+ "e": {
34
+ "foo": "bar"
35
+ },
36
+ "g": "\"\u0000\u001f",
37
+ "h": 1000.0,
38
+ "i": 0.001
39
+ }
40
+ EOT
41
+ end
42
+
43
+ def test_generate
44
+ json = generate(@hash)
45
+ assert_equal(JSON.parse(@json2), JSON.parse(json))
46
+ parsed_json = parse(json)
47
+ assert_equal(@hash, parsed_json)
48
+ json = generate({1=>2})
49
+ assert_equal('{"1":2}', json)
50
+ parsed_json = parse(json)
51
+ assert_equal({"1"=>2}, parsed_json)
52
+ assert_raise(GeneratorError) { generate(666) }
53
+ end
54
+
55
+ def test_generate_pretty
56
+ json = pretty_generate(@hash)
57
+ # hashes aren't (insertion) ordered on every ruby implementation assert_equal(@json3, json)
58
+ assert_equal(JSON.parse(@json3), JSON.parse(json))
59
+ parsed_json = parse(json)
60
+ assert_equal(@hash, parsed_json)
61
+ json = pretty_generate({1=>2})
62
+ assert_equal(<<'EOT'.chomp, json)
63
+ {
64
+ "1": 2
65
+ }
66
+ EOT
67
+ parsed_json = parse(json)
68
+ assert_equal({"1"=>2}, parsed_json)
69
+ assert_raise(GeneratorError) { pretty_generate(666) }
70
+ end
71
+
72
+ def test_fast_generate
73
+ json = fast_generate(@hash)
74
+ assert_equal(JSON.parse(@json2), JSON.parse(json))
75
+ parsed_json = parse(json)
76
+ assert_equal(@hash, parsed_json)
77
+ json = fast_generate({1=>2})
78
+ assert_equal('{"1":2}', json)
79
+ parsed_json = parse(json)
80
+ assert_equal({"1"=>2}, parsed_json)
81
+ assert_raise(GeneratorError) { fast_generate(666) }
82
+ end
83
+
84
+
85
+
86
+ def test_states
87
+ json = generate({1=>2}, nil)
88
+ assert_equal('{"1":2}', json)
89
+ s = JSON.state.new
90
+ assert s.check_circular?
91
+ assert s[:check_circular?]
92
+ h = { 1=>2 }
93
+ h[3] = h
94
+ assert_raises(JSON::NestingError) { generate(h) }
95
+ assert_raises(JSON::NestingError) { generate(h, s) }
96
+ s = JSON.state.new
97
+ a = [ 1, 2 ]
98
+ a << a
99
+ assert_raises(JSON::NestingError) { generate(a, s) }
100
+ assert s.check_circular?
101
+ assert s[:check_circular?]
102
+ end
103
+
104
+ def test_pretty_state
105
+ state = PRETTY_STATE_PROTOTYPE.dup
106
+ assert_equal({
107
+ :allow_nan => false,
108
+ :array_nl => "\n",
109
+ :ascii_only => false,
110
+ :depth => 0,
111
+ :indent => " ",
112
+ :max_nesting => 19,
113
+ :object_nl => "\n",
114
+ :space => " ",
115
+ :space_before => "",
116
+ }.sort_by { |n,| n.to_s }, state.to_h.sort_by { |n,| n.to_s })
117
+ end
118
+
119
+ def test_safe_state
120
+ state = SAFE_STATE_PROTOTYPE.dup
121
+ assert_equal({
122
+ :allow_nan => false,
123
+ :array_nl => "",
124
+ :ascii_only => false,
125
+ :depth => 0,
126
+ :indent => "",
127
+ :max_nesting => 19,
128
+ :object_nl => "",
129
+ :space => "",
130
+ :space_before => "",
131
+ }.sort_by { |n,| n.to_s }, state.to_h.sort_by { |n,| n.to_s })
132
+ end
133
+
134
+ def test_fast_state
135
+ state = FAST_STATE_PROTOTYPE.dup
136
+ assert_equal({
137
+ :allow_nan => false,
138
+ :array_nl => "",
139
+ :ascii_only => false,
140
+ :depth => 0,
141
+ :indent => "",
142
+ :max_nesting => 0,
143
+ :object_nl => "",
144
+ :space => "",
145
+ :space_before => "",
146
+ }.sort_by { |n,| n.to_s }, state.to_h.sort_by { |n,| n.to_s })
147
+ end
148
+
149
+ def test_allow_nan
150
+ assert_raises(GeneratorError) { generate([JSON::NaN]) }
151
+ assert_equal '[NaN]', generate([JSON::NaN], :allow_nan => true)
152
+ assert_raises(GeneratorError) { fast_generate([JSON::NaN]) }
153
+ assert_raises(GeneratorError) { pretty_generate([JSON::NaN]) }
154
+ assert_equal "[\n NaN\n]", pretty_generate([JSON::NaN], :allow_nan => true)
155
+ assert_raises(GeneratorError) { generate([JSON::Infinity]) }
156
+ assert_equal '[Infinity]', generate([JSON::Infinity], :allow_nan => true)
157
+ assert_raises(GeneratorError) { fast_generate([JSON::Infinity]) }
158
+ assert_raises(GeneratorError) { pretty_generate([JSON::Infinity]) }
159
+ assert_equal "[\n Infinity\n]", pretty_generate([JSON::Infinity], :allow_nan => true)
160
+ assert_raises(GeneratorError) { generate([JSON::MinusInfinity]) }
161
+ assert_equal '[-Infinity]', generate([JSON::MinusInfinity], :allow_nan => true)
162
+ assert_raises(GeneratorError) { fast_generate([JSON::MinusInfinity]) }
163
+ assert_raises(GeneratorError) { pretty_generate([JSON::MinusInfinity]) }
164
+ assert_equal "[\n -Infinity\n]", pretty_generate([JSON::MinusInfinity], :allow_nan => true)
165
+ end
166
+
167
+ def test_depth
168
+ ary = []; ary << ary
169
+ assert_equal 0, JSON::SAFE_STATE_PROTOTYPE.depth
170
+ assert_raises(JSON::NestingError) { JSON.generate(ary) }
171
+ assert_equal 0, JSON::SAFE_STATE_PROTOTYPE.depth
172
+ assert_equal 0, JSON::PRETTY_STATE_PROTOTYPE.depth
173
+ assert_raises(JSON::NestingError) { JSON.pretty_generate(ary) }
174
+ assert_equal 0, JSON::PRETTY_STATE_PROTOTYPE.depth
175
+ s = JSON.state.new
176
+ assert_equal 0, s.depth
177
+ assert_raises(JSON::NestingError) { ary.to_json(s) }
178
+ assert_equal 19, s.depth
179
+ end
180
+ end