|
|
@@ -0,0 +1,157 @@
|
|
|
+import {
|
|
|
+ assert,
|
|
|
+ assertEquals,
|
|
|
+} from "https://deno.land/std@0.161.0/testing/asserts.ts";
|
|
|
+import { OrderedUniqueNumbers } from "./ordered-unique-numbers.class.ts";
|
|
|
+
|
|
|
+Deno.test("OrderedUniqueNumbers 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);
|
|
|
+ });
|
|
|
+
|
|
|
+ await t.step("returns ascending ordered list of numbers", () => {
|
|
|
+ const input = [2, 13, 5, 7, 11, 3];
|
|
|
+ const numbers = new OrderedUniqueNumbers(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);
|
|
|
+ assertEquals(numbers.list, [2, 3, 5, 7, 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);
|
|
|
+ assertEquals(numbers.list, [2, 3, 5, 7, 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);
|
|
|
+ assertEquals(numbers.max, undefined);
|
|
|
+ });
|
|
|
+
|
|
|
+ await t.step("returns only number in list", () => {
|
|
|
+ const input = [11];
|
|
|
+ const numbers = new OrderedUniqueNumbers(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);
|
|
|
+ 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]);
|
|
|
+ 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]);
|
|
|
+ assert(!numbers.contains(6));
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ await t.step("method add()", 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]);
|
|
|
+ numbers.add(15);
|
|
|
+ assertEquals(numbers.list, [2, 3, 5, 7, 11, 13, 15]);
|
|
|
+ },
|
|
|
+ );
|
|
|
+
|
|
|
+ await t.step(
|
|
|
+ "does not add number if already present and returns list",
|
|
|
+ () => {
|
|
|
+ const numbers = new OrderedUniqueNumbers([2, 3, 5, 7, 11, 13]);
|
|
|
+ numbers.add(13);
|
|
|
+ assertEquals(numbers.list, [2, 3, 5, 7, 11, 13]);
|
|
|
+ },
|
|
|
+ );
|
|
|
+
|
|
|
+ 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]);
|
|
|
+ numbers.add(1);
|
|
|
+ assertEquals(numbers.list, [1, 2, 3, 5, 7, 11, 13]);
|
|
|
+ },
|
|
|
+ );
|
|
|
+
|
|
|
+ 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]);
|
|
|
+ numbers.add(6);
|
|
|
+ assertEquals(numbers.list, [2, 3, 5, 6, 7, 11, 13]);
|
|
|
+ },
|
|
|
+ );
|
|
|
+ });
|
|
|
+
|
|
|
+ await t.step("method remove()", async (t) => {
|
|
|
+ await t.step(
|
|
|
+ "removes a number from the list and returns it",
|
|
|
+ () => {
|
|
|
+ const numbers = new OrderedUniqueNumbers([2, 3, 5, 7, 11, 13]);
|
|
|
+ numbers.remove(7);
|
|
|
+ assertEquals(numbers.list, [2, 3, 5, 11, 13]);
|
|
|
+ },
|
|
|
+ );
|
|
|
+
|
|
|
+ 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]);
|
|
|
+ numbers.remove(8);
|
|
|
+ assertEquals(numbers.list, [2, 3, 5, 7, 11, 13]);
|
|
|
+ },
|
|
|
+ );
|
|
|
+ });
|
|
|
+
|
|
|
+ await t.step("method findNextLargerValue()", async (t) => {
|
|
|
+ await t.step(
|
|
|
+ "returns the next larger number found in list",
|
|
|
+ () => {
|
|
|
+ const numbers = new OrderedUniqueNumbers([2, 3, 5, 7, 11, 13]);
|
|
|
+ assertEquals(numbers.findNextLargerValue(6), 7);
|
|
|
+ },
|
|
|
+ );
|
|
|
+
|
|
|
+ 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]);
|
|
|
+ assertEquals(numbers.findNextLargerValue(7), 11);
|
|
|
+ },
|
|
|
+ );
|
|
|
+
|
|
|
+ await t.step(
|
|
|
+ "returns the first number of list if input is smaller",
|
|
|
+ () => {
|
|
|
+ const numbers = new OrderedUniqueNumbers([2, 3, 5, 7, 11, 13]);
|
|
|
+ assertEquals(numbers.findNextLargerValue(-5), 2);
|
|
|
+ },
|
|
|
+ );
|
|
|
+
|
|
|
+ await t.step(
|
|
|
+ "returns undefined if input is larger than largest in list",
|
|
|
+ () => {
|
|
|
+ const numbers = new OrderedUniqueNumbers([2, 3, 5, 7, 11, 13]);
|
|
|
+ assertEquals(numbers.findNextLargerValue(15), undefined);
|
|
|
+ },
|
|
|
+ );
|
|
|
+ });
|
|
|
+});
|