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,
   assertEquals,
 } 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("returns unmodified list of ordered unique numbers", () => {
       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", () => {
       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]);
     });
 
     await t.step("returns list of unique numbers", () => {
       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]);
     });
 
+    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", () => {
       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]);
     });
+
+    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("returns undefined for empty list", () => {
       const input: number[] = [];
-      const numbers = new OrderedUniqueNumbers(input);
+      const numbers = new OrderedNumbers(input);
       assertEquals(numbers.max, undefined);
     });
 
     await t.step("returns only number in list", () => {
       const input = [11];
-      const numbers = new OrderedUniqueNumbers(input);
+      const numbers = new OrderedNumbers(input);
       assertEquals(numbers.max, 11);
     });
 
     await t.step("returns greatest number in list", () => {
       const input = [2, 3, 5, 7, 11, 13];
-      const numbers = new OrderedUniqueNumbers(input);
+      const numbers = new OrderedNumbers(input);
       assertEquals(numbers.max, 13);
     });
   });
 
   await t.step("method contains()", async (t) => {
     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));
     });
 
     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));
     });
   });
@@ -67,7 +84,7 @@ Deno.test("OrderedUniqueNumbers class", async (t) => {
     await t.step(
       "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);
         assertEquals(numbers.list, [2, 3, 5, 7, 11, 13, 15]);
       },
@@ -76,7 +93,7 @@ Deno.test("OrderedUniqueNumbers class", async (t) => {
     await t.step(
       "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);
         assertEquals(numbers.list, [2, 3, 5, 7, 11, 13]);
       },
@@ -85,7 +102,7 @@ Deno.test("OrderedUniqueNumbers class", async (t) => {
     await t.step(
       "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);
         assertEquals(numbers.list, [1, 2, 3, 5, 7, 11, 13]);
       },
@@ -94,7 +111,7 @@ Deno.test("OrderedUniqueNumbers class", async (t) => {
     await t.step(
       "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);
         assertEquals(numbers.list, [2, 3, 5, 6, 7, 11, 13]);
       },
@@ -105,7 +122,7 @@ Deno.test("OrderedUniqueNumbers class", async (t) => {
     await t.step(
       "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);
         assertEquals(numbers.list, [2, 3, 5, 11, 13]);
       },
@@ -114,7 +131,7 @@ Deno.test("OrderedUniqueNumbers class", async (t) => {
     await t.step(
       "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);
         assertEquals(numbers.list, [2, 3, 5, 7, 11, 13]);
       },
@@ -125,7 +142,7 @@ Deno.test("OrderedUniqueNumbers class", async (t) => {
     await t.step(
       "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);
       },
     );
@@ -133,7 +150,7 @@ Deno.test("OrderedUniqueNumbers class", async (t) => {
     await t.step(
       "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);
       },
     );
@@ -141,7 +158,7 @@ Deno.test("OrderedUniqueNumbers class", async (t) => {
     await t.step(
       "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);
       },
     );
@@ -149,7 +166,7 @@ Deno.test("OrderedUniqueNumbers class", async (t) => {
     await t.step(
       "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);
       },
     );

+ 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) {
       this.sort();
-      this.makeUnique();
+      if (this.unique) {
+        this.makeUnique();
+      }
     }
   }
 
@@ -29,12 +31,12 @@ export class OrderedUniqueNumbers {
   }
 
   private get isUnique(): boolean {
-    return this.numbers.filter(OrderedUniqueNumbers.filterUnique).length ===
+    return this.numbers.filter(OrderedNumbers.filterUnique).length ===
       this.numbers.length;
   }
 
   private makeUnique(): number[] {
-    this.numbers = this.numbers.filter(OrderedUniqueNumbers.filterUnique);
+    this.numbers = this.numbers.filter(OrderedNumbers.filterUnique);
 
     return this.numbers;
   }
@@ -52,7 +54,7 @@ export class OrderedUniqueNumbers {
   }
 
   public add(number: number): number[] {
-    if (this.contains(number)) {
+    if (this.unique && this.contains(number)) {
       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("returns the list of prime numbers", () => {
-      assertEquals(Prime.list(20), [
+      assertEquals(Prime.list(19), [
         2,
         3,
         5,
@@ -96,6 +96,8 @@ Deno.test("Prime class", async (t) => {
         5,
         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 {
-  private static values: OrderedUniqueNumbers = new OrderedUniqueNumbers([
+  private static values: OrderedNumbers = new OrderedNumbers([
     2,
     3,
     5,
@@ -214,7 +214,7 @@ export class Prime {
       return [];
     }
 
-    // find the next bigger prime number
+    // find the next bigger prime number after input
     const outOfLimit = Prime.next(to);
 
     // deliver the list of known primes up to (but excluding) retrieved prime