diff --git a/src/data/projEntry.tsx b/src/data/projEntry.tsx
index e4640b6..f69ac8b 100644
--- a/src/data/projEntry.tsx
+++ b/src/data/projEntry.tsx
@@ -1,3 +1,4 @@
+import Node from "components/Node.vue";
import Spacer from "components/layout/Spacer.vue";
import { jsx } from "features/feature";
import { createResource, trackBest, trackOOMPS, trackTotal } from "features/resources/resource";
@@ -48,19 +49,35 @@ export const main = createLayer("main", function (this: BaseLayer) {
links: tree.links,
display: jsx(() => (
<>
- {player.devSpeed === 0 ?
Game Paused
: null}
+ {player.devSpeed === 0 ? (
+
+ Game Paused
+
+
+ ) : null}
{player.devSpeed != null && player.devSpeed !== 0 && player.devSpeed !== 1 ? (
- Dev Speed: {format(player.devSpeed)}x
+
+ Dev Speed: {format(player.devSpeed)}x
+
+
) : null}
{player.offlineTime != null && player.offlineTime !== 0 ? (
- Offline Time: {formatTime(player.offlineTime)}
+
+ Offline Time: {formatTime(player.offlineTime)}
+
+
) : null}
{Decimal.lt(points.value, "1e1000") ? You have : null}
{format(points.value)}
{Decimal.lt(points.value, "1e1e6") ? points : null}
- {Decimal.gt(pointGain.value, 0) ? ({oomps.value})
: null}
+ {Decimal.gt(pointGain.value, 0) ? (
+
+ ({oomps.value})
+
+
+ ) : null}
{render(tree)}
>
diff --git a/src/features/trees/tree.ts b/src/features/trees/tree.ts
index 8ec317f..4e43bbf 100644
--- a/src/features/trees/tree.ts
+++ b/src/features/trees/tree.ts
@@ -224,7 +224,7 @@ export interface BaseTree {
id: string;
/** The link objects for each of the branches of the tree. */
links: Ref;
- /** Cause a reset on this node and propagate it through the tree according to {@link resetPropagation}. */
+ /** Cause a reset on this node and propagate it through the tree according to {@link TreeOptions.resetPropagation}. */
reset: (node: GenericTreeNode) => void;
/** A flag that is true while the reset is still propagating through the tree. */
isResetting: Ref;
diff --git a/tests/features/tree.test.ts b/tests/features/tree.test.ts
new file mode 100644
index 0000000..206988f
--- /dev/null
+++ b/tests/features/tree.test.ts
@@ -0,0 +1,111 @@
+import { beforeAll, beforeEach, describe, expect, test, vi } from "vitest";
+import { Ref, ref } from "vue";
+import "../utils";
+import {
+ createTree,
+ createTreeNode,
+ defaultResetPropagation,
+ invertedResetPropagation,
+ branchedResetPropagation
+} from "features/trees/tree";
+import { createReset, GenericReset } from "features/reset";
+
+describe("Reset propagation", () => {
+ let shouldReset: Ref, shouldNotReset: Ref;
+ let goodReset: GenericReset, badReset: GenericReset;
+ beforeAll(() => {
+ shouldReset = ref(false);
+ shouldNotReset = ref(false);
+ goodReset = createReset(() => ({
+ thingsToReset: [],
+ onReset() {
+ shouldReset.value = true;
+ }
+ }));
+ badReset = createReset(() => ({
+ thingsToReset: [],
+ onReset() {
+ shouldNotReset.value = true;
+ }
+ }));
+ });
+ beforeEach(() => {
+ shouldReset.value = false;
+ shouldNotReset.value = false;
+ });
+ test("No resets", () => {
+ expect(() => {
+ const a = createTreeNode(() => ({}));
+ const b = createTreeNode(() => ({}));
+ const c = createTreeNode(() => ({}));
+ const tree = createTree(() => ({
+ nodes: [[a], [b], [c]]
+ }));
+ tree.reset(a);
+ }).not.toThrowError();
+ });
+
+ test("Do not propagate resets", () => {
+ const a = createTreeNode(() => ({ reset: badReset }));
+ const b = createTreeNode(() => ({ reset: badReset }));
+ const c = createTreeNode(() => ({ reset: badReset }));
+ const tree = createTree(() => ({
+ nodes: [[a], [b], [c]]
+ }));
+ tree.reset(b);
+ expect(shouldNotReset.value).toBe(false);
+ });
+
+ test("Default propagation", () => {
+ const a = createTreeNode(() => ({ reset: goodReset }));
+ const b = createTreeNode(() => ({}));
+ const c = createTreeNode(() => ({ reset: badReset }));
+ const tree = createTree(() => ({
+ nodes: [[a], [b], [c]],
+ resetPropagation: defaultResetPropagation
+ }));
+ tree.reset(b);
+ expect(shouldReset.value).toBe(true);
+ expect(shouldNotReset.value).toBe(false);
+ });
+
+ test("Inverted propagation", () => {
+ const a = createTreeNode(() => ({ reset: badReset }));
+ const b = createTreeNode(() => ({}));
+ const c = createTreeNode(() => ({ reset: goodReset }));
+ const tree = createTree(() => ({
+ nodes: [[a], [b], [c]],
+ resetPropagation: invertedResetPropagation
+ }));
+ tree.reset(b);
+ expect(shouldReset.value).toBe(true);
+ expect(shouldNotReset.value).toBe(false);
+ });
+
+ test("Branched propagation", () => {
+ const a = createTreeNode(() => ({ reset: badReset }));
+ const b = createTreeNode(() => ({}));
+ const c = createTreeNode(() => ({ reset: goodReset }));
+ const tree = createTree(() => ({
+ nodes: [[a, b, c]],
+ resetPropagation: branchedResetPropagation,
+ branches: [{ startNode: b, endNode: c }]
+ }));
+ tree.reset(b);
+ expect(shouldReset.value).toBe(true);
+ expect(shouldNotReset.value).toBe(false);
+ });
+
+ test("Branched propagation not bi-directional", () => {
+ const a = createTreeNode(() => ({ reset: badReset }));
+ const b = createTreeNode(() => ({}));
+ const c = createTreeNode(() => ({ reset: badReset }));
+ const tree = createTree(() => ({
+ nodes: [[a, b, c]],
+ resetPropagation: branchedResetPropagation,
+ branches: [{ startNode: c, endNode: b }]
+ }));
+ tree.reset(b);
+ expect(shouldNotReset.value).toBe(false);
+ });
+});