import "@testing-library/jest-dom/vitest";
import { cleanup, render, screen } from "@testing-library/react";
import { afterEach, describe, expect, it } from "vitest";
import type { MarineForecast, RouteGuidanceResult } from "@watermaps/shared";
import { StatusBar } from "../src/components/StatusBar";
import type { GpsState } from "../src/hooks/useGeolocation";
afterEach(cleanup);
const idleGps: GpsState = {
status: "idle",
position: null,
accuracyM: null,
speedKn: null,
courseDeg: null,
timestampMs: null,
message: null
};
describe("StatusBar", () => {
it("always includes GPS speed in planning mode without claiming that a route is safe", () => {
const forecast = {
windSpeed: 12,
waveHeightM: 0.8
} as MarineForecast;
const { container } = render(
);
expect(container.querySelectorAll(".status-item")).toHaveLength(4);
expect(screen.getByText("12 kn · 0.8 m")).toBeVisible();
expect(screen.getByText("-- km/h · -- kn")).toBeVisible();
expect(screen.queryByText("Route OK")).not.toBeInTheDocument();
});
it("prioritizes course, cross-track error and open warnings during guidance", () => {
const guidance = {
desiredCourseDeg: 87,
distanceToRouteM: 24,
crossTrackSide: "starboard"
} as RouteGuidanceResult;
render(
);
expect(screen.getByText("087°T")).toBeVisible();
expect(screen.getByText("24 m Stb")).toBeVisible();
expect(screen.getByText("2 offen")).toBeVisible();
expect(screen.getByText("11,5 km/h · 6,2 kn")).toBeVisible();
});
it("shows anchor drift, GPS and the expected tide rise in anchor mode", () => {
render(
);
expect(screen.getByText("12 / 40 m")).toBeVisible();
expect(screen.getByText("±5 m")).toBeVisible();
expect(screen.getByText("+1.3 m")).toBeVisible();
expect(screen.getByText("-- km/h · -- kn")).toBeVisible();
});
});