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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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 84a5e6432152c9f0fb53dc86496c0eafb7221607 Mon Sep 17 00:00:00 2001
From: "samita.boma" <148894025+Samita-Boma@users.noreply.github.com>
Date: Wed, 27 Aug 2025 17:37:52 -0400
Subject: [PATCH 25/35] Update deploy.yml
---
.github/workflows/deploy.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 1a225c9283..b3fbd5360b 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -117,7 +117,7 @@ jobs:
- name: Generate HTML from Markdown in Docs/
if: ${{ !cancelled() }}
id: markdown-docs
- uses: ldeluigi/markdown-docs@latest
+ uses: ldeluigi/markdown-docs@v1.5.0
with:
src: docs
dst: dist/docs/
@@ -143,5 +143,5 @@ jobs:
path: "dist/"
- name: Deploy to GitHub Pages
id: deployment
- uses: actions/deploy-pages@v2
+ uses: actions/deploy-pages@v4
if: ${{ !cancelled() }}
From 3c1c118f45740ed9fc9f7b1a8227d0f96d4589be Mon Sep 17 00:00:00 2001
From: "samita.boma" <148894025+Samita-Boma@users.noreply.github.com>
Date: Wed, 27 Aug 2025 17:41:00 -0400
Subject: [PATCH 26/35] Update deploy.yml
---
.github/workflows/deploy.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index b3fbd5360b..92198985e0 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -117,7 +117,7 @@ jobs:
- name: Generate HTML from Markdown in Docs/
if: ${{ !cancelled() }}
id: markdown-docs
- uses: ldeluigi/markdown-docs@v1.5.0
+ uses: ldeluigi/markdown-docs@latest
with:
src: docs
dst: dist/docs/
From 4b713a453178ab7ed88fb429498ef26b5321bcb1 Mon Sep 17 00:00:00 2001
From: "samita.boma" <148894025+Samita-Boma@users.noreply.github.com>
Date: Wed, 27 Aug 2025 17:42:31 -0400
Subject: [PATCH 27/35] Update deploy.yml
---
.github/workflows/deploy.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 92198985e0..35fae83bb3 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -137,7 +137,7 @@ jobs:
uses: actions/configure-pages@v3
if: ${{ !cancelled() }}
- name: Upload artifact
- uses: actions/upload-pages-artifact@v2
+ uses: actions/upload-pages-artifact@v4
if: ${{ !cancelled() }}
with:
path: "dist/"
From adacd7fa736222c46bb22e4cc8a2f21883dfe13f Mon Sep 17 00:00:00 2001
From: "samita.boma" <148894025+Samita-Boma@users.noreply.github.com>
Date: Wed, 27 Aug 2025 18:01:43 -0400
Subject: [PATCH 28/35] Update deploy.yml
---
.github/workflows/deploy.yml | 35 ++++++++++++++++++++---------------
1 file changed, 20 insertions(+), 15 deletions(-)
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 35fae83bb3..7c8df4f80f 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -24,26 +24,29 @@ concurrency:
jobs:
deploy:
runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ node-version: [20]
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- - name: Use Node.js ${{ matrix.node-version }}
+ - name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- - id: get-repo-values
- name: Get repository values
- run: |
- url=https://$(echo "${{github.repository}}" | sed "s/\//.github.io\//")
- echo "url=$url" >> $GITHUB_OUTPUT
+ #- id: get-repo-values
+ # name: Get repository values
+ # run: |
+ # url=https://$(echo "${{github.repository}}" | sed "s/\//.github.io\//")
+ # echo "url=$url" >> $GITHUB_OUTPUT
- name: Update package.json homepage
uses: jossef/action-set-json-field@v1
with:
file: package.json
field: homepage
- value: ${{ steps.get-repo-values.outputs.url }}
+ value: "https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}"
# create_redirects
- name: Create Redirects and Links
id: create_redirects
@@ -93,8 +96,8 @@ jobs:
echo "* [Tests](../tests.html)" >> docs/quick-links.md
# Verify Integrity
- name: Verify Integrity
- if: ${{ !cancelled() }}
- id: integrity
+ #if: ${{ !cancelled() }}
+ #id: integrity
run: |
echo "" > ./dist/integrity.html
find src -type f -name "*.test.ts" -exec md5sum {} + >> ./dist/integrity.html
@@ -107,16 +110,16 @@ jobs:
echo "* [Integrity](../integrity.html)" >> docs/quick-links.md
# Create GitInspector Report
- name: Create GitInspector Report
- if: ${{ !cancelled() }}
- id: gitinspector
+ #if: ${{ !cancelled() }}
+ #id: gitinspector
run: |
git clone https://github.com/jpwhite3/gitinspector.git
python ./gitinspector/gitinspector.py ./ --grading --format=html -f tsx,ts,html,css -x ./gitinspector -x ./node_modules -x ./wbcore > ./dist/git.html
echo "* [Git Inspector](../git.html)" >> docs/quick-links.md
# Generate HTML from Markdown in Docs/
- name: Generate HTML from Markdown in Docs/
- if: ${{ !cancelled() }}
- id: markdown-docs
+ #if: ${{ !cancelled() }}
+ #id: markdown-docs
uses: ldeluigi/markdown-docs@latest
with:
src: docs
@@ -138,10 +141,12 @@ jobs:
if: ${{ !cancelled() }}
- name: Upload artifact
uses: actions/upload-pages-artifact@v4
- if: ${{ !cancelled() }}
+ #if: ${{ !cancelled() }}
with:
path: "dist/"
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
- if: ${{ !cancelled() }}
+ #if: ${{ !cancelled() }}
+ - name: Show deployed URL
+ run: echo Evaluated environment url ${{ steps.deployment.outputs.page_url }}"
From 308a6fd4934ebc8a1506689e18664d222db2af72 Mon Sep 17 00:00:00 2001
From: "samita.boma" <148894025+Samita-Boma@users.noreply.github.com>
Date: Wed, 27 Aug 2025 18:04:55 -0400
Subject: [PATCH 29/35] Update deploy.yml
---
.github/workflows/deploy.yml | 36 +++++++++++++++---------------------
1 file changed, 15 insertions(+), 21 deletions(-)
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 7c8df4f80f..6f3386d428 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -24,29 +24,26 @@ concurrency:
jobs:
deploy:
runs-on: ubuntu-latest
- strategy:
- matrix:
- node-version: [20]
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- - name: Setup Node.js
+ - name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- #- id: get-repo-values
- # name: Get repository values
- # run: |
- # url=https://$(echo "${{github.repository}}" | sed "s/\//.github.io\//")
- # echo "url=$url" >> $GITHUB_OUTPUT
+ - id: get-repo-values
+ name: Get repository values
+ run: |
+ url=https://$(echo "${{github.repository}}" | sed "s/\//.github.io\//")
+ echo "url=$url" >> $GITHUB_OUTPUT
- name: Update package.json homepage
uses: jossef/action-set-json-field@v1
with:
file: package.json
field: homepage
- value: "https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}"
+ value: ${{ steps.get-repo-values.outputs.url }}
# create_redirects
- name: Create Redirects and Links
id: create_redirects
@@ -55,7 +52,6 @@ jobs:
echo "\
\
Redirecting to repository" > ./dist/repo.html
-
mkdir -p docs
cp README.md docs/index.md
echo "# Quick Links" > docs/quick-links.md
@@ -96,8 +92,8 @@ jobs:
echo "* [Tests](../tests.html)" >> docs/quick-links.md
# Verify Integrity
- name: Verify Integrity
- #if: ${{ !cancelled() }}
- #id: integrity
+ if: ${{ !cancelled() }}
+ id: integrity
run: |
echo "" > ./dist/integrity.html
find src -type f -name "*.test.ts" -exec md5sum {} + >> ./dist/integrity.html
@@ -110,16 +106,16 @@ jobs:
echo "* [Integrity](../integrity.html)" >> docs/quick-links.md
# Create GitInspector Report
- name: Create GitInspector Report
- #if: ${{ !cancelled() }}
- #id: gitinspector
+ if: ${{ !cancelled() }}
+ id: gitinspector
run: |
git clone https://github.com/jpwhite3/gitinspector.git
python ./gitinspector/gitinspector.py ./ --grading --format=html -f tsx,ts,html,css -x ./gitinspector -x ./node_modules -x ./wbcore > ./dist/git.html
echo "* [Git Inspector](../git.html)" >> docs/quick-links.md
# Generate HTML from Markdown in Docs/
- name: Generate HTML from Markdown in Docs/
- #if: ${{ !cancelled() }}
- #id: markdown-docs
+ if: ${{ !cancelled() }}
+ id: markdown-docs
uses: ldeluigi/markdown-docs@latest
with:
src: docs
@@ -141,12 +137,10 @@ jobs:
if: ${{ !cancelled() }}
- name: Upload artifact
uses: actions/upload-pages-artifact@v4
- #if: ${{ !cancelled() }}
+ if: ${{ !cancelled() }}
with:
path: "dist/"
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
- #if: ${{ !cancelled() }}
- - name: Show deployed URL
- run: echo Evaluated environment url ${{ steps.deployment.outputs.page_url }}"
+ if: ${{ !cancelled() }}
From 3061b6660b1573534d0610011d951777ecbb9850 Mon Sep 17 00:00:00 2001
From: "samita.boma" <148894025+Samita-Boma@users.noreply.github.com>
Date: Wed, 27 Aug 2025 18:19:17 -0400
Subject: [PATCH 30/35] Update deploy.yml
---
.github/workflows/deploy.yml | 278 ++++++++++++++++++-----------------
1 file changed, 143 insertions(+), 135 deletions(-)
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 6f3386d428..10d82be5ee 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -3,144 +3,152 @@
name: Deploy main branch as website
on:
- push:
- branches: [main]
+ push:
+ branches: [main]
+ workflow_dispatch:
- # Allows you to run this workflow manually from the Actions tab
- workflow_dispatch:
-
-# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
+# Required permissions for Pages v4 + artifact v4
permissions:
- contents: read
- pages: write
- id-token: write
+ actions: read # NEW: required by deploy-pages@v4
+ contents: read
+ pages: write
+ id-token: write
-# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
-# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
+# Only one concurrent deployment
concurrency:
- group: "pages"
- cancel-in-progress: false
+ group: "pages"
+ cancel-in-progress: false
jobs:
- deploy:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v4
- with:
- fetch-depth: 0
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v3
- with:
- node-version: ${{ matrix.node-version }}
- - id: get-repo-values
- name: Get repository values
- run: |
- url=https://$(echo "${{github.repository}}" | sed "s/\//.github.io\//")
- echo "url=$url" >> $GITHUB_OUTPUT
- - name: Update package.json homepage
- uses: jossef/action-set-json-field@v1
- with:
- file: package.json
- field: homepage
- value: ${{ steps.get-repo-values.outputs.url }}
- # create_redirects
- - name: Create Redirects and Links
- id: create_redirects
- run: |
- mkdir -p dist
- echo "\
- \
- Redirecting to repository" > ./dist/repo.html
- mkdir -p docs
- cp README.md docs/index.md
- echo "# Quick Links" > docs/quick-links.md
- echo "* [Repository](../repo.html)" >> docs/quick-links.md
- echo "\
- \
- Redirecting to quick links page" > ./dist/quick.html
- # Install node packages
- - name: Install
- id: install
- run: |
- echo "" > ./dist/installation.html
- npm install |& tee -a ./dist/installation.html
- echo "
" >> ./dist/installation.html
- echo "* [Installation](../installation.html)" >> docs/quick-links.md
- # Run linter
- - name: Run Linter
- id: lint
- run: |
- npm run eslint-output
- echo "* [Linter](../lint.html)" >> docs/quick-links.md
- # Build the project
- - name: Build the project
- id: build
- run: |
- echo "" > ./dist/build.html
- npm run build |& tee -a ./dist/build.html
- mv ./build/* ./dist
- echo "
" >> ./dist/build.html
- echo "* [Build](../build.html)" >> docs/quick-links.md
- # Run Tests
- - name: Run Tests
- id: test
- run: |
- echo "" > ./dist/tests.html
- npm run test -- --coverage |& tee -a ./dist/tests.html
- echo "
" >> ./dist/tests.html
- echo "* [Tests](../tests.html)" >> docs/quick-links.md
- # Verify Integrity
- - name: Verify Integrity
- if: ${{ !cancelled() }}
- id: integrity
- run: |
- echo "" > ./dist/integrity.html
- find src -type f -name "*.test.ts" -exec md5sum {} + >> ./dist/integrity.html
- find src -type f -name "*.test.tsx" -exec md5sum {} + >> ./dist/integrity.html
- md5sum .eslintrc.js >> ./dist/integrity.html
- md5sum jest.config.js >> ./dist/integrity.html
- md5sum tsconfig.json >> ./dist/integrity.html
- md5sum .github/workflows/deploy.yml >> ./dist/integrity.html
- echo "" >> ./dist/integrity.html
- echo "* [Integrity](../integrity.html)" >> docs/quick-links.md
- # Create GitInspector Report
- - name: Create GitInspector Report
- if: ${{ !cancelled() }}
- id: gitinspector
- run: |
- git clone https://github.com/jpwhite3/gitinspector.git
- python ./gitinspector/gitinspector.py ./ --grading --format=html -f tsx,ts,html,css -x ./gitinspector -x ./node_modules -x ./wbcore > ./dist/git.html
- echo "* [Git Inspector](../git.html)" >> docs/quick-links.md
- # Generate HTML from Markdown in Docs/
- - name: Generate HTML from Markdown in Docs/
- if: ${{ !cancelled() }}
- id: markdown-docs
- uses: ldeluigi/markdown-docs@latest
- with:
- src: docs
- dst: dist/docs/
-
- #- name: Handle Failure
- # run: |
- # echo "Build Failure
The build failed during one of the steps.
" > ./dist/index.html
- #- uses: austenstone/job-summary@v2.0
- # id: job-summary
- # with:
- # create-pdf: false
- #- run: |
- # echo "${{ steps.job-summary.outputs.job-summary }}" >> ./dist/index.html
- # echo "" >> ./dist/index.html
- # Deploy
- - name: Setup Pages
- uses: actions/configure-pages@v3
- if: ${{ !cancelled() }}
- - name: Upload artifact
- uses: actions/upload-pages-artifact@v4
- if: ${{ !cancelled() }}
- with:
- path: "dist/"
- - name: Deploy to GitHub Pages
- id: deployment
- uses: actions/deploy-pages@v4
- if: ${{ !cancelled() }}
+ deploy:
+ runs-on: ubuntu-latest
+
+ # Recommended for Pages so the URL shows on the run summary
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Use Node.js 20
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ cache: "npm"
+
+ - id: get-repo-values
+ name: Get repository values
+ run: |
+ url=https://$(echo "${{ github.repository }}" | sed "s/\//.github.io\//")
+ echo "url=$url" >> $GITHUB_OUTPUT
+
+ - name: Update package.json homepage
+ uses: jossef/action-set-json-field@v1
+ with:
+ file: package.json
+ field: homepage
+ value: ${{ steps.get-repo-values.outputs.url }}
+
+ # create_redirects
+ - name: Create Redirects and Links
+ id: create_redirects
+ run: |
+ mkdir -p dist
+ echo "\
+ \
+ Redirecting to repository" > ./dist/repo.html
+ mkdir -p docs
+ cp README.md docs/index.md
+ echo "# Quick Links" > docs/quick-links.md
+ echo "* [Repository](../repo.html)" >> docs/quick-links.md
+ echo "\
+ \
+ Redirecting to quick links page" > ./dist/quick.html
+
+ # Install node packages
+ - name: Install
+ id: install
+ run: |
+ echo "" > ./dist/installation.html
+ npm ci |& tee -a ./dist/installation.html
+ echo "
" >> ./dist/installation.html
+ echo "* [Installation](../installation.html)" >> docs/quick-links.md
+
+ # Run linter (ensure your script writes dist/lint.html)
+ - name: Run Linter
+ id: lint
+ run: |
+ npm run eslint-output
+ echo "* [Linter](../lint.html)" >> docs/quick-links.md
+
+ # Build the project
+ - name: Build the project
+ id: build
+ run: |
+ echo "" > ./dist/build.html
+ npm run build |& tee -a ./dist/build.html
+ mv ./build/* ./dist
+ echo "
" >> ./dist/build.html
+ echo "* [Build](../build.html)" >> docs/quick-links.md
+
+ # Run Tests
+ - name: Run Tests
+ id: test
+ run: |
+ echo "" > ./dist/tests.html
+ npm test -- --coverage |& tee -a ./dist/tests.html
+ echo "
" >> ./dist/tests.html
+ echo "* [Tests](../tests.html)" >> docs/quick-links.md
+
+ # Verify Integrity
+ - name: Verify Integrity
+ if: ${{ !cancelled() }}
+ id: integrity
+ run: |
+ echo "" > ./dist/integrity.html
+ find src -type f -name "*.test.ts" -exec md5sum {} + >> ./dist/integrity.html
+ find src -type f -name "*.test.tsx" -exec md5sum {} + >> ./dist/integrity.html
+ md5sum .eslintrc.js >> ./dist/integrity.html
+ md5sum jest.config.js >> ./dist/integrity.html
+ md5sum tsconfig.json >> ./dist/integrity.html
+ md5sum .github/workflows/deploy.yml >> ./dist/integrity.html
+ echo "" >> ./dist/integrity.html
+ echo "* [Integrity](../integrity.html)" >> docs/quick-links.md
+
+ # Create GitInspector Report
+ - name: Create GitInspector Report
+ if: ${{ !cancelled() }}
+ id: gitinspector
+ run: |
+ git clone https://github.com/jpwhite3/gitinspector.git
+ python ./gitinspector/gitinspector.py ./ --grading --format=html -f tsx,ts,html,css -x ./gitinspector -x ./node_modules -x ./wbcore > ./dist/git.html
+ echo "* [Git Inspector](../git.html)" >> docs/quick-links.md
+
+ # Generate HTML from Markdown in Docs/
+ - name: Generate HTML from Markdown in Docs/
+ if: ${{ !cancelled() }}
+ id: markdown-docs
+ uses: ldeluigi/markdown-docs@latest
+ with:
+ src: docs
+ dst: dist/docs/
+
+ # Pages
+ - name: Setup Pages
+ if: ${{ !cancelled() }}
+ uses: actions/configure-pages@v5
+
+ - name: Upload artifact (for Pages)
+ if: ${{ !cancelled() }}
+ uses: actions/upload-pages-artifact@v4
+ with:
+ path: "dist/"
+
+ - name: Deploy to GitHub Pages
+ if: ${{ !cancelled() }}
+ id: deployment
+ uses: actions/deploy-pages@v4
From d8135d03fb7196da0215949b3acf8d6374bb0c6b Mon Sep 17 00:00:00 2001
From: samita
Date: Thu, 28 Aug 2025 19:02:20 -0400
Subject: [PATCH 31/35] Added name to app
---
src/App.tsx | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/App.tsx b/src/App.tsx
index b77558eaac..cb37b043a9 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -11,6 +11,7 @@ function App(): React.JSX.Element {
Edit src/App.tsx and save. This page will
automatically reload.
+ Samita Bomasamudram
);
}
From de1d1186e6b3db1ea9607794a057dbb6c836973c Mon Sep 17 00:00:00 2001
From: Samita Bomasamudram
Date: Wed, 3 Sep 2025 18:56:47 -0400
Subject: [PATCH 32/35] added Hello World
---
src/App.tsx | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/App.tsx b/src/App.tsx
index cb37b043a9..18ce57aac0 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -12,6 +12,7 @@ function App(): React.JSX.Element {
automatically reload.
Samita Bomasamudram
+ Hello World!
);
}
From 7e2e213ac3d5f2387ade8015aaaa7df41f8b8280 Mon Sep 17 00:00:00 2001
From: Samita Bomasamudram
Date: Wed, 3 Sep 2025 18:58:31 -0400
Subject: [PATCH 33/35] Add HW
---
src/App.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/App.tsx b/src/App.tsx
index 18ce57aac0..4a03e79ecb 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -12,7 +12,7 @@ function App(): React.JSX.Element {
automatically reload.
Samita Bomasamudram
- Hello World!
+ Hello World!!
);
}
From 2c8c10a5a3e917d5d7f2f041705187a8218443a6 Mon Sep 17 00:00:00 2001
From: Samita Bomasamudram
Date: Thu, 4 Sep 2025 22:40:06 -0400
Subject: [PATCH 34/35] Task 3
---
src/App.css | 4 ++--
src/App.tsx | 41 +++++++++++++++++++++++++++++++++++++++++
src/paris.jpg | Bin 0 -> 107563 bytes
3 files changed, 43 insertions(+), 2 deletions(-)
create mode 100644 src/paris.jpg
diff --git a/src/App.css b/src/App.css
index ad32fac073..fe38ddbaef 100644
--- a/src/App.css
+++ b/src/App.css
@@ -15,14 +15,14 @@
.App-header {
width: 100%;
- background-color: #282c34;
+ background-color: #4432ac;
min-height: 40vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: calc(10px + 2vmin);
- color: white;
+ color: rgb(167, 168, 230);
}
.App-link {
diff --git a/src/App.tsx b/src/App.tsx
index 4a03e79ecb..bf555bc14e 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,5 +1,7 @@
import React from "react";
import "./App.css";
+import paris from "./paris.jpg";
+import { Button, Container, Row, Col } from "react-bootstrap";
function App(): React.JSX.Element {
return (
@@ -13,6 +15,45 @@ function App(): React.JSX.Element {
Samita Bomasamudram
Hello World!!
+ This is a header
+
+
+ - task 1
+ - task 2
+ - task 3
+
+
+
+
+
+
+ First column
+
+
+
+ Second column
+
+
+
+
);
}
diff --git a/src/paris.jpg b/src/paris.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..d2e5f37a8052f30ac45297bbb0194a1dcc58a444
GIT binary patch
literal 107563
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