@@ -32,21 +32,149 @@ describe('GEOPOS', () => {
32
32
33
33
testUtils . testAll ( 'geoPos with member' , async client => {
34
34
const coordinates = {
35
- longitude : '-122.06429868936538696 ' ,
36
- latitude : '37.37749628831998194 '
35
+ longitude : '-122.06429868936539 ' ,
36
+ latitude : '37.37749628831998 '
37
37
} ;
38
38
39
39
await client . geoAdd ( 'key' , {
40
40
member : 'member' ,
41
41
...coordinates
42
42
} ) ;
43
43
44
- assert . deepEqual (
45
- await client . geoPos ( 'key' , 'member' ) ,
46
- [ coordinates ]
44
+ const result = await client . geoPos ( 'key' , 'member' ) ;
45
+
46
+ /**
47
+ * - Redis < 8: Returns coordinates with 14 decimal places (e.g., "-122.06429868936539")
48
+ * - Redis 8+: Returns coordinates with 17 decimal places (e.g., "-122.06429868936538696")
49
+ *
50
+ */
51
+ const PRECISION = 13 ; // Number of decimal places to compare
52
+
53
+ assert . ok ( result . length === 1 , 'Expected one result' ) ;
54
+
55
+ assert . ok (
56
+ compareWithPrecision ( result [ 0 ] . longitude , coordinates . longitude , PRECISION ) ,
57
+ `Longitude mismatch: ${ result [ 0 ] . longitude } vs ${ coordinates . longitude } `
58
+ ) ;
59
+ assert . ok (
60
+ compareWithPrecision ( result [ 0 ] . latitude , coordinates . latitude , PRECISION ) ,
61
+ `Latitude mismatch: ${ result [ 0 ] . latitude } vs ${ coordinates . latitude } `
47
62
) ;
48
63
} , {
49
64
client : GLOBAL . SERVERS . OPEN ,
50
65
cluster : GLOBAL . CLUSTERS . OPEN
51
66
} ) ;
52
67
} ) ;
68
+
69
+ describe ( 'compareWithPrecision' , ( ) => {
70
+ it ( 'should match exact same numbers' , ( ) => {
71
+ assert . strictEqual (
72
+ compareWithPrecision ( '123.456789' , '123.456789' , 6 ) ,
73
+ true
74
+ ) ;
75
+ } ) ;
76
+
77
+ it ( 'should match when actual has more precision than needed' , ( ) => {
78
+ assert . strictEqual (
79
+ compareWithPrecision ( '123.456789123456' , '123.456789' , 6 ) ,
80
+ true
81
+ ) ;
82
+ } ) ;
83
+
84
+ it ( 'should match when expected has more precision than needed' , ( ) => {
85
+ assert . strictEqual (
86
+ compareWithPrecision ( '123.456789' , '123.456789123456' , 6 ) ,
87
+ true
88
+ ) ;
89
+ } ) ;
90
+
91
+ it ( 'should fail when decimals differ within precision' , ( ) => {
92
+ assert . strictEqual (
93
+ compareWithPrecision ( '123.456689' , '123.456789' , 6 ) ,
94
+ false
95
+ ) ;
96
+ } ) ;
97
+
98
+ it ( 'should handle negative numbers' , ( ) => {
99
+ assert . strictEqual (
100
+ compareWithPrecision ( '-122.06429868936538' , '-122.06429868936539' , 13 ) ,
101
+ true
102
+ ) ;
103
+ } ) ;
104
+
105
+ it ( 'should fail when integer parts differ' , ( ) => {
106
+ assert . strictEqual (
107
+ compareWithPrecision ( '124.456789' , '123.456789' , 6 ) ,
108
+ false
109
+ ) ;
110
+ } ) ;
111
+
112
+ it ( 'should handle zero decimal places' , ( ) => {
113
+ assert . strictEqual (
114
+ compareWithPrecision ( '123.456789' , '123.456789' , 0 ) ,
115
+ true
116
+ ) ;
117
+ } ) ;
118
+
119
+ it ( 'should handle numbers without decimal points' , ( ) => {
120
+ assert . strictEqual (
121
+ compareWithPrecision ( '123' , '123' , 6 ) ,
122
+ true
123
+ ) ;
124
+ } ) ;
125
+
126
+ it ( 'should handle one number without decimal point' , ( ) => {
127
+ assert . strictEqual (
128
+ compareWithPrecision ( '123' , '123.000' , 3 ) ,
129
+ false
130
+ ) ;
131
+ } ) ;
132
+
133
+ it ( 'should match Redis coordinates with different precision' , ( ) => {
134
+ assert . strictEqual (
135
+ compareWithPrecision (
136
+ '-122.06429868936538696' ,
137
+ '-122.06429868936539' ,
138
+ 13
139
+ ) ,
140
+ true
141
+ ) ;
142
+ } ) ;
143
+
144
+ it ( 'should match Redis latitude with different precision' , ( ) => {
145
+ assert . strictEqual (
146
+ compareWithPrecision (
147
+ '37.37749628831998194' ,
148
+ '37.37749628831998' ,
149
+ 14
150
+ ) ,
151
+ true
152
+ ) ;
153
+ } ) ;
154
+ } ) ;
155
+
156
+ // Helper function to compare with fixed decimal places
157
+ const compareWithPrecision = ( actual , expected , decimals ) => {
158
+ const actualDotIndex = actual . indexOf ( '.' ) ;
159
+ const expectedDotIndex = expected . indexOf ( '.' ) ;
160
+
161
+ // If either number doesn't have a decimal point
162
+ if ( actualDotIndex === - 1 || expectedDotIndex === - 1 ) {
163
+ // If both don't have decimal points, compare directly
164
+ if ( actualDotIndex === - 1 && expectedDotIndex === - 1 ) {
165
+ return actual === expected ;
166
+ }
167
+ // If only one has a decimal point, add .000... to the other
168
+ const withoutDecimal = actualDotIndex === - 1 ? actual : expected ;
169
+ const withDecimal = actualDotIndex === - 1 ? expected : actual ;
170
+ return compareWithPrecision ( withoutDecimal + '.0' , withDecimal , decimals ) ;
171
+ }
172
+
173
+ const integerPart = actual . slice ( 0 , actualDotIndex ) ;
174
+ const decimalPart = actual . slice ( actualDotIndex + 1 , actualDotIndex + 1 + decimals ) ;
175
+
176
+ const expectedIntegerPart = expected . slice ( 0 , expectedDotIndex ) ;
177
+ const expectedDecimalPart = expected . slice ( expectedDotIndex + 1 , expectedDotIndex + 1 + decimals ) ;
178
+
179
+ return integerPart === expectedIntegerPart && decimalPart === expectedDecimalPart ;
180
+ } ;
0 commit comments