| 
									
										
										
										
											2025-03-02 11:26:37 +01:00
										 |  |  | // This is necessary because we can't simply check if 0 is negative using equality,
 | 
					
						
							|  |  |  | // since -0 === 0 evaluates to true.
 | 
					
						
							|  |  |  | // test262 checks for negative zero in a similar way here:
 | 
					
						
							|  |  |  | // https://github.com/tc39/test262/blob/main/test/built-ins/parseFloat/S15.1.2.3_A1_T2.js
 | 
					
						
							|  |  |  | function isZeroNegative(x) { | 
					
						
							|  |  |  |     const isZero = x === 0; | 
					
						
							|  |  |  |     const isNegative = 1 / x === Number.NEGATIVE_INFINITY; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return isZero && isNegative; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-04 10:09:48 -07:00
										 |  |  | test("parsing numbers", () => { | 
					
						
							| 
									
										
										
										
											2020-07-06 07:37:45 -07:00
										 |  |  |     [ | 
					
						
							|  |  |  |         [1, 1], | 
					
						
							|  |  |  |         [0.23, 0.23], | 
					
						
							|  |  |  |         [1.23, 1.23], | 
					
						
							|  |  |  |         [0.0123e2, 1.23], | 
					
						
							|  |  |  |         [1.23e4, 12300], | 
					
						
							|  |  |  |         [Infinity, Infinity], | 
					
						
							|  |  |  |     ].forEach(test => { | 
					
						
							|  |  |  |         expect(parseFloat(test[0])).toBe(test[1]); | 
					
						
							|  |  |  |         expect(parseFloat(+test[0])).toBe(test[1]); | 
					
						
							|  |  |  |         expect(parseFloat(-test[0])).toBe(-test[1]); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2020-07-04 10:09:48 -07:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2020-05-17 15:12:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-02 11:26:37 +01:00
										 |  |  | test("parsing zero", () => { | 
					
						
							|  |  |  |     expect(isZeroNegative(parseFloat("0"))).toBeFalse(); | 
					
						
							|  |  |  |     expect(isZeroNegative(parseFloat("+0"))).toBeFalse(); | 
					
						
							|  |  |  |     expect(isZeroNegative(parseFloat("-0"))).toBeTrue(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(isZeroNegative(parseFloat(0))).toBeFalse(); | 
					
						
							|  |  |  |     expect(isZeroNegative(parseFloat(+0))).toBeFalse(); | 
					
						
							|  |  |  |     expect(isZeroNegative(parseFloat(-0))).toBeFalse(); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-04 10:09:48 -07:00
										 |  |  | test("parsing strings", () => { | 
					
						
							| 
									
										
										
										
											2020-07-06 07:37:45 -07:00
										 |  |  |     [ | 
					
						
							|  |  |  |         ["0", 0], | 
					
						
							|  |  |  |         ["1", 1], | 
					
						
							|  |  |  |         [".23", 0.23], | 
					
						
							|  |  |  |         ["1.23", 1.23], | 
					
						
							|  |  |  |         ["0.0123E+2", 1.23], | 
					
						
							|  |  |  |         ["1.23e4", 12300], | 
					
						
							| 
									
										
										
										
											2022-10-12 02:12:13 +02:00
										 |  |  |         ["0x1.23p5", 0], | 
					
						
							|  |  |  |         ["1.23p5", 1.23], | 
					
						
							|  |  |  |         ["1.23e42351245", Infinity], | 
					
						
							| 
									
										
										
										
											2020-07-06 07:37:45 -07:00
										 |  |  |         ["Infinity", Infinity], | 
					
						
							|  |  |  |     ].forEach(test => { | 
					
						
							|  |  |  |         expect(parseFloat(test[0])).toBe(test[1]); | 
					
						
							|  |  |  |         expect(parseFloat(`+${test[0]}`)).toBe(test[1]); | 
					
						
							|  |  |  |         expect(parseFloat(`-${test[0]}`)).toBe(-test[1]); | 
					
						
							|  |  |  |         expect(parseFloat(`${test[0]}foo`)).toBe(test[1]); | 
					
						
							|  |  |  |         expect(parseFloat(`+${test[0]}foo`)).toBe(test[1]); | 
					
						
							|  |  |  |         expect(parseFloat(`-${test[0]}foo`)).toBe(-test[1]); | 
					
						
							|  |  |  |         expect(parseFloat(`   \n  \t ${test[0]} \v  foo   `)).toBe(test[1]); | 
					
						
							|  |  |  |         expect(parseFloat(`   \r -${test[0]} \f \n\n  foo   `)).toBe(-test[1]); | 
					
						
							|  |  |  |         expect(parseFloat({ toString: () => test[0] })).toBe(test[1]); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2020-07-04 10:09:48 -07:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2020-05-17 15:12:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-04 10:09:48 -07:00
										 |  |  | test("parsing NaN", () => { | 
					
						
							| 
									
										
										
										
											2020-07-06 07:37:45 -07:00
										 |  |  |     [ | 
					
						
							|  |  |  |         "", | 
					
						
							|  |  |  |         [], | 
					
						
							|  |  |  |         [], | 
					
						
							|  |  |  |         true, | 
					
						
							|  |  |  |         false, | 
					
						
							|  |  |  |         null, | 
					
						
							|  |  |  |         undefined, | 
					
						
							|  |  |  |         NaN, | 
					
						
							|  |  |  |         "foo123", | 
					
						
							|  |  |  |         "foo+123", | 
					
						
							|  |  |  |         "fooInfinity", | 
					
						
							|  |  |  |         "foo+Infinity", | 
					
						
							|  |  |  |     ].forEach(value => { | 
					
						
							|  |  |  |         expect(parseFloat(value)).toBeNaN(); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2020-05-17 15:12:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-06 07:37:45 -07:00
										 |  |  |     expect(parseFloat()).toBeNaN(); | 
					
						
							|  |  |  |     expect(parseFloat("", 123, Infinity)).toBeNaN(); | 
					
						
							| 
									
										
										
										
											2020-07-04 10:09:48 -07:00
										 |  |  | }); |