From 0d79299072bcf7fe7d0b34b7ed699327752b4295 Mon Sep 17 00:00:00 2001 From: Alex Mickelson Date: Wed, 21 Aug 2024 14:55:36 -0600 Subject: [PATCH] rubric item tests --- .../src/models/local/assignmnet/rubricItem.ts | 6 ++ .../utils/assignmentMarkdownParser.ts | 1 + .../local/quiz/utils/quizMarkdownParser.ts | 0 .../tests/markdown/rubricMarkdown.test.ts | 100 ++++++++++++++++++ 4 files changed, 107 insertions(+) create mode 100644 nextjs/src/models/local/quiz/utils/quizMarkdownParser.ts create mode 100644 nextjs/src/models/local/tests/markdown/rubricMarkdown.test.ts diff --git a/nextjs/src/models/local/assignmnet/rubricItem.ts b/nextjs/src/models/local/assignmnet/rubricItem.ts index 0cd5423..e80d517 100644 --- a/nextjs/src/models/local/assignmnet/rubricItem.ts +++ b/nextjs/src/models/local/assignmnet/rubricItem.ts @@ -2,3 +2,9 @@ export interface RubricItem { label: string; points: number; } + + +export const rubricItemIsExtraCredit = (item: RubricItem) => { + const extraCredit = '(extra credit)'; + return item.label.toLowerCase().includes(extraCredit.toLowerCase()); +} \ No newline at end of file diff --git a/nextjs/src/models/local/assignmnet/utils/assignmentMarkdownParser.ts b/nextjs/src/models/local/assignmnet/utils/assignmentMarkdownParser.ts index efb6089..88ae281 100644 --- a/nextjs/src/models/local/assignmnet/utils/assignmentMarkdownParser.ts +++ b/nextjs/src/models/local/assignmnet/utils/assignmentMarkdownParser.ts @@ -109,6 +109,7 @@ const parseRubricMarkdown = (rawMarkdown: string) => { }; export const assignmentMarkdownParser = { + parseRubricMarkdown, parseMarkdown(input: string): LocalAssignment { const settingsString = input.split("---")[0]; const { diff --git a/nextjs/src/models/local/quiz/utils/quizMarkdownParser.ts b/nextjs/src/models/local/quiz/utils/quizMarkdownParser.ts new file mode 100644 index 0000000..e69de29 diff --git a/nextjs/src/models/local/tests/markdown/rubricMarkdown.test.ts b/nextjs/src/models/local/tests/markdown/rubricMarkdown.test.ts new file mode 100644 index 0000000..84d8fe9 --- /dev/null +++ b/nextjs/src/models/local/tests/markdown/rubricMarkdown.test.ts @@ -0,0 +1,100 @@ +import { describe, it, expect } from "vitest"; +import { + RubricItem, + rubricItemIsExtraCredit, +} from "../../assignmnet/rubricItem"; +import { assignmentMarkdownParser } from "../../assignmnet/utils/assignmentMarkdownParser"; + +describe("RubricMarkdownTests", () => { + it("can parse one item", () => { + const rawRubric = ` + - 2pts: this is the task + `; + + const rubric: RubricItem[] = + assignmentMarkdownParser.parseRubricMarkdown(rawRubric); + expect(rubric.length).toBe(1); + expect(rubricItemIsExtraCredit(rubric[0])).toBe(false); + expect(rubric[0].label).toBe("this is the task"); + expect(rubric[0].points).toBe(2); + }); + + it("can parse multiple items", () => { + const rawRubric = ` + - 2pts: this is the task + - 3pts: this is the other task + `; + + const rubric: RubricItem[] = + assignmentMarkdownParser.parseRubricMarkdown(rawRubric); + expect(rubric.length).toBe(2); + expect(rubricItemIsExtraCredit(rubric[0])).toBe(false); + expect(rubric[1].label).toBe("this is the other task"); + expect(rubric[1].points).toBe(3); + }); + + it("can parse single point", () => { + const rawRubric = ` + - 1pt: this is the task + `; + + const rubric: RubricItem[] = + assignmentMarkdownParser.parseRubricMarkdown(rawRubric); + + expect(rubricItemIsExtraCredit(rubric[0])).toBe(false); + expect(rubric[0].label).toBe("this is the task"); + expect(rubric[0].points).toBe(1); + }); + + it("can parse single extra credit (lower case)", () => { + const rawRubric = ` + - 1pt: (extra credit) this is the task + `; + + const rubric: RubricItem[] = + assignmentMarkdownParser.parseRubricMarkdown(rawRubric); + expect(rubricItemIsExtraCredit(rubric[0])).toBe(true); + expect(rubric[0].label).toBe("(extra credit) this is the task"); + }); + + it("can parse single extra credit (upper case)", () => { + const rawRubric = ` + - 1pt: (Extra Credit) this is the task + `; + + const rubric: RubricItem[] = + assignmentMarkdownParser.parseRubricMarkdown(rawRubric); + expect(rubricItemIsExtraCredit(rubric[0])).toBe(true); + expect(rubric[0].label).toBe("(Extra Credit) this is the task"); + }); + + it("can parse floating point numbers", () => { + const rawRubric = ` + - 1.5pt: this is the task + `; + + const rubric: RubricItem[] = + assignmentMarkdownParser.parseRubricMarkdown(rawRubric); + expect(rubric[0].points).toBe(1.5); + }); + + it("can parse negative numbers", () => { + const rawRubric = ` + - -2pt: this is the task + `; + + const rubric: RubricItem[] = + assignmentMarkdownParser.parseRubricMarkdown(rawRubric); + expect(rubric[0].points).toBe(-2); + }); + + it("can parse negative floating point numbers", () => { + const rawRubric = ` + - -2895.00053pt: this is the task + `; + + const rubric: RubricItem[] = + assignmentMarkdownParser.parseRubricMarkdown(rawRubric); + expect(rubric[0].points).toBe(-2895.00053); + }); +});