bson 4.1.1 → 5.2.0

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 (226) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +106 -7
  3. data/Rakefile +86 -43
  4. data/ext/bson/{native-endian.h → bson-endian.h} +14 -107
  5. data/ext/bson/bson-native.h +135 -0
  6. data/ext/bson/bytebuf.c +133 -0
  7. data/ext/bson/endian.c +117 -0
  8. data/ext/bson/extconf.rb +8 -3
  9. data/ext/bson/init.c +364 -0
  10. data/ext/bson/libbson-utf8.c +230 -0
  11. data/ext/bson/read.c +470 -0
  12. data/ext/bson/util.c +250 -0
  13. data/ext/bson/write.c +675 -0
  14. data/lib/bson/active_support.rb +19 -0
  15. data/lib/bson/array.rb +97 -30
  16. data/lib/bson/big_decimal.rb +77 -0
  17. data/lib/bson/binary.rb +510 -70
  18. data/lib/bson/boolean.rb +15 -4
  19. data/lib/bson/code.rb +25 -12
  20. data/lib/bson/code_with_scope.rb +41 -15
  21. data/lib/bson/config.rb +3 -28
  22. data/lib/bson/date.rb +16 -4
  23. data/lib/bson/date_time.rb +6 -4
  24. data/lib/bson/db_pointer.rb +110 -0
  25. data/lib/bson/dbref.rb +154 -0
  26. data/lib/bson/decimal128/builder.rb +456 -0
  27. data/lib/bson/decimal128.rb +272 -0
  28. data/lib/bson/document.rb +177 -7
  29. data/lib/bson/environment.rb +17 -2
  30. data/lib/bson/error/bson_decode_error.rb +11 -0
  31. data/lib/bson/error/ext_json_parse_error.rb +11 -0
  32. data/lib/bson/error/illegal_key.rb +23 -0
  33. data/lib/bson/error/invalid_binary_type.rb +37 -0
  34. data/lib/bson/error/invalid_dbref_argument.rb +12 -0
  35. data/lib/bson/error/invalid_decimal128_argument.rb +25 -0
  36. data/lib/bson/error/invalid_decimal128_range.rb +27 -0
  37. data/lib/bson/error/invalid_decimal128_string.rb +26 -0
  38. data/lib/bson/error/invalid_key.rb +24 -0
  39. data/lib/bson/error/invalid_object_id.rb +11 -0
  40. data/lib/bson/error/invalid_regexp_pattern.rb +13 -0
  41. data/lib/bson/error/unrepresentable_precision.rb +19 -0
  42. data/lib/bson/error/unserializable_class.rb +13 -0
  43. data/lib/bson/error/unsupported_binary_subtype.rb +12 -0
  44. data/lib/bson/error/unsupported_type.rb +11 -0
  45. data/lib/bson/error.rb +22 -0
  46. data/lib/bson/ext_json.rb +389 -0
  47. data/lib/bson/false_class.rb +6 -4
  48. data/lib/bson/float.rb +43 -7
  49. data/lib/bson/hash.rb +152 -37
  50. data/lib/bson/int32.rb +104 -6
  51. data/lib/bson/int64.rb +111 -8
  52. data/lib/bson/integer.rb +43 -9
  53. data/lib/bson/json.rb +3 -1
  54. data/lib/bson/max_key.rb +21 -10
  55. data/lib/bson/min_key.rb +21 -10
  56. data/lib/bson/nil_class.rb +7 -3
  57. data/lib/bson/object.rb +25 -17
  58. data/lib/bson/object_id.rb +98 -113
  59. data/lib/bson/open_struct.rb +59 -0
  60. data/lib/bson/regexp.rb +129 -56
  61. data/lib/bson/registry.rb +7 -10
  62. data/lib/bson/specialized.rb +8 -4
  63. data/lib/bson/string.rb +12 -32
  64. data/lib/bson/symbol.rb +107 -11
  65. data/lib/bson/time.rb +68 -7
  66. data/lib/bson/time_with_zone.rb +67 -0
  67. data/lib/bson/timestamp.rb +50 -10
  68. data/lib/bson/true_class.rb +6 -4
  69. data/lib/bson/undefined.rb +28 -2
  70. data/lib/bson/vector.rb +44 -0
  71. data/lib/bson/version.rb +6 -14
  72. data/lib/bson.rb +22 -12
  73. data/spec/README.md +14 -0
  74. data/spec/bson/array_spec.rb +38 -62
  75. data/spec/bson/big_decimal_spec.rb +328 -0
  76. data/spec/bson/binary_spec.rb +199 -53
  77. data/spec/bson/binary_uuid_spec.rb +190 -0
  78. data/spec/bson/boolean_spec.rb +2 -1
  79. data/spec/bson/byte_buffer_read_spec.rb +198 -0
  80. data/spec/bson/byte_buffer_spec.rb +122 -381
  81. data/spec/bson/byte_buffer_write_spec.rb +855 -0
  82. data/spec/bson/code_spec.rb +6 -4
  83. data/spec/bson/code_with_scope_spec.rb +6 -4
  84. data/spec/bson/config_spec.rb +1 -35
  85. data/spec/bson/date_spec.rb +2 -1
  86. data/spec/bson/date_time_spec.rb +55 -1
  87. data/spec/bson/dbref_legacy_spec.rb +186 -0
  88. data/spec/bson/dbref_spec.rb +487 -0
  89. data/spec/bson/decimal128_spec.rb +1840 -0
  90. data/spec/bson/document_as_spec.rb +61 -0
  91. data/spec/bson/document_spec.rb +205 -32
  92. data/spec/bson/ext_json_parse_spec.rb +346 -0
  93. data/spec/bson/false_class_spec.rb +9 -1
  94. data/spec/bson/float_spec.rb +42 -1
  95. data/spec/bson/hash_as_spec.rb +58 -0
  96. data/spec/bson/hash_spec.rb +318 -66
  97. data/spec/bson/int32_spec.rb +248 -1
  98. data/spec/bson/int64_spec.rb +308 -1
  99. data/spec/bson/integer_spec.rb +61 -3
  100. data/spec/bson/json_spec.rb +2 -1
  101. data/spec/bson/max_key_spec.rb +6 -4
  102. data/spec/bson/min_key_spec.rb +6 -4
  103. data/spec/bson/nil_class_spec.rb +2 -1
  104. data/spec/bson/object_id_spec.rb +95 -5
  105. data/spec/bson/object_spec.rb +3 -2
  106. data/spec/bson/open_struct_spec.rb +87 -0
  107. data/spec/bson/raw_spec.rb +594 -0
  108. data/spec/bson/regexp_spec.rb +61 -8
  109. data/spec/bson/registry_spec.rb +3 -2
  110. data/spec/bson/string_spec.rb +26 -33
  111. data/spec/bson/symbol_raw_spec.rb +70 -0
  112. data/spec/bson/symbol_spec.rb +77 -20
  113. data/spec/bson/time_spec.rb +206 -2
  114. data/spec/bson/time_with_zone_spec.rb +69 -0
  115. data/spec/bson/timestamp_spec.rb +58 -2
  116. data/spec/bson/true_class_spec.rb +9 -1
  117. data/spec/bson/undefined_spec.rb +28 -1
  118. data/spec/bson/vector_spec.rb +33 -0
  119. data/spec/bson_spec.rb +2 -1
  120. data/spec/runners/binary_vector.rb +78 -0
  121. data/spec/runners/common_driver.rb +348 -0
  122. data/spec/runners/corpus.rb +191 -0
  123. data/spec/runners/corpus_legacy.rb +248 -0
  124. data/spec/shared/LICENSE +20 -0
  125. data/spec/shared/bin/get-mongodb-download-url +17 -0
  126. data/spec/shared/bin/s3-copy +45 -0
  127. data/spec/shared/bin/s3-upload +69 -0
  128. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  129. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  130. data/spec/shared/lib/mrss/constraints.rb +378 -0
  131. data/spec/shared/lib/mrss/docker_runner.rb +298 -0
  132. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  133. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  134. data/spec/shared/lib/mrss/lite_constraints.rb +238 -0
  135. data/spec/shared/lib/mrss/release/candidate.rb +281 -0
  136. data/spec/shared/lib/mrss/release/product_data.rb +144 -0
  137. data/spec/shared/lib/mrss/server_version_registry.rb +113 -0
  138. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  139. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  140. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  141. data/spec/shared/lib/mrss/utils.rb +37 -0
  142. data/spec/shared/lib/tasks/candidate.rake +64 -0
  143. data/spec/shared/share/Dockerfile.erb +251 -0
  144. data/spec/shared/share/haproxy-1.conf +16 -0
  145. data/spec/shared/share/haproxy-2.conf +17 -0
  146. data/spec/shared/shlib/config.sh +27 -0
  147. data/spec/shared/shlib/distro.sh +84 -0
  148. data/spec/shared/shlib/server.sh +423 -0
  149. data/spec/shared/shlib/set_env.sh +110 -0
  150. data/spec/spec_helper.rb +61 -1
  151. data/spec/spec_tests/binary_vector_spec.rb +82 -0
  152. data/spec/spec_tests/common_driver_spec.rb +84 -0
  153. data/spec/spec_tests/corpus_legacy_spec.rb +72 -0
  154. data/spec/spec_tests/corpus_spec.rb +134 -0
  155. data/spec/spec_tests/data/binary_vector/README.md +61 -0
  156. data/spec/spec_tests/data/binary_vector/float32.json +65 -0
  157. data/spec/spec_tests/data/binary_vector/int8.json +57 -0
  158. data/spec/spec_tests/data/binary_vector/packed_bit.json +83 -0
  159. data/spec/spec_tests/data/corpus/README.md +15 -0
  160. data/spec/spec_tests/data/corpus/array.json +49 -0
  161. data/spec/spec_tests/data/corpus/binary.json +153 -0
  162. data/spec/spec_tests/data/corpus/boolean.json +27 -0
  163. data/spec/spec_tests/data/corpus/code.json +67 -0
  164. data/spec/spec_tests/data/corpus/code_w_scope.json +78 -0
  165. data/spec/spec_tests/data/corpus/datetime.json +42 -0
  166. data/spec/spec_tests/data/corpus/dbpointer.json +56 -0
  167. data/spec/spec_tests/data/corpus/dbref.json +51 -0
  168. data/spec/spec_tests/data/corpus/decimal128-1.json +317 -0
  169. data/spec/spec_tests/data/corpus/decimal128-2.json +793 -0
  170. data/spec/spec_tests/data/corpus/decimal128-3.json +1771 -0
  171. data/spec/spec_tests/data/corpus/decimal128-4.json +165 -0
  172. data/spec/spec_tests/data/corpus/decimal128-5.json +402 -0
  173. data/spec/spec_tests/data/corpus/decimal128-6.json +131 -0
  174. data/spec/spec_tests/data/corpus/decimal128-7.json +327 -0
  175. data/spec/spec_tests/data/corpus/document.json +60 -0
  176. data/spec/spec_tests/data/corpus/double.json +87 -0
  177. data/spec/spec_tests/data/corpus/int32.json +43 -0
  178. data/spec/spec_tests/data/corpus/int64.json +43 -0
  179. data/spec/spec_tests/data/corpus/maxkey.json +12 -0
  180. data/spec/spec_tests/data/corpus/minkey.json +12 -0
  181. data/spec/spec_tests/data/corpus/multi-type-deprecated.json +15 -0
  182. data/spec/spec_tests/data/corpus/multi-type.json +11 -0
  183. data/spec/spec_tests/data/corpus/null.json +12 -0
  184. data/spec/spec_tests/data/corpus/oid.json +28 -0
  185. data/spec/spec_tests/data/corpus/regex.json +65 -0
  186. data/spec/spec_tests/data/corpus/string.json +72 -0
  187. data/spec/spec_tests/data/corpus/symbol.json +80 -0
  188. data/spec/spec_tests/data/corpus/timestamp.json +34 -0
  189. data/spec/spec_tests/data/corpus/top.json +262 -0
  190. data/spec/spec_tests/data/corpus/undefined.json +15 -0
  191. data/spec/spec_tests/data/corpus_legacy/array.json +49 -0
  192. data/spec/spec_tests/data/corpus_legacy/binary.json +69 -0
  193. data/spec/spec_tests/data/corpus_legacy/boolean.json +27 -0
  194. data/spec/spec_tests/data/corpus_legacy/code.json +67 -0
  195. data/spec/spec_tests/data/corpus_legacy/code_w_scope.json +78 -0
  196. data/spec/spec_tests/data/corpus_legacy/document.json +36 -0
  197. data/spec/spec_tests/data/corpus_legacy/double.json +69 -0
  198. data/spec/spec_tests/data/corpus_legacy/failures/datetime.json +31 -0
  199. data/spec/spec_tests/data/corpus_legacy/failures/dbpointer.json +42 -0
  200. data/spec/spec_tests/data/corpus_legacy/failures/int64.json +38 -0
  201. data/spec/spec_tests/data/corpus_legacy/failures/symbol.json +62 -0
  202. data/spec/spec_tests/data/corpus_legacy/int32.json +38 -0
  203. data/spec/spec_tests/data/corpus_legacy/maxkey.json +12 -0
  204. data/spec/spec_tests/data/corpus_legacy/minkey.json +12 -0
  205. data/spec/spec_tests/data/corpus_legacy/null.json +12 -0
  206. data/spec/spec_tests/data/corpus_legacy/oid.json +28 -0
  207. data/spec/spec_tests/data/corpus_legacy/regex.json +37 -0
  208. data/spec/spec_tests/data/corpus_legacy/string.json +67 -0
  209. data/spec/spec_tests/data/corpus_legacy/timestamp.json +18 -0
  210. data/spec/spec_tests/data/corpus_legacy/top.json +62 -0
  211. data/spec/spec_tests/data/corpus_legacy/undefined.json +13 -0
  212. data/spec/spec_tests/data/decimal128/decimal128-1.json +363 -0
  213. data/spec/spec_tests/data/decimal128/decimal128-2.json +793 -0
  214. data/spec/spec_tests/data/decimal128/decimal128-3.json +1771 -0
  215. data/spec/spec_tests/data/decimal128/decimal128-4.json +165 -0
  216. data/spec/spec_tests/data/decimal128/decimal128-5.json +402 -0
  217. data/spec/spec_tests/data/decimal128/decimal128-6.json +131 -0
  218. data/spec/spec_tests/data/decimal128/decimal128-7.json +327 -0
  219. data/spec/support/shared_examples.rb +32 -11
  220. data/spec/support/spec_config.rb +17 -0
  221. data/spec/support/utils.rb +58 -0
  222. metadata +284 -45
  223. checksums.yaml.gz.sig +0 -3
  224. data/ext/bson/native.c +0 -722
  225. data.tar.gz.sig +0 -0
  226. metadata.gz.sig +0 -0
@@ -0,0 +1,190 @@
1
+ # rubocop:todo all
2
+ # Copyright (C) 2019-2020 MongoDB Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require "spec_helper"
17
+ require "base64"
18
+
19
+ describe "BSON::Binary - UUID spec tests" do
20
+ def make_binary(uuid_hex_str, type)
21
+ uuid_binary_str = uuid_hex_str.scan(/../).map(&:hex).map(&:chr).join
22
+ BSON::Binary.new(uuid_binary_str, type)
23
+ end
24
+
25
+ describe 'explicit encoding' do
26
+ let(:uuid_str) { '00112233-4455-6677-8899-aabbccddeeff' }
27
+
28
+ shared_examples_for 'creates binary' do
29
+ it 'creates subtype 4 binary' do
30
+ expect(binary.type).to eq(expected_type)
31
+ end
32
+
33
+ it 'creates binary with correct value' do
34
+ expect(binary.data).to eq(expected_hex_value.scan(/../).map(&:hex).map(&:chr).join)
35
+ end
36
+ end
37
+
38
+ context 'no representation' do
39
+ let(:binary) { BSON::Binary.from_uuid(uuid_str) }
40
+ let(:expected_type) { :uuid }
41
+ let(:expected_hex_value) { '00112233445566778899AABBCCDDEEFF' }
42
+
43
+ it_behaves_like 'creates binary'
44
+ end
45
+
46
+ context 'standard representation' do
47
+ let(:binary) { BSON::Binary.from_uuid(uuid_str, :standard) }
48
+ let(:expected_type) { :uuid }
49
+ let(:expected_hex_value) { '00112233445566778899AABBCCDDEEFF' }
50
+
51
+ it_behaves_like 'creates binary'
52
+ end
53
+
54
+ context 'csharp legacy representation' do
55
+ let(:binary) { BSON::Binary.from_uuid(uuid_str, :csharp_legacy) }
56
+ let(:expected_type) { :uuid_old }
57
+ let(:expected_hex_value) { '33221100554477668899AABBCCDDEEFF' }
58
+
59
+ it_behaves_like 'creates binary'
60
+ end
61
+
62
+ context 'java legacy representation' do
63
+ let(:binary) { BSON::Binary.from_uuid(uuid_str, :java_legacy) }
64
+ let(:expected_type) { :uuid_old }
65
+ let(:expected_hex_value) { '7766554433221100FFEEDDCCBBAA9988' }
66
+
67
+ it_behaves_like 'creates binary'
68
+ end
69
+
70
+ context 'python legacy representation' do
71
+ let(:binary) { BSON::Binary.from_uuid(uuid_str, :python_legacy) }
72
+ let(:expected_type) { :uuid_old }
73
+ let(:expected_hex_value) { '00112233445566778899AABBCCDDEEFF' }
74
+
75
+ it_behaves_like 'creates binary'
76
+ end
77
+ end
78
+
79
+ describe 'explicit decoding' do
80
+ context ':uuid, standard encoded' do
81
+ let(:binary) { make_binary("00112233445566778899AABBCCDDEEFF", :uuid) }
82
+
83
+ it 'decodes without arguments' do
84
+ expect(binary.to_uuid.gsub('-', '').upcase).to eq("00112233445566778899AABBCCDDEEFF")
85
+ end
86
+
87
+ it 'decodes as standard' do
88
+ expect(binary.to_uuid(:standard).gsub('-', '').upcase).to eq("00112233445566778899AABBCCDDEEFF")
89
+ end
90
+
91
+ it 'does not decode as csharp legacy' do
92
+ expect do
93
+ binary.to_uuid(:csharp_legacy)
94
+ end.to raise_error(ArgumentError, /Binary of type :uuid can only be stringified to :standard representation/)
95
+ end
96
+
97
+ it 'does not decode as java legacy' do
98
+ expect do
99
+ binary.to_uuid(:java_legacy)
100
+ end.to raise_error(ArgumentError, /Binary of type :uuid can only be stringified to :standard representation/)
101
+ end
102
+
103
+ it 'does not decode as python legacy' do
104
+ expect do
105
+ binary.to_uuid(:python_legacy)
106
+ end.to raise_error(ArgumentError, /Binary of type :uuid can only be stringified to :standard representation/)
107
+ end
108
+ end
109
+
110
+ shared_examples_for 'a legacy uuid' do
111
+ it 'does not decode without arguments' do
112
+ expect do
113
+ binary.to_uuid
114
+ end.to raise_error(ArgumentError, /Representation must be specified for BSON::Binary objects of type :uuid_old/)
115
+ end
116
+
117
+ it 'does not decode as standard' do
118
+ expect do
119
+ binary.to_uuid(:standard)
120
+ end.to raise_error(ArgumentError, /BSON::Binary objects of type :uuid_old cannot be stringified to :standard representation/)
121
+ end
122
+ end
123
+
124
+ context ':uuid_old, csharp legacy encoded' do
125
+ let(:binary) { make_binary("33221100554477668899AABBCCDDEEFF", :uuid_old) }
126
+
127
+ it_behaves_like 'a legacy uuid'
128
+
129
+ it 'decodes as csharp legacy' do
130
+ expect(binary.to_uuid(:csharp_legacy).gsub('-', '').upcase).to eq("00112233445566778899AABBCCDDEEFF")
131
+ end
132
+
133
+ it 'decodes as java legacy' do
134
+ expect(binary.to_uuid(:java_legacy).gsub('-', '').upcase).not_to eq("00112233445566778899AABBCCDDEEFF")
135
+ end
136
+
137
+ it 'decodes as python legacy' do
138
+ expect(binary.to_uuid(:python_legacy).gsub('-', '').upcase).not_to eq("00112233445566778899AABBCCDDEEFF")
139
+ end
140
+
141
+ it 'expects four dashes when output as String' do
142
+ expect(binary.to_uuid(:csharp_legacy)).to eq("00112233-4455-6677-8899-aabbccddeeff")
143
+ end
144
+ end
145
+
146
+ context ':uuid_old, java legacy encoded' do
147
+ let(:binary) { make_binary("7766554433221100FFEEDDCCBBAA9988", :uuid_old) }
148
+
149
+ it_behaves_like 'a legacy uuid'
150
+
151
+ it 'decodes as csharp legacy' do
152
+ expect(binary.to_uuid(:csharp_legacy).gsub('-', '').upcase).not_to eq("00112233445566778899AABBCCDDEEFF")
153
+ end
154
+
155
+ it 'decodes as java legacy' do
156
+ expect(binary.to_uuid(:java_legacy).gsub('-', '').upcase).to eq("00112233445566778899AABBCCDDEEFF")
157
+ end
158
+
159
+ it 'decodes as python legacy' do
160
+ expect(binary.to_uuid(:python_legacy).gsub('-', '').upcase).not_to eq("00112233445566778899AABBCCDDEEFF")
161
+ end
162
+
163
+ it 'expects four dashes when output as String' do
164
+ expect(binary.to_uuid(:java_legacy)).to eq("00112233-4455-6677-8899-aabbccddeeff")
165
+ end
166
+ end
167
+
168
+ context ':uuid_old, python legacy encoded' do
169
+ let(:binary) { make_binary("00112233445566778899AABBCCDDEEFF", :uuid_old) }
170
+
171
+ it_behaves_like 'a legacy uuid'
172
+
173
+ it 'decodes as csharp legacy' do
174
+ expect(binary.to_uuid(:csharp_legacy).gsub('-', '').upcase).not_to eq("00112233445566778899AABBCCDDEEFF")
175
+ end
176
+
177
+ it 'decodes as java legacy' do
178
+ expect(binary.to_uuid(:java_legacy).gsub('-', '').upcase).not_to eq("00112233445566778899AABBCCDDEEFF")
179
+ end
180
+
181
+ it 'decodes as python legacy' do
182
+ expect(binary.to_uuid(:python_legacy).gsub('-', '').upcase).to eq("00112233445566778899AABBCCDDEEFF")
183
+ end
184
+
185
+ it 'expects four dashes when output as String' do
186
+ expect(binary.to_uuid(:python_legacy)).to eq("00112233-4455-6677-8899-aabbccddeeff")
187
+ end
188
+ end
189
+ end
190
+ end
@@ -1,4 +1,5 @@
1
- # Copyright (C) 2009-2014 MongoDB Inc.
1
+ # rubocop:todo all
2
+ # Copyright (C) 2009-2020 MongoDB Inc.
2
3
  #
3
4
  # Licensed under the Apache License, Version 2.0 (the "License");
4
5
  # you may not use this file except in compliance with the License.
@@ -0,0 +1,198 @@
1
+ # rubocop:todo all
2
+ require 'spec_helper'
3
+
4
+ describe BSON::ByteBuffer do
5
+
6
+ describe '#get_byte' do
7
+
8
+ let(:buffer) do
9
+ described_class.new(BSON::Int32::BSON_TYPE)
10
+ end
11
+
12
+ let!(:byte) do
13
+ buffer.get_byte
14
+ end
15
+
16
+ it 'gets the byte from the buffer' do
17
+ expect(byte).to eq(BSON::Int32::BSON_TYPE)
18
+ end
19
+
20
+ it 'increments the read position by 1' do
21
+ expect(buffer.read_position).to eq(1)
22
+ end
23
+ end
24
+
25
+ describe '#get_bytes' do
26
+
27
+ let(:string) do
28
+ "#{BSON::Int32::BSON_TYPE}#{BSON::Int32::BSON_TYPE}"
29
+ end
30
+
31
+ let(:buffer) do
32
+ described_class.new(string)
33
+ end
34
+
35
+ let!(:bytes) do
36
+ buffer.get_bytes(2)
37
+ end
38
+
39
+ it 'gets the bytes from the buffer' do
40
+ expect(bytes).to eq(string)
41
+ end
42
+
43
+ it 'increments the position by the length' do
44
+ expect(buffer.read_position).to eq(string.bytesize)
45
+ end
46
+ end
47
+
48
+ describe '#get_cstring' do
49
+
50
+ let(:buffer) do
51
+ described_class.new("testing#{BSON::NULL_BYTE}")
52
+ end
53
+
54
+ let!(:string) do
55
+ buffer.get_cstring
56
+ end
57
+
58
+ it 'gets the cstring from the buffer' do
59
+ expect(string).to eq("testing")
60
+ end
61
+
62
+ it 'increments the position by string length + 1' do
63
+ expect(buffer.read_position).to eq(8)
64
+ end
65
+ end
66
+
67
+ describe '#get_double' do
68
+
69
+ let(:buffer) do
70
+ described_class.new(12.5.to_bson.to_s)
71
+ end
72
+
73
+ let!(:double) do
74
+ buffer.get_double
75
+ end
76
+
77
+ it 'gets the double from the buffer' do
78
+ expect(double).to eq(12.5)
79
+ end
80
+
81
+ it 'increments the read position by 8' do
82
+ expect(buffer.read_position).to eq(8)
83
+ end
84
+ end
85
+
86
+ describe '#get_int32' do
87
+
88
+ let(:buffer) do
89
+ described_class.new(12.to_bson.to_s)
90
+ end
91
+
92
+ let!(:int32) do
93
+ buffer.get_int32
94
+ end
95
+
96
+ it 'gets the int32 from the buffer' do
97
+ expect(int32).to eq(12)
98
+ end
99
+
100
+ it 'increments the position by 4' do
101
+ expect(buffer.read_position).to eq(4)
102
+ end
103
+ end
104
+
105
+ describe '#get_uint32' do
106
+ context 'when using 2^32-1' do
107
+ let(:buffer) do
108
+ described_class.new(4294967295.to_bson.to_s)
109
+ end
110
+
111
+ let!(:int32) do
112
+ buffer.get_uint32
113
+ end
114
+
115
+ it 'gets the uint32 from the buffer' do
116
+ expect(int32).to eq(4294967295)
117
+ end
118
+
119
+ it 'increments the position by 4' do
120
+ expect(buffer.read_position).to eq(4)
121
+ end
122
+ end
123
+
124
+ context 'when using 2^32-2' do
125
+ let(:buffer) do
126
+ described_class.new(4294967294.to_bson.to_s)
127
+ end
128
+
129
+ let!(:int32) do
130
+ buffer.get_uint32
131
+ end
132
+
133
+ it 'gets the uint32 from the buffer' do
134
+ expect(int32).to eq(4294967294)
135
+ end
136
+
137
+ it 'increments the position by 4' do
138
+ expect(buffer.read_position).to eq(4)
139
+ end
140
+ end
141
+
142
+ context 'when using 0' do
143
+ let(:buffer) do
144
+ described_class.new(0.to_bson.to_s)
145
+ end
146
+
147
+ let!(:int32) do
148
+ buffer.get_uint32
149
+ end
150
+
151
+ it 'gets the uint32 from the buffer' do
152
+ expect(int32).to eq(0)
153
+ end
154
+
155
+ it 'increments the position by 4' do
156
+ expect(buffer.read_position).to eq(4)
157
+ end
158
+ end
159
+ end
160
+
161
+ describe '#get_int64' do
162
+
163
+ let(:buffer) do
164
+ described_class.new((Integer::MAX_64BIT - 1).to_bson.to_s)
165
+ end
166
+
167
+ let!(:int64) do
168
+ buffer.get_int64
169
+ end
170
+
171
+ it 'gets the int64 from the buffer' do
172
+ expect(int64).to eq(Integer::MAX_64BIT - 1)
173
+ end
174
+
175
+ it 'increments the position by 8' do
176
+ expect(buffer.read_position).to eq(8)
177
+ end
178
+ end
179
+
180
+ describe '#get_string' do
181
+
182
+ let(:buffer) do
183
+ described_class.new("#{8.to_bson.to_s}testing#{BSON::NULL_BYTE}")
184
+ end
185
+
186
+ let!(:string) do
187
+ buffer.get_string
188
+ end
189
+
190
+ it 'gets the string from the buffer' do
191
+ expect(string).to eq("testing")
192
+ end
193
+
194
+ it 'increments the position by string length + 5' do
195
+ expect(buffer.read_position).to eq(12)
196
+ end
197
+ end
198
+ end