Browse Source

refactoring

Richard Köhl 3 years ago
parent
commit
104cb53161
4 changed files with 53 additions and 32 deletions
  1. 39 22
      src/ordered-numbers.class.test.ts
  2. 8 6
      src/ordered-numbers.class.ts
  3. 3 1
      src/prime.class.test.ts
  4. 3 3
      src/prime.class.ts

+ 39 - 22
src/ordered-unique-numbers.class.test.ts → src/ordered-numbers.class.test.ts

@@ -2,63 +2,80 @@ import {
   assert,
   assert,
   assertEquals,
   assertEquals,
 } from "https://deno.land/std@0.161.0/testing/asserts.ts";
 } from "https://deno.land/std@0.161.0/testing/asserts.ts";
-import { OrderedUniqueNumbers } from "./ordered-unique-numbers.class.ts";
+import { OrderedNumbers } from "./ordered-numbers.class.ts";
 
 
-Deno.test("OrderedUniqueNumbers class", async (t) => {
+Deno.test("OrderedNumbers class", async (t) => {
   await t.step("getter list()", async (t) => {
   await t.step("getter list()", async (t) => {
     await t.step("returns unmodified list of ordered unique numbers", () => {
     await t.step("returns unmodified list of ordered unique numbers", () => {
       const input = [2, 3, 5, 7, 11, 13];
       const input = [2, 3, 5, 7, 11, 13];
-      const numbers = new OrderedUniqueNumbers(input);
-      assertEquals(numbers.list, input);
+      const numbers = new OrderedNumbers(input);
+      assertEquals(numbers.list, input, "set to unique");
+      assertEquals(
+        (new OrderedNumbers(input, false)).list,
+        input,
+        "not set to unique",
+      );
     });
     });
 
 
     await t.step("returns ascending ordered list of numbers", () => {
     await t.step("returns ascending ordered list of numbers", () => {
       const input = [2, 13, 5, 7, 11, 3];
       const input = [2, 13, 5, 7, 11, 3];
-      const numbers = new OrderedUniqueNumbers(input);
+      const numbers = new OrderedNumbers(input);
       assertEquals(numbers.list, [2, 3, 5, 7, 11, 13]);
       assertEquals(numbers.list, [2, 3, 5, 7, 11, 13]);
     });
     });
 
 
     await t.step("returns list of unique numbers", () => {
     await t.step("returns list of unique numbers", () => {
       const input = [2, 2, 3, 5, 7, 11, 11, 11, 11, 13];
       const input = [2, 2, 3, 5, 7, 11, 11, 11, 11, 13];
-      const numbers = new OrderedUniqueNumbers(input);
+      const numbers = new OrderedNumbers(input);
       assertEquals(numbers.list, [2, 3, 5, 7, 11, 13]);
       assertEquals(numbers.list, [2, 3, 5, 7, 11, 13]);
     });
     });
 
 
+    await t.step("returns list of non-unique numbers", () => {
+      const input = [2, 2, 3, 5, 7, 11, 11, 11, 11, 13];
+      const numbers = new OrderedNumbers(input, false);
+      assertEquals(numbers.list, [2, 2, 3, 5, 7, 11, 11, 11, 11, 13]);
+    });
+
     await t.step("returns list of ordered unique numbers", () => {
     await t.step("returns list of ordered unique numbers", () => {
       const input = [11, 11, 2, 5, 7, 11, 11, 13, 2, 3];
       const input = [11, 11, 2, 5, 7, 11, 11, 13, 2, 3];
-      const numbers = new OrderedUniqueNumbers(input);
+      const numbers = new OrderedNumbers(input);
       assertEquals(numbers.list, [2, 3, 5, 7, 11, 13]);
       assertEquals(numbers.list, [2, 3, 5, 7, 11, 13]);
     });
     });
+
+    await t.step("returns list of ordered non-unique numbers", () => {
+      const input = [11, 11, 2, 5, 7, 11, 11, 13, 2, 3];
+      const numbers = new OrderedNumbers(input, false);
+      assertEquals(numbers.list, [2, 2, 3, 5, 7, 11, 11, 11, 11, 13]);
+    });
   });
   });
 
 
   await t.step("getter max()", async (t) => {
   await t.step("getter max()", async (t) => {
     await t.step("returns undefined for empty list", () => {
     await t.step("returns undefined for empty list", () => {
       const input: number[] = [];
       const input: number[] = [];
-      const numbers = new OrderedUniqueNumbers(input);
+      const numbers = new OrderedNumbers(input);
       assertEquals(numbers.max, undefined);
       assertEquals(numbers.max, undefined);
     });
     });
 
 
     await t.step("returns only number in list", () => {
     await t.step("returns only number in list", () => {
       const input = [11];
       const input = [11];
-      const numbers = new OrderedUniqueNumbers(input);
+      const numbers = new OrderedNumbers(input);
       assertEquals(numbers.max, 11);
       assertEquals(numbers.max, 11);
     });
     });
 
 
     await t.step("returns greatest number in list", () => {
     await t.step("returns greatest number in list", () => {
       const input = [2, 3, 5, 7, 11, 13];
       const input = [2, 3, 5, 7, 11, 13];
-      const numbers = new OrderedUniqueNumbers(input);
+      const numbers = new OrderedNumbers(input);
       assertEquals(numbers.max, 13);
       assertEquals(numbers.max, 13);
     });
     });
   });
   });
 
 
   await t.step("method contains()", async (t) => {
   await t.step("method contains()", async (t) => {
     await t.step("returns true if input is found in list", () => {
     await t.step("returns true if input is found in list", () => {
-      const numbers = new OrderedUniqueNumbers([2, 3, 5, 7, 11, 13]);
+      const numbers = new OrderedNumbers([2, 3, 5, 7, 11, 13]);
       assert(numbers.contains(5));
       assert(numbers.contains(5));
     });
     });
 
 
     await t.step("returns false if input is not found in list", () => {
     await t.step("returns false if input is not found in list", () => {
-      const numbers = new OrderedUniqueNumbers([2, 3, 5, 7, 11, 13]);
+      const numbers = new OrderedNumbers([2, 3, 5, 7, 11, 13]);
       assert(!numbers.contains(6));
       assert(!numbers.contains(6));
     });
     });
   });
   });
@@ -67,7 +84,7 @@ Deno.test("OrderedUniqueNumbers class", async (t) => {
     await t.step(
     await t.step(
       "adds a larger number to the end of the list and returns it",
       "adds a larger number to the end of the list and returns it",
       () => {
       () => {
-        const numbers = new OrderedUniqueNumbers([2, 3, 5, 7, 11, 13]);
+        const numbers = new OrderedNumbers([2, 3, 5, 7, 11, 13]);
         numbers.add(15);
         numbers.add(15);
         assertEquals(numbers.list, [2, 3, 5, 7, 11, 13, 15]);
         assertEquals(numbers.list, [2, 3, 5, 7, 11, 13, 15]);
       },
       },
@@ -76,7 +93,7 @@ Deno.test("OrderedUniqueNumbers class", async (t) => {
     await t.step(
     await t.step(
       "does not add number if already present and returns list",
       "does not add number if already present and returns list",
       () => {
       () => {
-        const numbers = new OrderedUniqueNumbers([2, 3, 5, 7, 11, 13]);
+        const numbers = new OrderedNumbers([2, 3, 5, 7, 11, 13]);
         numbers.add(13);
         numbers.add(13);
         assertEquals(numbers.list, [2, 3, 5, 7, 11, 13]);
         assertEquals(numbers.list, [2, 3, 5, 7, 11, 13]);
       },
       },
@@ -85,7 +102,7 @@ Deno.test("OrderedUniqueNumbers class", async (t) => {
     await t.step(
     await t.step(
       "adds a smaller number to the start of the list and returns it",
       "adds a smaller number to the start of the list and returns it",
       () => {
       () => {
-        const numbers = new OrderedUniqueNumbers([2, 3, 5, 7, 11, 13]);
+        const numbers = new OrderedNumbers([2, 3, 5, 7, 11, 13]);
         numbers.add(1);
         numbers.add(1);
         assertEquals(numbers.list, [1, 2, 3, 5, 7, 11, 13]);
         assertEquals(numbers.list, [1, 2, 3, 5, 7, 11, 13]);
       },
       },
@@ -94,7 +111,7 @@ Deno.test("OrderedUniqueNumbers class", async (t) => {
     await t.step(
     await t.step(
       "inserts number to the proper position of the list and returns it",
       "inserts number to the proper position of the list and returns it",
       () => {
       () => {
-        const numbers = new OrderedUniqueNumbers([2, 3, 5, 7, 11, 13]);
+        const numbers = new OrderedNumbers([2, 3, 5, 7, 11, 13]);
         numbers.add(6);
         numbers.add(6);
         assertEquals(numbers.list, [2, 3, 5, 6, 7, 11, 13]);
         assertEquals(numbers.list, [2, 3, 5, 6, 7, 11, 13]);
       },
       },
@@ -105,7 +122,7 @@ Deno.test("OrderedUniqueNumbers class", async (t) => {
     await t.step(
     await t.step(
       "removes a number from the list and returns it",
       "removes a number from the list and returns it",
       () => {
       () => {
-        const numbers = new OrderedUniqueNumbers([2, 3, 5, 7, 11, 13]);
+        const numbers = new OrderedNumbers([2, 3, 5, 7, 11, 13]);
         numbers.remove(7);
         numbers.remove(7);
         assertEquals(numbers.list, [2, 3, 5, 11, 13]);
         assertEquals(numbers.list, [2, 3, 5, 11, 13]);
       },
       },
@@ -114,7 +131,7 @@ Deno.test("OrderedUniqueNumbers class", async (t) => {
     await t.step(
     await t.step(
       "does not modify list if input is not present in list and returns it",
       "does not modify list if input is not present in list and returns it",
       () => {
       () => {
-        const numbers = new OrderedUniqueNumbers([2, 3, 5, 7, 11, 13]);
+        const numbers = new OrderedNumbers([2, 3, 5, 7, 11, 13]);
         numbers.remove(8);
         numbers.remove(8);
         assertEquals(numbers.list, [2, 3, 5, 7, 11, 13]);
         assertEquals(numbers.list, [2, 3, 5, 7, 11, 13]);
       },
       },
@@ -125,7 +142,7 @@ Deno.test("OrderedUniqueNumbers class", async (t) => {
     await t.step(
     await t.step(
       "returns the next larger number found in list",
       "returns the next larger number found in list",
       () => {
       () => {
-        const numbers = new OrderedUniqueNumbers([2, 3, 5, 7, 11, 13]);
+        const numbers = new OrderedNumbers([2, 3, 5, 7, 11, 13]);
         assertEquals(numbers.findNextLargerValue(6), 7);
         assertEquals(numbers.findNextLargerValue(6), 7);
       },
       },
     );
     );
@@ -133,7 +150,7 @@ Deno.test("OrderedUniqueNumbers class", async (t) => {
     await t.step(
     await t.step(
       "returns the next larger number found in list - even if input exists",
       "returns the next larger number found in list - even if input exists",
       () => {
       () => {
-        const numbers = new OrderedUniqueNumbers([2, 3, 5, 7, 11, 13]);
+        const numbers = new OrderedNumbers([2, 3, 5, 7, 11, 13]);
         assertEquals(numbers.findNextLargerValue(7), 11);
         assertEquals(numbers.findNextLargerValue(7), 11);
       },
       },
     );
     );
@@ -141,7 +158,7 @@ Deno.test("OrderedUniqueNumbers class", async (t) => {
     await t.step(
     await t.step(
       "returns the first number of list if input is smaller",
       "returns the first number of list if input is smaller",
       () => {
       () => {
-        const numbers = new OrderedUniqueNumbers([2, 3, 5, 7, 11, 13]);
+        const numbers = new OrderedNumbers([2, 3, 5, 7, 11, 13]);
         assertEquals(numbers.findNextLargerValue(-5), 2);
         assertEquals(numbers.findNextLargerValue(-5), 2);
       },
       },
     );
     );
@@ -149,7 +166,7 @@ Deno.test("OrderedUniqueNumbers class", async (t) => {
     await t.step(
     await t.step(
       "returns undefined if input is larger than largest in list",
       "returns undefined if input is larger than largest in list",
       () => {
       () => {
-        const numbers = new OrderedUniqueNumbers([2, 3, 5, 7, 11, 13]);
+        const numbers = new OrderedNumbers([2, 3, 5, 7, 11, 13]);
         assertEquals(numbers.findNextLargerValue(15), undefined);
         assertEquals(numbers.findNextLargerValue(15), undefined);
       },
       },
     );
     );

+ 8 - 6
src/ordered-unique-numbers.class.ts → src/ordered-numbers.class.ts

@@ -1,8 +1,10 @@
-export class OrderedUniqueNumbers {
-  constructor(private numbers: number[] = []) {
+export class OrderedNumbers {
+  constructor(private numbers: number[] = [], private readonly unique = true) {
     if (!this.isValid) {
     if (!this.isValid) {
       this.sort();
       this.sort();
-      this.makeUnique();
+      if (this.unique) {
+        this.makeUnique();
+      }
     }
     }
   }
   }
 
 
@@ -29,12 +31,12 @@ export class OrderedUniqueNumbers {
   }
   }
 
 
   private get isUnique(): boolean {
   private get isUnique(): boolean {
-    return this.numbers.filter(OrderedUniqueNumbers.filterUnique).length ===
+    return this.numbers.filter(OrderedNumbers.filterUnique).length ===
       this.numbers.length;
       this.numbers.length;
   }
   }
 
 
   private makeUnique(): number[] {
   private makeUnique(): number[] {
-    this.numbers = this.numbers.filter(OrderedUniqueNumbers.filterUnique);
+    this.numbers = this.numbers.filter(OrderedNumbers.filterUnique);
 
 
     return this.numbers;
     return this.numbers;
   }
   }
@@ -52,7 +54,7 @@ export class OrderedUniqueNumbers {
   }
   }
 
 
   public add(number: number): number[] {
   public add(number: number): number[] {
-    if (this.contains(number)) {
+    if (this.unique && this.contains(number)) {
       return this.list;
       return this.list;
     }
     }
 
 

+ 3 - 1
src/prime.class.test.ts

@@ -30,7 +30,7 @@ Deno.test("Prime class", async (t) => {
 
 
   await t.step("static method list()", async (t) => {
   await t.step("static method list()", async (t) => {
     await t.step("returns the list of prime numbers", () => {
     await t.step("returns the list of prime numbers", () => {
-      assertEquals(Prime.list(20), [
+      assertEquals(Prime.list(19), [
         2,
         2,
         3,
         3,
         5,
         5,
@@ -96,6 +96,8 @@ Deno.test("Prime class", async (t) => {
         5,
         5,
         7,
         7,
       ]);
       ]);
+
+      assertEquals(Prime.list(1), []);
     });
     });
   });
   });
 
 

+ 3 - 3
src/prime.class.ts

@@ -1,7 +1,7 @@
-import { OrderedUniqueNumbers } from "./ordered-unique-numbers.class.ts";
+import { OrderedNumbers } from "./ordered-numbers.class.ts";
 
 
 export class Prime {
 export class Prime {
-  private static values: OrderedUniqueNumbers = new OrderedUniqueNumbers([
+  private static values: OrderedNumbers = new OrderedNumbers([
     2,
     2,
     3,
     3,
     5,
     5,
@@ -214,7 +214,7 @@ export class Prime {
       return [];
       return [];
     }
     }
 
 
-    // find the next bigger prime number
+    // find the next bigger prime number after input
     const outOfLimit = Prime.next(to);
     const outOfLimit = Prime.next(to);
 
 
     // deliver the list of known primes up to (but excluding) retrieved prime
     // deliver the list of known primes up to (but excluding) retrieved prime