kbaum-mongo 0.18.3p

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 (72) hide show
  1. data/LICENSE.txt +202 -0
  2. data/README.rdoc +339 -0
  3. data/Rakefile +138 -0
  4. data/bin/bson_benchmark.rb +59 -0
  5. data/bin/fail_if_no_c.rb +11 -0
  6. data/examples/admin.rb +42 -0
  7. data/examples/capped.rb +22 -0
  8. data/examples/cursor.rb +48 -0
  9. data/examples/gridfs.rb +88 -0
  10. data/examples/index_test.rb +126 -0
  11. data/examples/info.rb +31 -0
  12. data/examples/queries.rb +70 -0
  13. data/examples/simple.rb +24 -0
  14. data/examples/strict.rb +35 -0
  15. data/examples/types.rb +36 -0
  16. data/lib/mongo/collection.rb +609 -0
  17. data/lib/mongo/connection.rb +672 -0
  18. data/lib/mongo/cursor.rb +403 -0
  19. data/lib/mongo/db.rb +555 -0
  20. data/lib/mongo/exceptions.rb +66 -0
  21. data/lib/mongo/gridfs/chunk.rb +91 -0
  22. data/lib/mongo/gridfs/grid.rb +79 -0
  23. data/lib/mongo/gridfs/grid_file_system.rb +101 -0
  24. data/lib/mongo/gridfs/grid_io.rb +338 -0
  25. data/lib/mongo/gridfs/grid_store.rb +580 -0
  26. data/lib/mongo/gridfs.rb +25 -0
  27. data/lib/mongo/types/binary.rb +52 -0
  28. data/lib/mongo/types/code.rb +36 -0
  29. data/lib/mongo/types/dbref.rb +40 -0
  30. data/lib/mongo/types/min_max_keys.rb +58 -0
  31. data/lib/mongo/types/objectid.rb +180 -0
  32. data/lib/mongo/types/regexp_of_holding.rb +45 -0
  33. data/lib/mongo/util/bson_c.rb +18 -0
  34. data/lib/mongo/util/bson_ruby.rb +606 -0
  35. data/lib/mongo/util/byte_buffer.rb +222 -0
  36. data/lib/mongo/util/conversions.rb +87 -0
  37. data/lib/mongo/util/ordered_hash.rb +140 -0
  38. data/lib/mongo/util/server_version.rb +69 -0
  39. data/lib/mongo/util/support.rb +26 -0
  40. data/lib/mongo.rb +63 -0
  41. data/mongo-ruby-driver.gemspec +28 -0
  42. data/test/auxillary/autoreconnect_test.rb +42 -0
  43. data/test/binary_test.rb +15 -0
  44. data/test/bson_test.rb +427 -0
  45. data/test/byte_buffer_test.rb +81 -0
  46. data/test/chunk_test.rb +82 -0
  47. data/test/collection_test.rb +515 -0
  48. data/test/connection_test.rb +160 -0
  49. data/test/conversions_test.rb +120 -0
  50. data/test/cursor_test.rb +379 -0
  51. data/test/db_api_test.rb +780 -0
  52. data/test/db_connection_test.rb +16 -0
  53. data/test/db_test.rb +272 -0
  54. data/test/grid_file_system_test.rb +210 -0
  55. data/test/grid_io_test.rb +78 -0
  56. data/test/grid_store_test.rb +334 -0
  57. data/test/grid_test.rb +87 -0
  58. data/test/objectid_test.rb +125 -0
  59. data/test/ordered_hash_test.rb +172 -0
  60. data/test/replica/count_test.rb +34 -0
  61. data/test/replica/insert_test.rb +50 -0
  62. data/test/replica/pooled_insert_test.rb +54 -0
  63. data/test/replica/query_test.rb +39 -0
  64. data/test/slave_connection_test.rb +36 -0
  65. data/test/test_helper.rb +42 -0
  66. data/test/threading/test_threading_large_pool.rb +90 -0
  67. data/test/threading_test.rb +87 -0
  68. data/test/unit/collection_test.rb +61 -0
  69. data/test/unit/connection_test.rb +117 -0
  70. data/test/unit/cursor_test.rb +93 -0
  71. data/test/unit/db_test.rb +98 -0
  72. metadata +127 -0
data/test/bson_test.rb ADDED
@@ -0,0 +1,427 @@
1
+ # encoding:utf-8
2
+ require 'test/test_helper'
3
+ require 'complex'
4
+ require 'bigdecimal'
5
+ require 'rational'
6
+
7
+ # Need to simulating this class
8
+ # without actually loading it.
9
+ module ActiveSupport
10
+ class TimeWithZone
11
+ end
12
+ end
13
+
14
+ class BSONTest < Test::Unit::TestCase
15
+
16
+ include Mongo
17
+
18
+ def test_string
19
+ doc = {'doc' => 'hello, world'}
20
+ bson = bson = BSON.serialize(doc)
21
+ assert_equal doc, BSON.deserialize(bson)
22
+ end
23
+
24
+ def test_valid_utf8_string
25
+ doc = {'doc' => 'aé'}
26
+ bson = bson = BSON.serialize(doc)
27
+ assert_equal doc, BSON.deserialize(bson)
28
+ end
29
+
30
+ def test_valid_utf8_key
31
+ doc = {'aé' => 'hello'}
32
+ bson = bson = BSON.serialize(doc)
33
+ assert_equal doc, BSON.deserialize(bson)
34
+ end
35
+
36
+ def test_document_length
37
+ doc = {'name' => 'a' * 5 * 1024 * 1024}
38
+ assert_raise InvalidDocument do
39
+ assert BSON.serialize(doc)
40
+ end
41
+ end
42
+
43
+ # In 1.8 we test that other string encodings raise an exception.
44
+ # In 1.9 we test that they get auto-converted.
45
+ if RUBY_VERSION < '1.9'
46
+ require 'iconv'
47
+ def test_invalid_string
48
+ string = Iconv.conv('iso-8859-1', 'utf-8', 'aé')
49
+ doc = {'doc' => string}
50
+ assert_raise InvalidStringEncoding do
51
+ BSON.serialize(doc)
52
+ end
53
+ end
54
+
55
+ def test_invalid_key
56
+ key = Iconv.conv('iso-8859-1', 'utf-8', 'aé')
57
+ doc = {key => 'hello'}
58
+ assert_raise InvalidStringEncoding do
59
+ BSON.serialize(doc)
60
+ end
61
+ end
62
+ else
63
+ def test_non_utf8_string
64
+ bson = BSON.serialize({'str' => 'aé'.encode('iso-8859-1')})
65
+ result = BSON.deserialize(bson)['str']
66
+ assert_equal 'aé', result
67
+ assert_equal 'UTF-8', result.encoding.name
68
+ end
69
+
70
+ def test_non_utf8_key
71
+ bson = BSON.serialize({'aé'.encode('iso-8859-1') => 'hello'})
72
+ assert_equal 'hello', BSON.deserialize(bson)['aé']
73
+ end
74
+ end
75
+
76
+ def test_code
77
+ doc = {'$where' => Code.new('this.a.b < this.b')}
78
+ bson = BSON.serialize(doc)
79
+ assert_equal doc, BSON.deserialize(bson)
80
+ end
81
+
82
+ def test_number
83
+ doc = {'doc' => 41.99}
84
+ bson = BSON.serialize(doc)
85
+ assert_equal doc, BSON.deserialize(bson)
86
+ end
87
+
88
+ def test_int
89
+ doc = {'doc' => 42}
90
+ bson = BSON.serialize(doc)
91
+ assert_equal doc, BSON.deserialize(bson)
92
+
93
+ doc = {"doc" => -5600}
94
+ bson = BSON.serialize(doc)
95
+ assert_equal doc, BSON.deserialize(bson)
96
+
97
+ doc = {"doc" => 2147483647}
98
+ bson = BSON.serialize(doc)
99
+ assert_equal doc, BSON.deserialize(bson)
100
+
101
+ doc = {"doc" => -2147483648}
102
+ bson = BSON.serialize(doc)
103
+ assert_equal doc, BSON.deserialize(bson)
104
+ end
105
+
106
+ def test_ordered_hash
107
+ doc = OrderedHash.new
108
+ doc["b"] = 1
109
+ doc["a"] = 2
110
+ doc["c"] = 3
111
+ doc["d"] = 4
112
+ bson = BSON.serialize(doc)
113
+ assert_equal doc, BSON.deserialize(bson)
114
+ end
115
+
116
+ def test_object
117
+ doc = {'doc' => {'age' => 42, 'name' => 'Spongebob', 'shoe_size' => 9.5}}
118
+ bson = BSON.serialize(doc)
119
+ assert_equal doc, BSON.deserialize(bson)
120
+ end
121
+
122
+ def test_oid
123
+ doc = {'doc' => ObjectID.new}
124
+ bson = BSON.serialize(doc)
125
+ assert_equal doc, BSON.deserialize(bson)
126
+ end
127
+
128
+ def test_array
129
+ doc = {'doc' => [1, 2, 'a', 'b']}
130
+ bson = BSON.serialize(doc)
131
+ assert_equal doc, BSON.deserialize(bson)
132
+ end
133
+
134
+ def test_regex
135
+ doc = {'doc' => /foobar/i}
136
+ bson = BSON.serialize(doc)
137
+ doc2 = BSON.deserialize(bson)
138
+ assert_equal doc, doc2
139
+
140
+ r = doc2['doc']
141
+ assert_kind_of Regexp, r
142
+
143
+ r = RegexpOfHolding.new('st', 0, 'zywcab')
144
+ assert_equal 'zywcab', r.extra_options_str
145
+
146
+ doc = {'doc' => r}
147
+ bson_doc = BSON.serialize(doc)
148
+ doc2 = nil
149
+ doc2 = BSON.deserialize(bson_doc)
150
+ assert_equal doc, doc2
151
+
152
+ r = doc2['doc']
153
+ assert_kind_of RegexpOfHolding, r
154
+ assert_equal 'abcwyz', r.extra_options_str # must be sorted
155
+ end
156
+
157
+ def test_boolean
158
+ doc = {'doc' => true}
159
+ bson = BSON.serialize(doc)
160
+ assert_equal doc, BSON.deserialize(bson)
161
+ end
162
+
163
+ def test_date
164
+ doc = {'date' => Time.now}
165
+ bson = BSON.serialize(doc)
166
+ doc2 = BSON.deserialize(bson)
167
+ # Mongo only stores up to the millisecond
168
+ assert_in_delta doc['date'], doc2['date'], 0.001
169
+ end
170
+
171
+ def test_date_returns_as_utc
172
+ doc = {'date' => Time.now}
173
+ bson = BSON.serialize(doc)
174
+ doc2 = BSON.deserialize(bson)
175
+ assert doc2['date'].utc?
176
+ end
177
+
178
+ def test_date_before_epoch
179
+ begin
180
+ doc = {'date' => Time.utc(1600)}
181
+ bson = BSON.serialize(doc)
182
+ doc2 = BSON.deserialize(bson)
183
+ # Mongo only stores up to the millisecond
184
+ assert_in_delta doc['date'], doc2['date'], 0.001
185
+ rescue ArgumentError
186
+ # some versions of Ruby won't let you create pre-epoch Time instances
187
+ #
188
+ # TODO figure out how that will work if somebady has saved data
189
+ # w/ early dates already and is just querying for it.
190
+ end
191
+ end
192
+
193
+ def test_exeption_on_using_unsupported_date_class
194
+ [DateTime.now, Date.today, ActiveSupport::TimeWithZone.new].each do |invalid_date|
195
+ doc = {:date => invalid_date}
196
+ begin
197
+ bson = BSON.serialize(doc)
198
+ rescue => e
199
+ ensure
200
+ assert_equal InvalidDocument, e.class
201
+ assert_match /UTC Time/, e.message
202
+ end
203
+ end
204
+ end
205
+
206
+ def test_dbref
207
+ oid = ObjectID.new
208
+ doc = {}
209
+ doc['dbref'] = DBRef.new('namespace', oid)
210
+ bson = BSON.serialize(doc)
211
+ doc2 = BSON.deserialize(bson)
212
+ assert_equal 'namespace', doc2['dbref'].namespace
213
+ assert_equal oid, doc2['dbref'].object_id
214
+ end
215
+
216
+ def test_symbol
217
+ doc = {'sym' => :foo}
218
+ bson = BSON.serialize(doc)
219
+ doc2 = BSON.deserialize(bson)
220
+ assert_equal :foo, doc2['sym']
221
+ end
222
+
223
+ def test_binary
224
+ bin = Binary.new
225
+ 'binstring'.each_byte { |b| bin.put(b) }
226
+
227
+ doc = {'bin' => bin}
228
+ bson = BSON.serialize(doc)
229
+ doc2 = BSON.deserialize(bson)
230
+ bin2 = doc2['bin']
231
+ assert_kind_of Binary, bin2
232
+ assert_equal 'binstring', bin2.to_s
233
+ assert_equal Binary::SUBTYPE_BYTES, bin2.subtype
234
+ end
235
+
236
+ def test_binary_type
237
+ bin = Binary.new([1, 2, 3, 4, 5], Binary::SUBTYPE_USER_DEFINED)
238
+
239
+ doc = {'bin' => bin}
240
+ bson = BSON.serialize(doc)
241
+ doc2 = BSON.deserialize(bson)
242
+ bin2 = doc2['bin']
243
+ assert_kind_of Binary, bin2
244
+ assert_equal [1, 2, 3, 4, 5], bin2.to_a
245
+ assert_equal Binary::SUBTYPE_USER_DEFINED, bin2.subtype
246
+ end
247
+
248
+ def test_binary_byte_buffer
249
+ bb = ByteBuffer.new
250
+ 5.times { |i| bb.put(i + 1) }
251
+
252
+ doc = {'bin' => bb}
253
+ bson = BSON.serialize(doc)
254
+ doc2 = BSON.deserialize(bson)
255
+ bin2 = doc2['bin']
256
+ assert_kind_of Binary, bin2
257
+ assert_equal [1, 2, 3, 4, 5], bin2.to_a
258
+ assert_equal Binary::SUBTYPE_BYTES, bin2.subtype
259
+ end
260
+
261
+ def test_put_id_first
262
+ val = OrderedHash.new
263
+ val['not_id'] = 1
264
+ val['_id'] = 2
265
+ roundtrip = BSON.deserialize(BSON.serialize(val, false, true).to_a)
266
+ assert_kind_of OrderedHash, roundtrip
267
+ assert_equal '_id', roundtrip.keys.first
268
+
269
+ val = {'a' => 'foo', 'b' => 'bar', :_id => 42, 'z' => 'hello'}
270
+ roundtrip = BSON.deserialize(BSON.serialize(val, false, true).to_a)
271
+ assert_kind_of OrderedHash, roundtrip
272
+ assert_equal '_id', roundtrip.keys.first
273
+ end
274
+
275
+ def test_nil_id
276
+ doc = {"_id" => nil}
277
+ assert_equal doc, BSON.deserialize(bson = BSON.serialize(doc, false, true).to_a)
278
+ end
279
+
280
+ def test_timestamp
281
+ val = {"test" => [4, 20]}
282
+ assert_equal val, BSON.deserialize([0x13, 0x00, 0x00, 0x00,
283
+ 0x11, 0x74, 0x65, 0x73,
284
+ 0x74, 0x00, 0x04, 0x00,
285
+ 0x00, 0x00, 0x14, 0x00,
286
+ 0x00, 0x00, 0x00])
287
+ end
288
+
289
+ def test_overflow
290
+ doc = {"x" => 2**75}
291
+ assert_raise RangeError do
292
+ bson = BSON.serialize(doc)
293
+ end
294
+
295
+ doc = {"x" => 9223372036854775}
296
+ assert_equal doc, BSON.deserialize(BSON.serialize(doc).to_a)
297
+
298
+ doc = {"x" => 9223372036854775807}
299
+ assert_equal doc, BSON.deserialize(BSON.serialize(doc).to_a)
300
+
301
+ doc["x"] = doc["x"] + 1
302
+ assert_raise RangeError do
303
+ bson = BSON.serialize(doc)
304
+ end
305
+
306
+ doc = {"x" => -9223372036854775}
307
+ assert_equal doc, BSON.deserialize(BSON.serialize(doc).to_a)
308
+
309
+ doc = {"x" => -9223372036854775808}
310
+ assert_equal doc, BSON.deserialize(BSON.serialize(doc).to_a)
311
+
312
+ doc["x"] = doc["x"] - 1
313
+ assert_raise RangeError do
314
+ bson = BSON.serialize(doc)
315
+ end
316
+ end
317
+
318
+ def test_invalid_numeric_types
319
+ [BigDecimal.new("1.0"), Complex(0, 1), Rational(2, 3)].each do |type|
320
+ doc = {"x" => type}
321
+ begin
322
+ BSON.serialize(doc)
323
+ rescue => e
324
+ ensure
325
+ assert_equal InvalidDocument, e.class
326
+ assert_match /Cannot serialize/, e.message
327
+ end
328
+ end
329
+ end
330
+
331
+ def test_do_not_change_original_object
332
+ val = OrderedHash.new
333
+ val['not_id'] = 1
334
+ val['_id'] = 2
335
+ assert val.keys.include?('_id')
336
+ BSON.serialize(val)
337
+ assert val.keys.include?('_id')
338
+
339
+ val = {'a' => 'foo', 'b' => 'bar', :_id => 42, 'z' => 'hello'}
340
+ assert val.keys.include?(:_id)
341
+ BSON.serialize(val)
342
+ assert val.keys.include?(:_id)
343
+ end
344
+
345
+ # note we only test for _id here because in the general case we will
346
+ # write duplicates for :key and "key". _id is a special case because
347
+ # we call has_key? to check for it's existance rather than just iterating
348
+ # over it like we do for the rest of the keys. thus, things like
349
+ # HashWithIndifferentAccess can cause problems for _id but not for other
350
+ # keys. rather than require rails to test with HWIA directly, we do this
351
+ # somewhat hacky test.
352
+ def test_no_duplicate_id
353
+ dup = {"_id" => "foo", :_id => "foo"}
354
+ one = {"_id" => "foo"}
355
+
356
+ assert_equal BSON.serialize(one).to_a, BSON.serialize(dup).to_a
357
+ end
358
+
359
+ def test_null_character
360
+ doc = {"a" => "\x00"}
361
+
362
+ assert_equal doc, BSON.deserialize(BSON.serialize(doc).to_a)
363
+
364
+ assert_raise InvalidDocument do
365
+ BSON.serialize({"\x00" => "a"})
366
+ end
367
+
368
+ assert_raise InvalidDocument do
369
+ BSON.serialize({"a" => (Regexp.compile "ab\x00c")})
370
+ end
371
+ end
372
+
373
+ def test_max_key
374
+ doc = {"a" => MaxKey.new}
375
+
376
+ assert_equal doc, BSON.deserialize(BSON.serialize(doc).to_a)
377
+ end
378
+
379
+ def test_min_key
380
+ doc = {"a" => MinKey.new}
381
+
382
+ assert_equal doc, BSON.deserialize(BSON.serialize(doc).to_a)
383
+ end
384
+
385
+ def test_invalid_object
386
+ o = Object.new
387
+ assert_raise InvalidDocument do
388
+ BSON.serialize({:foo => o})
389
+ end
390
+
391
+ assert_raise InvalidDocument do
392
+ BSON.serialize({:foo => Date.today})
393
+ end
394
+ end
395
+
396
+ def test_move_id
397
+ a = OrderedHash.new
398
+ a['text'] = 'abc'
399
+ a['key'] = 'abc'
400
+ a['_id'] = 1
401
+
402
+ assert_equal ")\000\000\000\020_id\000\001\000\000\000\002text" +
403
+ "\000\004\000\000\000abc\000\002key\000\004\000\000\000abc\000\000",
404
+ BSON.serialize(a, false, true).to_s
405
+ assert_equal ")\000\000\000\002text\000\004\000\000\000abc\000\002key" +
406
+ "\000\004\000\000\000abc\000\020_id\000\001\000\000\000\000",
407
+ BSON.serialize(a, false, false).to_s
408
+ end
409
+
410
+ def test_move_id_with_nested_doc
411
+ b = OrderedHash.new
412
+ b['text'] = 'abc'
413
+ b['_id'] = 2
414
+ c = OrderedHash.new
415
+ c['text'] = 'abc'
416
+ c['hash'] = b
417
+ c['_id'] = 3
418
+ assert_equal ">\000\000\000\020_id\000\003\000\000\000\002text" +
419
+ "\000\004\000\000\000abc\000\003hash\000\034\000\000" +
420
+ "\000\002text\000\004\000\000\000abc\000\020_id\000\002\000\000\000\000\000",
421
+ BSON.serialize(c, false, true).to_s
422
+ assert_equal ">\000\000\000\002text\000\004\000\000\000abc\000\003hash" +
423
+ "\000\034\000\000\000\002text\000\004\000\000\000abc\000\020_id" +
424
+ "\000\002\000\000\000\000\020_id\000\003\000\000\000\000",
425
+ BSON.serialize(c, false, false).to_s
426
+ end
427
+ end
@@ -0,0 +1,81 @@
1
+ require 'test/test_helper'
2
+
3
+ class ByteBufferTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @buf = ByteBuffer.new
7
+ end
8
+
9
+ def test_nil_get_returns_one_byte
10
+ @buf.put_array([1, 2, 3, 4])
11
+ @buf.rewind
12
+ assert_equal 1, @buf.get
13
+ end
14
+
15
+ def test_one_get_returns_array_length_one
16
+ @buf.put_array([1, 2, 3, 4])
17
+ @buf.rewind
18
+ assert_equal [1], @buf.get(1)
19
+ end
20
+
21
+ def test_zero_get_returns_empty_array
22
+ @buf.put_array([1, 2, 3, 4])
23
+ @buf.rewind
24
+ assert_equal [], @buf.get(0)
25
+ end
26
+
27
+ def test_empty
28
+ assert_equal 0, @buf.length
29
+ end
30
+
31
+ def test_length
32
+ @buf.put_int 3
33
+ assert_equal 4, @buf.length
34
+ end
35
+
36
+ def test_default_order
37
+ assert_equal :little_endian, @buf.order
38
+ end
39
+
40
+ def test_long_length
41
+ @buf.put_long 1027
42
+ assert_equal 8, @buf.length
43
+ end
44
+
45
+ def test_get_long
46
+ @buf.put_long 1027
47
+ @buf.rewind
48
+ assert_equal 1027, @buf.get_long
49
+ end
50
+
51
+ def test_get_double
52
+ @buf.put_double 41.2
53
+ @buf.rewind
54
+ assert_equal 41.2, @buf.get_double
55
+ end
56
+
57
+ def test_rewrite
58
+ @buf.put_int(0)
59
+ @buf.rewind
60
+ @buf.put_int(1027)
61
+ assert_equal 4, @buf.length
62
+ @buf.rewind
63
+ assert_equal 1027, @buf.get_int
64
+ assert_equal 4, @buf.position
65
+ end
66
+
67
+ def test_prepend_byte_buffer
68
+ @buf.put_int(4)
69
+ new_buf = ByteBuffer.new([5, 0, 0, 0])
70
+ @buf.prepend!(new_buf)
71
+ assert_equal [5, 0, 0, 0, 4, 0, 0, 0], @buf.to_a
72
+ end
73
+
74
+ def test_append_byte_buffer
75
+ @buf.put_int(4)
76
+ new_buf = ByteBuffer.new([5, 0, 0, 0])
77
+ @buf.append!(new_buf)
78
+ assert_equal [4, 0, 0, 0, 5, 0, 0, 0], @buf.to_a
79
+ end
80
+
81
+ end
@@ -0,0 +1,82 @@
1
+ require 'test/test_helper'
2
+ require 'mongo/gridfs'
3
+
4
+ class ChunkTest < Test::Unit::TestCase
5
+
6
+ include Mongo
7
+ include GridFS
8
+
9
+ @@db = Connection.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost',
10
+ ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT).db('ruby-mongo-utils-test')
11
+ @@files = @@db.collection('gridfs.files')
12
+ @@chunks = @@db.collection('gridfs.chunks')
13
+
14
+ def setup
15
+ @@chunks.remove
16
+ @@files.remove
17
+
18
+ @f = GridStore.new(@@db, 'foobar', 'w')
19
+ @c = @f.instance_variable_get('@curr_chunk')
20
+ end
21
+
22
+ def teardown
23
+ @@chunks.remove
24
+ @@files.remove
25
+ @@db.error
26
+ end
27
+
28
+ def test_pos
29
+ assert_equal 0, @c.pos
30
+ assert @c.eof? # since data is empty
31
+
32
+ b = ByteBuffer.new
33
+ 3.times { |i| b.put(i) }
34
+ c = Chunk.new(@f, 'data' => b)
35
+ assert !c.eof?
36
+ end
37
+
38
+ def test_getc
39
+ b = ByteBuffer.new
40
+ 3.times { |i| b.put(i) }
41
+ c = Chunk.new(@f, 'data' => b)
42
+
43
+ assert !c.eof?
44
+ assert_equal 0, c.getc
45
+ assert !c.eof?
46
+ assert_equal 1, c.getc
47
+ assert !c.eof?
48
+ assert_equal 2, c.getc
49
+ assert c.eof?
50
+ end
51
+
52
+ def test_putc
53
+ 3.times { |i| @c.putc(i) }
54
+ @c.pos = 0
55
+
56
+ assert !@c.eof?
57
+ assert_equal 0, @c.getc
58
+ assert !@c.eof?
59
+ assert_equal 1, @c.getc
60
+ assert !@c.eof?
61
+ assert_equal 2, @c.getc
62
+ assert @c.eof?
63
+ end
64
+
65
+ def test_truncate
66
+ 10.times { |i| @c.putc(i) }
67
+ assert_equal 10, @c.size
68
+ @c.pos = 3
69
+ @c.truncate
70
+ assert_equal 3, @c.size
71
+
72
+ @c.pos = 0
73
+ assert !@c.eof?
74
+ assert_equal 0, @c.getc
75
+ assert !@c.eof?
76
+ assert_equal 1, @c.getc
77
+ assert !@c.eof?
78
+ assert_equal 2, @c.getc
79
+ assert @c.eof?
80
+ end
81
+
82
+ end