From adceb3a224b123d3824e88404d0d421af8489eb2 Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Thu, 15 Jun 2023 21:33:23 -0700 Subject: [PATCH] Add tests for AirDefenseRangeLayer. --- .../AirDefenseRangeLayer.test.tsx | 146 ++++++++++++++++++ .../AirDefenseRangeLayer.tsx | 2 +- 2 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 client/src/components/airdefenserangelayer/AirDefenseRangeLayer.test.tsx diff --git a/client/src/components/airdefenserangelayer/AirDefenseRangeLayer.test.tsx b/client/src/components/airdefenserangelayer/AirDefenseRangeLayer.test.tsx new file mode 100644 index 00000000..ac4071e1 --- /dev/null +++ b/client/src/components/airdefenserangelayer/AirDefenseRangeLayer.test.tsx @@ -0,0 +1,146 @@ +import { renderWithProviders } from "../../testutils"; +import AirDefenseRangeLayer, { colorFor } from "./AirDefenseRangeLayer"; +import { PropsWithChildren } from "react"; + +const mockLayerGroup = jest.fn(); +const mockCircle = jest.fn(); +jest.mock("react-leaflet", () => ({ + LayerGroup: (props: PropsWithChildren) => { + mockLayerGroup(props); + return <>{props.children}; + }, + Circle: (props: any) => { + mockCircle(props); + }, +})); + +describe("colorFor", () => { + it("has a unique color for each configuration", () => { + const params = [ + [false, false], + [false, true], + [true, false], + [true, true], + ]; + var colors = new Set(); + for (const [blue, detection] of params) { + colors.add(colorFor(blue, detection)); + } + expect(colors.size).toEqual(4); + }); +}); + +describe("AirDefenseRangeLayer", () => { + it("draws nothing when there are no TGOs", () => { + renderWithProviders(); + expect(mockLayerGroup).toHaveBeenCalledTimes(1); + expect(mockCircle).not.toHaveBeenCalled(); + }); + + it("does not draw wrong range types", () => { + renderWithProviders(, { + preloadedState: { + tgos: { + tgos: { + foo: { + id: "foo", + name: "Foo", + control_point_name: "Bar", + category: "AA", + blue: false, + position: { + lat: 0, + lng: 0, + }, + units: [], + threat_ranges: [], + detection_ranges: [20], + dead: false, + sidc: "", + }, + }, + }, + }, + }); + expect(mockLayerGroup).toHaveBeenCalledTimes(1); + expect(mockCircle).not.toHaveBeenCalled(); + }); + + it("draws threat ranges", () => { + renderWithProviders(, { + preloadedState: { + tgos: { + tgos: { + foo: { + id: "foo", + name: "Foo", + control_point_name: "Bar", + category: "AA", + blue: true, + position: { + lat: 10, + lng: 20, + }, + units: [], + threat_ranges: [10], + detection_ranges: [20], + dead: false, + sidc: "", + }, + }, + }, + }, + }); + expect(mockLayerGroup).toHaveBeenCalledTimes(1); + expect(mockCircle).toHaveBeenCalledWith( + expect.objectContaining({ + center: { + lat: 10, + lng: 20, + }, + radius: 10, + color: colorFor(true, false), + interactive: false, + }) + ); + }); + + it("draws detection ranges", () => { + renderWithProviders(, { + preloadedState: { + tgos: { + tgos: { + foo: { + id: "foo", + name: "Foo", + control_point_name: "Bar", + category: "AA", + blue: true, + position: { + lat: 10, + lng: 20, + }, + units: [], + threat_ranges: [10], + detection_ranges: [20], + dead: false, + sidc: "", + }, + }, + }, + }, + }); + expect(mockLayerGroup).toHaveBeenCalledTimes(1); + expect(mockCircle).toHaveBeenCalledWith( + expect.objectContaining({ + center: { + lat: 10, + lng: 20, + }, + radius: 20, + color: colorFor(true, true), + interactive: false, + }) + ); + }); +}); diff --git a/client/src/components/airdefenserangelayer/AirDefenseRangeLayer.tsx b/client/src/components/airdefenserangelayer/AirDefenseRangeLayer.tsx index 1763160d..96c0e776 100644 --- a/client/src/components/airdefenserangelayer/AirDefenseRangeLayer.tsx +++ b/client/src/components/airdefenserangelayer/AirDefenseRangeLayer.tsx @@ -9,7 +9,7 @@ interface TgoRangeCirclesProps { detection?: boolean; } -function colorFor(blue: boolean, detection: boolean) { +export function colorFor(blue: boolean, detection: boolean) { if (blue) { return detection ? "#bb89ff" : "#0084ff"; }