bson 4.2.2 → 4.12.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (169) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.md +25 -7
  5. data/Rakefile +16 -9
  6. data/ext/bson/{native-endian.h → bson-endian.h} +5 -99
  7. data/ext/bson/bson-native.h +125 -0
  8. data/ext/bson/bytebuf.c +133 -0
  9. data/ext/bson/endian.c +117 -0
  10. data/ext/bson/init.c +355 -0
  11. data/ext/bson/libbson-utf8.c +230 -0
  12. data/ext/bson/read.c +411 -0
  13. data/ext/bson/util.c +95 -0
  14. data/ext/bson/write.c +680 -0
  15. data/lib/bson.rb +6 -3
  16. data/lib/bson/active_support.rb +17 -0
  17. data/lib/bson/array.rb +57 -17
  18. data/lib/bson/binary.rb +185 -13
  19. data/lib/bson/boolean.rb +12 -3
  20. data/lib/bson/code.rb +16 -2
  21. data/lib/bson/code_with_scope.rb +32 -5
  22. data/lib/bson/config.rb +1 -1
  23. data/lib/bson/date.rb +12 -2
  24. data/lib/bson/date_time.rb +2 -2
  25. data/lib/bson/db_pointer.rb +110 -0
  26. data/lib/bson/decimal128.rb +17 -3
  27. data/lib/bson/decimal128/builder.rb +1 -1
  28. data/lib/bson/document.rb +152 -5
  29. data/lib/bson/environment.rb +2 -1
  30. data/lib/bson/error.rb +27 -0
  31. data/lib/bson/ext_json.rb +383 -0
  32. data/lib/bson/false_class.rb +1 -1
  33. data/lib/bson/float.rb +48 -2
  34. data/lib/bson/hash.rb +68 -17
  35. data/lib/bson/int32.rb +52 -13
  36. data/lib/bson/int64.rb +59 -15
  37. data/lib/bson/integer.rb +36 -2
  38. data/lib/bson/json.rb +1 -1
  39. data/lib/bson/max_key.rb +13 -1
  40. data/lib/bson/min_key.rb +13 -1
  41. data/lib/bson/nil_class.rb +4 -2
  42. data/lib/bson/object.rb +28 -1
  43. data/lib/bson/object_id.rb +16 -2
  44. data/lib/bson/open_struct.rb +1 -1
  45. data/lib/bson/regexp.rb +27 -4
  46. data/lib/bson/registry.rb +3 -3
  47. data/lib/bson/specialized.rb +4 -2
  48. data/lib/bson/string.rb +5 -3
  49. data/lib/bson/symbol.rb +99 -7
  50. data/lib/bson/time.rb +63 -4
  51. data/lib/bson/time_with_zone.rb +54 -0
  52. data/lib/bson/timestamp.rb +44 -6
  53. data/lib/bson/true_class.rb +1 -1
  54. data/lib/bson/undefined.rb +12 -1
  55. data/lib/bson/version.rb +2 -2
  56. data/spec/bson/array_spec.rb +18 -1
  57. data/spec/bson/binary_spec.rb +100 -3
  58. data/spec/bson/binary_uuid_spec.rb +189 -0
  59. data/spec/bson/boolean_spec.rb +1 -1
  60. data/spec/bson/byte_buffer_read_spec.rb +197 -0
  61. data/spec/bson/byte_buffer_spec.rb +121 -381
  62. data/spec/bson/byte_buffer_write_spec.rb +854 -0
  63. data/spec/bson/code_spec.rb +1 -1
  64. data/spec/bson/code_with_scope_spec.rb +1 -1
  65. data/spec/bson/date_spec.rb +1 -1
  66. data/spec/bson/date_time_spec.rb +54 -1
  67. data/spec/bson/decimal128_spec.rb +35 -35
  68. data/spec/bson/document_as_spec.rb +46 -0
  69. data/spec/bson/document_spec.rb +197 -30
  70. data/spec/bson/ext_json_parse_spec.rb +308 -0
  71. data/spec/bson/false_class_spec.rb +1 -1
  72. data/spec/bson/float_spec.rb +37 -1
  73. data/spec/bson/hash_as_spec.rb +57 -0
  74. data/spec/bson/hash_spec.rb +209 -1
  75. data/spec/bson/int32_spec.rb +180 -6
  76. data/spec/bson/int64_spec.rb +199 -6
  77. data/spec/bson/integer_spec.rb +29 -3
  78. data/spec/bson/json_spec.rb +1 -1
  79. data/spec/bson/max_key_spec.rb +1 -1
  80. data/spec/bson/min_key_spec.rb +1 -1
  81. data/spec/bson/nil_class_spec.rb +1 -1
  82. data/spec/bson/object_id_spec.rb +1 -1
  83. data/spec/bson/object_spec.rb +1 -1
  84. data/spec/bson/open_struct_spec.rb +1 -1
  85. data/spec/bson/raw_spec.rb +34 -2
  86. data/spec/bson/regexp_spec.rb +1 -1
  87. data/spec/bson/registry_spec.rb +1 -1
  88. data/spec/bson/string_spec.rb +19 -1
  89. data/spec/bson/symbol_raw_spec.rb +45 -0
  90. data/spec/bson/symbol_spec.rb +63 -3
  91. data/spec/bson/time_spec.rb +205 -2
  92. data/spec/bson/time_with_zone_spec.rb +68 -0
  93. data/spec/bson/timestamp_spec.rb +56 -1
  94. data/spec/bson/true_class_spec.rb +1 -1
  95. data/spec/bson/undefined_spec.rb +1 -1
  96. data/spec/bson_spec.rb +1 -1
  97. data/spec/{support → runners}/common_driver.rb +1 -1
  98. data/spec/runners/corpus.rb +185 -0
  99. data/spec/{support/corpus.rb → runners/corpus_legacy.rb} +41 -59
  100. data/spec/spec_helper.rb +40 -3
  101. data/spec/{bson/driver_bson_spec.rb → spec_tests/common_driver_spec.rb} +1 -0
  102. data/spec/{bson/corpus_spec.rb → spec_tests/corpus_legacy_spec.rb} +10 -7
  103. data/spec/spec_tests/corpus_spec.rb +124 -0
  104. data/spec/spec_tests/data/corpus/README.md +15 -0
  105. data/spec/spec_tests/data/corpus/array.json +49 -0
  106. data/spec/spec_tests/data/corpus/binary.json +113 -0
  107. data/spec/spec_tests/data/corpus/boolean.json +27 -0
  108. data/spec/spec_tests/data/corpus/code.json +67 -0
  109. data/spec/spec_tests/data/corpus/code_w_scope.json +78 -0
  110. data/spec/spec_tests/data/corpus/datetime.json +42 -0
  111. data/spec/spec_tests/data/corpus/dbpointer.json +56 -0
  112. data/spec/spec_tests/data/corpus/dbref.json +31 -0
  113. data/spec/spec_tests/data/corpus/decimal128-1.json +317 -0
  114. data/spec/spec_tests/data/corpus/decimal128-2.json +793 -0
  115. data/spec/spec_tests/data/corpus/decimal128-3.json +1771 -0
  116. data/spec/spec_tests/data/corpus/decimal128-4.json +117 -0
  117. data/spec/spec_tests/data/corpus/decimal128-5.json +402 -0
  118. data/spec/spec_tests/data/corpus/decimal128-6.json +119 -0
  119. data/spec/spec_tests/data/corpus/decimal128-7.json +323 -0
  120. data/spec/spec_tests/data/corpus/document.json +36 -0
  121. data/spec/spec_tests/data/corpus/double.json +87 -0
  122. data/spec/spec_tests/data/corpus/int32.json +43 -0
  123. data/spec/spec_tests/data/corpus/int64.json +43 -0
  124. data/spec/spec_tests/data/corpus/maxkey.json +12 -0
  125. data/spec/spec_tests/data/corpus/minkey.json +12 -0
  126. data/spec/spec_tests/data/corpus/multi-type-deprecated.json +15 -0
  127. data/spec/spec_tests/data/corpus/multi-type.json +11 -0
  128. data/spec/spec_tests/data/corpus/null.json +12 -0
  129. data/spec/spec_tests/data/corpus/oid.json +28 -0
  130. data/spec/spec_tests/data/corpus/regex.json +65 -0
  131. data/spec/spec_tests/data/corpus/string.json +72 -0
  132. data/spec/spec_tests/data/corpus/symbol.json +80 -0
  133. data/spec/spec_tests/data/corpus/timestamp.json +34 -0
  134. data/spec/spec_tests/data/corpus/top.json +236 -0
  135. data/spec/spec_tests/data/corpus/undefined.json +15 -0
  136. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/array.json +8 -2
  137. data/spec/{support/corpus-tests/failures → spec_tests/data/corpus_legacy}/binary.json +0 -0
  138. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/boolean.json +0 -0
  139. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/code.json +1 -1
  140. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/code_w_scope.json +1 -1
  141. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/document.json +1 -1
  142. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/double.json +1 -1
  143. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/failures/datetime.json +0 -0
  144. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/failures/dbpointer.json +0 -0
  145. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/failures/int64.json +0 -0
  146. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/failures/symbol.json +0 -0
  147. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/int32.json +1 -1
  148. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/maxkey.json +1 -1
  149. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/minkey.json +1 -1
  150. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/null.json +1 -1
  151. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/oid.json +0 -0
  152. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/regex.json +1 -1
  153. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/string.json +0 -0
  154. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/timestamp.json +1 -1
  155. data/spec/{support/corpus-tests → spec_tests/data/corpus_legacy}/top.json +0 -0
  156. data/spec/{support/corpus-tests/failures → spec_tests/data/corpus_legacy}/undefined.json +0 -0
  157. data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-1.json +0 -0
  158. data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-2.json +0 -0
  159. data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-3.json +0 -0
  160. data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-4.json +0 -0
  161. data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-5.json +0 -0
  162. data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-6.json +0 -0
  163. data/spec/{support/driver-spec-tests → spec_tests/data}/decimal128/decimal128-7.json +0 -0
  164. data/spec/support/shared_examples.rb +3 -5
  165. data/spec/support/spec_config.rb +16 -0
  166. data/spec/support/utils.rb +10 -0
  167. metadata +227 -124
  168. metadata.gz.sig +0 -0
  169. data/ext/bson/bson_native.c +0 -762
@@ -0,0 +1,67 @@
1
+ {
2
+ "description": "Javascript Code",
3
+ "bson_type": "0x0D",
4
+ "test_key": "a",
5
+ "valid": [
6
+ {
7
+ "description": "Empty string",
8
+ "canonical_bson": "0D0000000D6100010000000000",
9
+ "canonical_extjson": "{\"a\" : {\"$code\" : \"\"}}"
10
+ },
11
+ {
12
+ "description": "Single character",
13
+ "canonical_bson": "0E0000000D610002000000620000",
14
+ "canonical_extjson": "{\"a\" : {\"$code\" : \"b\"}}"
15
+ },
16
+ {
17
+ "description": "Multi-character",
18
+ "canonical_bson": "190000000D61000D0000006162616261626162616261620000",
19
+ "canonical_extjson": "{\"a\" : {\"$code\" : \"abababababab\"}}"
20
+ },
21
+ {
22
+ "description": "two-byte UTF-8 (\u00e9)",
23
+ "canonical_bson": "190000000261000D000000C3A9C3A9C3A9C3A9C3A9C3A90000",
24
+ "canonical_extjson": "{\"a\" : \"\\u00e9\\u00e9\\u00e9\\u00e9\\u00e9\\u00e9\"}"
25
+ },
26
+ {
27
+ "description": "three-byte UTF-8 (\u2606)",
28
+ "canonical_bson": "190000000261000D000000E29886E29886E29886E298860000",
29
+ "canonical_extjson": "{\"a\" : \"\\u2606\\u2606\\u2606\\u2606\"}"
30
+ },
31
+ {
32
+ "description": "Embedded nulls",
33
+ "canonical_bson": "190000000261000D0000006162006261620062616261620000",
34
+ "canonical_extjson": "{\"a\" : \"ab\\u0000bab\\u0000babab\"}"
35
+ }
36
+ ],
37
+ "decodeErrors": [
38
+ {
39
+ "description": "bad code string length: 0 (but no 0x00 either)",
40
+ "bson": "0C0000000261000000000000"
41
+ },
42
+ {
43
+ "description": "bad code string length: -1",
44
+ "bson": "0C000000026100FFFFFFFF00"
45
+ },
46
+ {
47
+ "description": "bad code string length: eats terminator",
48
+ "bson": "10000000026100050000006200620000"
49
+ },
50
+ {
51
+ "description": "bad code string length: longer than rest of document",
52
+ "bson": "120000000200FFFFFF00666F6F6261720000"
53
+ },
54
+ {
55
+ "description": "code string is not null-terminated",
56
+ "bson": "1000000002610004000000616263FF00"
57
+ },
58
+ {
59
+ "description": "empty code string, but extra null",
60
+ "bson": "0E00000002610001000000000000"
61
+ },
62
+ {
63
+ "description": "invalid UTF-8",
64
+ "bson": "0E00000002610002000000E90000"
65
+ }
66
+ ]
67
+ }
@@ -0,0 +1,78 @@
1
+ {
2
+ "description": "Javascript Code with Scope",
3
+ "bson_type": "0x0F",
4
+ "test_key": "a",
5
+ "valid": [
6
+ {
7
+ "description": "Empty code string, empty scope",
8
+ "canonical_bson": "160000000F61000E0000000100000000050000000000",
9
+ "canonical_extjson": "{\"a\" : {\"$code\" : \"\", \"$scope\" : {}}}"
10
+ },
11
+ {
12
+ "description": "Non-empty code string, empty scope",
13
+ "canonical_bson": "1A0000000F610012000000050000006162636400050000000000",
14
+ "canonical_extjson": "{\"a\" : {\"$code\" : \"abcd\", \"$scope\" : {}}}"
15
+ },
16
+ {
17
+ "description": "Empty code string, non-empty scope",
18
+ "canonical_bson": "1D0000000F61001500000001000000000C000000107800010000000000",
19
+ "canonical_extjson": "{\"a\" : {\"$code\" : \"\", \"$scope\" : {\"x\" : {\"$numberInt\": \"1\"}}}}"
20
+ },
21
+ {
22
+ "description": "Non-empty code string and non-empty scope",
23
+ "canonical_bson": "210000000F6100190000000500000061626364000C000000107800010000000000",
24
+ "canonical_extjson": "{\"a\" : {\"$code\" : \"abcd\", \"$scope\" : {\"x\" : {\"$numberInt\": \"1\"}}}}"
25
+ },
26
+ {
27
+ "description": "Unicode and embedded null in code string, empty scope",
28
+ "canonical_bson": "1A0000000F61001200000005000000C3A9006400050000000000",
29
+ "canonical_extjson": "{\"a\" : {\"$code\" : \"\\u00e9\\u0000d\", \"$scope\" : {}}}"
30
+ }
31
+ ],
32
+ "decodeErrors": [
33
+ {
34
+ "description": "field length zero",
35
+ "bson": "280000000F6100000000000500000061626364001300000010780001000000107900010000000000"
36
+ },
37
+ {
38
+ "description": "field length negative",
39
+ "bson": "280000000F6100FFFFFFFF0500000061626364001300000010780001000000107900010000000000"
40
+ },
41
+ {
42
+ "description": "field length too short (less than minimum size)",
43
+ "bson": "160000000F61000D0000000100000000050000000000"
44
+ },
45
+ {
46
+ "description": "field length too short (truncates scope)",
47
+ "bson": "280000000F61001F0000000500000061626364001300000010780001000000107900010000000000"
48
+ },
49
+ {
50
+ "description": "field length too long (clips outer doc)",
51
+ "bson": "280000000F6100210000000500000061626364001300000010780001000000107900010000000000"
52
+ },
53
+ {
54
+ "description": "field length too long (longer than outer doc)",
55
+ "bson": "280000000F6100FF0000000500000061626364001300000010780001000000107900010000000000"
56
+ },
57
+ {
58
+ "description": "bad code string: length too short",
59
+ "bson": "280000000F6100200000000400000061626364001300000010780001000000107900010000000000"
60
+ },
61
+ {
62
+ "description": "bad code string: length too long (clips scope)",
63
+ "bson": "280000000F6100200000000600000061626364001300000010780001000000107900010000000000"
64
+ },
65
+ {
66
+ "description": "bad code string: negative length",
67
+ "bson": "280000000F610020000000FFFFFFFF61626364001300000010780001000000107900010000000000"
68
+ },
69
+ {
70
+ "description": "bad code string: length longer than field",
71
+ "bson": "280000000F610020000000FF00000061626364001300000010780001000000107900010000000000"
72
+ },
73
+ {
74
+ "description": "bad scope doc (field has bad string length)",
75
+ "bson": "1C0000000F001500000001000000000C000000020000000000000000"
76
+ }
77
+ ]
78
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "description": "DateTime",
3
+ "bson_type": "0x09",
4
+ "test_key": "a",
5
+ "valid": [
6
+ {
7
+ "description": "epoch",
8
+ "canonical_bson": "10000000096100000000000000000000",
9
+ "relaxed_extjson": "{\"a\" : {\"$date\" : \"1970-01-01T00:00:00Z\"}}",
10
+ "canonical_extjson": "{\"a\" : {\"$date\" : {\"$numberLong\" : \"0\"}}}"
11
+ },
12
+ {
13
+ "description": "positive ms",
14
+ "canonical_bson": "10000000096100C5D8D6CC3B01000000",
15
+ "relaxed_extjson": "{\"a\" : {\"$date\" : \"2012-12-24T12:15:30.501Z\"}}",
16
+ "canonical_extjson": "{\"a\" : {\"$date\" : {\"$numberLong\" : \"1356351330501\"}}}"
17
+ },
18
+ {
19
+ "description": "negative",
20
+ "canonical_bson": "10000000096100C33CE7B9BDFFFFFF00",
21
+ "relaxed_extjson": "{\"a\" : {\"$date\" : {\"$numberLong\" : \"-284643869501\"}}}",
22
+ "canonical_extjson": "{\"a\" : {\"$date\" : {\"$numberLong\" : \"-284643869501\"}}}"
23
+ },
24
+ {
25
+ "description" : "Y10K",
26
+ "canonical_bson" : "1000000009610000DC1FD277E6000000",
27
+ "canonical_extjson" : "{\"a\":{\"$date\":{\"$numberLong\":\"253402300800000\"}}}"
28
+ },
29
+ {
30
+ "description": "leading zero ms",
31
+ "canonical_bson": "10000000096100D1D6D6CC3B01000000",
32
+ "relaxed_extjson": "{\"a\" : {\"$date\" : \"2012-12-24T12:15:30.001Z\"}}",
33
+ "canonical_extjson": "{\"a\" : {\"$date\" : {\"$numberLong\" : \"1356351330001\"}}}"
34
+ }
35
+ ],
36
+ "decodeErrors": [
37
+ {
38
+ "description": "datetime field truncated",
39
+ "bson": "0C0000000961001234567800"
40
+ }
41
+ ]
42
+ }
@@ -0,0 +1,56 @@
1
+ {
2
+ "description": "DBPointer type (deprecated)",
3
+ "bson_type": "0x0C",
4
+ "deprecated": true,
5
+ "test_key": "a",
6
+ "valid": [
7
+ {
8
+ "description": "DBpointer",
9
+ "canonical_bson": "1A0000000C610002000000620056E1FC72E0C917E9C471416100",
10
+ "canonical_extjson": "{\"a\": {\"$dbPointer\": {\"$ref\": \"b\", \"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}}}}",
11
+ "converted_bson": "2a00000003610022000000022472656600020000006200072469640056e1fc72e0c917e9c47141610000",
12
+ "converted_extjson": "{\"a\": {\"$ref\": \"b\", \"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}}}"
13
+ },
14
+ {
15
+ "description": "DBpointer with opposite key order",
16
+ "canonical_bson": "1A0000000C610002000000620056E1FC72E0C917E9C471416100",
17
+ "canonical_extjson": "{\"a\": {\"$dbPointer\": {\"$ref\": \"b\", \"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}}}}",
18
+ "degenerate_extjson": "{\"a\": {\"$dbPointer\": {\"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}, \"$ref\": \"b\"}}}",
19
+ "converted_bson": "2a00000003610022000000022472656600020000006200072469640056e1fc72e0c917e9c47141610000",
20
+ "converted_extjson": "{\"a\": {\"$ref\": \"b\", \"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}}}"
21
+ },
22
+ {
23
+ "description": "With two-byte UTF-8",
24
+ "canonical_bson": "1B0000000C610003000000C3A90056E1FC72E0C917E9C471416100",
25
+ "canonical_extjson": "{\"a\": {\"$dbPointer\": {\"$ref\": \"é\", \"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}}}}",
26
+ "converted_bson": "2B0000000361002300000002247265660003000000C3A900072469640056E1FC72E0C917E9C47141610000",
27
+ "converted_extjson": "{\"a\": {\"$ref\": \"é\", \"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}}}"
28
+ }
29
+ ],
30
+ "decodeErrors": [
31
+ {
32
+ "description": "String with negative length",
33
+ "bson": "1A0000000C6100FFFFFFFF620056E1FC72E0C917E9C471416100"
34
+ },
35
+ {
36
+ "description": "String with zero length",
37
+ "bson": "1A0000000C610000000000620056E1FC72E0C917E9C471416100"
38
+ },
39
+ {
40
+ "description": "String not null terminated",
41
+ "bson": "1A0000000C610002000000626256E1FC72E0C917E9C471416100"
42
+ },
43
+ {
44
+ "description": "short OID (less than minimum length for field)",
45
+ "bson": "160000000C61000300000061620056E1FC72E0C91700"
46
+ },
47
+ {
48
+ "description": "short OID (greater than minimum, but truncated)",
49
+ "bson": "1A0000000C61000300000061620056E1FC72E0C917E9C4716100"
50
+ },
51
+ {
52
+ "description": "String with bad UTF-8",
53
+ "bson": "1A0000000C610002000000E90056E1FC72E0C917E9C471416100"
54
+ }
55
+ ]
56
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "description": "DBRef",
3
+ "bson_type": "0x03",
4
+ "valid": [
5
+ {
6
+ "description": "DBRef",
7
+ "canonical_bson": "37000000036462726566002b0000000224726566000b000000636f6c6c656374696f6e00072469640058921b3e6e32ab156a22b59e0000",
8
+ "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}}}"
9
+ },
10
+ {
11
+ "description": "DBRef with database",
12
+ "canonical_bson": "4300000003646272656600370000000224726566000b000000636f6c6c656374696f6e00072469640058921b3e6e32ab156a22b59e0224646200030000006462000000",
13
+ "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}, \"$db\": \"db\"}}"
14
+ },
15
+ {
16
+ "description": "DBRef with database and additional fields",
17
+ "canonical_bson": "48000000036462726566003c0000000224726566000b000000636f6c6c656374696f6e0010246964002a00000002246462000300000064620002666f6f0004000000626172000000",
18
+ "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\", \"$id\": {\"$numberInt\": \"42\"}, \"$db\": \"db\", \"foo\": \"bar\"}}"
19
+ },
20
+ {
21
+ "description": "DBRef with additional fields",
22
+ "canonical_bson": "4400000003646272656600380000000224726566000b000000636f6c6c656374696f6e00072469640058921b3e6e32ab156a22b59e02666f6f0004000000626172000000",
23
+ "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}, \"foo\": \"bar\"}}"
24
+ },
25
+ {
26
+ "description": "Document with key names similar to those of a DBRef",
27
+ "canonical_bson": "3e0000000224726566000c0000006e6f742d612d646272656600072469640058921b3e6e32ab156a22b59e022462616e616e6100050000007065656c0000",
28
+ "canonical_extjson": "{\"$ref\": \"not-a-dbref\", \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}, \"$banana\": \"peel\"}"
29
+ }
30
+ ]
31
+ }
@@ -0,0 +1,317 @@
1
+ {
2
+ "description": "Decimal128",
3
+ "bson_type": "0x13",
4
+ "test_key": "d",
5
+ "valid": [
6
+ {
7
+ "description": "Special - Canonical NaN",
8
+ "canonical_bson": "180000001364000000000000000000000000000000007C00",
9
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}"
10
+ },
11
+ {
12
+ "description": "Special - Negative NaN",
13
+ "canonical_bson": "18000000136400000000000000000000000000000000FC00",
14
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}",
15
+ "lossy": true
16
+ },
17
+ {
18
+ "description": "Special - Negative NaN",
19
+ "canonical_bson": "18000000136400000000000000000000000000000000FC00",
20
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}",
21
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-NaN\"}}",
22
+ "lossy": true
23
+ },
24
+ {
25
+ "description": "Special - Canonical SNaN",
26
+ "canonical_bson": "180000001364000000000000000000000000000000007E00",
27
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}",
28
+ "lossy": true
29
+ },
30
+ {
31
+ "description": "Special - Negative SNaN",
32
+ "canonical_bson": "18000000136400000000000000000000000000000000FE00",
33
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}",
34
+ "lossy": true
35
+ },
36
+ {
37
+ "description": "Special - NaN with a payload",
38
+ "canonical_bson": "180000001364001200000000000000000000000000007E00",
39
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}",
40
+ "lossy": true
41
+ },
42
+ {
43
+ "description": "Special - Canonical Positive Infinity",
44
+ "canonical_bson": "180000001364000000000000000000000000000000007800",
45
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"Infinity\"}}"
46
+ },
47
+ {
48
+ "description": "Special - Canonical Negative Infinity",
49
+ "canonical_bson": "18000000136400000000000000000000000000000000F800",
50
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}"
51
+ },
52
+ {
53
+ "description": "Special - Invalid representation treated as 0",
54
+ "canonical_bson": "180000001364000000000000000000000000000000106C00",
55
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}",
56
+ "lossy": true
57
+ },
58
+ {
59
+ "description": "Special - Invalid representation treated as -0",
60
+ "canonical_bson": "18000000136400DCBA9876543210DEADBEEF00000010EC00",
61
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0\"}}",
62
+ "lossy": true
63
+ },
64
+ {
65
+ "description": "Special - Invalid representation treated as 0E3",
66
+ "canonical_bson": "18000000136400FFFFFFFFFFFFFFFFFFFFFFFFFFFF116C00",
67
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+3\"}}",
68
+ "lossy": true
69
+ },
70
+ {
71
+ "description": "Regular - Adjusted Exponent Limit",
72
+ "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3CF22F00",
73
+ "canonical_extjson": "{\"d\": { \"$numberDecimal\": \"0.000001234567890123456789012345678901234\" }}"
74
+ },
75
+ {
76
+ "description": "Regular - Smallest",
77
+ "canonical_bson": "18000000136400D204000000000000000000000000343000",
78
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.001234\"}}"
79
+ },
80
+ {
81
+ "description": "Regular - Smallest with Trailing Zeros",
82
+ "canonical_bson": "1800000013640040EF5A07000000000000000000002A3000",
83
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00123400000\"}}"
84
+ },
85
+ {
86
+ "description": "Regular - 0.1",
87
+ "canonical_bson": "1800000013640001000000000000000000000000003E3000",
88
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1\"}}"
89
+ },
90
+ {
91
+ "description": "Regular - 0.1234567890123456789012345678901234",
92
+ "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3CFC2F00",
93
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1234567890123456789012345678901234\"}}"
94
+ },
95
+ {
96
+ "description": "Regular - 0",
97
+ "canonical_bson": "180000001364000000000000000000000000000000403000",
98
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}"
99
+ },
100
+ {
101
+ "description": "Regular - -0",
102
+ "canonical_bson": "18000000136400000000000000000000000000000040B000",
103
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0\"}}"
104
+ },
105
+ {
106
+ "description": "Regular - -0.0",
107
+ "canonical_bson": "1800000013640000000000000000000000000000003EB000",
108
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0\"}}"
109
+ },
110
+ {
111
+ "description": "Regular - 2",
112
+ "canonical_bson": "180000001364000200000000000000000000000000403000",
113
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"2\"}}"
114
+ },
115
+ {
116
+ "description": "Regular - 2.000",
117
+ "canonical_bson": "18000000136400D0070000000000000000000000003A3000",
118
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"2.000\"}}"
119
+ },
120
+ {
121
+ "description": "Regular - Largest",
122
+ "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3C403000",
123
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1234567890123456789012345678901234\"}}"
124
+ },
125
+ {
126
+ "description": "Scientific - Tiniest",
127
+ "canonical_bson": "18000000136400FFFFFFFF638E8D37C087ADBE09ED010000",
128
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"9.999999999999999999999999999999999E-6143\"}}"
129
+ },
130
+ {
131
+ "description": "Scientific - Tiny",
132
+ "canonical_bson": "180000001364000100000000000000000000000000000000",
133
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-6176\"}}"
134
+ },
135
+ {
136
+ "description": "Scientific - Negative Tiny",
137
+ "canonical_bson": "180000001364000100000000000000000000000000008000",
138
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1E-6176\"}}"
139
+ },
140
+ {
141
+ "description": "Scientific - Adjusted Exponent Limit",
142
+ "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3CF02F00",
143
+ "canonical_extjson": "{\"d\": { \"$numberDecimal\": \"1.234567890123456789012345678901234E-7\" }}"
144
+ },
145
+ {
146
+ "description": "Scientific - Fractional",
147
+ "canonical_bson": "1800000013640064000000000000000000000000002CB000",
148
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.00E-8\"}}"
149
+ },
150
+ {
151
+ "description": "Scientific - 0 with Exponent",
152
+ "canonical_bson": "180000001364000000000000000000000000000000205F00",
153
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6000\"}}"
154
+ },
155
+ {
156
+ "description": "Scientific - 0 with Negative Exponent",
157
+ "canonical_bson": "1800000013640000000000000000000000000000007A2B00",
158
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-611\"}}"
159
+ },
160
+ {
161
+ "description": "Scientific - No Decimal with Signed Exponent",
162
+ "canonical_bson": "180000001364000100000000000000000000000000463000",
163
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+3\"}}"
164
+ },
165
+ {
166
+ "description": "Scientific - Trailing Zero",
167
+ "canonical_bson": "180000001364001A04000000000000000000000000423000",
168
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.050E+4\"}}"
169
+ },
170
+ {
171
+ "description": "Scientific - With Decimal",
172
+ "canonical_bson": "180000001364006900000000000000000000000000423000",
173
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.05E+3\"}}"
174
+ },
175
+ {
176
+ "description": "Scientific - Full",
177
+ "canonical_bson": "18000000136400FFFFFFFFFFFFFFFFFFFFFFFFFFFF403000",
178
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"5192296858534827628530496329220095\"}}"
179
+ },
180
+ {
181
+ "description": "Scientific - Large",
182
+ "canonical_bson": "18000000136400000000000A5BC138938D44C64D31FE5F00",
183
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000000000E+6144\"}}"
184
+ },
185
+ {
186
+ "description": "Scientific - Largest",
187
+ "canonical_bson": "18000000136400FFFFFFFF638E8D37C087ADBE09EDFF5F00",
188
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"9.999999999999999999999999999999999E+6144\"}}"
189
+ },
190
+ {
191
+ "description": "Non-Canonical Parsing - Exponent Normalization",
192
+ "canonical_bson": "1800000013640064000000000000000000000000002CB000",
193
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-100E-10\"}}",
194
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.00E-8\"}}"
195
+ },
196
+ {
197
+ "description": "Non-Canonical Parsing - Unsigned Positive Exponent",
198
+ "canonical_bson": "180000001364000100000000000000000000000000463000",
199
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E3\"}}",
200
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+3\"}}"
201
+ },
202
+ {
203
+ "description": "Non-Canonical Parsing - Lowercase Exponent Identifier",
204
+ "canonical_bson": "180000001364000100000000000000000000000000463000",
205
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1e+3\"}}",
206
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+3\"}}"
207
+ },
208
+ {
209
+ "description": "Non-Canonical Parsing - Long Significand with Exponent",
210
+ "canonical_bson": "1800000013640079D9E0F9763ADA429D0200000000583000",
211
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12345689012345789012345E+12\"}}",
212
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.2345689012345789012345E+34\"}}"
213
+ },
214
+ {
215
+ "description": "Non-Canonical Parsing - Positive Sign",
216
+ "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3C403000",
217
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+1234567890123456789012345678901234\"}}",
218
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1234567890123456789012345678901234\"}}"
219
+ },
220
+ {
221
+ "description": "Non-Canonical Parsing - Long Decimal String",
222
+ "canonical_bson": "180000001364000100000000000000000000000000722800",
223
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \".000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\"}}",
224
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-999\"}}"
225
+ },
226
+ {
227
+ "description": "Non-Canonical Parsing - nan",
228
+ "canonical_bson": "180000001364000000000000000000000000000000007C00",
229
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"nan\"}}",
230
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}"
231
+ },
232
+ {
233
+ "description": "Non-Canonical Parsing - nAn",
234
+ "canonical_bson": "180000001364000000000000000000000000000000007C00",
235
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"nAn\"}}",
236
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}"
237
+ },
238
+ {
239
+ "description": "Non-Canonical Parsing - +infinity",
240
+ "canonical_bson": "180000001364000000000000000000000000000000007800",
241
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+infinity\"}}",
242
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"Infinity\"}}"
243
+ },
244
+ {
245
+ "description": "Non-Canonical Parsing - infinity",
246
+ "canonical_bson": "180000001364000000000000000000000000000000007800",
247
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"infinity\"}}",
248
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"Infinity\"}}"
249
+ },
250
+ {
251
+ "description": "Non-Canonical Parsing - infiniTY",
252
+ "canonical_bson": "180000001364000000000000000000000000000000007800",
253
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"infiniTY\"}}",
254
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"Infinity\"}}"
255
+ },
256
+ {
257
+ "description": "Non-Canonical Parsing - inf",
258
+ "canonical_bson": "180000001364000000000000000000000000000000007800",
259
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"inf\"}}",
260
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"Infinity\"}}"
261
+ },
262
+ {
263
+ "description": "Non-Canonical Parsing - inF",
264
+ "canonical_bson": "180000001364000000000000000000000000000000007800",
265
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"inF\"}}",
266
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"Infinity\"}}"
267
+ },
268
+ {
269
+ "description": "Non-Canonical Parsing - -infinity",
270
+ "canonical_bson": "18000000136400000000000000000000000000000000F800",
271
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-infinity\"}}",
272
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}"
273
+ },
274
+ {
275
+ "description": "Non-Canonical Parsing - -infiniTy",
276
+ "canonical_bson": "18000000136400000000000000000000000000000000F800",
277
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-infiniTy\"}}",
278
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}"
279
+ },
280
+ {
281
+ "description": "Non-Canonical Parsing - -Inf",
282
+ "canonical_bson": "18000000136400000000000000000000000000000000F800",
283
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}",
284
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}"
285
+ },
286
+ {
287
+ "description": "Non-Canonical Parsing - -inf",
288
+ "canonical_bson": "18000000136400000000000000000000000000000000F800",
289
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-inf\"}}",
290
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}"
291
+ },
292
+ {
293
+ "description": "Non-Canonical Parsing - -inF",
294
+ "canonical_bson": "18000000136400000000000000000000000000000000F800",
295
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-inF\"}}",
296
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}"
297
+ },
298
+ {
299
+ "description": "Rounded Subnormal number",
300
+ "canonical_bson": "180000001364000100000000000000000000000000000000",
301
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10E-6177\"}}",
302
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-6176\"}}"
303
+ },
304
+ {
305
+ "description": "Clamped",
306
+ "canonical_bson": "180000001364000a00000000000000000000000000fe5f00",
307
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E6112\"}}",
308
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+6112\"}}"
309
+ },
310
+ {
311
+ "description": "Exact rounding",
312
+ "canonical_bson": "18000000136400000000000a5bc138938d44c64d31cc3700",
313
+ "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\"}}",
314
+ "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000000000E+999\"}}"
315
+ }
316
+ ]
317
+ }