From 2b5f14cf6979706d394a7699aa00f2b5e9d02bbb Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Mon, 31 Jan 2022 16:37:54 -0500 Subject: [PATCH 01/44] Require Hello World in the document --- src/text.Test.tsx | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/text.Test.tsx diff --git a/src/text.Test.tsx b/src/text.Test.tsx new file mode 100644 index 0000000000..b32c330d3f --- /dev/null +++ b/src/text.Test.tsx @@ -0,0 +1,9 @@ +import React from "react"; +import { render, screen } from "@testing-library/react"; +import App from "./App"; + +test("renders the text 'Hello World' somewhere", () => { + render(); + const text = screen.getByText(/Hello World/); + expect(text).toBeInTheDocument(); +}); From a7dee05e0bee0379110c6189433d12482280146a Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Mon, 31 Jan 2022 16:41:17 -0500 Subject: [PATCH 02/44] Rename text.Test.tsx to text.test.tsx --- src/{text.Test.tsx => text.test.tsx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{text.Test.tsx => text.test.tsx} (100%) diff --git a/src/text.Test.tsx b/src/text.test.tsx similarity index 100% rename from src/text.Test.tsx rename to src/text.test.tsx From 3e381f38b1d44afd102eb053a8ba9a48a069434e Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Mon, 31 Jan 2022 16:56:42 -0500 Subject: [PATCH 03/44] Include the task info --- public/tasks/task-first-branch.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 public/tasks/task-first-branch.md diff --git a/public/tasks/task-first-branch.md b/public/tasks/task-first-branch.md new file mode 100644 index 0000000000..94333338a0 --- /dev/null +++ b/public/tasks/task-first-branch.md @@ -0,0 +1,5 @@ +# Task - First Branch + +Version: 0.0.1 + +Pass a short test to have certain text on the page. From e6b1dab1961daf6f03459789cef974bf043501f2 Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Thu, 3 Feb 2022 14:10:55 -0500 Subject: [PATCH 04/44] Allow one or more instances of the Hello World text --- src/text.test.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/text.test.tsx b/src/text.test.tsx index b32c330d3f..f99a063e76 100644 --- a/src/text.test.tsx +++ b/src/text.test.tsx @@ -4,6 +4,6 @@ import App from "./App"; test("renders the text 'Hello World' somewhere", () => { render(); - const text = screen.getByText(/Hello World/); - expect(text).toBeInTheDocument(); + const texts = screen.getAllByText(/Hello World/); + expect(texts.length).toBeGreaterThanOrEqual(1); }); From 7a207345d9e404afd04607811b89bb758de02905 Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Sat, 24 Aug 2024 12:52:12 -0400 Subject: [PATCH 05/44] Include json test command here --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index cf6e1bc772..fc2b66a549 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "build": "react-scripts build", "test": "react-scripts test", "test:cov": "react-scripts test --coverage --watchAll", + "test:json": "react-scripts test --json --watchAll=false --outputFile jest-output.json --coverage", "eject": "react-scripts eject", "lint": "eslint ./src --ext .tsx --ext .ts --max-warnings 0", "eslint-output": "eslint-output ./src --ext .tsx --ext .ts --max-warnings 0", From 7fe9ca316fad2e694586e037fe601b85a2584c56 Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Mon, 31 Jan 2022 16:37:54 -0500 Subject: [PATCH 06/44] Require Hello World in the document --- src/text.Test.tsx | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/text.Test.tsx diff --git a/src/text.Test.tsx b/src/text.Test.tsx new file mode 100644 index 0000000000..b32c330d3f --- /dev/null +++ b/src/text.Test.tsx @@ -0,0 +1,9 @@ +import React from "react"; +import { render, screen } from "@testing-library/react"; +import App from "./App"; + +test("renders the text 'Hello World' somewhere", () => { + render(); + const text = screen.getByText(/Hello World/); + expect(text).toBeInTheDocument(); +}); From b8b8878c873d4faa2fd5f04d656e23d66c7d6cef Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Mon, 31 Jan 2022 16:56:42 -0500 Subject: [PATCH 07/44] Include the task info --- public/tasks/task-first-branch.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 public/tasks/task-first-branch.md diff --git a/public/tasks/task-first-branch.md b/public/tasks/task-first-branch.md new file mode 100644 index 0000000000..94333338a0 --- /dev/null +++ b/public/tasks/task-first-branch.md @@ -0,0 +1,5 @@ +# Task - First Branch + +Version: 0.0.1 + +Pass a short test to have certain text on the page. From fbdebdec2006b01d3976bd9408037baf82eb5e56 Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Mon, 31 Jan 2022 16:41:17 -0500 Subject: [PATCH 08/44] Rename text.Test.tsx to text.test.tsx --- src/{text.Test.tsx => text.test.tsx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{text.Test.tsx => text.test.tsx} (100%) diff --git a/src/text.Test.tsx b/src/text.test.tsx similarity index 100% rename from src/text.Test.tsx rename to src/text.test.tsx From 2f0146c22beca5c5ac48603876f0fa8ea2e2e905 Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Thu, 3 Feb 2022 14:10:55 -0500 Subject: [PATCH 09/44] Allow one or more instances of the Hello World text --- src/text.test.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/text.test.tsx b/src/text.test.tsx index b32c330d3f..f99a063e76 100644 --- a/src/text.test.tsx +++ b/src/text.test.tsx @@ -4,6 +4,6 @@ import App from "./App"; test("renders the text 'Hello World' somewhere", () => { render(); - const text = screen.getByText(/Hello World/); - expect(text).toBeInTheDocument(); + const texts = screen.getAllByText(/Hello World/); + expect(texts.length).toBeGreaterThanOrEqual(1); }); From ac36b32302a8ea2e66b4b954626c8e396e172075 Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Sat, 29 Jan 2022 23:59:24 -0500 Subject: [PATCH 10/44] First set of tests --- public/tasks/task-html-css.md | 5 +++++ src/HtmlCss.test.tsx | 28 ++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 public/tasks/task-html-css.md create mode 100644 src/HtmlCss.test.tsx diff --git a/public/tasks/task-html-css.md b/public/tasks/task-html-css.md new file mode 100644 index 0000000000..ebc0efcba5 --- /dev/null +++ b/public/tasks/task-html-css.md @@ -0,0 +1,5 @@ +# Task - HTML/CSS + +Version: 0.0.1 + +Add in some HTML and CSS, including a fancy looking button. diff --git a/src/HtmlCss.test.tsx b/src/HtmlCss.test.tsx new file mode 100644 index 0000000000..168ce37fde --- /dev/null +++ b/src/HtmlCss.test.tsx @@ -0,0 +1,28 @@ +import React from "react"; +import { render, screen } from "@testing-library/react"; +import App from "./App"; + +describe("Some HTML Elements are added.", () => { + test("There is a header", () => { + render(); + const header = screen.getByRole("heading"); + expect(header).toBeInTheDocument(); + }); +}); + +describe("Some basic CSS is added.", () => { + test("There is a floating red box", () => { + render(); + expect(true); + }); +}); + +describe("Some Bootstrap Elements are added", () => { + test("There is a bootstrap button", () => { + render(); + const button = screen.getByRole("button"); + expect(button).toBeInTheDocument(); + expect(button).toHaveClass("btn"); + expect(button).toHaveClass("btn-primary"); + }); +}); From d04739d1d2ec0c934c0ecf1dc05ac1289063627d Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Sun, 30 Jan 2022 00:24:38 -0500 Subject: [PATCH 11/44] Some logging tests --- src/HtmlCss.test.tsx | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/HtmlCss.test.tsx b/src/HtmlCss.test.tsx index 168ce37fde..bf957616f9 100644 --- a/src/HtmlCss.test.tsx +++ b/src/HtmlCss.test.tsx @@ -1,6 +1,7 @@ import React from "react"; import { render, screen } from "@testing-library/react"; import App from "./App"; +import userEvent from "@testing-library/user-event"; describe("Some HTML Elements are added.", () => { test("There is a header", () => { @@ -18,11 +19,25 @@ describe("Some basic CSS is added.", () => { }); describe("Some Bootstrap Elements are added", () => { - test("There is a bootstrap button", () => { + test("There is one bootstrap button with the text 'Log Hello World'", () => { render(); - const button = screen.getByRole("button"); + const button = screen.getByRole("button", { name: /Log Hello World/i }); expect(button).toBeInTheDocument(); expect(button).toHaveClass("btn"); expect(button).toHaveClass("btn-primary"); }); + + test("Not clicking the bootstrap button does not logs 'Hello World!'", () => { + const consoleSpy = jest.spyOn(console, "log"); + render(); + expect(consoleSpy).not.toHaveBeenCalledWith("Hello World!"); + }); + + test("Clicking the bootstrap button logs 'Hello World!'", () => { + const consoleSpy = jest.spyOn(console, "log"); + render(); + const button = screen.getByRole("button", { name: /Log Hello World/i }); + userEvent.click(button); + expect(consoleSpy).toHaveBeenCalledWith("Hello World!"); + }); }); From b26100f543943eced73fdff33784861243c65386 Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Sun, 30 Jan 2022 00:47:43 -0500 Subject: [PATCH 12/44] More html tests --- src/HtmlCss.test.tsx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/HtmlCss.test.tsx b/src/HtmlCss.test.tsx index bf957616f9..676c37f903 100644 --- a/src/HtmlCss.test.tsx +++ b/src/HtmlCss.test.tsx @@ -9,6 +9,20 @@ describe("Some HTML Elements are added.", () => { const header = screen.getByRole("heading"); expect(header).toBeInTheDocument(); }); + + test("There is an image with alt text", () => { + render(); + const image = screen.getByRole("image"); + expect(image).toBeInTheDocument(); + expect(image).toHaveAttribute("alt"); + }); + + test("There is a list with at least three elements", () => { + render(); + const list = screen.getByRole("list"); + expect(list).toBeInTheDocument(); + expect(list.children.length).toBeGreaterThanOrEqual(3); + }); }); describe("Some basic CSS is added.", () => { From 3bf4550a8f042dee28a57c06abec05dfce779519 Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Sun, 30 Jan 2022 00:55:24 -0500 Subject: [PATCH 13/44] Fix the image test --- src/HtmlCss.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/HtmlCss.test.tsx b/src/HtmlCss.test.tsx index 676c37f903..79b7db2dda 100644 --- a/src/HtmlCss.test.tsx +++ b/src/HtmlCss.test.tsx @@ -12,7 +12,7 @@ describe("Some HTML Elements are added.", () => { test("There is an image with alt text", () => { render(); - const image = screen.getByRole("image"); + const image = screen.getByRole("img"); expect(image).toBeInTheDocument(); expect(image).toHaveAttribute("alt"); }); From 8dff2b64a2efc0b1b49703077965fe5e334eab1a Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Mon, 31 Jan 2022 16:31:58 -0500 Subject: [PATCH 14/44] Updated CSS tests, left a note about additional tests --- src/HtmlCss.test.tsx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/HtmlCss.test.tsx b/src/HtmlCss.test.tsx index 79b7db2dda..379fc8f449 100644 --- a/src/HtmlCss.test.tsx +++ b/src/HtmlCss.test.tsx @@ -30,6 +30,14 @@ describe("Some basic CSS is added.", () => { render(); expect(true); }); + + test("The background color of the header area is different", () => { + render(); + const banner = screen.getByRole("banner"); + expect(banner).not.toHaveStyle({ + "background-color": "rgb(40, 44, 52)" + }); + }); }); describe("Some Bootstrap Elements are added", () => { From b66d4de909f74de4cba160a6fff05b078b9b47cc Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Mon, 31 Jan 2022 16:32:13 -0500 Subject: [PATCH 15/44] See previous commit message --- src/HtmlCss.test.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/HtmlCss.test.tsx b/src/HtmlCss.test.tsx index 379fc8f449..36767ad350 100644 --- a/src/HtmlCss.test.tsx +++ b/src/HtmlCss.test.tsx @@ -26,11 +26,6 @@ describe("Some HTML Elements are added.", () => { }); describe("Some basic CSS is added.", () => { - test("There is a floating red box", () => { - render(); - expect(true); - }); - test("The background color of the header area is different", () => { render(); const banner = screen.getByRole("banner"); @@ -63,3 +58,7 @@ describe("Some Bootstrap Elements are added", () => { expect(consoleSpy).toHaveBeenCalledWith("Hello World!"); }); }); + +/** + * Remember, there are additional tasks described on the page! + */ From 0a24364f67b1ee221ebe175d6c494d5eca6ad7dc Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Sat, 24 Aug 2024 13:10:09 -0400 Subject: [PATCH 16/44] Add in new css test --- src/HtmlCss.test.tsx | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/HtmlCss.test.tsx b/src/HtmlCss.test.tsx index 36767ad350..48b0a6df2d 100644 --- a/src/HtmlCss.test.tsx +++ b/src/HtmlCss.test.tsx @@ -30,7 +30,7 @@ describe("Some basic CSS is added.", () => { render(); const banner = screen.getByRole("banner"); expect(banner).not.toHaveStyle({ - "background-color": "rgb(40, 44, 52)" + "background-color": "rgb(40, 44, 52)", }); }); }); @@ -59,6 +59,25 @@ describe("Some Bootstrap Elements are added", () => { }); }); -/** - * Remember, there are additional tasks described on the page! - */ +describe("Some additional CSS was added", () => { + test("checks if any element has a background color of red", () => { + const { container } = render(); + // Get all elements in the rendered container + const elements = container.querySelectorAll("*"); + + // Check if any element has a background color of red + let foundRedBackground = false; + + elements.forEach((element) => { + const style = getComputedStyle(element); + if ( + style.backgroundColor === "red" || + style.backgroundColor === "rgb(255, 0, 0)" + ) { + foundRedBackground = true; + } + }); + + expect(foundRedBackground).toBe(true); + }); +}); From 4d43d7a5d133522b0a8d92e1cb3d7e4053a81992 Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Sat, 24 Aug 2024 13:12:28 -0400 Subject: [PATCH 17/44] Add in points --- src/HtmlCss.test.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/HtmlCss.test.tsx b/src/HtmlCss.test.tsx index 48b0a6df2d..320cb97524 100644 --- a/src/HtmlCss.test.tsx +++ b/src/HtmlCss.test.tsx @@ -4,20 +4,20 @@ import App from "./App"; import userEvent from "@testing-library/user-event"; describe("Some HTML Elements are added.", () => { - test("There is a header", () => { + test("(2 pts) There is a header", () => { render(); const header = screen.getByRole("heading"); expect(header).toBeInTheDocument(); }); - test("There is an image with alt text", () => { + test("(2 pts) There is an image with alt text", () => { render(); const image = screen.getByRole("img"); expect(image).toBeInTheDocument(); expect(image).toHaveAttribute("alt"); }); - test("There is a list with at least three elements", () => { + test("(2 pts) There is a list with at least three elements", () => { render(); const list = screen.getByRole("list"); expect(list).toBeInTheDocument(); @@ -25,7 +25,7 @@ describe("Some HTML Elements are added.", () => { }); }); -describe("Some basic CSS is added.", () => { +describe("(2 pts) Some basic CSS is added.", () => { test("The background color of the header area is different", () => { render(); const banner = screen.getByRole("banner"); @@ -35,7 +35,7 @@ describe("Some basic CSS is added.", () => { }); }); -describe("Some Bootstrap Elements are added", () => { +describe("(2 pts) Some Bootstrap Elements are added", () => { test("There is one bootstrap button with the text 'Log Hello World'", () => { render(); const button = screen.getByRole("button", { name: /Log Hello World/i }); @@ -44,13 +44,13 @@ describe("Some Bootstrap Elements are added", () => { expect(button).toHaveClass("btn-primary"); }); - test("Not clicking the bootstrap button does not logs 'Hello World!'", () => { + test("(2 pts) Not clicking the bootstrap button does not logs 'Hello World!'", () => { const consoleSpy = jest.spyOn(console, "log"); render(); expect(consoleSpy).not.toHaveBeenCalledWith("Hello World!"); }); - test("Clicking the bootstrap button logs 'Hello World!'", () => { + test("(2 pts) Clicking the bootstrap button logs 'Hello World!'", () => { const consoleSpy = jest.spyOn(console, "log"); render(); const button = screen.getByRole("button", { name: /Log Hello World/i }); @@ -60,7 +60,7 @@ describe("Some Bootstrap Elements are added", () => { }); describe("Some additional CSS was added", () => { - test("checks if any element has a background color of red", () => { + test("(2 pts) checks if any element has a background color of red", () => { const { container } = render(); // Get all elements in the rendered container const elements = container.querySelectorAll("*"); From 83c4461f9dbe7d2a66c09eed18959565a302eea2 Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Sat, 29 Jan 2022 23:23:45 -0500 Subject: [PATCH 18/44] Basic functions tests and stubs --- public/tasks/task-functions.md | 5 +++ src/functions.test.ts | 59 ++++++++++++++++++++++++++++++++++ src/functions.ts | 19 +++++++++++ 3 files changed, 83 insertions(+) create mode 100644 public/tasks/task-functions.md create mode 100644 src/functions.test.ts create mode 100644 src/functions.ts diff --git a/public/tasks/task-functions.md b/public/tasks/task-functions.md new file mode 100644 index 0000000000..36e7926bb7 --- /dev/null +++ b/public/tasks/task-functions.md @@ -0,0 +1,5 @@ +# Task - Functions + +Version: 0.0.1 + +Implement a bunch of functions that work on primitives. diff --git a/src/functions.test.ts b/src/functions.test.ts new file mode 100644 index 0000000000..e0bef414ea --- /dev/null +++ b/src/functions.test.ts @@ -0,0 +1,59 @@ +import { + add3, + fahrenheitToCelius, + shout, + isQuestion, + convertYesNo +} from "./functions"; + +test("Testing the basic functions", () => { + it("Testing the add3 function", () => { + expect(add3(1, 2, 3)).toBe(6); + expect(add3(9, 7, 4)).toBe(20); + expect(add3(6, -3, 9)).toBe(15); + expect(add3(10, 1, -9)).toBe(11); + expect(add3(-9, -100, -4)).toBe(0); + expect(add3(-1, -1, 1)).toBe(1); + }); + + it("Testing the fahrenheitToCelius function", () => { + expect(fahrenheitToCelius(32)).toBe(0); + expect(fahrenheitToCelius(-40)).toBe(40); + expect(fahrenheitToCelius(-22)).toBe(-30); + expect(fahrenheitToCelius(14)).toBe(-10); + expect(fahrenheitToCelius(68)).toBe(20); + expect(fahrenheitToCelius(86)).toBe(30); + expect(fahrenheitToCelius(212)).toBe(100); + }); + + it("Testing the shout function", () => { + expect(shout("Hello")).toBe("HELLO!"); + expect(shout("What?")).toBe("WHAT?!"); + expect(shout("oHo")).toBe("OHO!"); + expect(shout("AHHHH!!!")).toBe("AHHHH!!!!"); + expect(shout("")).toBe("!"); + expect(shout("Please go outside")).toBe("PLEASE GO OUTSIDE!"); + }); + + it("Testing the isQuestion function", () => { + expect(isQuestion("Is this a question?")).toBe(true); + expect(isQuestion("Who are you?")).toBe(true); + expect(isQuestion("WHAT ARE YOU !?")).toBe(true); + expect(isQuestion("WHAT IS THIS?!")).toBe(false); + expect(isQuestion("OH GOD!")).toBe(false); + expect(isQuestion("Oh nevermind, it's fine.")).toBe(false); + expect(isQuestion("")).toBe(false); + }); + + it("Testing the convertYesNo function", () => { + expect(convertYesNo("yes")).toBe(true); + expect(convertYesNo("YES")).toBe(true); + expect(convertYesNo("NO")).toBe(false); + expect(convertYesNo("no")).toBe(false); + expect(convertYesNo("Apple")).toBe(null); + expect(convertYesNo("Bananas")).toBe(null); + expect(convertYesNo("Nope")).toBe(null); + expect(convertYesNo("Yesterday")).toBe(null); + expect(convertYesNo("Maybe")).toBe(null); + }); +}); diff --git a/src/functions.ts b/src/functions.ts new file mode 100644 index 0000000000..03193e4212 --- /dev/null +++ b/src/functions.ts @@ -0,0 +1,19 @@ +export function fahrenheitToCelius(temperature: number): number { + return 0; +} + +export function add3(first: number, second: number, third: number): number { + return 0; +} + +export function shout(message: string): string { + return ""; +} + +export function isQuestion(message: string): boolean { + return true; +} + +export function convertYesNo(word: string): boolean | null { + return true; +} From a48653022ec3c8b7ce99cf49d98b041e20815420 Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Sat, 29 Jan 2022 23:30:17 -0500 Subject: [PATCH 19/44] Fix test organization --- src/functions.test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/functions.test.ts b/src/functions.test.ts index e0bef414ea..98c926bb6f 100644 --- a/src/functions.test.ts +++ b/src/functions.test.ts @@ -6,8 +6,8 @@ import { convertYesNo } from "./functions"; -test("Testing the basic functions", () => { - it("Testing the add3 function", () => { +describe("Testing the basic functions", () => { + test("Testing the add3 function", () => { expect(add3(1, 2, 3)).toBe(6); expect(add3(9, 7, 4)).toBe(20); expect(add3(6, -3, 9)).toBe(15); @@ -16,7 +16,7 @@ test("Testing the basic functions", () => { expect(add3(-1, -1, 1)).toBe(1); }); - it("Testing the fahrenheitToCelius function", () => { + test("Testing the fahrenheitToCelius function", () => { expect(fahrenheitToCelius(32)).toBe(0); expect(fahrenheitToCelius(-40)).toBe(40); expect(fahrenheitToCelius(-22)).toBe(-30); @@ -26,7 +26,7 @@ test("Testing the basic functions", () => { expect(fahrenheitToCelius(212)).toBe(100); }); - it("Testing the shout function", () => { + test("Testing the shout function", () => { expect(shout("Hello")).toBe("HELLO!"); expect(shout("What?")).toBe("WHAT?!"); expect(shout("oHo")).toBe("OHO!"); @@ -35,7 +35,7 @@ test("Testing the basic functions", () => { expect(shout("Please go outside")).toBe("PLEASE GO OUTSIDE!"); }); - it("Testing the isQuestion function", () => { + test("Testing the isQuestion function", () => { expect(isQuestion("Is this a question?")).toBe(true); expect(isQuestion("Who are you?")).toBe(true); expect(isQuestion("WHAT ARE YOU !?")).toBe(true); @@ -45,7 +45,7 @@ test("Testing the basic functions", () => { expect(isQuestion("")).toBe(false); }); - it("Testing the convertYesNo function", () => { + test("Testing the convertYesNo function", () => { expect(convertYesNo("yes")).toBe(true); expect(convertYesNo("YES")).toBe(true); expect(convertYesNo("NO")).toBe(false); From 9722564e99cecda5d50dd95524c94a76c4cda923 Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Sat, 29 Jan 2022 23:39:22 -0500 Subject: [PATCH 20/44] Fix issue in fahrenheit conversion --- src/functions.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/functions.test.ts b/src/functions.test.ts index 98c926bb6f..3eb9f4f3aa 100644 --- a/src/functions.test.ts +++ b/src/functions.test.ts @@ -18,7 +18,7 @@ describe("Testing the basic functions", () => { test("Testing the fahrenheitToCelius function", () => { expect(fahrenheitToCelius(32)).toBe(0); - expect(fahrenheitToCelius(-40)).toBe(40); + expect(fahrenheitToCelius(-40)).toBe(-40); expect(fahrenheitToCelius(-22)).toBe(-30); expect(fahrenheitToCelius(14)).toBe(-10); expect(fahrenheitToCelius(68)).toBe(20); From bd06d5d0e3ed264f7bffb4e8e4811d0efc170255 Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Thu, 3 Feb 2022 14:27:08 -0500 Subject: [PATCH 21/44] Move around some of the functions --- src/functions.test.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/functions.test.ts b/src/functions.test.ts index 3eb9f4f3aa..c496ac7e99 100644 --- a/src/functions.test.ts +++ b/src/functions.test.ts @@ -7,15 +7,6 @@ import { } from "./functions"; describe("Testing the basic functions", () => { - test("Testing the add3 function", () => { - expect(add3(1, 2, 3)).toBe(6); - expect(add3(9, 7, 4)).toBe(20); - expect(add3(6, -3, 9)).toBe(15); - expect(add3(10, 1, -9)).toBe(11); - expect(add3(-9, -100, -4)).toBe(0); - expect(add3(-1, -1, 1)).toBe(1); - }); - test("Testing the fahrenheitToCelius function", () => { expect(fahrenheitToCelius(32)).toBe(0); expect(fahrenheitToCelius(-40)).toBe(-40); @@ -26,6 +17,15 @@ describe("Testing the basic functions", () => { expect(fahrenheitToCelius(212)).toBe(100); }); + test("Testing the add3 function", () => { + expect(add3(1, 2, 3)).toBe(6); + expect(add3(9, 7, 4)).toBe(20); + expect(add3(6, -3, 9)).toBe(15); + expect(add3(10, 1, -9)).toBe(11); + expect(add3(-9, -100, -4)).toBe(0); + expect(add3(-1, -1, 1)).toBe(1); + }); + test("Testing the shout function", () => { expect(shout("Hello")).toBe("HELLO!"); expect(shout("What?")).toBe("WHAT?!"); From 4cd1900783f690690229b7c17cf9e81995f52b3a Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Thu, 3 Feb 2022 14:27:18 -0500 Subject: [PATCH 22/44] Explain what the actual functions require you to do --- src/functions.ts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/functions.ts b/src/functions.ts index 03193e4212..e614c81c0c 100644 --- a/src/functions.ts +++ b/src/functions.ts @@ -1,19 +1,41 @@ +/** + * Consumes a single temperature in Fahrenheit (a number) and converts to Celsius + * using this formula: + * C = (F - 32) * 5/9 + */ export function fahrenheitToCelius(temperature: number): number { return 0; } +/** + * Consumes three numbers and produces their sum. BUT you should only add a number + * if the number is greater than zero. + */ export function add3(first: number, second: number, third: number): number { return 0; } +/** + * Consumes a string and produces the same string in UPPERCASE and with an exclamation + * mark added to the end. + */ export function shout(message: string): string { return ""; } +/** + * Consumes a string (a message) and returns a boolean if the string ends in a question + * mark. Do not use an `if` statement in solving this question. + */ export function isQuestion(message: string): boolean { return true; } +/** + * Consumes a word (a string) and returns either `true`, `false`, or `null`. If the string + * is "yes" (upper or lower case), then return `true`. If the string is "no" (again, either + * upper or lower case), then return `false`. Otherwise, return `null`. + */ export function convertYesNo(word: string): boolean | null { return true; } From cf1d21a31d00c2e8dc8bb7c76f372b3e0adebfbe Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Sat, 24 Aug 2024 13:15:59 -0400 Subject: [PATCH 23/44] Update formatting --- src/functions.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/functions.test.ts b/src/functions.test.ts index c496ac7e99..a082bfd61a 100644 --- a/src/functions.test.ts +++ b/src/functions.test.ts @@ -3,7 +3,7 @@ import { fahrenheitToCelius, shout, isQuestion, - convertYesNo + convertYesNo, } from "./functions"; describe("Testing the basic functions", () => { From e11693a366f61cdb442c6f6f5822bd49e2dd604f Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Sat, 24 Aug 2024 13:18:24 -0400 Subject: [PATCH 24/44] Add in points --- src/functions.test.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/functions.test.ts b/src/functions.test.ts index a082bfd61a..3d921f5d64 100644 --- a/src/functions.test.ts +++ b/src/functions.test.ts @@ -7,7 +7,7 @@ import { } from "./functions"; describe("Testing the basic functions", () => { - test("Testing the fahrenheitToCelius function", () => { + test("(3 pts) Testing the fahrenheitToCelius function", () => { expect(fahrenheitToCelius(32)).toBe(0); expect(fahrenheitToCelius(-40)).toBe(-40); expect(fahrenheitToCelius(-22)).toBe(-30); @@ -17,7 +17,7 @@ describe("Testing the basic functions", () => { expect(fahrenheitToCelius(212)).toBe(100); }); - test("Testing the add3 function", () => { + test("(3 pts) Testing the add3 function", () => { expect(add3(1, 2, 3)).toBe(6); expect(add3(9, 7, 4)).toBe(20); expect(add3(6, -3, 9)).toBe(15); @@ -26,7 +26,7 @@ describe("Testing the basic functions", () => { expect(add3(-1, -1, 1)).toBe(1); }); - test("Testing the shout function", () => { + test("(3 pts) Testing the shout function", () => { expect(shout("Hello")).toBe("HELLO!"); expect(shout("What?")).toBe("WHAT?!"); expect(shout("oHo")).toBe("OHO!"); @@ -35,7 +35,7 @@ describe("Testing the basic functions", () => { expect(shout("Please go outside")).toBe("PLEASE GO OUTSIDE!"); }); - test("Testing the isQuestion function", () => { + test("(3 pts) Testing the isQuestion function", () => { expect(isQuestion("Is this a question?")).toBe(true); expect(isQuestion("Who are you?")).toBe(true); expect(isQuestion("WHAT ARE YOU !?")).toBe(true); @@ -45,7 +45,7 @@ describe("Testing the basic functions", () => { expect(isQuestion("")).toBe(false); }); - test("Testing the convertYesNo function", () => { + test("(3 pts) Testing the convertYesNo function", () => { expect(convertYesNo("yes")).toBe(true); expect(convertYesNo("YES")).toBe(true); expect(convertYesNo("NO")).toBe(false); From 7cc4e3f20e61307e9f22eb466fe21871b3eefbd3 Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Tue, 1 Feb 2022 14:51:32 -0500 Subject: [PATCH 25/44] First stab at array problems --- public/tasks/task-arrays.md | 5 +++ src/arrays.test.ts | 12 ++++++ src/arrays.ts | 84 +++++++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 public/tasks/task-arrays.md create mode 100644 src/arrays.test.ts create mode 100644 src/arrays.ts diff --git a/public/tasks/task-arrays.md b/public/tasks/task-arrays.md new file mode 100644 index 0000000000..c2fbf80f8d --- /dev/null +++ b/public/tasks/task-arrays.md @@ -0,0 +1,5 @@ +# Task - Arrays + +Version: 0.0.1 + +Implement functions that work with arrays immutably. diff --git a/src/arrays.test.ts b/src/arrays.test.ts new file mode 100644 index 0000000000..b812349d2f --- /dev/null +++ b/src/arrays.test.ts @@ -0,0 +1,12 @@ +import { bookEndList } from "./arrays"; + +describe("Testing the array functions", () => { + const NUMBERS_1 = [1, 2, 3]; + + test("Testing the bookEndList function", () => { + // Ensure that the original array was not changed + expect(bookEndList(NUMBERS_1)).not.toBe(NUMBERS_1); + // And that a correct new array was returned + expect(bookEndList(NUMBERS_1)).toEqual([1, 3]); + }); +}); diff --git a/src/arrays.ts b/src/arrays.ts new file mode 100644 index 0000000000..7604b40cdb --- /dev/null +++ b/src/arrays.ts @@ -0,0 +1,84 @@ +/** + * Consume an array of numbers, and return a new array containing + * JUST the first and last number. If there are no elements, return + * an empty array. If there is one element, the resulting list should + * the number twice. + */ +export function bookEndList(numbers: number[]): number[] { + return numbers; +} + +/** + * Consume an array of numbers, and return a new array where each + * number has been tripled (multiplied by 3). + */ +export function tripleNumbers(numbers: number[]): number[] { + return numbers; +} + +/** + * Consume an array of strings and convert them to integers. If + * the number cannot be parsed as an integer, convert it to "?" instead. + */ +export function stringsToIntegers(numbers: string[]): number[] { + return []; +} + +/** + * Consume an array of strings and return them as numbers. Note that + * the strings MAY have "$" symbols at the beginning, in which case + * those should be removed. If the result cannot be parsed as an integer, + * convert it to "?" instead. + */ +// Remember, you can write functions as lambdas too! They work exactly the same. +export const removeDollars = (amounts: string[]): number[] => { + return []; +}; + +/** + * Consume an array of messages and return a new list of the messages. However, any + * string that ends in "!" should be made uppercase. + */ +export const shoutIfExclaiming = (messages: string[]): string[] => { + return []; +}; + +/** + * Consumes an array of words and returns the number of words that are LESS THAN + * 4 letters long. + */ +export function countShortWords(words: string[]): number { + return 0; +} + +/** + * Consumes an array of colors (e.g., 'red', 'purple') and returns true if ALL + * the colors are either 'red', 'blue', or 'green'. If an empty list is given, + * then return true. + */ +export function allRGB(colors: string[]): boolean { + return false; +} + +/** + * Consumes an array of numbers, and produces a string representation of the + * numbers being added together along with their actual sum. + * + * For instance, the array [1, 2, 3] would become "6=1+2+3". + */ +export function makeMath(addends: number[]): string { + return ""; +} + +/** + * Consumes an array of numbers and produces a new array of the same numbers, + * with one difference. After the FIRST negative number, insert the sum of all + * previous numbers in the list. If there are no negative numbers, then append + * 0 to the list. + * + * For instance, the array [1, 9, -5, 7] would become [1, 9, -5, 10, 7] + * And the array [1, 9, 7] would become [1, 9, 0] + */ +export function injectPositive(values: number[]): number[] { + return []; +} From f25333778032fc42866a278af6a3ce871f735150 Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Tue, 1 Feb 2022 16:09:10 -0500 Subject: [PATCH 26/44] Add in the rest of the tests --- src/arrays.test.ts | 269 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 265 insertions(+), 4 deletions(-) diff --git a/src/arrays.test.ts b/src/arrays.test.ts index b812349d2f..0881d9fe8a 100644 --- a/src/arrays.test.ts +++ b/src/arrays.test.ts @@ -1,12 +1,273 @@ -import { bookEndList } from "./arrays"; +import { + allRGB, + bookEndList, + countShortWords, + injectPositive, + makeMath, + removeDollars, + shoutIfExclaiming, + stringsToIntegers, + tripleNumbers +} from "./arrays"; describe("Testing the array functions", () => { + ////////////////////////////////// + // bookEndList and tripleNumbers + const NUMBERS_1 = [1, 2, 3]; + const NUMBERS_2 = [100, 300, 200]; + const NUMBERS_3 = [5]; + const NUMBERS_4: number[] = []; + const NUMBERS_5 = [100, 199, 1, -5, 7, 3]; + const NUMBERS_6 = [-100, -200, 100, 200]; + const NUMBERS_7 = [199, 1, 550, 50, 200]; + + // Ensure that none of the arrays were changed mutably + // If you fail these, you aren't using map/filter/reduce/etc. properly! + afterEach(() => { + expect(NUMBERS_1).toEqual([1, 2, 3]); + expect(NUMBERS_2).toEqual([100, 300, 200]); + expect(NUMBERS_3).toEqual([5]); + expect(NUMBERS_4).toEqual([]); + expect(NUMBERS_5).toEqual([100, 199, 1, -5, 7, 3]); + expect(NUMBERS_6).toEqual([-100, -200, 100, 200]); + expect(NUMBERS_7).toEqual([199, 1, 550, 50, 200]); + }); test("Testing the bookEndList function", () => { - // Ensure that the original array was not changed - expect(bookEndList(NUMBERS_1)).not.toBe(NUMBERS_1); - // And that a correct new array was returned expect(bookEndList(NUMBERS_1)).toEqual([1, 3]); + expect(bookEndList(NUMBERS_2)).toEqual([100, 200]); + expect(bookEndList(NUMBERS_3)).toEqual([5, 5]); + expect(bookEndList(NUMBERS_4)).toEqual([]); + expect(bookEndList(NUMBERS_5)).toEqual([100, 3]); + expect(bookEndList(NUMBERS_6)).toEqual([-100, 200]); + }); + + test("Testing the tripleNumbers function", () => { + expect(tripleNumbers(NUMBERS_1)).toEqual([3, 6, 9]); + expect(tripleNumbers(NUMBERS_2)).toEqual([300, 900, 600]); + expect(tripleNumbers(NUMBERS_3)).toEqual([15]); + expect(tripleNumbers(NUMBERS_4)).toEqual([]); + expect(tripleNumbers(NUMBERS_5)).toEqual([300, 597, 3, -15, 21, 9]); + expect(tripleNumbers(NUMBERS_6)).toEqual([-300, -600, 300, 600]); + }); + + ////////////////////////////////// + // stringsToIntegers + + const VALUES_1 = ["1", "2", "3"]; + const VALUES_2 = ["100", "200", "300"]; + const VALUES_3 = ["5"]; + const VALUES_4: string[] = []; + const VALUES_5 = ["100", "?", "27", "$44"]; + const VALUES_6 = ["-1", "0", "1", "*1"]; + const VALUES_7 = ["apple", "banana", "cactus"]; + + // Ensure that none of the arrays were changed mutably + // If you fail these, you aren't using map/filter/reduce/etc. properly! + afterEach(() => { + expect(VALUES_1).toEqual(["1", "2", "3"]); + expect(VALUES_2).toEqual(["100", "200", "300"]); + expect(VALUES_3).toEqual(["5"]); + expect(VALUES_4).toEqual([]); + expect(VALUES_5).toEqual(["100", "?", "27", "$44"]); + expect(VALUES_6).toEqual(["-1", "0", "1", "*1"]); + expect(VALUES_7).toEqual(["apple", "banana", "cactus"]); + }); + + test("Testing the stringsToIntegers function", () => { + expect(stringsToIntegers(VALUES_1)).toEqual([1, 2, 3]); + expect(stringsToIntegers(VALUES_2)).toEqual([100, 200, 300]); + expect(stringsToIntegers(VALUES_3)).toEqual([5]); + expect(stringsToIntegers(VALUES_4)).toEqual([]); + expect(stringsToIntegers(VALUES_5)).toEqual([100, 0, 27, 0]); + expect(stringsToIntegers(VALUES_6)).toEqual([-1, 0, 1, 0]); + expect(stringsToIntegers(VALUES_7)).toEqual([0, 0, 0]); + }); + + ////////////////////////////////// + // removeDollars + + const AMOUNTS_1 = ["$1", "$2", "$3"]; + const AMOUNTS_2 = ["$100", "$200", "$300", "$400"]; + const AMOUNTS_3 = ["$5"]; + const AMOUNTS_4 = ["$"]; + const AMOUNTS_5 = ["100", "200", "$300", "$400"]; + const AMOUNTS_6: string[] = []; + const AMOUNTS_7 = ["100", "???", "7", "$233", "", "$"]; + const AMOUNTS_8 = ["$one", "two", "$three"]; + + // Ensure that none of the arrays were changed mutably + // If you fail these, you aren't using map/filter/reduce/etc. properly! + afterEach(() => { + expect(AMOUNTS_1).toEqual(["$1", "$2", "$3"]); + expect(AMOUNTS_2).toEqual(["$100", "$200", "$300", "$400"]); + expect(AMOUNTS_3).toEqual(["$5"]); + expect(AMOUNTS_4).toEqual(["$"]); + expect(AMOUNTS_5).toEqual(["100", "200", "$300", "$400"]); + expect(AMOUNTS_6).toEqual([]); + expect(AMOUNTS_7).toEqual(["100", "???", "7", "$233", "", "$"]); + expect(AMOUNTS_8).toEqual(["$one", "two", "$three"]); + }); + + test("Testing the removeDollars function", () => { + expect(removeDollars(AMOUNTS_1)).toEqual([1, 2, 3]); + expect(removeDollars(AMOUNTS_2)).toEqual([100, 200, 300, 400]); + expect(removeDollars(AMOUNTS_3)).toEqual([5]); + expect(removeDollars(AMOUNTS_4)).toEqual([0]); + expect(removeDollars(AMOUNTS_5)).toEqual([100, 200, 300, 400]); + expect(removeDollars(AMOUNTS_6)).toEqual([]); + expect(removeDollars(AMOUNTS_7)).toEqual([100, 0, 7, 233, 0, 0]); + expect(removeDollars(AMOUNTS_8)).toEqual([0, 0, 0]); + }); + + ////////////////////////////////// + // shoutIfExclaiming + + const MESSAGE_1 = ["Hello", "you", "are", "great!"]; + const MESSAGE_2 = ["oho!", "Oho!", "oHo!", "oHO!", "OHO!"]; + const MESSAGE_3 = ["Wait?", "What?", "Lo", "How?", "High!"]; + const MESSAGE_4 = ["??????"]; + const MESSAGE_5: string[] = ["This one is very long!"]; + const MESSAGE_6 = ["No", "Caps", "here.", "Right?"]; + + // Ensure that none of the arrays were changed mutably + // If you fail these, you aren't using map/filter/reduce/etc. properly! + afterEach(() => { + expect(MESSAGE_1).toEqual(["Hello", "you", "are", "great!"]); + expect(MESSAGE_2).toEqual(["oho!", "Oho!", "oHo!", "oHO!", "OHO!"]); + expect(MESSAGE_3).toEqual(["Wait?", "What?", "Lo", "How?", "High!"]); + expect(MESSAGE_4).toEqual(["??????"]); + expect(MESSAGE_5).toEqual(["This one is very long!"]); + expect(MESSAGE_6).toEqual(["No", "Caps", "here.", "Right?"]); + }); + + test("Testing the shoutIfExclaiming function", () => { + expect(shoutIfExclaiming(MESSAGE_1)).toEqual([ + "Hello", + "you", + "are", + "GREAT!" + ]); + expect(shoutIfExclaiming(MESSAGE_2)).toEqual([ + "OHO!", + "OHO!", + "OHO!", + "OHO!", + "OHO!" + ]); + expect(shoutIfExclaiming(MESSAGE_3)).toEqual(["Lo", "HIGH!"]); + expect(shoutIfExclaiming(MESSAGE_4)).toEqual([]); + expect(shoutIfExclaiming(MESSAGE_5)).toEqual([ + "THIS ONE IS VERY LONG!" + ]); + expect(shoutIfExclaiming(MESSAGE_6)).toEqual(["No", "Caps", "here."]); + }); + + ////////////////////////////////// + // countShortWords + + const WORDS_1 = ["the", "cat", "in", "the", "hat"]; + const WORDS_2 = ["one", "two", "three", "four", "five", "six", "seven"]; + const WORDS_3 = ["alpha", "beta", "gamma"]; + const WORDS_4 = ["Longest", "Words", "Possible"]; + const WORDS_5: string[] = []; + const WORDS_6 = ["", "", "", ""]; + + // Ensure that none of the arrays were changed mutably + // If you fail these, you aren't using map/filter/reduce/etc. properly! + afterEach(() => { + expect(WORDS_1).toEqual(["the", "cat", "in", "the", "hat"]); + expect(WORDS_2).toEqual([ + "one", + "two", + "three", + "four", + "five", + "six", + "seven" + ]); + expect(WORDS_3).toEqual(["alpha", "beta", "gamma"]); + expect(WORDS_4).toEqual(["Longest", "Words", "Possible"]); + expect(WORDS_5).toEqual([]); + expect(WORDS_6).toEqual(["", "", "", ""]); + }); + + test("Testing the countShortWords function", () => { + expect(countShortWords(WORDS_1)).toEqual(5); + expect(countShortWords(WORDS_2)).toEqual(3); + expect(countShortWords(WORDS_3)).toEqual(0); + expect(countShortWords(WORDS_4)).toEqual(0); + expect(countShortWords(WORDS_5)).toEqual(0); + expect(countShortWords(WORDS_6)).toEqual(4); + }); + + ////////////////////////////////// + // allRGB + + const COLORS_1 = ["red", "green", "blue"]; + const COLORS_2 = ["red", "red", "red"]; + const COLORS_3 = ["red", "red", "blue", "blue", "green", "red"]; + const COLORS_4 = ["purple", "orange", "violet"]; + const COLORS_5 = ["red", "blue", "yellow"]; + const COLORS_6 = ["green"]; + const COLORS_7 = ["red"]; + const COLORS_8 = ["kabluey"]; + const COLORS_9: string[] = []; + + // Ensure that none of the arrays were changed mutably + // If you fail these, you aren't using map/filter/reduce/etc. properly! + afterEach(() => { + expect(COLORS_1).toEqual(["red", "green", "blue"]); + expect(COLORS_2).toEqual(["red", "red", "red"]); + expect(COLORS_3).toEqual([ + "red", + "red", + "blue", + "blue", + "green", + "red" + ]); + expect(COLORS_4).toEqual(["purple", "orange", "violet"]); + expect(COLORS_5).toEqual(["red", "blue", "yellow"]); + expect(COLORS_6).toEqual(["green"]); + expect(COLORS_7).toEqual(["red"]); + expect(COLORS_8).toEqual(["kabluey"]); + expect(COLORS_9).toEqual([]); + }); + + test("Testing the allRGB function", () => { + expect(allRGB(COLORS_1)).toEqual(true); + expect(allRGB(COLORS_2)).toEqual(true); + expect(allRGB(COLORS_3)).toEqual(true); + expect(allRGB(COLORS_4)).toEqual(false); + expect(allRGB(COLORS_5)).toEqual(false); + expect(allRGB(COLORS_6)).toEqual(true); + expect(allRGB(COLORS_7)).toEqual(true); + expect(allRGB(COLORS_8)).toEqual(false); + expect(allRGB(COLORS_9)).toEqual(true); + }); + + ////////////////////////////////// + // makeMath + + test("Testing the makeMath function", () => { + expect(makeMath(NUMBERS_1)).toEqual("6=1+2+3"); + expect(makeMath(NUMBERS_2)).toEqual("600=100+300+200"); + expect(makeMath(NUMBERS_3)).toEqual("5=5"); + expect(makeMath(NUMBERS_4)).toEqual("0=0"); + expect(makeMath(NUMBERS_7)).toEqual("1000=199+1+550+50+200"); + }); + + ////////////////////////////////// + // injectPositive + test("Testing the tripleNumbers function", () => { + expect(injectPositive(NUMBERS_1)).toEqual([1, 2, 3, 6]); + expect(injectPositive(NUMBERS_2)).toEqual([100, 300, 200, 600]); + expect(injectPositive(NUMBERS_3)).toEqual([5, 5]); + expect(injectPositive(NUMBERS_4)).toEqual([0]); + expect(injectPositive(NUMBERS_5)).toEqual([100, 199, 1, -5, 300, 7, 3]); + expect(injectPositive(NUMBERS_6)).toEqual([-100, 0, -200, 100, 200]); + expect(injectPositive(NUMBERS_7)).toEqual([199, 1, 550, 50, 200, 1000]); }); }); From b8777b1873553a2e2780b67fd504486b9d16bd92 Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Tue, 1 Feb 2022 16:09:25 -0500 Subject: [PATCH 27/44] Fix question text --- src/arrays.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/arrays.ts b/src/arrays.ts index 7604b40cdb..4a2ffe8e5b 100644 --- a/src/arrays.ts +++ b/src/arrays.ts @@ -18,7 +18,7 @@ export function tripleNumbers(numbers: number[]): number[] { /** * Consume an array of strings and convert them to integers. If - * the number cannot be parsed as an integer, convert it to "?" instead. + * the number cannot be parsed as an integer, convert it to 0 instead. */ export function stringsToIntegers(numbers: string[]): number[] { return []; @@ -28,7 +28,7 @@ export function stringsToIntegers(numbers: string[]): number[] { * Consume an array of strings and return them as numbers. Note that * the strings MAY have "$" symbols at the beginning, in which case * those should be removed. If the result cannot be parsed as an integer, - * convert it to "?" instead. + * convert it to 0 instead. */ // Remember, you can write functions as lambdas too! They work exactly the same. export const removeDollars = (amounts: string[]): number[] => { @@ -37,7 +37,8 @@ export const removeDollars = (amounts: string[]): number[] => { /** * Consume an array of messages and return a new list of the messages. However, any - * string that ends in "!" should be made uppercase. + * string that ends in "!" should be made uppercase. Also, remove any strings that end + * in question marks ("?"). */ export const shoutIfExclaiming = (messages: string[]): string[] => { return []; @@ -65,6 +66,7 @@ export function allRGB(colors: string[]): boolean { * numbers being added together along with their actual sum. * * For instance, the array [1, 2, 3] would become "6=1+2+3". + * And the array [] would become "0=0". */ export function makeMath(addends: number[]): string { return ""; @@ -74,10 +76,10 @@ export function makeMath(addends: number[]): string { * Consumes an array of numbers and produces a new array of the same numbers, * with one difference. After the FIRST negative number, insert the sum of all * previous numbers in the list. If there are no negative numbers, then append - * 0 to the list. + * the sum to the list. * * For instance, the array [1, 9, -5, 7] would become [1, 9, -5, 10, 7] - * And the array [1, 9, 7] would become [1, 9, 0] + * And the array [1, 9, 7] would become [1, 9, 7, 17] */ export function injectPositive(values: number[]): number[] { return []; From f87771e7d8058f6c4fc6d8c6d036953f65b3a775 Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Fri, 11 Feb 2022 14:24:17 -0500 Subject: [PATCH 28/44] Update arrays.test.ts --- src/arrays.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/arrays.test.ts b/src/arrays.test.ts index 0881d9fe8a..3652078efa 100644 --- a/src/arrays.test.ts +++ b/src/arrays.test.ts @@ -261,7 +261,7 @@ describe("Testing the array functions", () => { ////////////////////////////////// // injectPositive - test("Testing the tripleNumbers function", () => { + test("Testing the injectPositive function", () => { expect(injectPositive(NUMBERS_1)).toEqual([1, 2, 3, 6]); expect(injectPositive(NUMBERS_2)).toEqual([100, 300, 200, 600]); expect(injectPositive(NUMBERS_3)).toEqual([5, 5]); From f0d316b36ae394d502e75849b5532b76ffdf7c68 Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Sat, 24 Aug 2024 13:21:13 -0400 Subject: [PATCH 29/44] Add in points --- src/arrays.test.ts | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/arrays.test.ts b/src/arrays.test.ts index 3652078efa..c2847517bd 100644 --- a/src/arrays.test.ts +++ b/src/arrays.test.ts @@ -7,7 +7,7 @@ import { removeDollars, shoutIfExclaiming, stringsToIntegers, - tripleNumbers + tripleNumbers, } from "./arrays"; describe("Testing the array functions", () => { @@ -34,7 +34,7 @@ describe("Testing the array functions", () => { expect(NUMBERS_7).toEqual([199, 1, 550, 50, 200]); }); - test("Testing the bookEndList function", () => { + test("(3 pts) Testing the bookEndList function", () => { expect(bookEndList(NUMBERS_1)).toEqual([1, 3]); expect(bookEndList(NUMBERS_2)).toEqual([100, 200]); expect(bookEndList(NUMBERS_3)).toEqual([5, 5]); @@ -43,7 +43,7 @@ describe("Testing the array functions", () => { expect(bookEndList(NUMBERS_6)).toEqual([-100, 200]); }); - test("Testing the tripleNumbers function", () => { + test("(3 pts) Testing the tripleNumbers function", () => { expect(tripleNumbers(NUMBERS_1)).toEqual([3, 6, 9]); expect(tripleNumbers(NUMBERS_2)).toEqual([300, 900, 600]); expect(tripleNumbers(NUMBERS_3)).toEqual([15]); @@ -75,7 +75,7 @@ describe("Testing the array functions", () => { expect(VALUES_7).toEqual(["apple", "banana", "cactus"]); }); - test("Testing the stringsToIntegers function", () => { + test("(3 pts) Testing the stringsToIntegers function", () => { expect(stringsToIntegers(VALUES_1)).toEqual([1, 2, 3]); expect(stringsToIntegers(VALUES_2)).toEqual([100, 200, 300]); expect(stringsToIntegers(VALUES_3)).toEqual([5]); @@ -110,7 +110,7 @@ describe("Testing the array functions", () => { expect(AMOUNTS_8).toEqual(["$one", "two", "$three"]); }); - test("Testing the removeDollars function", () => { + test("(3 pts) Testing the removeDollars function", () => { expect(removeDollars(AMOUNTS_1)).toEqual([1, 2, 3]); expect(removeDollars(AMOUNTS_2)).toEqual([100, 200, 300, 400]); expect(removeDollars(AMOUNTS_3)).toEqual([5]); @@ -142,24 +142,24 @@ describe("Testing the array functions", () => { expect(MESSAGE_6).toEqual(["No", "Caps", "here.", "Right?"]); }); - test("Testing the shoutIfExclaiming function", () => { + test("(3 pts) Testing the shoutIfExclaiming function", () => { expect(shoutIfExclaiming(MESSAGE_1)).toEqual([ "Hello", "you", "are", - "GREAT!" + "GREAT!", ]); expect(shoutIfExclaiming(MESSAGE_2)).toEqual([ "OHO!", "OHO!", "OHO!", "OHO!", - "OHO!" + "OHO!", ]); expect(shoutIfExclaiming(MESSAGE_3)).toEqual(["Lo", "HIGH!"]); expect(shoutIfExclaiming(MESSAGE_4)).toEqual([]); expect(shoutIfExclaiming(MESSAGE_5)).toEqual([ - "THIS ONE IS VERY LONG!" + "THIS ONE IS VERY LONG!", ]); expect(shoutIfExclaiming(MESSAGE_6)).toEqual(["No", "Caps", "here."]); }); @@ -185,7 +185,7 @@ describe("Testing the array functions", () => { "four", "five", "six", - "seven" + "seven", ]); expect(WORDS_3).toEqual(["alpha", "beta", "gamma"]); expect(WORDS_4).toEqual(["Longest", "Words", "Possible"]); @@ -193,7 +193,7 @@ describe("Testing the array functions", () => { expect(WORDS_6).toEqual(["", "", "", ""]); }); - test("Testing the countShortWords function", () => { + test("(3 pts) Testing the countShortWords function", () => { expect(countShortWords(WORDS_1)).toEqual(5); expect(countShortWords(WORDS_2)).toEqual(3); expect(countShortWords(WORDS_3)).toEqual(0); @@ -226,7 +226,7 @@ describe("Testing the array functions", () => { "blue", "blue", "green", - "red" + "red", ]); expect(COLORS_4).toEqual(["purple", "orange", "violet"]); expect(COLORS_5).toEqual(["red", "blue", "yellow"]); @@ -236,7 +236,7 @@ describe("Testing the array functions", () => { expect(COLORS_9).toEqual([]); }); - test("Testing the allRGB function", () => { + test("(3 pts) Testing the allRGB function", () => { expect(allRGB(COLORS_1)).toEqual(true); expect(allRGB(COLORS_2)).toEqual(true); expect(allRGB(COLORS_3)).toEqual(true); @@ -251,7 +251,7 @@ describe("Testing the array functions", () => { ////////////////////////////////// // makeMath - test("Testing the makeMath function", () => { + test("(3 pts) Testing the makeMath function", () => { expect(makeMath(NUMBERS_1)).toEqual("6=1+2+3"); expect(makeMath(NUMBERS_2)).toEqual("600=100+300+200"); expect(makeMath(NUMBERS_3)).toEqual("5=5"); @@ -261,7 +261,7 @@ describe("Testing the array functions", () => { ////////////////////////////////// // injectPositive - test("Testing the injectPositive function", () => { + test("(3 pts) Testing the injectPositive function", () => { expect(injectPositive(NUMBERS_1)).toEqual([1, 2, 3, 6]); expect(injectPositive(NUMBERS_2)).toEqual([100, 300, 200, 600]); expect(injectPositive(NUMBERS_3)).toEqual([5, 5]); From c2e556dece7ea7737c13bdd355ef3ebcee121e70 Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Wed, 2 Feb 2022 13:12:40 -0500 Subject: [PATCH 30/44] First stab at questions --- public/tasks/task-objects.md | 5 + src/data/questions.json | 79 ++++++++++ src/objects.test.ts | 295 +++++++++++++++++++++++++++++++++++ src/objects.ts | 141 +++++++++++++++++ 4 files changed, 520 insertions(+) create mode 100644 public/tasks/task-objects.md create mode 100644 src/data/questions.json create mode 100644 src/objects.test.ts create mode 100644 src/objects.ts diff --git a/public/tasks/task-objects.md b/public/tasks/task-objects.md new file mode 100644 index 0000000000..480889da0d --- /dev/null +++ b/public/tasks/task-objects.md @@ -0,0 +1,5 @@ +# Task - Objects + +Version: 0.0.1 + +Implement functions that work with objects immutably. diff --git a/src/data/questions.json b/src/data/questions.json new file mode 100644 index 0000000000..3b19537526 --- /dev/null +++ b/src/data/questions.json @@ -0,0 +1,79 @@ +{ + "BLANK_QUESTIONS": [ + { + "id": 1, + "name": "Question 1", + "body": "", + "type": "multiple_choice_question", + "options": [], + "expected": "", + "points": 1, + "published": false + }, + { + "id": 47, + "name": "My New Question", + "body": "", + "type": "multiple_choice_question", + "options": [], + "expected": "", + "points": 1, + "published": false + }, + { + "id": 2, + "name": "Question 2", + "body": "", + "type": "short_answer_question", + "options": [], + "expected": "", + "points": 1, + "published": false + } + ], + "SIMPLE_QUESTIONS": [ + { + "id": 1, + "name": "Addition", + "body": "What is 2+2?", + "type": "short_answer_question", + "options": [], + "expected": "4", + "points": 1, + "published": true + }, + { + "id": 2, + "name": "Letters", + "body": "What is the last letter of the English alphabet?", + "type": "short_answer_question", + "options": [], + "expected": "Z", + "points": 1, + "published": false + }, + { + "id": 5, + "name": "Colors", + "body": "Which of these is a color?", + "type": "multiple_choice_question", + "options": ["red", "apple", "firetruck"], + "expected": "red", + "points": 1, + "published": true + }, + { + "id": 9, + "name": "Shapes", + "body": "What shape can you make with one line?", + "type": "multiple_choice_question", + "options": ["square", "triangle", "circle"], + "expected": "circle", + "points": 2, + "published": false + } + ], + "SIMPLE_QUESTIONS_2": [], + "EMPTY_QUESTIONS": [], + "TRIVIA_QUESTIONS": [] +} diff --git a/src/objects.test.ts b/src/objects.test.ts new file mode 100644 index 0000000000..bcff7ab176 --- /dev/null +++ b/src/objects.test.ts @@ -0,0 +1,295 @@ +import { + makeBlankQuestion, + isCorrect, + Question, + isValid, + toShortForm, + toMarkdown, + duplicateQuestion, + renameQuestion, + publishQuestion, + addOption, + mergeQuestion +} from "./objects"; +import testQuestionData from "./data/questions.json"; +import backupQuestionData from "./data/questions.json"; + +//////////////////////////////////////////// +// Setting up the test data + +const { BLANK_QUESTIONS, SIMPLE_QUESTIONS }: Record = + // Typecast the test data that we imported to be a record matching + // strings to the question list + testQuestionData as Record; + +// We have backup versions of the data to make sure all changes are immutable +const { + BLANK_QUESTIONS: BACKUP_BLANK_QUESTIONS, + SIMPLE_QUESTIONS: BACKUP_SIMPLE_QUESTIONS +}: Record = backupQuestionData as Record< + string, + Question[] +>; + +// Unpack the list of simple questions into convenient constants +const [ADDITION_QUESTION, LETTER_QUESTION, COLOR_QUESTION, SHAPE_QUESTION] = + SIMPLE_QUESTIONS; +const [ + BACKUP_ADDITION_QUESTION, + BACKUP_LETTER_QUESTION, + BACKUP_COLOR_QUESTION, + BACKUP_SHAPE_QUESTION +] = BACKUP_SIMPLE_QUESTIONS; + +//////////////////////////////////////////// +// Actual tests + +describe("Testing the object functions", () => { + ////////////////////////////////// + // makeBlankQuestion + + test("Testing the makeBlankQuestion function", () => { + expect( + makeBlankQuestion(1, "Question 1", "multiple_choice_question") + ).toEqual(BLANK_QUESTIONS[0]); + expect( + makeBlankQuestion(47, "My New Question", "multiple_choice_question") + ).toEqual(BLANK_QUESTIONS[1]); + expect( + makeBlankQuestion(2, "Question 2", "short_answer_question") + ).toEqual(BLANK_QUESTIONS[2]); + }); + + /////////////////////////////////// + // isCorrect + test("Testing the isCorrect function", () => { + expect(isCorrect(ADDITION_QUESTION, "4")).toEqual(true); + expect(isCorrect(ADDITION_QUESTION, "2")).toEqual(false); + expect(isCorrect(ADDITION_QUESTION, " 4\n")).toEqual(true); + expect(isCorrect(LETTER_QUESTION, "Z")).toEqual(true); + expect(isCorrect(LETTER_QUESTION, "z")).toEqual(true); + expect(isCorrect(LETTER_QUESTION, "4")).toEqual(false); + expect(isCorrect(LETTER_QUESTION, "0")).toEqual(false); + expect(isCorrect(LETTER_QUESTION, "zed")).toEqual(false); + expect(isCorrect(COLOR_QUESTION, "red")).toEqual(true); + expect(isCorrect(COLOR_QUESTION, "apple")).toEqual(false); + expect(isCorrect(COLOR_QUESTION, "firetruck")).toEqual(false); + expect(isCorrect(SHAPE_QUESTION, "square")).toEqual(false); + expect(isCorrect(SHAPE_QUESTION, "triangle")).toEqual(false); + expect(isCorrect(SHAPE_QUESTION, "circle")).toEqual(true); + }); + + /////////////////////////////////// + // isValid + test("Testing the isValid function", () => { + expect(isValid(ADDITION_QUESTION, "4")).toEqual(true); + expect(isValid(ADDITION_QUESTION, "2")).toEqual(true); + expect(isValid(ADDITION_QUESTION, " 4\n")).toEqual(true); + expect(isValid(LETTER_QUESTION, "Z")).toEqual(true); + expect(isValid(LETTER_QUESTION, "z")).toEqual(true); + expect(isValid(LETTER_QUESTION, "4")).toEqual(true); + expect(isValid(LETTER_QUESTION, "0")).toEqual(true); + expect(isValid(LETTER_QUESTION, "zed")).toEqual(true); + expect(isValid(COLOR_QUESTION, "red")).toEqual(true); + expect(isValid(COLOR_QUESTION, "apple")).toEqual(true); + expect(isValid(COLOR_QUESTION, "firetruck")).toEqual(true); + expect(isValid(COLOR_QUESTION, "RED")).toEqual(false); + expect(isValid(COLOR_QUESTION, "orange")).toEqual(false); + expect(isValid(SHAPE_QUESTION, "square")).toEqual(true); + expect(isValid(SHAPE_QUESTION, "triangle")).toEqual(true); + expect(isValid(SHAPE_QUESTION, "circle")).toEqual(true); + expect(isValid(SHAPE_QUESTION, "circle ")).toEqual(false); + expect(isValid(SHAPE_QUESTION, "rhombus")).toEqual(false); + }); + + /////////////////////////////////// + // toShortForm + test("Testing the toShortForm function", () => { + expect(toShortForm(ADDITION_QUESTION)).toEqual("1: Addition"); + expect(toShortForm(LETTER_QUESTION)).toEqual("2: Letters"); + expect(toShortForm(COLOR_QUESTION)).toEqual("5: Colors"); + expect(toShortForm(SHAPE_QUESTION)).toEqual("9: Shapes"); + expect(toShortForm(BLANK_QUESTIONS[1])).toEqual("47: My New Que"); + }); + + /////////////////////////////////// + // toMarkdown + test("Testing the toMarkdown function", () => { + expect(toMarkdown(ADDITION_QUESTION)).toEqual(`# Addition +What is 2+2?`); + expect(toMarkdown(LETTER_QUESTION)).toEqual(`# Letters +What is the last letter of the English alphabet?`); + expect(toMarkdown(COLOR_QUESTION)).toEqual(`# Colors +Which of these is a color? +- red +- apple +- firetruck`); + expect(toMarkdown(SHAPE_QUESTION)).toEqual(`# Shapes +What shape can you make with one line? +- square +- triangle +- circle`); + }); + + afterEach(() => { + expect(ADDITION_QUESTION).toEqual(BACKUP_ADDITION_QUESTION); + expect(LETTER_QUESTION).toEqual(BACKUP_LETTER_QUESTION); + expect(SHAPE_QUESTION).toEqual(BACKUP_SHAPE_QUESTION); + expect(COLOR_QUESTION).toEqual(BACKUP_COLOR_QUESTION); + expect(BLANK_QUESTIONS).toEqual(BACKUP_BLANK_QUESTIONS); + }); + + /////////////////////////////////// + // renameQuestion + test("Testing the renameQuestion function", () => { + expect( + renameQuestion(ADDITION_QUESTION, "My Addition Question") + ).toEqual({ + id: 1, + name: "My Addition Question", + body: "What is 2+2?", + type: "short_answer_question", + options: [], + expected: "4", + points: 1, + published: true + }); + expect( + renameQuestion(SHAPE_QUESTION, "I COMPLETELY CHANGED THIS NAME") + ).toEqual({ + id: 9, + name: "I COMPLETELY CHANGED THIS NAME", + body: "What shape can you make with one line?", + type: "multiple_choice_question", + options: ["square", "triangle", "circle"], + expected: "circle", + points: 2, + published: false + }); + }); + + /////////////////////////////////// + // publishQuestion + test("Testing the publishQuestion function", () => { + expect(publishQuestion(ADDITION_QUESTION)).toEqual({ + id: 1, + name: "Addition", + body: "What is 2+2?", + type: "short_answer_question", + options: [], + expected: "4", + points: 1, + published: false + }); + expect(publishQuestion(LETTER_QUESTION)).toEqual({ + id: 2, + name: "Letters", + body: "What is the last letter of the English alphabet?", + type: "short_answer_question", + options: [], + expected: "Z", + points: 1, + published: true + }); + expect(publishQuestion(publishQuestion(ADDITION_QUESTION))).toEqual({ + id: 1, + name: "Addition", + body: "What is 2+2?", + type: "short_answer_question", + options: [], + expected: "4", + points: 1, + published: true + }); + }); + + /////////////////////////////////// + // duplicateQuestion + test("Testing the duplicateQuestion function", () => { + expect(duplicateQuestion(9, ADDITION_QUESTION)).toEqual({ + id: 9, + name: "Copy of Addition", + body: "What is 2+2?", + type: "short_answer_question", + options: [], + expected: "4", + points: 1, + published: false + }); + expect(duplicateQuestion(55, LETTER_QUESTION)).toEqual({ + id: 55, + name: "Copy of Letters", + body: "What is the last letter of the English alphabet?", + type: "short_answer_question", + options: [], + expected: "Z", + points: 1, + published: false + }); + }); + + /////////////////////////////////// + // addOption + test("Testing the addOption function", () => { + expect(addOption(SHAPE_QUESTION, "heptagon")).toEqual({ + id: 9, + name: "Shapes", + body: "What shape can you make with one line?", + type: "multiple_choice_question", + options: ["square", "triangle", "circle", "heptagon"], + expected: "circle", + points: 2, + published: false + }); + expect(addOption(COLOR_QUESTION, "squiggles")).toEqual({ + id: 5, + name: "Colors", + body: "Which of these is a color?", + type: "multiple_choice_question", + options: ["red", "apple", "firetruck", "squiggles"], + expected: "red", + points: 1, + published: true + }); + }); + + /////////////////////////////////// + // mergeQuestion + test("Testing the mergeQuestion function", () => { + expect( + mergeQuestion( + 192, + "More Points Addition", + ADDITION_QUESTION, + SHAPE_QUESTION + ) + ).toEqual({ + id: 192, + name: "More Points Addition", + body: "What is 2+2?", + type: "short_answer_question", + options: [], + expected: "4", + points: 2, + published: false + }); + + expect( + mergeQuestion( + 99, + "Less Points Shape", + SHAPE_QUESTION, + ADDITION_QUESTION + ) + ).toEqual({ + id: 99, + name: "Less Points Shape", + body: "What shape can you make with one line?", + type: "multiple_choice_question", + options: ["square", "triangle", "circle"], + expected: "circle", + points: 1, + published: false + }); + }); +}); diff --git a/src/objects.ts b/src/objects.ts new file mode 100644 index 0000000000..d03dd473e3 --- /dev/null +++ b/src/objects.ts @@ -0,0 +1,141 @@ +/** QuestionType influences how a question is asked and what kinds of answers are possible */ +export type QuestionType = "multiple_choice_question" | "short_answer_question"; + +export interface Question { + /** A unique identifier for the question */ + id: number; + /** The human-friendly title of the question */ + name: string; + /** The instructions and content of the Question */ + body: string; + /** The kind of Question; influences how the user answers and what options are displayed */ + type: QuestionType; + /** The possible answers for a Question (for Multiple Choice questions) */ + options: string[]; + /** The actually correct answer expected */ + expected: string; + /** How many points this question is worth, roughly indicating its importance and difficulty */ + points: number; + /** Whether or not this question is ready to display to students */ + published: boolean; +} + +/** + * Create a new blank question with the given `id`, `name`, and `type. The `body` and + * `expected` should be empty strings, the `options` should be an empty list, the `points` + * should default to 1, and `published` should default to false. + */ +export function makeBlankQuestion( + id: number, + name: string, + type: QuestionType +): Question { + return {}; +} + +/** + * Consumes a question and a potential `answer`, and returns whether or not + * the `answer` is correct. You should check that the `answer` is equal to + * the `expected`, ignoring capitalization and trimming any whitespace. + * + * HINT: Look up the `trim` and `toLowerCase` functions. + */ +export function isCorrect(question: Question, answer: string): boolean { + return false; +} + +/** + * Consumes a question and a potential `answer`, and returns whether or not + * the `answer` is valid (but not necessarily correct). For a `short_answer_question`, + * any answer is valid. But for a `multiple_choice_question`, the `answer` must + * be exactly one of the options. + */ +export function isValid(question: Question, answer: string): boolean { + return false; +} + +/** + * Consumes a question and produces a string representation combining the + * `id` and first 10 characters of the `name`. The two strings should be + * separated by ": ". So for example, the question with id 9 and the + * name "My First Question" would become "9: My First Q". + */ +export function toShortForm(question: Question): string { + return ""; +} + +/** + * Consumes a question and returns a formatted string representation as follows: + * - The first line should be a hash sign, a space, and then the `name` + * - The second line should be the `body` + * - If the question is a `multiple_choice_question`, then the following lines + * need to show each option on its line, preceded by a dash and space. + * + * The example below might help, but don't include the border! + * ----------Example------------- + * |# Name | + * |The body goes here! | + * |- Option 1 | + * |- Option 2 | + * |- Option 3 | + * ------------------------------ + * Check the unit tests for more examples of what this looks like! + */ +export function toMarkdown(question: Question): string { + return ""; +} + +/** + * Return a new version of the given question, except the name should now be + * `newName`. + */ +export function renameQuestion(question: Question, newName: string): Question { + return question; +} + +/** + * Return a new version of the given question, except the `published` field + * should be inverted. If the question was not published, now it should be + * published; if it was published, now it should be not published. + */ +export function publishQuestion(question: Question): Question { + return question; +} + +/** + * Create a new question based on the old question, copying over its `body`, `type`, + * `options`, `expected`, and `points` without changes. The `name` should be copied + * over as "Copy of ORIGINAL NAME" (e.g., so "Question 1" would become "Copy of Question 1"). + * The `published` field should be reset to false. + */ +export function duplicateQuestion(id: number, oldQuestion: Question): Question { + return oldQuestion; +} + +/** + * Return a new version of the given question, with the `newOption` added to + * the list of existing `options`. Remember that the new Question MUST have + * its own separate copy of the `options` list, rather than the same reference + * to the original question's list! + * Check out the subsection about "Nested Fields" for more information. + */ +export function addOption(question: Question, newOption: string): Question { + return question; +} + +/** + * Consumes an id, name, and two questions, and produces a new question. + * The new question will use the `body`, `type`, `options`, and `expected` of the + * `contentQuestion`. The second question will provide the `points`. + * The `published` status should be set to false. + * Notice that the second Question is provided as just an object with a `points` + * field; but the function call would be the same as if it were a `Question` type! + */ +export function mergeQuestion( + id: number, + name: string, + contentQuestion: Question, + { points }: { points: number } +): Question { + return contentQuestion; +} From 406ffb2b572cb14e885af2a2fddc8e9cc42c97dd Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Sun, 6 Feb 2022 18:33:46 -0500 Subject: [PATCH 31/44] Move Question interface to separate file --- src/interfaces/question.ts | 21 +++++++++++++++++++++ src/objects.test.ts | 2 +- src/objects.ts | 22 +--------------------- 3 files changed, 23 insertions(+), 22 deletions(-) create mode 100644 src/interfaces/question.ts diff --git a/src/interfaces/question.ts b/src/interfaces/question.ts new file mode 100644 index 0000000000..a39431565e --- /dev/null +++ b/src/interfaces/question.ts @@ -0,0 +1,21 @@ +/** QuestionType influences how a question is asked and what kinds of answers are possible */ +export type QuestionType = "multiple_choice_question" | "short_answer_question"; + +export interface Question { + /** A unique identifier for the question */ + id: number; + /** The human-friendly title of the question */ + name: string; + /** The instructions and content of the Question */ + body: string; + /** The kind of Question; influences how the user answers and what options are displayed */ + type: QuestionType; + /** The possible answers for a Question (for Multiple Choice questions) */ + options: string[]; + /** The actually correct answer expected */ + expected: string; + /** How many points this question is worth, roughly indicating its importance and difficulty */ + points: number; + /** Whether or not this question is ready to display to students */ + published: boolean; +} diff --git a/src/objects.test.ts b/src/objects.test.ts index bcff7ab176..a9c76a334e 100644 --- a/src/objects.test.ts +++ b/src/objects.test.ts @@ -1,7 +1,7 @@ +import { Question } from "./interfaces/question"; import { makeBlankQuestion, isCorrect, - Question, isValid, toShortForm, toMarkdown, diff --git a/src/objects.ts b/src/objects.ts index d03dd473e3..3fd2072e5e 100644 --- a/src/objects.ts +++ b/src/objects.ts @@ -1,24 +1,4 @@ -/** QuestionType influences how a question is asked and what kinds of answers are possible */ -export type QuestionType = "multiple_choice_question" | "short_answer_question"; - -export interface Question { - /** A unique identifier for the question */ - id: number; - /** The human-friendly title of the question */ - name: string; - /** The instructions and content of the Question */ - body: string; - /** The kind of Question; influences how the user answers and what options are displayed */ - type: QuestionType; - /** The possible answers for a Question (for Multiple Choice questions) */ - options: string[]; - /** The actually correct answer expected */ - expected: string; - /** How many points this question is worth, roughly indicating its importance and difficulty */ - points: number; - /** Whether or not this question is ready to display to students */ - published: boolean; -} +import { Question, QuestionType } from "./interfaces/question"; /** * Create a new blank question with the given `id`, `name`, and `type. The `body` and From 9b9adb6f2ccbd1113a09cb8e13186d6d4f829928 Mon Sep 17 00:00:00 2001 From: Austin Cory Bart Date: Sat, 24 Aug 2024 13:27:44 -0400 Subject: [PATCH 32/44] Fix formatting --- src/objects.test.ts | 70 ++++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/src/objects.test.ts b/src/objects.test.ts index a9c76a334e..4d3117405d 100644 --- a/src/objects.test.ts +++ b/src/objects.test.ts @@ -9,7 +9,7 @@ import { renameQuestion, publishQuestion, addOption, - mergeQuestion + mergeQuestion, } from "./objects"; import testQuestionData from "./data/questions.json"; import backupQuestionData from "./data/questions.json"; @@ -25,7 +25,7 @@ const { BLANK_QUESTIONS, SIMPLE_QUESTIONS }: Record = // We have backup versions of the data to make sure all changes are immutable const { BLANK_QUESTIONS: BACKUP_BLANK_QUESTIONS, - SIMPLE_QUESTIONS: BACKUP_SIMPLE_QUESTIONS + SIMPLE_QUESTIONS: BACKUP_SIMPLE_QUESTIONS, }: Record = backupQuestionData as Record< string, Question[] @@ -38,7 +38,7 @@ const [ BACKUP_ADDITION_QUESTION, BACKUP_LETTER_QUESTION, BACKUP_COLOR_QUESTION, - BACKUP_SHAPE_QUESTION + BACKUP_SHAPE_QUESTION, ] = BACKUP_SIMPLE_QUESTIONS; //////////////////////////////////////////// @@ -48,21 +48,25 @@ describe("Testing the object functions", () => { ////////////////////////////////// // makeBlankQuestion - test("Testing the makeBlankQuestion function", () => { + test("(3 pts) Testing the makeBlankQuestion function", () => { expect( - makeBlankQuestion(1, "Question 1", "multiple_choice_question") + makeBlankQuestion(1, "Question 1", "multiple_choice_question"), ).toEqual(BLANK_QUESTIONS[0]); expect( - makeBlankQuestion(47, "My New Question", "multiple_choice_question") + makeBlankQuestion( + 47, + "My New Question", + "multiple_choice_question", + ), ).toEqual(BLANK_QUESTIONS[1]); expect( - makeBlankQuestion(2, "Question 2", "short_answer_question") + makeBlankQuestion(2, "Question 2", "short_answer_question"), ).toEqual(BLANK_QUESTIONS[2]); }); /////////////////////////////////// // isCorrect - test("Testing the isCorrect function", () => { + test("(3 pts) Testing the isCorrect function", () => { expect(isCorrect(ADDITION_QUESTION, "4")).toEqual(true); expect(isCorrect(ADDITION_QUESTION, "2")).toEqual(false); expect(isCorrect(ADDITION_QUESTION, " 4\n")).toEqual(true); @@ -81,7 +85,7 @@ describe("Testing the object functions", () => { /////////////////////////////////// // isValid - test("Testing the isValid function", () => { + test("(3 pts) Testing the isValid function", () => { expect(isValid(ADDITION_QUESTION, "4")).toEqual(true); expect(isValid(ADDITION_QUESTION, "2")).toEqual(true); expect(isValid(ADDITION_QUESTION, " 4\n")).toEqual(true); @@ -104,7 +108,7 @@ describe("Testing the object functions", () => { /////////////////////////////////// // toShortForm - test("Testing the toShortForm function", () => { + test("(3 pts) Testing the toShortForm function", () => { expect(toShortForm(ADDITION_QUESTION)).toEqual("1: Addition"); expect(toShortForm(LETTER_QUESTION)).toEqual("2: Letters"); expect(toShortForm(COLOR_QUESTION)).toEqual("5: Colors"); @@ -114,7 +118,7 @@ describe("Testing the object functions", () => { /////////////////////////////////// // toMarkdown - test("Testing the toMarkdown function", () => { + test("(3 pts) Testing the toMarkdown function", () => { expect(toMarkdown(ADDITION_QUESTION)).toEqual(`# Addition What is 2+2?`); expect(toMarkdown(LETTER_QUESTION)).toEqual(`# Letters @@ -141,9 +145,9 @@ What shape can you make with one line? /////////////////////////////////// // renameQuestion - test("Testing the renameQuestion function", () => { + test("(3 pts) Testing the renameQuestion function", () => { expect( - renameQuestion(ADDITION_QUESTION, "My Addition Question") + renameQuestion(ADDITION_QUESTION, "My Addition Question"), ).toEqual({ id: 1, name: "My Addition Question", @@ -152,10 +156,10 @@ What shape can you make with one line? options: [], expected: "4", points: 1, - published: true + published: true, }); expect( - renameQuestion(SHAPE_QUESTION, "I COMPLETELY CHANGED THIS NAME") + renameQuestion(SHAPE_QUESTION, "I COMPLETELY CHANGED THIS NAME"), ).toEqual({ id: 9, name: "I COMPLETELY CHANGED THIS NAME", @@ -164,13 +168,13 @@ What shape can you make with one line? options: ["square", "triangle", "circle"], expected: "circle", points: 2, - published: false + published: false, }); }); /////////////////////////////////// // publishQuestion - test("Testing the publishQuestion function", () => { + test("(3 pts) Testing the publishQuestion function", () => { expect(publishQuestion(ADDITION_QUESTION)).toEqual({ id: 1, name: "Addition", @@ -179,7 +183,7 @@ What shape can you make with one line? options: [], expected: "4", points: 1, - published: false + published: false, }); expect(publishQuestion(LETTER_QUESTION)).toEqual({ id: 2, @@ -189,7 +193,7 @@ What shape can you make with one line? options: [], expected: "Z", points: 1, - published: true + published: true, }); expect(publishQuestion(publishQuestion(ADDITION_QUESTION))).toEqual({ id: 1, @@ -199,13 +203,13 @@ What shape can you make with one line? options: [], expected: "4", points: 1, - published: true + published: true, }); }); /////////////////////////////////// // duplicateQuestion - test("Testing the duplicateQuestion function", () => { + test("(3 pts) Testing the duplicateQuestion function", () => { expect(duplicateQuestion(9, ADDITION_QUESTION)).toEqual({ id: 9, name: "Copy of Addition", @@ -214,7 +218,7 @@ What shape can you make with one line? options: [], expected: "4", points: 1, - published: false + published: false, }); expect(duplicateQuestion(55, LETTER_QUESTION)).toEqual({ id: 55, @@ -224,13 +228,13 @@ What shape can you make with one line? options: [], expected: "Z", points: 1, - published: false + published: false, }); }); /////////////////////////////////// // addOption - test("Testing the addOption function", () => { + test("(3 pts) Testing the addOption function", () => { expect(addOption(SHAPE_QUESTION, "heptagon")).toEqual({ id: 9, name: "Shapes", @@ -239,7 +243,7 @@ What shape can you make with one line? options: ["square", "triangle", "circle", "heptagon"], expected: "circle", points: 2, - published: false + published: false, }); expect(addOption(COLOR_QUESTION, "squiggles")).toEqual({ id: 5, @@ -249,20 +253,20 @@ What shape can you make with one line? options: ["red", "apple", "firetruck", "squiggles"], expected: "red", points: 1, - published: true + published: true, }); }); /////////////////////////////////// // mergeQuestion - test("Testing the mergeQuestion function", () => { + test("(3 pts) Testing the mergeQuestion function", () => { expect( mergeQuestion( 192, "More Points Addition", ADDITION_QUESTION, - SHAPE_QUESTION - ) + SHAPE_QUESTION, + ), ).toEqual({ id: 192, name: "More Points Addition", @@ -271,7 +275,7 @@ What shape can you make with one line? options: [], expected: "4", points: 2, - published: false + published: false, }); expect( @@ -279,8 +283,8 @@ What shape can you make with one line? 99, "Less Points Shape", SHAPE_QUESTION, - ADDITION_QUESTION - ) + ADDITION_QUESTION, + ), ).toEqual({ id: 99, name: "Less Points Shape", @@ -289,7 +293,7 @@ What shape can you make with one line? options: ["square", "triangle", "circle"], expected: "circle", points: 1, - published: false + published: false, }); }); }); From 703ae4e7a03798cde5e71a991f108df329ae941a Mon Sep 17 00:00:00 2001 From: Amy Mendoza Date: Thu, 5 Feb 2026 21:22:39 -0500 Subject: [PATCH 33/44] Added name to App --- src/App.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/App.tsx b/src/App.tsx index b77558eaac..6068b33f0b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -5,8 +5,9 @@ function App(): React.JSX.Element { return (
- UD CISC275 with React Hooks and TypeScript + UD CISC275 with React Hooks and TypeScript - Amy Mendoza
+

Edit src/App.tsx and save. This page will automatically reload. From f4f8f46f14d8c3d87f5b25e27c38114a65830cf8 Mon Sep 17 00:00:00 2001 From: Amy Mendoza Date: Tue, 10 Feb 2026 12:16:15 -0500 Subject: [PATCH 34/44] Added 'Hello World' to body of the page --- package-lock.json | 155 ++++++++++++++++++++++++++-------------------- src/App.tsx | 3 + 2 files changed, 91 insertions(+), 67 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8c3779f487..8c4e862b08 100644 --- a/package-lock.json +++ b/package-lock.json @@ -100,6 +100,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", @@ -785,6 +786,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz", "integrity": "sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -1663,6 +1665,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", @@ -2153,7 +2156,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" @@ -2166,7 +2169,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", @@ -3273,7 +3276,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" @@ -3436,7 +3439,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", @@ -3454,7 +3457,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -3470,7 +3473,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -3487,7 +3490,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -3500,14 +3503,14 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@jest/types/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -3517,7 +3520,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -3909,7 +3912,7 @@ "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@sinonjs/commons": { @@ -4222,8 +4225,8 @@ "version": "10.4.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", - "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -4242,7 +4245,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -4258,7 +4260,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -4275,7 +4276,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -4288,14 +4288,12 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, "license": "MIT" }, "node_modules/@testing-library/dom/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -4305,7 +4303,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -4470,35 +4467,34 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, "license": "MIT" }, "node_modules/@types/babel__core": { @@ -4728,7 +4724,8 @@ "version": "16.18.105", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.105.tgz", "integrity": "sha512-w2d0Z9yMk07uH3+Cx0N8lqFyi3yjXZxlbYappPj+AsOlT02OyxyiuNoNHdGt6EuiSm8Wtgp2YV7vWg+GMFrvFA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/node-forge": { "version": "1.3.11", @@ -4791,6 +4788,7 @@ "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/react": "*" } @@ -4911,7 +4909,7 @@ "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@types/yargs-parser": "*" @@ -5116,6 +5114,7 @@ "integrity": "sha512-j3Di+o0lHgPrb7FxL3fdEy6LJ/j2NE8u+AP/5cQ9SKb+JLH6V6UHDqJ+e0hXBkHP1wn1YDFjYCS9LBQsZDlDEg==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.2.0", "@typescript-eslint/types": "8.2.0", @@ -5468,6 +5467,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5508,7 +5508,7 @@ "version": "8.3.3", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "acorn": "^8.11.0" @@ -5569,6 +5569,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6556,6 +6557,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001646", "electron-to-chromium": "^1.5.4", @@ -7210,7 +7212,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/cross-spawn": { @@ -7947,7 +7949,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -8499,6 +8501,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -8555,6 +8558,7 @@ "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "license": "MIT", + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -8595,6 +8599,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", @@ -8629,6 +8634,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -12248,6 +12254,7 @@ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -13021,7 +13028,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -13031,7 +13038,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", @@ -13949,7 +13956,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -13959,7 +13966,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "chalk": "^4.0.0", @@ -13994,7 +14001,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -14010,7 +14017,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -14027,7 +14034,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -14040,14 +14047,14 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/jest-resolve/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -14057,7 +14064,7 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -14075,7 +14082,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -14518,7 +14525,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", @@ -14536,7 +14543,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -14552,7 +14559,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -14569,7 +14576,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -14582,14 +14589,14 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/jest-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -14599,7 +14606,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -14612,7 +14619,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", @@ -14630,7 +14637,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -14646,7 +14653,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=10" @@ -14659,7 +14666,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -14676,7 +14683,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -14689,14 +14696,14 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/jest-validate/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -14706,7 +14713,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", @@ -14721,7 +14728,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=10" @@ -14734,14 +14741,14 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/jest-validate/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -14850,7 +14857,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -14866,7 +14873,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -14876,7 +14883,7 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -15368,7 +15375,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, "license": "MIT", "bin": { "lz-string": "bin/bin.js" @@ -15402,7 +15408,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/makeerror": { @@ -16444,6 +16450,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.1", @@ -17650,6 +17657,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -17759,6 +17767,7 @@ "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -18290,6 +18299,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -18481,6 +18491,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -18512,6 +18523,7 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -19225,6 +19237,7 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", @@ -20668,7 +20681,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=10" @@ -20714,6 +20727,7 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", "license": "MIT", + "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -20964,6 +20978,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -22588,8 +22603,9 @@ "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, + "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -22632,7 +22648,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/tsconfig-paths": { @@ -22721,6 +22737,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "license": "(MIT OR CC0-1.0)", + "peer": true, "engines": { "node": ">=10" }, @@ -22828,6 +22845,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -23056,7 +23074,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/v8-to-istanbul": { @@ -23205,6 +23223,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", @@ -23275,6 +23294,7 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "license": "MIT", + "peer": true, "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -23665,6 +23685,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -24118,7 +24139,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6" diff --git a/src/App.tsx b/src/App.tsx index 6068b33f0b..643de6a5bd 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -12,6 +12,9 @@ function App(): React.JSX.Element { Edit src/App.tsx and save. This page will automatically reload.

+

+ Hello World! +

); } From a30a3af5c3a75fae0584060db2c5fa81260d4ac0 Mon Sep 17 00:00:00 2001 From: Amy Mendoza Date: Wed, 11 Feb 2026 09:36:33 -0500 Subject: [PATCH 35/44] Added 'Hello World' --- src/App.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.tsx b/src/App.tsx index 643de6a5bd..1301d1cd52 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -13,7 +13,7 @@ function App(): React.JSX.Element { automatically reload.

- Hello World! + Hello World!!

); From d2b870a7fb85909cfaa47fd333e4d642023608eb Mon Sep 17 00:00:00 2001 From: Amy Mendoza Date: Thu, 12 Feb 2026 12:07:29 -0500 Subject: [PATCH 36/44] Completed Task 3 --- src/App.css | 1 + src/App.tsx | 76 ++++++++++++++++++++++++++++++++++------ src/Images/IMG_0444.jpg | Bin 0 -> 44123 bytes 3 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 src/Images/IMG_0444.jpg diff --git a/src/App.css b/src/App.css index ad32fac073..cd06bd1c0b 100644 --- a/src/App.css +++ b/src/App.css @@ -37,3 +37,4 @@ transform: rotate(360deg); } } + diff --git a/src/App.tsx b/src/App.tsx index 1301d1cd52..349f1d938c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,21 +1,77 @@ import React from "react"; import "./App.css"; +import image from './Images/IMG_0444.jpg'; +import {Button, Col, Container, Row} from 'react-bootstrap' function App(): React.JSX.Element { return ( -
+
+
+ + + + Column 1 + + + Column 2 + + + Column 3 + + + +
- UD CISC275 with React Hooks and TypeScript - Amy Mendoza +

UDCISC275 with Reach Hooks and Types by Amy Mendoza

- -

- Edit src/App.tsx and save. This page will - automatically reload. -

-

- Hello World!! -

+
+ A funny Picture +
    +
  1. Tacos
  2. +
  3. Quesadilla
  4. +
  5. Soup
  6. +
+ +
+ + //
+ //
+ // UD CISC275 with React Hooks and TypeScript - Amy Mendoza + //
+ + //

+ // Edit src/App.tsx and save. This page will + // automatically reload. + //

+ //

+ // Hello World! + //

+ //
); } diff --git a/src/Images/IMG_0444.jpg b/src/Images/IMG_0444.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8cc22586af6e725eead7c80d62b228bbf5ba53ee GIT binary patch literal 44123 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 literal 0 HcmV?d00001 From f616cefa750ced648309ad4f7382172473533ea1 Mon Sep 17 00:00:00 2001 From: Amy Mendoza Date: Sun, 15 Feb 2026 19:18:08 -0500 Subject: [PATCH 37/44] Created fahrenheitToCelius and add3 functions --- src/functions.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/functions.ts b/src/functions.ts index e614c81c0c..6f30237e93 100644 --- a/src/functions.ts +++ b/src/functions.ts @@ -4,7 +4,7 @@ * C = (F - 32) * 5/9 */ export function fahrenheitToCelius(temperature: number): number { - return 0; + return (temperature - 32) * 5/9; } /** @@ -12,7 +12,15 @@ export function fahrenheitToCelius(temperature: number): number { * if the number is greater than zero. */ export function add3(first: number, second: number, third: number): number { - return 0; + let sum: number = 0; + if(first > 0){ + sum += first; + }if(second > 0){ + sum += second; + } if(third > 0){ + sum += third; + } + return sum; } /** From 248b8604ceae2c658e83b99f3c25104c1928a535 Mon Sep 17 00:00:00 2001 From: Amy Mendoza Date: Tue, 17 Feb 2026 11:23:09 -0500 Subject: [PATCH 38/44] Compiled function shout and function isQuestion --- src/functions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/functions.ts b/src/functions.ts index 6f30237e93..4d7ae8633c 100644 --- a/src/functions.ts +++ b/src/functions.ts @@ -28,7 +28,7 @@ export function add3(first: number, second: number, third: number): number { * mark added to the end. */ export function shout(message: string): string { - return ""; + return message.toUpperCase() +"!"; } /** @@ -36,7 +36,7 @@ export function shout(message: string): string { * mark. Do not use an `if` statement in solving this question. */ export function isQuestion(message: string): boolean { - return true; + return message.endsWith('?'); } /** From 3284e2b1fb4f6eb80db1294e7d4673c36ae713f0 Mon Sep 17 00:00:00 2001 From: Amy Mendoza Date: Tue, 17 Feb 2026 11:27:06 -0500 Subject: [PATCH 39/44] Implemented convertYesNO function --- src/functions.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/functions.ts b/src/functions.ts index 4d7ae8633c..a4d08ab7b1 100644 --- a/src/functions.ts +++ b/src/functions.ts @@ -45,5 +45,10 @@ export function isQuestion(message: string): boolean { * upper or lower case), then return `false`. Otherwise, return `null`. */ export function convertYesNo(word: string): boolean | null { - return true; + if(word === "yes" || word == "YES"){ + return true + } else if ( word === "no" || word === "NO"){ + return false; + } + return null; } From 960286fe6d5297934a0645d171d421738b9fddd5 Mon Sep 17 00:00:00 2001 From: Amy Mendoza Date: Tue, 17 Feb 2026 19:43:34 -0500 Subject: [PATCH 40/44] Implemented tripleNumbers and stringsToIntegers function --- src/arrays.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/arrays.ts b/src/arrays.ts index 4a2ffe8e5b..ff8d59141d 100644 --- a/src/arrays.ts +++ b/src/arrays.ts @@ -13,7 +13,8 @@ export function bookEndList(numbers: number[]): number[] { * number has been tripled (multiplied by 3). */ export function tripleNumbers(numbers: number[]): number[] { - return numbers; + let tripled = numbers.map(num => 3 * num); + return tripled; } /** @@ -21,7 +22,8 @@ export function tripleNumbers(numbers: number[]): number[] { * the number cannot be parsed as an integer, convert it to 0 instead. */ export function stringsToIntegers(numbers: string[]): number[] { - return []; + let newarr = numbers.map((num: string):number => parseInt(num) || 0) + return newarr; } /** From 9866b504a4bd026b32dfea372a524f74d0d7efaf Mon Sep 17 00:00:00 2001 From: Amy Mendoza Date: Wed, 18 Feb 2026 13:11:29 -0500 Subject: [PATCH 41/44] Implemented shoutIfExclaiming, countShortWords, allRGB, & makeMath --- src/arrays.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/arrays.ts b/src/arrays.ts index ff8d59141d..fddbde9d23 100644 --- a/src/arrays.ts +++ b/src/arrays.ts @@ -34,7 +34,9 @@ export function stringsToIntegers(numbers: string[]): number[] { */ // Remember, you can write functions as lambdas too! They work exactly the same. export const removeDollars = (amounts: string[]): number[] => { - return []; + let dollars = amounts.map((amount: string): number => (amount.startsWith('$')) ? parseInt(amount.slice(1)): parseInt(amount)|| 0); + console.log(dollars); + return dollars; }; /** @@ -43,7 +45,8 @@ export const removeDollars = (amounts: string[]): number[] => { * in question marks ("?"). */ export const shoutIfExclaiming = (messages: string[]): string[] => { - return []; + let shout = messages.map((message: string): string => (message.endsWith("!")) ? message.toUpperCase(): message).filter((message: string): boolean => (!message.endsWith("?"))) + return shout; }; /** @@ -51,7 +54,9 @@ export const shoutIfExclaiming = (messages: string[]): string[] => { * 4 letters long. */ export function countShortWords(words: string[]): number { - return 0; + let lenwords = words.filter((word: string): boolean => (word.length < 4)) + console.log(lenwords) + return lenwords.length; } /** @@ -60,7 +65,8 @@ export function countShortWords(words: string[]): number { * then return true. */ export function allRGB(colors: string[]): boolean { - return false; + let rgb = colors.every((color: string): boolean => color === "red" || color === "green" || color === "blue") + return rgb; } /** @@ -71,7 +77,8 @@ export function allRGB(colors: string[]): boolean { * And the array [] would become "0=0". */ export function makeMath(addends: number[]): string { - return ""; + let sum = addends.reduce((currentTotal: number, num: number) => currentTotal+num, 0 ); + return (sum.toString() + "=" + (addends.length > 0 ? addends.join("+") : "0")); } /** From f9e00806449f5eacc1d09199e2f93b4658979582 Mon Sep 17 00:00:00 2001 From: Amy Mendoza Date: Sun, 22 Feb 2026 16:55:35 -0500 Subject: [PATCH 42/44] corrected and implemented removeDollars --- src/arrays.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/arrays.ts b/src/arrays.ts index fddbde9d23..479034b7f6 100644 --- a/src/arrays.ts +++ b/src/arrays.ts @@ -5,7 +5,8 @@ * the number twice. */ export function bookEndList(numbers: number[]): number[] { - return numbers; + let newArr = numbers.length > 1 ? [numbers[0], numbers[numbers.length - 1]] : (numbers.length === 1) ? [numbers[0] ,numbers[0]] : [] + return newArr; } /** @@ -34,8 +35,8 @@ export function stringsToIntegers(numbers: string[]): number[] { */ // Remember, you can write functions as lambdas too! They work exactly the same. export const removeDollars = (amounts: string[]): number[] => { - let dollars = amounts.map((amount: string): number => (amount.startsWith('$')) ? parseInt(amount.slice(1)): parseInt(amount)|| 0); - console.log(dollars); + let dollars = amounts.map((amount: string): number => (parseInt(amount.replace(/\$/g, "")) ? parseInt(amount.replace(/\$/g, "")) : 0)); + console.log(dollars) return dollars; }; @@ -55,7 +56,6 @@ export const shoutIfExclaiming = (messages: string[]): string[] => { */ export function countShortWords(words: string[]): number { let lenwords = words.filter((word: string): boolean => (word.length < 4)) - console.log(lenwords) return lenwords.length; } From 4b3b87fa6a9b3289f9570e0de5d8876769a60b0f Mon Sep 17 00:00:00 2001 From: Amy Mendoza Date: Sun, 22 Feb 2026 18:25:25 -0500 Subject: [PATCH 43/44] created injectPositive & removed console.logs --- src/arrays.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/arrays.ts b/src/arrays.ts index 479034b7f6..37a15ee766 100644 --- a/src/arrays.ts +++ b/src/arrays.ts @@ -36,7 +36,6 @@ export function stringsToIntegers(numbers: string[]): number[] { // Remember, you can write functions as lambdas too! They work exactly the same. export const removeDollars = (amounts: string[]): number[] => { let dollars = amounts.map((amount: string): number => (parseInt(amount.replace(/\$/g, "")) ? parseInt(amount.replace(/\$/g, "")) : 0)); - console.log(dollars) return dollars; }; @@ -91,5 +90,10 @@ export function makeMath(addends: number[]): string { * And the array [1, 9, 7] would become [1, 9, 7, 17] */ export function injectPositive(values: number[]): number[] { - return []; + let indx = values.findIndex((value: number): boolean => value < 0); + let sum = (indx === -1) ? values.reduce((currentTotal: number, num: number) => currentTotal+num, 0): values.slice(0, indx).reduce((currentTotal: number, num: number) => { return num > 0 ? currentTotal + num : currentTotal + 0; }, 0); + let newArr = [...values]; + newArr.splice(indx + 1, 0, sum); + let final = (indx === -1) ? [...values, sum]: newArr; + return final; } From 73fefe75306a3f81a101db511b03d5e14c219a20 Mon Sep 17 00:00:00 2001 From: Amy Mendoza Date: Thu, 26 Feb 2026 20:40:46 -0500 Subject: [PATCH 44/44] Configured all functions --- src/objects.ts | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/objects.ts b/src/objects.ts index 3fd2072e5e..d093e421c3 100644 --- a/src/objects.ts +++ b/src/objects.ts @@ -10,7 +10,7 @@ export function makeBlankQuestion( name: string, type: QuestionType ): Question { - return {}; + return {id,name,body:"", type, options: [], expected:"", points:1, published: false}; } /** @@ -21,7 +21,7 @@ export function makeBlankQuestion( * HINT: Look up the `trim` and `toLowerCase` functions. */ export function isCorrect(question: Question, answer: string): boolean { - return false; + return question.expected.toLocaleLowerCase().trim() === answer.toLocaleLowerCase().trim() } /** @@ -31,7 +31,8 @@ export function isCorrect(question: Question, answer: string): boolean { * be exactly one of the options. */ export function isValid(question: Question, answer: string): boolean { - return false; + let validAnswer = question.options.some((option: string): boolean => option === answer) + return (question.type === "multiple_choice_question" && validAnswer) || question.type === "short_answer_question" ? true: false } /** @@ -41,7 +42,7 @@ export function isValid(question: Question, answer: string): boolean { * name "My First Question" would become "9: My First Q". */ export function toShortForm(question: Question): string { - return ""; + return question.id + ": " + question.name.slice(0,10); } /** @@ -62,7 +63,8 @@ export function toShortForm(question: Question): string { * Check the unit tests for more examples of what this looks like! */ export function toMarkdown(question: Question): string { - return ""; + return question.type === "short_answer_question" ? + `# ${question.name}\n${question.body}` : `# ${question.name}\n${question.body}\n${question.options.join('\n').replace(/^/gm, "- ")}` } /** @@ -70,7 +72,7 @@ export function toMarkdown(question: Question): string { * `newName`. */ export function renameQuestion(question: Question, newName: string): Question { - return question; + return {...question, name: newName} } /** @@ -79,7 +81,7 @@ export function renameQuestion(question: Question, newName: string): Question { * published; if it was published, now it should be not published. */ export function publishQuestion(question: Question): Question { - return question; + return {...question, published: !question.published} } /** @@ -89,7 +91,7 @@ export function publishQuestion(question: Question): Question { * The `published` field should be reset to false. */ export function duplicateQuestion(id: number, oldQuestion: Question): Question { - return oldQuestion; + return {...oldQuestion, id: id, name:`Copy of ${oldQuestion.name}`, published: false}; } /** @@ -100,7 +102,7 @@ export function duplicateQuestion(id: number, oldQuestion: Question): Question { * Check out the subsection about "Nested Fields" for more information. */ export function addOption(question: Question, newOption: string): Question { - return question; + return {...question, options: [...question.options, newOption]} } /** @@ -117,5 +119,5 @@ export function mergeQuestion( contentQuestion: Question, { points }: { points: number } ): Question { - return contentQuestion; + return {id, name, body: contentQuestion.body, type: contentQuestion.type, options: contentQuestion.options, expected: contentQuestion.expected, points: points, published: false}; }