diff --git a/packages/perseus-editor/src/components/__stories__/color-select.stories.tsx b/packages/perseus-editor/src/components/__stories__/color-select.stories.tsx index 05cdfcdcd3..b51fda6959 100644 --- a/packages/perseus-editor/src/components/__stories__/color-select.stories.tsx +++ b/packages/perseus-editor/src/components/__stories__/color-select.stories.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import ColorSelect from "../../widgets/interactive-graph-editor/locked-figures/color-select"; -import {getDefaultFigureForType} from "../util"; +import {getDefaultFigureForType} from "../../widgets/interactive-graph-editor/locked-figures/util"; import type {LockedFigureColor} from "@khanacademy/perseus"; import type {Meta} from "@storybook/react"; diff --git a/packages/perseus-editor/src/components/__stories__/color-swatch.stories.tsx b/packages/perseus-editor/src/components/__stories__/color-swatch.stories.tsx index 202f025242..f27e68f6a6 100644 --- a/packages/perseus-editor/src/components/__stories__/color-swatch.stories.tsx +++ b/packages/perseus-editor/src/components/__stories__/color-swatch.stories.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import ColorSwatch from "../../widgets/interactive-graph-editor/locked-figures/color-swatch"; -import {getDefaultFigureForType} from "../util"; +import {getDefaultFigureForType} from "../../widgets/interactive-graph-editor/locked-figures/util"; import type {Meta} from "@storybook/react"; diff --git a/packages/perseus-editor/src/components/__stories__/locked-ellipse-settings.stories.tsx b/packages/perseus-editor/src/components/__stories__/locked-ellipse-settings.stories.tsx index e28bc4a1cf..a61ee33c20 100644 --- a/packages/perseus-editor/src/components/__stories__/locked-ellipse-settings.stories.tsx +++ b/packages/perseus-editor/src/components/__stories__/locked-ellipse-settings.stories.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import LockedEllipseSettings from "../../widgets/interactive-graph-editor/locked-figures/locked-ellipse-settings"; -import {getDefaultFigureForType} from "../util"; +import {getDefaultFigureForType} from "../../widgets/interactive-graph-editor/locked-figures/util"; import type {Meta, StoryObj} from "@storybook/react"; diff --git a/packages/perseus-editor/src/components/__stories__/locked-figures-section.stories.tsx b/packages/perseus-editor/src/components/__stories__/locked-figures-section.stories.tsx index 5fbfa7fb41..97d7c3617e 100644 --- a/packages/perseus-editor/src/components/__stories__/locked-figures-section.stories.tsx +++ b/packages/perseus-editor/src/components/__stories__/locked-figures-section.stories.tsx @@ -4,7 +4,7 @@ import {StyleSheet} from "aphrodite"; import * as React from "react"; import LockedFiguresSection from "../../widgets/interactive-graph-editor/locked-figures/locked-figures-section"; -import {getDefaultFigureForType} from "../util"; +import {getDefaultFigureForType} from "../../widgets/interactive-graph-editor/locked-figures/util"; import type {Meta, StoryObj} from "@storybook/react"; diff --git a/packages/perseus-editor/src/components/__stories__/locked-function-settings.stories.tsx b/packages/perseus-editor/src/components/__stories__/locked-function-settings.stories.tsx index 3070bfbba7..ad5b20baa4 100644 --- a/packages/perseus-editor/src/components/__stories__/locked-function-settings.stories.tsx +++ b/packages/perseus-editor/src/components/__stories__/locked-function-settings.stories.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import LockedFunctionSettings from "../../widgets/interactive-graph-editor/locked-figures/locked-function-settings"; -import {getDefaultFigureForType} from "../util"; +import {getDefaultFigureForType} from "../../widgets/interactive-graph-editor/locked-figures/util"; import type {Meta, StoryObj} from "@storybook/react"; diff --git a/packages/perseus-editor/src/components/__stories__/locked-label-settings.stories.tsx b/packages/perseus-editor/src/components/__stories__/locked-label-settings.stories.tsx index e1900e3c70..3e25620ca8 100644 --- a/packages/perseus-editor/src/components/__stories__/locked-label-settings.stories.tsx +++ b/packages/perseus-editor/src/components/__stories__/locked-label-settings.stories.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import LockedLabelSettings from "../../widgets/interactive-graph-editor/locked-figures/locked-label-settings"; -import {getDefaultFigureForType} from "../util"; +import {getDefaultFigureForType} from "../../widgets/interactive-graph-editor/locked-figures/util"; import type {Meta, StoryObj} from "@storybook/react"; diff --git a/packages/perseus-editor/src/components/__stories__/locked-line-settings.stories.tsx b/packages/perseus-editor/src/components/__stories__/locked-line-settings.stories.tsx index 2dfc131f01..336aa82b0f 100644 --- a/packages/perseus-editor/src/components/__stories__/locked-line-settings.stories.tsx +++ b/packages/perseus-editor/src/components/__stories__/locked-line-settings.stories.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import LockedLineSettings from "../../widgets/interactive-graph-editor/locked-figures/locked-line-settings"; -import {getDefaultFigureForType} from "../util"; +import {getDefaultFigureForType} from "../../widgets/interactive-graph-editor/locked-figures/util"; import type {Meta, StoryObj} from "@storybook/react"; diff --git a/packages/perseus-editor/src/components/__stories__/locked-point-settings.stories.tsx b/packages/perseus-editor/src/components/__stories__/locked-point-settings.stories.tsx index e1bc449a74..e257912c79 100644 --- a/packages/perseus-editor/src/components/__stories__/locked-point-settings.stories.tsx +++ b/packages/perseus-editor/src/components/__stories__/locked-point-settings.stories.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import LockedPointSettings from "../../widgets/interactive-graph-editor/locked-figures/locked-point-settings"; -import {getDefaultFigureForType} from "../util"; +import {getDefaultFigureForType} from "../../widgets/interactive-graph-editor/locked-figures/util"; import type {Meta, StoryObj} from "@storybook/react"; diff --git a/packages/perseus-editor/src/components/__stories__/locked-polygon-settings.stories.tsx b/packages/perseus-editor/src/components/__stories__/locked-polygon-settings.stories.tsx index 6576e337c6..b700d30378 100644 --- a/packages/perseus-editor/src/components/__stories__/locked-polygon-settings.stories.tsx +++ b/packages/perseus-editor/src/components/__stories__/locked-polygon-settings.stories.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import LockedPolygonSettings from "../../widgets/interactive-graph-editor/locked-figures/locked-polygon-settings"; -import {getDefaultFigureForType} from "../util"; +import {getDefaultFigureForType} from "../../widgets/interactive-graph-editor/locked-figures/util"; import type {Meta, StoryObj} from "@storybook/react"; diff --git a/packages/perseus-editor/src/components/__stories__/locked-vector-settings.stories.tsx b/packages/perseus-editor/src/components/__stories__/locked-vector-settings.stories.tsx index 1159e8a2ee..1cf06969d6 100644 --- a/packages/perseus-editor/src/components/__stories__/locked-vector-settings.stories.tsx +++ b/packages/perseus-editor/src/components/__stories__/locked-vector-settings.stories.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import LockedVectorSettings from "../../widgets/interactive-graph-editor/locked-figures/locked-vector-settings"; -import {getDefaultFigureForType} from "../util"; +import {getDefaultFigureForType} from "../../widgets/interactive-graph-editor/locked-figures/util"; import type {Meta, StoryObj} from "@storybook/react"; diff --git a/packages/perseus-editor/src/components/__tests__/util.test.ts b/packages/perseus-editor/src/components/__tests__/util.test.ts index ff293c6b6a..b855dd2462 100644 --- a/packages/perseus-editor/src/components/__tests__/util.test.ts +++ b/packages/perseus-editor/src/components/__tests__/util.test.ts @@ -1,6 +1,5 @@ import { degreeToRadian, - getDefaultFigureForType, radianToDegree, getDefaultGraphStartCoords, getSinusoidEquation, @@ -10,107 +9,6 @@ import { import type {PerseusGraphType, Range} from "@khanacademy/perseus"; -describe("getDefaultFigureForType", () => { - test("should return a point with default values", () => { - const figure = getDefaultFigureForType("point"); - expect(figure).toEqual({ - type: "point", - coord: [0, 0], - color: "grayH", - filled: true, - }); - }); - - test("should return a line with default values", () => { - const figure = getDefaultFigureForType("line"); - expect(figure).toEqual({ - type: "line", - kind: "line", - points: [ - { - type: "point", - coord: [0, 0], - color: "grayH", - filled: true, - }, - { - type: "point", - coord: [2, 2], - color: "grayH", - filled: true, - }, - ], - color: "grayH", - lineStyle: "solid", - showPoint1: false, - showPoint2: false, - }); - }); - - test("should return a vector with default values", () => { - const figure = getDefaultFigureForType("vector"); - expect(figure).toEqual({ - type: "vector", - points: [ - [0, 0], - [2, 2], - ], - color: "grayH", - }); - }); - - test("should return an ellipse with default values", () => { - const figure = getDefaultFigureForType("ellipse"); - expect(figure).toEqual({ - type: "ellipse", - center: [0, 0], - radius: [1, 1], - angle: 0, - color: "grayH", - fillStyle: "none", - strokeStyle: "solid", - }); - }); - - test("should return a polygon with default values", () => { - const figure = getDefaultFigureForType("polygon"); - expect(figure).toEqual({ - type: "polygon", - points: [ - [0, 2], - [-1, 0], - [1, 0], - ], - color: "grayH", - showVertices: false, - fillStyle: "none", - strokeStyle: "solid", - }); - }); - - test("should return a 'function' with default values", () => { - const figure = getDefaultFigureForType("function"); - expect(figure).toEqual({ - type: "function", - color: "grayH", - strokeStyle: "solid", - equation: "x^2", - directionalAxis: "x", - }); - }); - - test("should return a 'label' with default values", () => { - const figure = getDefaultFigureForType("label"); - expect(figure).toEqual({ - type: "label", - coord: [0, 0], - text: "", - color: "grayH", - size: "medium", - }); - }); -}); - describe("degreeToRadian", () => { test.each` degrees | radians diff --git a/packages/perseus-editor/src/components/util.ts b/packages/perseus-editor/src/components/util.ts index a30ff1a6a5..16bd2b48ec 100644 --- a/packages/perseus-editor/src/components/util.ts +++ b/packages/perseus-editor/src/components/util.ts @@ -66,94 +66,6 @@ export function focusWithChromeStickyFocusBugWorkaround(element: Element) { element.focus({preventScroll: true}); } -const DEFAULT_COLOR = "grayH"; - -export function getDefaultFigureForType(type: "point"): LockedPointType; -export function getDefaultFigureForType(type: "line"): LockedLineType; -export function getDefaultFigureForType(type: "vector"): LockedVectorType; -export function getDefaultFigureForType(type: "ellipse"): LockedEllipseType; -export function getDefaultFigureForType(type: "polygon"): LockedPolygonType; -export function getDefaultFigureForType(type: "function"): LockedFunctionType; -export function getDefaultFigureForType(type: "label"): LockedLabelType; -export function getDefaultFigureForType(type: LockedFigureType): LockedFigure; -export function getDefaultFigureForType(type: LockedFigureType): LockedFigure { - switch (type) { - case "point": - return { - type: "point", - coord: [0, 0], - color: DEFAULT_COLOR, - filled: true, - }; - case "line": - return { - type: "line", - kind: "line", - points: [ - getDefaultFigureForType("point"), - { - ...getDefaultFigureForType("point"), - coord: [2, 2], - }, - ], - color: DEFAULT_COLOR, - lineStyle: "solid", - showPoint1: false, - showPoint2: false, - }; - case "vector": - return { - type: "vector", - points: [ - [0, 0], - [2, 2], - ], - color: DEFAULT_COLOR, - }; - case "ellipse": - return { - type: "ellipse", - center: [0, 0], - radius: [1, 1], - angle: 0, - color: DEFAULT_COLOR, - fillStyle: "none", - strokeStyle: "solid", - }; - case "polygon": - return { - type: "polygon", - points: [ - [0, 2], - [-1, 0], - [1, 0], - ], - color: DEFAULT_COLOR, - showVertices: false, - fillStyle: "none", - strokeStyle: "solid", - }; - case "function": - return { - type: "function", - color: DEFAULT_COLOR, - strokeStyle: "solid", - equation: "x^2", - directionalAxis: "x", - }; - case "label": - return { - type: "label", - coord: [0, 0], - text: "", - color: DEFAULT_COLOR, - size: "medium", - }; - default: - throw new UnreachableCaseError(type); - } -} - export function degreeToRadian(degrees: number) { return (degrees / 180) * Math.PI; } diff --git a/packages/perseus-editor/src/widgets/__stories__/interactive-graph-editor.stories.tsx b/packages/perseus-editor/src/widgets/__stories__/interactive-graph-editor.stories.tsx index 1cb07282d5..407166ed82 100644 --- a/packages/perseus-editor/src/widgets/__stories__/interactive-graph-editor.stories.tsx +++ b/packages/perseus-editor/src/widgets/__stories__/interactive-graph-editor.stories.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import {flags} from "../../__stories__/flags-for-api-options"; -import {getDefaultFigureForType} from "../../components/util"; +import {getDefaultFigureForType} from "../interactive-graph-editor/locked-figures/util"; import InteractiveGraphEditor from "../interactive-graph-editor/interactive-graph-editor"; import InteractiveGraphEditorArgTypes from "./interactive-graph-editor.argtypes"; diff --git a/packages/perseus-editor/src/widgets/__tests__/interactive-graph-editor-locked-figures.test.tsx b/packages/perseus-editor/src/widgets/__tests__/interactive-graph-editor-locked-figures.test.tsx index 9af887e86f..bd95301a04 100644 --- a/packages/perseus-editor/src/widgets/__tests__/interactive-graph-editor-locked-figures.test.tsx +++ b/packages/perseus-editor/src/widgets/__tests__/interactive-graph-editor-locked-figures.test.tsx @@ -6,7 +6,7 @@ import * as React from "react"; import {testDependencies} from "../../../../../testing/test-dependencies"; import {flags} from "../../__stories__/flags-for-api-options"; -import {getDefaultFigureForType} from "../../components/util"; +import {getDefaultFigureForType} from "../interactive-graph-editor/locked-figures/util"; import InteractiveGraphEditor from "../interactive-graph-editor/interactive-graph-editor"; import type {PerseusGraphType} from "@khanacademy/perseus"; diff --git a/packages/perseus-editor/src/widgets/__tests__/interactive-graph-editor.test.tsx b/packages/perseus-editor/src/widgets/__tests__/interactive-graph-editor.test.tsx index dba66beab9..70b843400b 100644 --- a/packages/perseus-editor/src/widgets/__tests__/interactive-graph-editor.test.tsx +++ b/packages/perseus-editor/src/widgets/__tests__/interactive-graph-editor.test.tsx @@ -7,7 +7,7 @@ import * as React from "react"; import {testDependencies} from "../../../../../testing/test-dependencies"; import {waitForInitialGraphieRender} from "../../../../../testing/wait"; import {flags} from "../../__stories__/flags-for-api-options"; -import {getDefaultFigureForType} from "../../components/util"; +import {getDefaultFigureForType} from "../interactive-graph-editor/locked-figures/util"; import InteractiveGraphEditor from "../interactive-graph-editor/interactive-graph-editor"; import type {PerseusGraphType} from "@khanacademy/perseus"; diff --git a/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-ellipse-settings.test.tsx b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-ellipse-settings.test.tsx index 1fe920361a..b54266bce7 100644 --- a/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-ellipse-settings.test.tsx +++ b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-ellipse-settings.test.tsx @@ -4,7 +4,7 @@ import {userEvent as userEventLib} from "@testing-library/user-event"; import * as React from "react"; import LockedEllipseSettings from "./locked-ellipse-settings"; -import {getDefaultFigureForType} from "../../../components/util"; +import {getDefaultFigureForType} from "./util"; import type {UserEvent} from "@testing-library/user-event"; diff --git a/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-figures-section.test.tsx b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-figures-section.test.tsx index 120d45dd3e..8985e3dabc 100644 --- a/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-figures-section.test.tsx +++ b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-figures-section.test.tsx @@ -4,7 +4,7 @@ import {userEvent as userEventLib} from "@testing-library/user-event"; import * as React from "react"; import LockedFiguresSection from "./locked-figures-section"; -import {getDefaultFigureForType} from "../../../components/util"; +import {getDefaultFigureForType} from "./util"; import type {UserEvent} from "@testing-library/user-event"; diff --git a/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-figures-section.tsx b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-figures-section.tsx index c545a22c0d..85f6010ed9 100644 --- a/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-figures-section.tsx +++ b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-figures-section.tsx @@ -11,7 +11,7 @@ import {StyleSheet} from "aphrodite"; import * as React from "react"; import Heading from "../../../components/heading"; -import {getDefaultFigureForType} from "../../../components/util"; +import {getDefaultFigureForType} from "./util"; import LockedFigureSelect from "./locked-figure-select"; import LockedFigureSettings from "./locked-figure-settings"; diff --git a/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-function-settings.test.tsx b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-function-settings.test.tsx index f6f2d98e60..c566379001 100644 --- a/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-function-settings.test.tsx +++ b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-function-settings.test.tsx @@ -4,7 +4,7 @@ import {userEvent as userEventLib} from "@testing-library/user-event"; import * as React from "react"; import LockedFunctionSettings from "./locked-function-settings"; -import {getDefaultFigureForType} from "../../../components/util"; +import {getDefaultFigureForType} from "./util"; import type {Props} from "./locked-function-settings"; import type {UserEvent} from "@testing-library/user-event"; diff --git a/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-label-settings.test.tsx b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-label-settings.test.tsx index 2fa1e8d02f..70dd48fcf0 100644 --- a/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-label-settings.test.tsx +++ b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-label-settings.test.tsx @@ -4,7 +4,7 @@ import {userEvent as userEventLib} from "@testing-library/user-event"; import * as React from "react"; import LockedLabelSettings from "./locked-label-settings"; -import {getDefaultFigureForType} from "../../../components/util"; +import {getDefaultFigureForType} from "./util"; import type {Props} from "./locked-label-settings"; import type {UserEvent} from "@testing-library/user-event"; diff --git a/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-line-settings.test.tsx b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-line-settings.test.tsx index 3c2fd1a8b7..5c4f73a1e9 100644 --- a/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-line-settings.test.tsx +++ b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-line-settings.test.tsx @@ -4,7 +4,7 @@ import {userEvent as userEventLib} from "@testing-library/user-event"; import * as React from "react"; import LockedLineSettings from "./locked-line-settings"; -import {getDefaultFigureForType} from "../../../components/util"; +import {getDefaultFigureForType} from "./util"; import type {UserEvent} from "@testing-library/user-event"; diff --git a/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-point-settings.test.tsx b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-point-settings.test.tsx index 11feb31e64..457a9a9c11 100644 --- a/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-point-settings.test.tsx +++ b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-point-settings.test.tsx @@ -4,7 +4,7 @@ import {userEvent as userEventLib} from "@testing-library/user-event"; import * as React from "react"; import LockedPointSettings from "./locked-point-settings"; -import {getDefaultFigureForType} from "../../../components/util"; +import {getDefaultFigureForType} from "./util"; import type {UserEvent} from "@testing-library/user-event"; diff --git a/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-polygon-settings.test.tsx b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-polygon-settings.test.tsx index 4b59ea70f8..4c35465822 100644 --- a/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-polygon-settings.test.tsx +++ b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-polygon-settings.test.tsx @@ -4,7 +4,7 @@ import {userEvent as userEventLib} from "@testing-library/user-event"; import * as React from "react"; import LockedPolygonSettings from "./locked-polygon-settings"; -import {getDefaultFigureForType} from "../../../components/util"; +import {getDefaultFigureForType} from "./util"; import type {UserEvent} from "@testing-library/user-event"; diff --git a/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-vector-settings.test.tsx b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-vector-settings.test.tsx index 586577e12b..33a98ced01 100644 --- a/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-vector-settings.test.tsx +++ b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/locked-vector-settings.test.tsx @@ -4,7 +4,7 @@ import {userEvent as userEventLib} from "@testing-library/user-event"; import * as React from "react"; import LockedVectorSettings from "./locked-vector-settings"; -import {getDefaultFigureForType} from "../../../components/util"; +import {getDefaultFigureForType} from "./util"; import type {Props} from "./locked-vector-settings"; import type {UserEvent} from "@testing-library/user-event"; diff --git a/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/util.test.ts b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/util.test.ts new file mode 100644 index 0000000000..9e84e85bdc --- /dev/null +++ b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/util.test.ts @@ -0,0 +1,102 @@ +import {getDefaultFigureForType} from "./util" + +describe("getDefaultFigureForType", () => { + test("should return a point with default values", () => { + const figure = getDefaultFigureForType("point"); + expect(figure).toEqual({ + type: "point", + coord: [0, 0], + color: "grayH", + filled: true, + }); + }); + + test("should return a line with default values", () => { + const figure = getDefaultFigureForType("line"); + expect(figure).toEqual({ + type: "line", + kind: "line", + points: [ + { + type: "point", + coord: [0, 0], + color: "grayH", + filled: true, + }, + { + type: "point", + coord: [2, 2], + color: "grayH", + filled: true, + }, + ], + color: "grayH", + lineStyle: "solid", + showPoint1: false, + showPoint2: false, + }); + }); + + test("should return a vector with default values", () => { + const figure = getDefaultFigureForType("vector"); + expect(figure).toEqual({ + type: "vector", + points: [ + [0, 0], + [2, 2], + ], + color: "grayH", + }); + }); + + test("should return an ellipse with default values", () => { + const figure = getDefaultFigureForType("ellipse"); + expect(figure).toEqual({ + type: "ellipse", + center: [0, 0], + radius: [1, 1], + angle: 0, + color: "grayH", + fillStyle: "none", + strokeStyle: "solid", + }); + }); + + test("should return a polygon with default values", () => { + const figure = getDefaultFigureForType("polygon"); + expect(figure).toEqual({ + type: "polygon", + points: [ + [0, 2], + [-1, 0], + [1, 0], + ], + color: "grayH", + showVertices: false, + fillStyle: "none", + strokeStyle: "solid", + }); + }); + + test("should return a 'function' with default values", () => { + const figure = getDefaultFigureForType("function"); + expect(figure).toEqual({ + type: "function", + color: "grayH", + strokeStyle: "solid", + equation: "x^2", + directionalAxis: "x", + }); + }); + + test("should return a 'label' with default values", () => { + const figure = getDefaultFigureForType("label"); + expect(figure).toEqual({ + type: "label", + coord: [0, 0], + text: "", + color: "grayH", + size: "medium", + }); + }); +}); diff --git a/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/util.ts b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/util.ts new file mode 100644 index 0000000000..d93fe0c93f --- /dev/null +++ b/packages/perseus-editor/src/widgets/interactive-graph-editor/locked-figures/util.ts @@ -0,0 +1,100 @@ +import { + LockedEllipseType, + LockedFigure, + LockedFigureType, + LockedFunctionType, + LockedLabelType, + LockedLineType, + LockedPointType, + LockedPolygonType, + LockedVectorType +} from "@khanacademy/perseus"; +import {UnreachableCaseError} from "@khanacademy/wonder-stuff-core"; + +const DEFAULT_COLOR = "grayH"; + +export function getDefaultFigureForType(type: "point"): LockedPointType; +export function getDefaultFigureForType(type: "line"): LockedLineType; +export function getDefaultFigureForType(type: "vector"): LockedVectorType; +export function getDefaultFigureForType(type: "ellipse"): LockedEllipseType; +export function getDefaultFigureForType(type: "polygon"): LockedPolygonType; +export function getDefaultFigureForType(type: "function"): LockedFunctionType; +export function getDefaultFigureForType(type: "label"): LockedLabelType; +export function getDefaultFigureForType(type: LockedFigureType): LockedFigure; +export function getDefaultFigureForType(type: LockedFigureType): LockedFigure { + switch (type) { + case "point": + return { + type: "point", + coord: [0, 0], + color: DEFAULT_COLOR, + filled: true, + }; + case "line": + return { + type: "line", + kind: "line", + points: [ + getDefaultFigureForType("point"), + { + ...getDefaultFigureForType("point"), + coord: [2, 2], + }, + ], + color: DEFAULT_COLOR, + lineStyle: "solid", + showPoint1: false, + showPoint2: false, + }; + case "vector": + return { + type: "vector", + points: [ + [0, 0], + [2, 2], + ], + color: DEFAULT_COLOR, + }; + case "ellipse": + return { + type: "ellipse", + center: [0, 0], + radius: [1, 1], + angle: 0, + color: DEFAULT_COLOR, + fillStyle: "none", + strokeStyle: "solid", + }; + case "polygon": + return { + type: "polygon", + points: [ + [0, 2], + [-1, 0], + [1, 0], + ], + color: DEFAULT_COLOR, + showVertices: false, + fillStyle: "none", + strokeStyle: "solid", + }; + case "function": + return { + type: "function", + color: DEFAULT_COLOR, + strokeStyle: "solid", + equation: "x^2", + directionalAxis: "x", + }; + case "label": + return { + type: "label", + coord: [0, 0], + text: "", + color: DEFAULT_COLOR, + size: "medium", + }; + default: + throw new UnreachableCaseError(type); + } +}