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/19] 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/19] 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/19] 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/19] 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/19] 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/19] 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/19] 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/19] 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/19] 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 c2e556dece7ea7737c13bdd355ef3ebcee121e70 Mon Sep 17 00:00:00 2001
From: Austin Cory Bart
Date: Wed, 2 Feb 2022 13:12:40 -0500
Subject: [PATCH 10/19] 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 11/19] 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 12/19] 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 8901da8009ea7687227cb3849157bf4e6c7aa36a Mon Sep 17 00:00:00 2001
From: Conall04 <157143254+Conall04@users.noreply.github.com>
Date: Sun, 16 Feb 2025 16:06:43 -0500
Subject: [PATCH 13/19] Added name to App
---
src/App.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/App.tsx b/src/App.tsx
index a8b41197f2..cae32d4b5e 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -9,7 +9,7 @@ function App(): React.JSX.Element {
Edit src/App.tsx
and save. This page will
- automatically reload.
+ automatically reload. Conall Gouveia
);
From f66d0567194fb4ca3e8da048779d5a63bef94f1a Mon Sep 17 00:00:00 2001
From: Conall04 <157143254+Conall04@users.noreply.github.com>
Date: Sun, 16 Feb 2025 17:24:57 -0500
Subject: [PATCH 14/19] Added Hello World
---
package-lock.json | 123 +++++++++++++++++++++-------------------------
src/App.tsx | 2 +-
2 files changed, 58 insertions(+), 67 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 8c3779f487..1e6922997e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2153,7 +2153,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 +2166,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 +3273,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 +3436,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 +3454,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 +3470,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 +3487,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 +3500,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 +3517,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 +3909,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,7 +4222,6 @@
"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",
"dependencies": {
"@babel/code-frame": "^7.10.4",
@@ -4242,7 +4241,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 +4256,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 +4272,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 +4284,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 +4299,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 +4463,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": {
@@ -4911,7 +4903,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": "*"
@@ -5508,7 +5500,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"
@@ -7210,7 +7202,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 +7939,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"
@@ -13021,7 +13013,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 +13023,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 +13941,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 +13951,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 +13986,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 +14002,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 +14019,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 +14032,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 +14049,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 +14067,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 +14510,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 +14528,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 +14544,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 +14561,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 +14574,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 +14591,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 +14604,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 +14622,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 +14638,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 +14651,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 +14668,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 +14681,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 +14698,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 +14713,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 +14726,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 +14842,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 +14858,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 +14868,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 +15360,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 +15393,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": {
@@ -20668,7 +20659,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"
@@ -22588,7 +22579,7 @@
"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",
"dependencies": {
"@cspotcode/source-map-support": "^0.8.0",
@@ -22632,7 +22623,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": {
@@ -23056,7 +23047,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": {
@@ -24118,7 +24109,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 cae32d4b5e..b3aa2e2117 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -9,7 +9,7 @@ function App(): React.JSX.Element {
Edit src/App.tsx
and save. This page will
- automatically reload. Conall Gouveia
+ automatically reload. Conall Gouveia. Hello World
);
From 4201248cd859f7aeeb3e9c0cc9bd1e3fd53a2eb3 Mon Sep 17 00:00:00 2001
From: Conall04 <157143254+Conall04@users.noreply.github.com>
Date: Thu, 27 Feb 2025 13:34:44 -0500
Subject: [PATCH 15/19] Added work From ch 2
---
public/tasks/task-html-css.md | 5 +++
src/App.tsx | 18 ++++++++
src/HtmlCss.test.tsx | 83 +++++++++++++++++++++++++++++++++++
3 files changed, 106 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/App.tsx b/src/App.tsx
index b3aa2e2117..9e4fe94679 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,5 +1,6 @@
import React from "react";
import "./App.css";
+import { Button } from "react-bootstrap";
function App(): React.JSX.Element {
return (
@@ -11,8 +12,25 @@ function App(): React.JSX.Element {
Edit src/App.tsx
and save. This page will
automatically reload. Conall Gouveia. Hello World
+
+ This is heading text
+
+
+
+ - First Element
+ - Second Element
+ - Third Element
+
+
+
+ this will be surrounded by a border and padding.
+
+
+
+
);
}
+
export default App;
diff --git a/src/HtmlCss.test.tsx b/src/HtmlCss.test.tsx
new file mode 100644
index 0000000000..84d76db400
--- /dev/null
+++ b/src/HtmlCss.test.tsx
@@ -0,0 +1,83 @@
+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("(2 pts) There is a heading", () => {
+ render();
+ const heading = screen.getAllByRole("heading");
+ expect(heading[0]).toBeInTheDocument();
+ });
+
+ test("(2 pts) There is an image with alt text", () => {
+ render();
+ const image = screen.getByRole("img");
+ expect(image).toBeInTheDocument();
+ expect(image).toHaveAttribute("alt");
+ });
+
+ test("(2 pts) 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("(2 pts) Some basic CSS is added.", () => {
+ 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("(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 });
+ expect(button).toBeInTheDocument();
+ expect(button).toHaveClass("btn");
+ expect(button).toHaveClass("btn-primary");
+ });
+
+ 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("(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 });
+ userEvent.click(button);
+ expect(consoleSpy).toHaveBeenCalledWith("Hello World!");
+ });
+});
+
+describe("Some additional CSS was added", () => {
+ 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("*");
+
+ // 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 5088c9a82dd7b523d4afe01f2db81138f6a3fbcc Mon Sep 17 00:00:00 2001
From: Conall04 <157143254+Conall04@users.noreply.github.com>
Date: Thu, 27 Feb 2025 14:24:39 -0500
Subject: [PATCH 16/19] added temp add3
---
public/tasks/task-functions.md | 5 +++
src/functions.test.ts | 59 ++++++++++++++++++++++++++++++++++
src/functions.ts | 52 ++++++++++++++++++++++++++++++
3 files changed, 116 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..3d921f5d64
--- /dev/null
+++ b/src/functions.test.ts
@@ -0,0 +1,59 @@
+import {
+ add3,
+ fahrenheitToCelius,
+ shout,
+ isQuestion,
+ convertYesNo,
+} from "./functions";
+
+describe("Testing the basic functions", () => {
+ test("(3 pts) 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);
+ });
+
+ 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);
+ expect(add3(10, 1, -9)).toBe(11);
+ expect(add3(-9, -100, -4)).toBe(0);
+ expect(add3(-1, -1, 1)).toBe(1);
+ });
+
+ test("(3 pts) 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!");
+ });
+
+ 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);
+ 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);
+ });
+
+ test("(3 pts) 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..45c2d2fb04
--- /dev/null
+++ b/src/functions.ts
@@ -0,0 +1,52 @@
+/**
+ * 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 ((temperature -32)*(5/9));
+}
+
+/**
+ * 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 {
+ let sum: number = 0;
+ if (first > 0){
+ sum += first;
+ }
+ if (second > 0){
+ sum += second;
+ }
+ if (third > 0){
+ sum += third;
+ }
+ return sum;
+}
+
+/**
+ * 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 0ab344894c67e1de5d1540938ff52c20b28c626b Mon Sep 17 00:00:00 2001
From: Conall04 <157143254+Conall04@users.noreply.github.com>
Date: Thu, 27 Feb 2025 14:43:44 -0500
Subject: [PATCH 17/19] added all functions
---
src/functions.ts | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/src/functions.ts b/src/functions.ts
index 45c2d2fb04..d1c9646750 100644
--- a/src/functions.ts
+++ b/src/functions.ts
@@ -31,7 +31,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( )+'!';
}
/**
@@ -39,7 +39,10 @@ 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;
+ let lastchar: string = message[message.length-1];
+ let q : boolean;
+ q = lastchar == "?" ? true : false;
+ return q;
}
/**
@@ -48,5 +51,13 @@ 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;
+ }
+ else{
+ return null;
+ }
}
From 130c3b4c6a8b664059bdb56620f87820314d344e Mon Sep 17 00:00:00 2001
From: Conall04 <157143254+Conall04@users.noreply.github.com>
Date: Mon, 3 Mar 2025 21:46:41 -0500
Subject: [PATCH 18/19] Completed Array tasks
---
src/arrays.test.ts | 273 +++++++++++++++++++++++++++++++++++++++++++++
src/arrays.ts | 126 +++++++++++++++++++++
2 files changed, 399 insertions(+)
create mode 100644 src/arrays.test.ts
create mode 100644 src/arrays.ts
diff --git a/src/arrays.test.ts b/src/arrays.test.ts
new file mode 100644
index 0000000000..d6edf48fde
--- /dev/null
+++ b/src/arrays.test.ts
@@ -0,0 +1,273 @@
+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("(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]);
+ expect(bookEndList(NUMBERS_4)).toEqual([]);
+ expect(bookEndList(NUMBERS_5)).toEqual([100, 3]);
+ expect(bookEndList(NUMBERS_6)).toEqual([-100, 200]);
+ });
+
+ 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]);
+ 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("(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]);
+ 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("(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]);
+ 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("(3 pts) 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("(3 pts) 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("(3 pts) 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("(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");
+ expect(makeMath(NUMBERS_4)).toEqual("0=0");
+ expect(makeMath(NUMBERS_7)).toEqual("1000=199+1+550+50+200");
+ });
+
+ //////////////////////////////////
+ // injectPositive
+ 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]);
+ 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]);
+ });
+});
diff --git a/src/arrays.ts b/src/arrays.ts
new file mode 100644
index 0000000000..175bb4033e
--- /dev/null
+++ b/src/arrays.ts
@@ -0,0 +1,126 @@
+/**
+ * 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[] {
+
+ let new_array =[];
+
+ if (numbers.length > 0){
+ new_array.push(numbers[0]);
+ let last_index = numbers.length - 1
+ new_array.push(numbers[last_index]);
+ }
+
+ return new_array;
+}
+
+/**
+ * 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[] {
+
+ const triplenum = numbers.map((num: number): number => num*3);
+
+
+ return triplenum;
+}
+
+/**
+ * Consume an array of strings and convert them to integers. If
+ * the number cannot be parsed as an integer, convert it to 0 instead.
+ */
+export function stringsToIntegers(numbers: string[]): number[] {
+ const int_array = numbers.map((num: string): number => (Number.isInteger(Number(num))) ? (Number(num)) : 0);
+ return int_array;
+}
+
+/**
+ * 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 0 instead.
+ */
+// Remember, you can write functions as lambdas too! They work exactly the same.
+export const removeDollars = (amounts: string[]): number[] => {
+
+ const rem_char = amounts.map((num: string): string => num.replace("$", ""));
+ const int_array = rem_char.map((num: string): number => (Number.isInteger(Number(num))) ? (Number(num)) : 0);
+ return int_array;
+};
+
+/**
+ * Consume an array of messages and return a new list of the messages. However, any
+ * string that ends in "!" should be made uppercase. Also, remove any strings that end
+ * in question marks ("?").
+ */
+export const shoutIfExclaiming = (messages: string[]): string[] => {
+
+ const check_ex = messages.map((msg: string): string => (msg.charAt(msg.length - 1) == "!") ? msg.toUpperCase() : msg);
+ const final_array = check_ex.filter((msg: string): boolean => (msg.charAt(msg.length - 1) != "?"));
+
+ return final_array;
+};
+
+/**
+ * Consumes an array of words and returns the number of words that are LESS THAN
+ * 4 letters long.
+ */
+export function countShortWords(words: string[]): number {
+ const short_words = words.filter((word: string): boolean => (word.length < 4));
+ return short_words.length;
+}
+
+/**
+ * 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 {
+ const rgb_tf = colors.every((color: string): boolean => (color == "red" || color == "green" || color == "blue"));
+ return rgb_tf;
+}
+
+/**
+ * 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".
+ * And the array [] would become "0=0".
+ */
+export function makeMath(addends: number[]): string {
+ const sum = addends.reduce((currentTotal: number, num: number) => currentTotal+num, 0);
+ let sum_string = addends.join("+");
+ if (addends.length < 1){
+ sum_string = "0";
+ }
+ let final_string: string = sum + "=" + sum_string;
+
+ return final_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
+ * 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, 7, 17]
+ */
+export function injectPositive(values: number[]): number[] {
+ let firstnegval = values.findIndex((value: number): boolean => value < 0);
+ if (firstnegval == -1){
+ firstnegval = values.length;
+ }
+
+ const sumofoartial = values.slice(0, firstnegval).reduce((currentTotal: number, value: number) => currentTotal+value, 0);
+
+ const valuesInside = [...values];
+ valuesInside.splice(firstnegval+1, 0, sumofoartial)
+
+ return valuesInside;
+}
From b32453b393d7d29707849a0874165dd2f9bbffc0 Mon Sep 17 00:00:00 2001
From: Conall04 <157143254+Conall04@users.noreply.github.com>
Date: Tue, 4 Mar 2025 01:26:55 -0500
Subject: [PATCH 19/19] Completed Object Tasks
---
src/objects.ts | 71 +++++++++++++++++++++++++++++++++++---------------
1 file changed, 50 insertions(+), 21 deletions(-)
diff --git a/src/objects.ts b/src/objects.ts
index 3fd2072e5e..7958d40d9c 100644
--- a/src/objects.ts
+++ b/src/objects.ts
@@ -5,12 +5,13 @@ import { Question, QuestionType } from "./interfaces/question";
* `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 {};
+export function makeBlankQuestion(id: number, name: string, type: QuestionType): Question {
+
+ const BlankQuestion = {body: "", expected: "", id: id, name: name, type: type, options: [], points: 1, published: false};
+
+
+
+ return BlankQuestion;
}
/**
@@ -21,7 +22,13 @@ export function makeBlankQuestion(
* HINT: Look up the `trim` and `toLowerCase` functions.
*/
export function isCorrect(question: Question, answer: string): boolean {
- return false;
+
+ let alt_answer: string = answer.trim().toLowerCase();
+ let alt_expected: string = question.expected.trim().toLowerCase();
+
+ const iscorrect: boolean = (alt_expected == alt_answer);
+
+ return iscorrect;
}
/**
@@ -31,7 +38,15 @@ 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 isvalid: boolean;
+ if (question.type == "short_answer_question"){
+ isvalid = true;
+ }
+ else{
+ const options = question.options;
+ isvalid = options.some((option: string): boolean => answer == option);
+ }
+ return isvalid;
}
/**
@@ -41,7 +56,11 @@ 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 "";
+
+ const shortname: string = question.name.substring(0, 10);
+ const shortform: string = String(question.id)+": "+shortname;
+
+ return shortform;
}
/**
@@ -62,7 +81,15 @@ 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 "";
+
+ let output: string = "# "+question.name+"\n"+question.body;
+
+ if (question.type == "multiple_choice_question"){
+ let optionsarray = question.options.map((option: string): string => "- "+option);
+ let optionstring = optionsarray.join("\n");
+ output = output+"\n"+optionstring;
+ }
+ return output;
}
/**
@@ -70,7 +97,8 @@ export function toMarkdown(question: Question): string {
* `newName`.
*/
export function renameQuestion(question: Question, newName: string): Question {
- return question;
+ const newquestion: Question = {...question, name: newName};
+ return newquestion;
}
/**
@@ -79,7 +107,8 @@ 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;
+ const newquestion: Question = {...question, published: !question.published};
+ return newquestion;
}
/**
@@ -89,7 +118,8 @@ export function publishQuestion(question: Question): Question {
* The `published` field should be reset to false.
*/
export function duplicateQuestion(id: number, oldQuestion: Question): Question {
- return oldQuestion;
+ const copyquestion: Question = {...oldQuestion, name: "Copy of "+oldQuestion.name, published: false, id: id};
+ return copyquestion;
}
/**
@@ -100,7 +130,8 @@ 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;
+ const newquestion: Question = {...question, options: [...question.options, newOption]};
+ return newquestion;
}
/**
@@ -111,11 +142,9 @@ export function addOption(question: Question, newOption: string): Question {
* 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;
+export function mergeQuestion(id: number, name: string, contentQuestion: Question, { points }: { points: number }): Question {
+
+ const newquestion: Question = {...contentQuestion, id: id, name: name, points: points, published: false};
+
+ return newquestion;
}