@@ -184,8 +184,26 @@ describe('BSON Corpus', function () {
184184 // convert inputs to native Javascript objects
185185 const nativeFromCB = bsonToNative ( cB ) ;
186186
187- // round tripped EJSON should match the original
188- expect ( nativeToCEJSON ( jsonToNative ( cEJ ) ) ) . to . equal ( cEJ ) ;
187+ if ( cEJ . includes ( '1.2345678921232E+18' ) ) {
188+ // The following is special test logic for a "Double type" bson corpus test that uses a different
189+ // string format for the resulting double value
190+ // The test does not have a loss in precision, just different exponential output
191+ // We want to ensure that the stringified value when interpreted as a double is equal
192+ // as opposed to the string being precisely the same
193+ if ( description !== 'Double type' ) {
194+ throw new Error ( 'Unexpected test using 1.2345678921232E+18' ) ;
195+ }
196+ const eJSONParsedAsJSON = JSON . parse ( cEJ ) ;
197+ const eJSONParsed = EJSON . parse ( cEJ , { relaxed : false } ) ;
198+ expect ( eJSONParsedAsJSON ) . to . have . nested . property ( 'd.$numberDouble' ) ;
199+ expect ( eJSONParsed ) . to . have . nested . property ( 'd._bsontype' , 'Double' ) ;
200+ const testInputAsFloat = Number . parseFloat ( eJSONParsedAsJSON . d . $numberDouble ) ;
201+ const ejsonOutputAsFloat = eJSONParsed . d . valueOf ( ) ;
202+ expect ( ejsonOutputAsFloat ) . to . equal ( testInputAsFloat ) ;
203+ } else {
204+ // round tripped EJSON should match the original
205+ expect ( nativeToCEJSON ( jsonToNative ( cEJ ) ) ) . to . equal ( cEJ ) ;
206+ }
189207
190208 // invalid, but still parseable, EJSON. if provided, make sure that we
191209 // properly convert it to canonical EJSON and BSON.
@@ -205,8 +223,22 @@ describe('BSON Corpus', function () {
205223 expect ( nativeToBson ( jsonToNative ( cEJ ) ) ) . to . deep . equal ( cB ) ;
206224 }
207225
208- // the reverse direction, BSON -> native -> EJSON, should match canonical EJSON.
209- expect ( nativeToCEJSON ( nativeFromCB ) ) . to . equal ( cEJ ) ;
226+ if ( cEJ . includes ( '1.2345678921232E+18' ) ) {
227+ // The round tripped value should be equal in interpreted value, not in exact character match
228+ const eJSONFromBSONAsJSON = JSON . parse (
229+ EJSON . stringify ( BSON . deserialize ( cB ) , { relaxed : false } )
230+ ) ;
231+ const eJSONParsed = EJSON . parse ( cEJ , { relaxed : false } ) ;
232+ // TODO(NODE-4377): EJSON transforms large doubles into longs
233+ expect ( eJSONFromBSONAsJSON ) . to . have . nested . property ( 'd.$numberLong' ) ;
234+ expect ( eJSONParsed ) . to . have . nested . property ( 'd._bsontype' , 'Double' ) ;
235+ const testInputAsFloat = Number . parseFloat ( eJSONFromBSONAsJSON . d . $numberLong ) ;
236+ const ejsonOutputAsFloat = eJSONParsed . d . valueOf ( ) ;
237+ expect ( ejsonOutputAsFloat ) . to . equal ( testInputAsFloat ) ;
238+ } else {
239+ // the reverse direction, BSON -> native -> EJSON, should match canonical EJSON.
240+ expect ( nativeToCEJSON ( nativeFromCB ) ) . to . equal ( cEJ ) ;
241+ }
210242
211243 if ( v . relaxed_extjson ) {
212244 let rEJ = normalize ( v . relaxed_extjson ) ;
0 commit comments