java_bin 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +25 -0
- data/LICENSE +20 -0
- data/README.rdoc +26 -0
- data/Rakefile +53 -0
- data/TODO +13 -0
- data/VERSION +1 -0
- data/ext/java_bin/ext/extconf.rb +26 -0
- data/ext/java_bin/ext/parser.c +372 -0
- data/ext/java_bin/ext/parser.h +134 -0
- data/fixtures/javabin.dat +0 -0
- data/fixtures/json.dat +55 -0
- data/fixtures/ruby.dat +55 -0
- data/java_bin.gemspec +67 -0
- data/lib/java_bin/ext/.keep +0 -0
- data/lib/java_bin/ext.rb +9 -0
- data/lib/java_bin/pure/parser.rb +219 -0
- data/lib/java_bin/pure.rb +8 -0
- data/lib/java_bin/version.rb +10 -0
- data/lib/java_bin.rb +17 -0
- data/test/helper.rb +10 -0
- data/test/test_java_bin_parser.rb +240 -0
- data/test/xxx_performance.rb +106 -0
- metadata +82 -0
data/fixtures/json.dat
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
{
|
2
|
+
"responseHeader":{
|
3
|
+
"status":0,
|
4
|
+
"QTime":0,
|
5
|
+
"params":{
|
6
|
+
"explainOther":"",
|
7
|
+
"fl":"*,score",
|
8
|
+
"indent":"on",
|
9
|
+
"start":"0",
|
10
|
+
"q":"software",
|
11
|
+
"hl.fl":"",
|
12
|
+
"qt":"standard",
|
13
|
+
"wt":"json",
|
14
|
+
"fq":"",
|
15
|
+
"version":"2.2",
|
16
|
+
"rows":"10"}},
|
17
|
+
"response":{"numFound":2,"start":0,"maxScore":0.6288448,"docs":[
|
18
|
+
{
|
19
|
+
"id":"UTF8TEST",
|
20
|
+
"name":"Test with some UTF-8 encoded characters",
|
21
|
+
"manu":"Apache Software Foundation",
|
22
|
+
"price":0.0,
|
23
|
+
"inStock":true,
|
24
|
+
"cat":[
|
25
|
+
"software",
|
26
|
+
"search"],
|
27
|
+
"features":[
|
28
|
+
"No accents here",
|
29
|
+
"This is an e acute: é",
|
30
|
+
"eaiou with circumflexes: êâîôû",
|
31
|
+
"eaiou with umlauts: ëäïöü",
|
32
|
+
"tag with escaped chars: <nicetag/>",
|
33
|
+
"escaped ampersand: Bonnie & Clyde"],
|
34
|
+
"score":0.6288448},
|
35
|
+
{
|
36
|
+
"id":"SOLR1000",
|
37
|
+
"name":"Solr, the Enterprise Search Server",
|
38
|
+
"manu":"Apache Software Foundation",
|
39
|
+
"price":0.0,
|
40
|
+
"popularity":10,
|
41
|
+
"inStock":true,
|
42
|
+
"incubationdate_dt":"2006-01-17T00:00:00Z",
|
43
|
+
"cat":[
|
44
|
+
"software",
|
45
|
+
"search"],
|
46
|
+
"features":[
|
47
|
+
"Advanced Full-Text Search Capabilities using Lucene",
|
48
|
+
"Optimized for High Volume Web Traffic",
|
49
|
+
"Standards Based Open Interfaces - XML and HTTP",
|
50
|
+
"Comprehensive HTML Administration Interfaces",
|
51
|
+
"Scalability - Efficient Replication to other Solr Search Servers",
|
52
|
+
"Flexible and Adaptable with XML configuration and Schema",
|
53
|
+
"Good unicode support: héllo (hello with an accent over the e)"],
|
54
|
+
"score":0.50307584}]
|
55
|
+
}}
|
data/fixtures/ruby.dat
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
{
|
2
|
+
'responseHeader'=>{
|
3
|
+
'status'=>0,
|
4
|
+
'QTime'=>0,
|
5
|
+
'params'=>{
|
6
|
+
'explainOther'=>'',
|
7
|
+
'fl'=>'*,score',
|
8
|
+
'indent'=>'on',
|
9
|
+
'start'=>'0',
|
10
|
+
'q'=>'software',
|
11
|
+
'hl.fl'=>'',
|
12
|
+
'qt'=>'standard',
|
13
|
+
'wt'=>'ruby',
|
14
|
+
'fq'=>'',
|
15
|
+
'version'=>'2.2',
|
16
|
+
'rows'=>'10'}},
|
17
|
+
'response'=>{'numFound'=>2,'start'=>0,'maxScore'=>0.6288448,'docs'=>[
|
18
|
+
{
|
19
|
+
'id'=>'UTF8TEST',
|
20
|
+
'name'=>'Test with some UTF-8 encoded characters',
|
21
|
+
'manu'=>'Apache Software Foundation',
|
22
|
+
'price'=>0.0,
|
23
|
+
'inStock'=>true,
|
24
|
+
'cat'=>[
|
25
|
+
'software',
|
26
|
+
'search'],
|
27
|
+
'features'=>[
|
28
|
+
'No accents here',
|
29
|
+
'This is an e acute: é',
|
30
|
+
'eaiou with circumflexes: êâîôû',
|
31
|
+
'eaiou with umlauts: ëäïöü',
|
32
|
+
'tag with escaped chars: <nicetag/>',
|
33
|
+
'escaped ampersand: Bonnie & Clyde'],
|
34
|
+
'score'=>0.6288448},
|
35
|
+
{
|
36
|
+
'id'=>'SOLR1000',
|
37
|
+
'name'=>'Solr, the Enterprise Search Server',
|
38
|
+
'manu'=>'Apache Software Foundation',
|
39
|
+
'price'=>0.0,
|
40
|
+
'popularity'=>10,
|
41
|
+
'inStock'=>true,
|
42
|
+
'incubationdate_dt'=>'2006-01-17T00:00:00Z',
|
43
|
+
'cat'=>[
|
44
|
+
'software',
|
45
|
+
'search'],
|
46
|
+
'features'=>[
|
47
|
+
'Advanced Full-Text Search Capabilities using Lucene',
|
48
|
+
'Optimized for High Volume Web Traffic',
|
49
|
+
'Standards Based Open Interfaces - XML and HTTP',
|
50
|
+
'Comprehensive HTML Administration Interfaces',
|
51
|
+
'Scalability - Efficient Replication to other Solr Search Servers',
|
52
|
+
'Flexible and Adaptable with XML configuration and Schema',
|
53
|
+
'Good unicode support: héllo (hello with an accent over the e)'],
|
54
|
+
'score'=>0.50307584}]
|
55
|
+
}}
|
data/java_bin.gemspec
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{java_bin}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["kennyj"]
|
12
|
+
s.date = %q{2010-01-11}
|
13
|
+
s.description = %q{Solr JavaBin format implementation for Ruby.}
|
14
|
+
s.email = %q{kennyj@gmail.com}
|
15
|
+
s.extensions = ["ext/java_bin/ext/extconf.rb"]
|
16
|
+
s.extra_rdoc_files = [
|
17
|
+
"LICENSE",
|
18
|
+
"README.rdoc",
|
19
|
+
"TODO"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".document",
|
23
|
+
".gitignore",
|
24
|
+
"LICENSE",
|
25
|
+
"README.rdoc",
|
26
|
+
"Rakefile",
|
27
|
+
"TODO",
|
28
|
+
"VERSION",
|
29
|
+
"ext/java_bin/ext/extconf.rb",
|
30
|
+
"ext/java_bin/ext/parser.c",
|
31
|
+
"ext/java_bin/ext/parser.h",
|
32
|
+
"fixtures/javabin.dat",
|
33
|
+
"fixtures/json.dat",
|
34
|
+
"fixtures/ruby.dat",
|
35
|
+
"java_bin.gemspec",
|
36
|
+
"lib/java_bin.rb",
|
37
|
+
"lib/java_bin/ext.rb",
|
38
|
+
"lib/java_bin/ext/.keep",
|
39
|
+
"lib/java_bin/pure.rb",
|
40
|
+
"lib/java_bin/pure/parser.rb",
|
41
|
+
"lib/java_bin/version.rb",
|
42
|
+
"test/helper.rb",
|
43
|
+
"test/test_java_bin_parser.rb",
|
44
|
+
"test/xxx_performance.rb"
|
45
|
+
]
|
46
|
+
s.homepage = %q{http://github.com/kennyj/java_bin}
|
47
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
48
|
+
s.require_paths = ["lib", "ext"]
|
49
|
+
s.rubygems_version = %q{1.3.5}
|
50
|
+
s.summary = %q{Solr JavaBin format implementation for Ruby.}
|
51
|
+
s.test_files = [
|
52
|
+
"test/xxx_performance.rb",
|
53
|
+
"test/test_java_bin_parser.rb",
|
54
|
+
"test/helper.rb"
|
55
|
+
]
|
56
|
+
|
57
|
+
if s.respond_to? :specification_version then
|
58
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
59
|
+
s.specification_version = 3
|
60
|
+
|
61
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
62
|
+
else
|
63
|
+
end
|
64
|
+
else
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
File without changes
|
data/lib/java_bin/ext.rb
ADDED
@@ -0,0 +1,219 @@
|
|
1
|
+
# vim:fileencoding=utf-8
|
2
|
+
module JavaBin
|
3
|
+
module Pure
|
4
|
+
NULL = 0
|
5
|
+
BOOL_TRUE = 1
|
6
|
+
BOOL_FALSE = 2
|
7
|
+
BYTE = 3
|
8
|
+
SHORT = 4
|
9
|
+
DOUBLE = 5
|
10
|
+
INT = 6
|
11
|
+
LONG = 7
|
12
|
+
FLOAT = 8
|
13
|
+
DATE = 9
|
14
|
+
MAP = 10
|
15
|
+
SOLRDOC = 11
|
16
|
+
SOLRDOCLST = 12
|
17
|
+
BYTEARR = 13
|
18
|
+
ITERATOR = 14
|
19
|
+
TERM = 15 #END = 15
|
20
|
+
|
21
|
+
#TAG_AND_LEN = (1 << 5)
|
22
|
+
STR = (1 << 5)
|
23
|
+
SINT = (2 << 5)
|
24
|
+
SLONG = (3 << 5)
|
25
|
+
ARR = (4 << 5)
|
26
|
+
ORDERED_MAP = (5 << 5)
|
27
|
+
NAMED_LST = (6 << 5)
|
28
|
+
EXTERN_STRING = (7 << 5)
|
29
|
+
|
30
|
+
# TODO 論理シフト
|
31
|
+
SHIFTED_STR = STR >> 5
|
32
|
+
SHIFTED_ARR = ARR >> 5
|
33
|
+
SHIFTED_EXTERN_STRING = EXTERN_STRING >> 5
|
34
|
+
SHIFTED_ORDERED_MAP = ORDERED_MAP >> 5
|
35
|
+
SHIFTED_NAMED_LST = NAMED_LST >> 5
|
36
|
+
SHIFTED_SINT = SINT >> 5
|
37
|
+
SHIFTED_SLONG = SLONG >> 5
|
38
|
+
|
39
|
+
VERSION = 1
|
40
|
+
TERM_OBJ = :term_obj
|
41
|
+
|
42
|
+
class Parser
|
43
|
+
|
44
|
+
attr_reader :tag_byte, :input, :current
|
45
|
+
|
46
|
+
def initialize
|
47
|
+
end
|
48
|
+
|
49
|
+
def parse(input)
|
50
|
+
array = input.bytes.to_a
|
51
|
+
check_version(array[0])
|
52
|
+
@input = array
|
53
|
+
@current = 1 # HINT VERSIONをとばす
|
54
|
+
@tag_byte = nil
|
55
|
+
read_val
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
def check_version(byte)
|
60
|
+
return true if VERSION == byte
|
61
|
+
raise "unsupported version #{byte}"
|
62
|
+
end
|
63
|
+
|
64
|
+
def getbyte
|
65
|
+
ret = @input[@current]
|
66
|
+
@current += 1
|
67
|
+
ret
|
68
|
+
end
|
69
|
+
|
70
|
+
def getbytes(size)
|
71
|
+
ret = @input[@current...(@current + size)]
|
72
|
+
@current += size
|
73
|
+
ret
|
74
|
+
end
|
75
|
+
|
76
|
+
def read_val
|
77
|
+
@tag_byte = getbyte
|
78
|
+
case (@tag_byte >> 5) # TODO 論理シフト
|
79
|
+
when SHIFTED_STR
|
80
|
+
return read_chars
|
81
|
+
when SHIFTED_ARR
|
82
|
+
size = read_size
|
83
|
+
array = Array.new(size)
|
84
|
+
size.times { |i| array[i] = read_val }
|
85
|
+
return array
|
86
|
+
when SHIFTED_EXTERN_STRING
|
87
|
+
size = read_size
|
88
|
+
if size == 0
|
89
|
+
str = read_val
|
90
|
+
@exts ||= []
|
91
|
+
@exts << str
|
92
|
+
return str
|
93
|
+
else
|
94
|
+
return @exts[size - 1].dup
|
95
|
+
end
|
96
|
+
when SHIFTED_ORDERED_MAP, SHIFTED_NAMED_LST
|
97
|
+
size = read_size
|
98
|
+
hash = {}
|
99
|
+
size.times do
|
100
|
+
k = read_val
|
101
|
+
v = read_val
|
102
|
+
hash[k] = v
|
103
|
+
end
|
104
|
+
return hash
|
105
|
+
when SHIFTED_SINT
|
106
|
+
return read_small_int
|
107
|
+
when SHIFTED_SLONG
|
108
|
+
return read_small_int
|
109
|
+
end
|
110
|
+
|
111
|
+
case @tag_byte
|
112
|
+
when NULL
|
113
|
+
return nil
|
114
|
+
when BOOL_TRUE
|
115
|
+
return true
|
116
|
+
when BOOL_FALSE
|
117
|
+
return false
|
118
|
+
when BYTE
|
119
|
+
return getbytes(1).pack("C*").unpack("c")[0]
|
120
|
+
when SHORT
|
121
|
+
return getbytes(2).reverse.pack("C*").unpack("s")[0]
|
122
|
+
when DOUBLE
|
123
|
+
return getbytes(8).pack("C*").unpack("G")[0]
|
124
|
+
when INT
|
125
|
+
return getbytes(4).reverse.pack("C*").unpack("i")[0]
|
126
|
+
when LONG
|
127
|
+
return getbytes(8).reverse.pack("C*").unpack("q")[0]
|
128
|
+
when FLOAT
|
129
|
+
return getbytes(4).pack("C*").unpack("g")[0]
|
130
|
+
when DATE
|
131
|
+
x = getbytes(8).reverse.pack("C*").unpack("q")[0]
|
132
|
+
return Time.at(x/1000)
|
133
|
+
when MAP
|
134
|
+
size = read_v_int
|
135
|
+
hash = {}
|
136
|
+
size.times do
|
137
|
+
k = read_val
|
138
|
+
v = read_val
|
139
|
+
hash[k] = v
|
140
|
+
end
|
141
|
+
return hash
|
142
|
+
when BYTEARR
|
143
|
+
size = read_v_int
|
144
|
+
return getbytes(size)
|
145
|
+
when ITERATOR
|
146
|
+
array = []
|
147
|
+
while true
|
148
|
+
i = read_val
|
149
|
+
break if i == TERM_OBJ
|
150
|
+
array << i
|
151
|
+
end
|
152
|
+
return array
|
153
|
+
when TERM
|
154
|
+
return TERM_OBJ
|
155
|
+
when SOLRDOC
|
156
|
+
return read_val
|
157
|
+
when SOLRDOCLST
|
158
|
+
result = {}
|
159
|
+
list = read_val
|
160
|
+
result['numFound'] = list[0]
|
161
|
+
result['start'] = list[1]
|
162
|
+
result['maxScore'] = list[2]
|
163
|
+
result['docs'] = read_val
|
164
|
+
return result
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def read_v_int
|
169
|
+
byte = getbyte
|
170
|
+
result = byte & 0x7f
|
171
|
+
shift = 7
|
172
|
+
while (byte & 0x80) != 0
|
173
|
+
byte = getbyte
|
174
|
+
result |= ((byte & 0x7f) << shift)
|
175
|
+
shift += 7
|
176
|
+
end
|
177
|
+
result
|
178
|
+
end
|
179
|
+
|
180
|
+
def read_size
|
181
|
+
size = (@tag_byte & 0x1f)
|
182
|
+
size += read_v_int if (size == 0x1f)
|
183
|
+
size
|
184
|
+
end
|
185
|
+
|
186
|
+
def read_small_int
|
187
|
+
result = @tag_byte & 0x0F
|
188
|
+
result = ((read_v_int << 4) | result) if ((@tag_byte & 0x10) != 0)
|
189
|
+
result
|
190
|
+
end
|
191
|
+
|
192
|
+
def read_chars
|
193
|
+
size = read_size
|
194
|
+
str = ''
|
195
|
+
size.times {
|
196
|
+
# HINT. read utf-8 char
|
197
|
+
b = getbyte
|
198
|
+
if ((b & 0x80) == 0)
|
199
|
+
str << b
|
200
|
+
elsif ((b & 0xE0) == 0xC0)
|
201
|
+
#str << (((b & 0x1F) << 6) | (getbyte & 0x3F))
|
202
|
+
str << b
|
203
|
+
str << getbyte
|
204
|
+
else
|
205
|
+
#str << (((b & 0x0F) << 12) | ((getbyte & 0x3F) << 6) | (getbyte & 0x3F))
|
206
|
+
str << b
|
207
|
+
str << getbyte
|
208
|
+
str << getbyte
|
209
|
+
end
|
210
|
+
}
|
211
|
+
str.force_encoding('utf-8') if str.respond_to? :force_encoding
|
212
|
+
str
|
213
|
+
end
|
214
|
+
|
215
|
+
end
|
216
|
+
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# vim:fileencoding=utf-8
|
2
|
+
module JavaBin
|
3
|
+
# JavaBin version
|
4
|
+
VERSION = '0.1.0'
|
5
|
+
VERSION_ARRAY = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
|
6
|
+
VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
|
7
|
+
VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
|
8
|
+
VERSION_BUILD = VERSION_ARRAY[2] # :nodoc:
|
9
|
+
end
|
10
|
+
|
data/lib/java_bin.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# vim:fileencoding=utf-8
|
2
|
+
module JavaBin
|
3
|
+
def self.parser=(value)
|
4
|
+
@parser = value
|
5
|
+
end
|
6
|
+
def self.parser
|
7
|
+
@parser
|
8
|
+
end
|
9
|
+
|
10
|
+
require 'java_bin/version'
|
11
|
+
begin
|
12
|
+
require 'java_bin/ext'
|
13
|
+
rescue LoadError => e
|
14
|
+
require 'java_bin/pure'
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,240 @@
|
|
1
|
+
# vim:fileencoding=utf-8
|
2
|
+
require 'helper'
|
3
|
+
|
4
|
+
case ENV['JavaBin']
|
5
|
+
when 'pure'
|
6
|
+
then
|
7
|
+
require 'java_bin/pure'
|
8
|
+
else
|
9
|
+
require 'java_bin/ext'
|
10
|
+
end
|
11
|
+
|
12
|
+
class TestJavaBin < Test::Unit::TestCase
|
13
|
+
|
14
|
+
private
|
15
|
+
def write_v_int(i, output)
|
16
|
+
while ((i & ~0x7F) != 0)
|
17
|
+
output.putc(((i & 0x7f) | 0x80))
|
18
|
+
# i >>>= 7
|
19
|
+
i = (i >> 7) # TODO 論理シフト
|
20
|
+
end
|
21
|
+
output.putc(i)
|
22
|
+
end
|
23
|
+
|
24
|
+
def write_tag(tag, size, output)
|
25
|
+
if ((tag & 0xe0) != 0)
|
26
|
+
if (size < 0x1f)
|
27
|
+
output.putc(tag | size)
|
28
|
+
else
|
29
|
+
output.putc(tag | 0x1f)
|
30
|
+
write_v_int(size - 0x1f, output)
|
31
|
+
end
|
32
|
+
else
|
33
|
+
output.putc(tag)
|
34
|
+
write_v_int(size, output)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def elapsed_time(name, t, &block)
|
39
|
+
GC.start
|
40
|
+
s = Time.now
|
41
|
+
t.times {
|
42
|
+
block.call
|
43
|
+
}
|
44
|
+
e = Time.now
|
45
|
+
puts "#{name}#{t} times. elapsed time #{e - s}"
|
46
|
+
(e - s)
|
47
|
+
end
|
48
|
+
|
49
|
+
public
|
50
|
+
def setup
|
51
|
+
@parser = JavaBin.parser.new
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_valid_version
|
55
|
+
assert @parser.parse([1, 1].pack("C*"))
|
56
|
+
end
|
57
|
+
def test_invalid_version
|
58
|
+
assert_raise(RuntimeError) { @parser.parse([2].pack("C*")) }
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_javabin_dat
|
62
|
+
result = @parser.parse(open("fixtures/javabin.dat", "r:utf-8").read)
|
63
|
+
assert result['response']['docs'][0]['features'].include?('eaiou with umlauts: ëäïöü')
|
64
|
+
assert_equal result['response']['docs'][1]['incubationdate_dt'], Time.local(2006, 1, 17, 9, 0, 0)
|
65
|
+
assert_equal result['response']['docs'][1]['score'], 0.5030758380889893
|
66
|
+
end
|
67
|
+
|
68
|
+
TIMES = 5000
|
69
|
+
def test_javabin_parse_and_ruby_eval
|
70
|
+
jb = open("fixtures/javabin.dat", "r:utf-8").read
|
71
|
+
r = open("fixtures/ruby.dat", "r:utf-8").read
|
72
|
+
puts ""
|
73
|
+
r_et = elapsed_time("ruby eval parse. ", TIMES) { eval(r) }
|
74
|
+
jb_et = elapsed_time("javabin parse. ", TIMES) { @parser.parse(jb) }
|
75
|
+
assert (jb_et * 3) < r_et if @parser.is_a? JavaBin::Ext::Parser
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_null
|
79
|
+
assert_nil @parser.parse([1, 0].pack("C*"))
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_true
|
83
|
+
assert @parser.parse([1, 1].pack("C*"))
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_false
|
87
|
+
assert !@parser.parse([1, 2].pack("C*"))
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_byte
|
91
|
+
assert_equal 1, @parser.parse([1, 3, 0x01].pack("C*"))
|
92
|
+
assert_equal 127, @parser.parse([1, 3, 0x7f].pack("C*"))
|
93
|
+
assert_equal -1, @parser.parse([1, 3, 0xff].pack("C*"))
|
94
|
+
assert_equal -2, @parser.parse([1, 3, 0xfe].pack("C*"))
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_short
|
98
|
+
assert_equal 1, @parser.parse([1, 4, 0x00, 0x01].pack("C*"))
|
99
|
+
assert_equal 32767, @parser.parse([1, 4, 0x7f, 0xff].pack("C*"))
|
100
|
+
assert_equal -1, @parser.parse([1, 4, 0xff, 0xff].pack("C*"))
|
101
|
+
assert_equal -2, @parser.parse([1, 4, 0xff, 0xfe].pack("C*"))
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_double
|
105
|
+
assert_equal -1.0, @parser.parse([1, 5, -1.0].pack("C2G"))
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_int
|
109
|
+
assert_equal 1, @parser.parse([1, 6, 0x00, 0x00, 0x00, 0x01].pack("C*"))
|
110
|
+
assert_equal 2147483647, @parser.parse([1, 6, 0x7f, 0xff, 0xff, 0xff].pack("C*"))
|
111
|
+
assert_equal -1, @parser.parse([1, 6, 0xff, 0xff, 0xff, 0xff].pack("C*"))
|
112
|
+
assert_equal -2, @parser.parse([1, 6, 0xff, 0xff, 0xff, 0xfe].pack("C*"))
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_long
|
116
|
+
assert_equal 1, @parser.parse([1, 7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01].pack("C*"))
|
117
|
+
assert_equal 9223372036854775807 , @parser.parse([1, 7, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff].pack("C*"))
|
118
|
+
assert_equal -1, @parser.parse([1, 7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff].pack("C*"))
|
119
|
+
assert_equal -2, @parser.parse([1, 7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe].pack("C*"))
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_float
|
123
|
+
assert_equal -1.0, @parser.parse([1, 8, -1.0].pack("C2g"))
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_date
|
127
|
+
t = Time.now
|
128
|
+
x = (t.to_f * 1000).to_i
|
129
|
+
x = [x].pack("q").unpack("C*").reverse # TODO endian次第なので修正必要
|
130
|
+
assert_equal t.to_i, @parser.parse(([1, 9] + x).pack("C*")).to_i
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_map
|
134
|
+
assert_equal({0 => 0, 1 => 1}, @parser.parse([1, 10, 2, 3, 0, 3, 0, 3, 1, 3, 1].pack("C*")))
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_solrdoc
|
138
|
+
arr = [1, 11] + [(5 << 5) | 2] + [(1 << 5) | 1] + "a".unpack("C*") + [3, 8] + [(1 << 5) | 1] + "b".unpack("C*") + [3, 9]
|
139
|
+
assert_equal({"a" => 8, "b" => 9}, @parser.parse(arr.pack("C*")))
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_solrdoclst
|
143
|
+
arr = [1, 12] + [(4 << 5) | 3, 3, 3, 3, 4, 3, 5] + [(4 << 5) | 0]
|
144
|
+
assert_equal({'numFound' => 3, 'start' => 4, 'maxScore' => 5, 'docs' => []}, @parser.parse(arr.pack("C*")))
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_bytearr
|
148
|
+
array = [0, 1, 0xff]
|
149
|
+
assert_equal array, @parser.parse([1, 13, array.size, *array].pack("C*"))
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_large_bytearr
|
153
|
+
array = [0,1,255] * 100
|
154
|
+
sio = StringIO.new
|
155
|
+
sio.putc 1 #VERSION
|
156
|
+
sio.putc 13 #JavaBin::BYTEARR
|
157
|
+
write_v_int(array.size, sio)
|
158
|
+
array.each { |e| sio.putc e }
|
159
|
+
sio.pos = 0
|
160
|
+
assert_equal array, @parser.parse(sio.read)
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_iterator
|
164
|
+
assert_equal([0, 127, nil, true], @parser.parse([1, 14, 3, 0, 3, 127, 0, 1,15].pack("C*")))
|
165
|
+
end
|
166
|
+
|
167
|
+
# def test_term
|
168
|
+
# end
|
169
|
+
|
170
|
+
def test_string
|
171
|
+
assert_equal "あい", @parser.parse(([1, (1 << 5) | 2] + "あい".unpack("C*")).pack("C*"))
|
172
|
+
end
|
173
|
+
|
174
|
+
def test_long_string
|
175
|
+
str = "0123456789" * 100
|
176
|
+
sio = StringIO.new
|
177
|
+
sio.putc 1 #VERSION
|
178
|
+
write_tag(1 << 5, str.size, sio)
|
179
|
+
str.each_byte { |e| sio.putc e }
|
180
|
+
sio.pos = 0
|
181
|
+
assert_equal str, @parser.parse(sio.read)
|
182
|
+
end
|
183
|
+
|
184
|
+
def test_sint
|
185
|
+
assert_equal 8, @parser.parse([1, (2 << 5) | 8].pack("C*"))
|
186
|
+
# flunk("not implemented yet.")
|
187
|
+
end
|
188
|
+
|
189
|
+
def test_slong
|
190
|
+
assert_equal 8, @parser.parse([1, (3 << 5) | 8].pack("C*"))
|
191
|
+
# flunk("not implemented yet.")
|
192
|
+
end
|
193
|
+
|
194
|
+
def test_arr
|
195
|
+
assert_equal [3, 4], @parser.parse([1, (4 << 5) | 2, 3, 3, 3, 4].pack("C*"))
|
196
|
+
end
|
197
|
+
|
198
|
+
def test_large_arr
|
199
|
+
array = [0, 1, 2, 3, 4] * 100
|
200
|
+
sio = StringIO.new
|
201
|
+
sio.putc 1 #VERSION
|
202
|
+
write_tag(4 << 5, array.size, sio)
|
203
|
+
array.each { |e| sio.putc 3; sio.putc e }
|
204
|
+
sio.pos = 0
|
205
|
+
assert_equal array, @parser.parse(sio.read)
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_ordered_map
|
209
|
+
arr = [1, (5 << 5) | 2] + [(1 << 5) | 1] + "a".unpack("C*") + [3, 8] + [(1 << 5) | 1] + "b".unpack("C*") + [3, 9]
|
210
|
+
assert_equal({"a" => 8, "b" => 9}, @parser.parse(arr.pack("C*")))
|
211
|
+
end
|
212
|
+
|
213
|
+
# def test_named_lst
|
214
|
+
# end
|
215
|
+
|
216
|
+
def test_extern_string
|
217
|
+
arr = [1, (5 << 5) | 2] +
|
218
|
+
[(1 << 5) | 1] + "a".unpack("C*") +
|
219
|
+
[(7 << 5) | 0] + [(1 << 5) | 3] + "あいa".unpack("C*") +
|
220
|
+
[(1 << 5) | 1] + "b".unpack("C*") +
|
221
|
+
[(7 << 5) | 1]
|
222
|
+
assert_equal({"a" => "あいa", "b" => "あいa"}, @parser.parse(arr.pack("C*")))
|
223
|
+
end
|
224
|
+
|
225
|
+
LARGE_SIZE = 1000
|
226
|
+
def test_long_large_amount_extern_string
|
227
|
+
sio = StringIO.new
|
228
|
+
sio.putc 1 #VERSION
|
229
|
+
write_tag(4 << 5, LARGE_SIZE, sio)
|
230
|
+
LARGE_SIZE.times { |i|
|
231
|
+
sio.putc((7 << 5) | 0)
|
232
|
+
sio.putc((1 << 5) | 1)
|
233
|
+
sio.putc("a")
|
234
|
+
write_tag((7 << 5), i, sio)
|
235
|
+
}
|
236
|
+
sio.pos = 0
|
237
|
+
assert_equal ['a'] * LARGE_SIZE, @parser.parse(sio.read)
|
238
|
+
end
|
239
|
+
|
240
|
+
end
|