@@ -413,3 +413,109 @@ func tupleHashabilityDictionary() throws {
413413 #expect( dict [ key2] == " Bob " , " key2 value should be 'Bob' " )
414414 #expect( dict [ key3] == " Charlie " , " key3 (same as key1) should retrieve 'Charlie' " )
415415}
416+
417+ // MARK: - Edge Cases
418+
419+ @Test ( " Tuple equality - Float positive and negative zero are unequal " )
420+ func tupleFloatZeroInequality( ) throws {
421+ let tuple1 = Tuple ( Float ( 0.0 ) )
422+ let tuple2 = Tuple ( Float ( - 0.0 ) )
423+
424+ // Note: These are unequal because they have different bit patterns
425+ // and encode to different bytes. This differs from Swift's Float equality
426+ // where 0.0 == -0.0 is true.
427+ #expect( tuple1 != tuple2, " Positive and negative zero have different encodings " )
428+
429+ // Verify they hash differently (important for Set/Dictionary correctness)
430+ #expect( tuple1. hashValue != tuple2. hashValue, " Different values must have potentially different hashes " )
431+ }
432+
433+ @Test ( " Tuple equality - Double positive and negative zero are unequal " )
434+ func tupleDoubleZeroInequality( ) throws {
435+ let tuple1 = Tuple ( Double ( 0.0 ) )
436+ let tuple2 = Tuple ( Double ( - 0.0 ) )
437+
438+ #expect( tuple1 != tuple2, " Positive and negative zero have different encodings " )
439+ #expect( tuple1. hashValue != tuple2. hashValue, " Different values must have potentially different hashes " )
440+ }
441+
442+ @Test ( " Tuple equality - Float NaN values are equal " )
443+ func tupleFloatNaNEquality( ) throws {
444+ let tuple1 = Tuple ( Float . nan)
445+ let tuple2 = Tuple ( Float . nan)
446+
447+ // Note: These are equal because they encode to the same bytes
448+ // (same bit pattern). This differs from Swift's Float equality
449+ // where Float.nan == Float.nan is false.
450+ #expect( tuple1 == tuple2, " NaN values with same bit pattern encode to same bytes " )
451+ #expect( tuple1. hashValue == tuple2. hashValue, " Equal values must have same hash " )
452+ }
453+
454+ @Test ( " Tuple equality - Double NaN values are equal " )
455+ func tupleDoubleNaNEquality( ) throws {
456+ let tuple1 = Tuple ( Double . nan)
457+ let tuple2 = Tuple ( Double . nan)
458+
459+ #expect( tuple1 == tuple2, " NaN values with same bit pattern encode to same bytes " )
460+ #expect( tuple1. hashValue == tuple2. hashValue, " Equal values must have same hash " )
461+ }
462+
463+ @Test ( " Tuple equality - Float infinity values " )
464+ func tupleFloatInfinity( ) throws {
465+ let tuple1 = Tuple ( Float . infinity)
466+ let tuple2 = Tuple ( Float . infinity)
467+ let tuple3 = Tuple ( - Float. infinity)
468+
469+ #expect( tuple1 == tuple2, " Same infinity values should be equal " )
470+ #expect( tuple1 != tuple3, " Positive and negative infinity should be unequal " )
471+ }
472+
473+ @Test ( " Tuple equality - Double infinity values " )
474+ func tupleDoubleInfinity( ) throws {
475+ let tuple1 = Tuple ( Double . infinity)
476+ let tuple2 = Tuple ( Double . infinity)
477+ let tuple3 = Tuple ( - Double. infinity)
478+
479+ #expect( tuple1 == tuple2, " Same infinity values should be equal " )
480+ #expect( tuple1 != tuple3, " Positive and negative infinity should be unequal " )
481+ }
482+
483+ @Test ( " Tuple equality - empty tuples " )
484+ func tupleEmptyEquality( ) throws {
485+ let tuple1 = Tuple ( )
486+ let tuple2 = Tuple ( [ ] )
487+
488+ #expect( tuple1 == tuple2, " Empty tuples should be equal " )
489+ #expect( tuple1. hashValue == tuple2. hashValue, " Empty tuples should have same hash " )
490+ #expect( tuple1. count == 0 , " Empty tuple should have count 0 " )
491+ }
492+
493+ @Test ( " Tuple hashability - empty tuples in Set " )
494+ func tupleEmptySet( ) throws {
495+ let tuple1 = Tuple ( )
496+ let tuple2 = Tuple ( [ ] )
497+
498+ var set = Set < Tuple > ( )
499+ set. insert ( tuple1)
500+ set. insert ( tuple2)
501+
502+ #expect( set. count == 1 , " Empty tuples should be deduplicated in Set " )
503+ }
504+
505+ @Test ( " Tuple with nil values " )
506+ func tupleWithNil( ) throws {
507+ let tuple1 = Tuple ( TupleNil ( ) , " hello " , TupleNil ( ) )
508+ let tuple2 = Tuple ( TupleNil ( ) , " hello " , TupleNil ( ) )
509+
510+ #expect( tuple1 == tuple2, " Tuples with nil values should be equal " )
511+ #expect( tuple1. hashValue == tuple2. hashValue, " Tuples with nil values should have same hash " )
512+ #expect( tuple1. count == 3 , " Tuple should have 3 elements including nils " )
513+ }
514+
515+ @Test ( " Tuple equality - nil values in different positions are unequal " )
516+ func tupleNilPositions( ) throws {
517+ let tuple1 = Tuple ( TupleNil ( ) , " hello " )
518+ let tuple2 = Tuple ( " hello " , TupleNil ( ) )
519+
520+ #expect( tuple1 != tuple2, " Tuples with nils in different positions should be unequal " )
521+ }
0 commit comments