Ensure number conversion helpers do not return NaN
authorJérôme Benoit <jerome.benoit@sap.com>
Thu, 29 Dec 2022 22:48:03 +0000 (23:48 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Thu, 29 Dec 2022 22:48:03 +0000 (23:48 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/utils/Utils.ts
test/utils/UtilsTest.ts

index 08e87320ce2c83f9ab563c46e53ec01718723cb1..f28de9816d70771a634b7e93dcdd4ee904e000d7 100644 (file)
@@ -52,7 +52,9 @@ export default class Utils {
     return Utils.formatDurationMilliSeconds(duration * 1000);
   }
 
-  public static convertToDate(value: unknown): Date | null | undefined {
+  public static convertToDate(
+    value: Date | string | number | null | undefined
+  ): Date | null | undefined {
     if (Utils.isNullOrUndefined(value)) {
       return value as null | undefined;
     }
@@ -60,7 +62,7 @@ export default class Utils {
       return value;
     }
     if (Utils.isString(value) || typeof value === 'number') {
-      return new Date(value as string | number);
+      return new Date(value);
     }
     return null;
   }
@@ -74,11 +76,14 @@ export default class Utils {
       return value as number;
     }
     if (typeof value === 'number') {
-      changedValue = Math.trunc(value);
+      return Math.trunc(value);
     }
     if (Utils.isString(value)) {
       changedValue = parseInt(value as string);
     }
+    if (isNaN(changedValue)) {
+      throw new Error(`Cannot convert to integer: ${value.toString()}`);
+    }
     return changedValue;
   }
 
@@ -90,6 +95,9 @@ export default class Utils {
     if (Utils.isString(value)) {
       changedValue = parseFloat(value as string);
     }
+    if (isNaN(changedValue)) {
+      throw new Error(`Cannot convert to float: ${value.toString()}`);
+    }
     return changedValue;
   }
 
@@ -98,7 +106,7 @@ export default class Utils {
     if (value) {
       // Check the type
       if (typeof value === 'boolean') {
-        result = value;
+        return value;
       } else if (
         Utils.isString(value) &&
         ((value as string).toLowerCase() === 'true' || value === '1')
index b621f88aefdb9bbb63c6d122a423e000da438b5a..45ba4eb03bba02b78277c0cf6998934e89096d50 100644 (file)
@@ -28,12 +28,6 @@ describe('Utils test suite', () => {
     const invalidDate = Utils.convertToDate('');
     expect(invalidDate instanceof Date && !isNaN(invalidDate.getTime())).toBe(false);
     expect(Utils.convertToDate(0)).toStrictEqual(new Date('1970-01-01T00:00:00.000Z'));
-    expect(Utils.convertToDate([])).toBe(null);
-    expect(Utils.convertToDate({})).toBe(null);
-    expect(Utils.convertToDate(new Map())).toBe(null);
-    expect(Utils.convertToDate(new Set())).toBe(null);
-    expect(Utils.convertToDate(new WeakMap())).toBe(null);
-    expect(Utils.convertToDate(new WeakSet())).toBe(null);
     const dateStr = '2020-01-01T00:00:00.000Z';
     let date = Utils.convertToDate(dateStr);
     expect(date).toBeInstanceOf(Date);
@@ -59,6 +53,9 @@ describe('Utils test suite', () => {
     expect(Utils.convertToInt(1.1)).toBe(1);
     expect(Utils.convertToInt(1.9)).toBe(1);
     expect(Utils.convertToInt(1.999)).toBe(1);
+    expect(() => {
+      Utils.convertToInt('NaN');
+    }).toThrow('Cannot convert to integer: NaN');
   });
 
   it('Verify convertToFloat()', () => {
@@ -77,6 +74,9 @@ describe('Utils test suite', () => {
     expect(Utils.convertToFloat(1.1)).toBe(1.1);
     expect(Utils.convertToFloat(1.9)).toBe(1.9);
     expect(Utils.convertToFloat(1.999)).toBe(1.999);
+    expect(() => {
+      Utils.convertToFloat('NaN');
+    }).toThrow('Cannot convert to float: NaN');
   });
 
   it('Verify convertToBoolean()', () => {