mirror of
https://github.com/Matysh/houseplan-card
synced 2026-07-31 16:38:31 +00:00
audit+refactor v1.7.0: drop hardcoded dacha bundle (293KB->83KB) + onboarding empty-state; remove migration & dead device_overrides/virtual_devices; extract src/logic.ts + validation.py (pure, unit-tested: 9 front + 10 back); fix latent bugs unmasked by truncated rules.ts (DOMAIN_PRIORITY, poly _defaultPositions); harden path sanitizers (leading-dot traversal); tsc strict in build+CI; sync versions
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import {
|
||||
lqiColor, snapToGrid, segKey, samePoint, pointInPolygon, markerIdForBinding, averageLqi,
|
||||
} from '../test-build/logic.js';
|
||||
import { iconFor } from '../test-build/rules.js';
|
||||
|
||||
test('lqiColor: границы и середина', () => {
|
||||
assert.equal(lqiColor(40), 'hsl(0, 85%, 55%)');
|
||||
assert.equal(lqiColor(180), 'hsl(120, 85%, 55%)');
|
||||
assert.equal(lqiColor(110), 'hsl(60, 85%, 55%)');
|
||||
assert.equal(lqiColor(0), 'hsl(0, 85%, 55%)');
|
||||
assert.equal(lqiColor(255), 'hsl(120, 85%, 55%)');
|
||||
});
|
||||
|
||||
test('snapToGrid', () => {
|
||||
assert.equal(snapToGrid(0, 10), 0);
|
||||
assert.equal(snapToGrid(14, 10), 10);
|
||||
assert.equal(snapToGrid(16, 10), 20);
|
||||
});
|
||||
|
||||
test('segKey: направление не влияет', () => {
|
||||
assert.equal(segKey([0, 0], [10, 5]), segKey([10, 5], [0, 0]));
|
||||
assert.notEqual(segKey([0, 0], [10, 5]), segKey([0, 0], [10, 6]));
|
||||
});
|
||||
|
||||
test('samePoint с допуском', () => {
|
||||
assert.ok(samePoint([1, 1], [1.0005, 0.9995]));
|
||||
assert.ok(!samePoint([1, 1], [1.5, 1]));
|
||||
});
|
||||
|
||||
test('pointInPolygon: квадрат', () => {
|
||||
const sq = [[0, 0], [10, 0], [10, 10], [0, 10]];
|
||||
assert.ok(pointInPolygon([5, 5], sq));
|
||||
assert.ok(!pointInPolygon([15, 5], sq));
|
||||
assert.ok(!pointInPolygon([-1, -1], sq));
|
||||
});
|
||||
|
||||
test('pointInPolygon: L-образный полигон', () => {
|
||||
const L = [[0, 0], [6, 0], [6, 2], [2, 2], [2, 6], [0, 6]];
|
||||
assert.ok(pointInPolygon([1, 5], L));
|
||||
assert.ok(pointInPolygon([5, 1], L));
|
||||
assert.ok(!pointInPolygon([5, 5], L));
|
||||
});
|
||||
|
||||
test('markerIdForBinding', () => {
|
||||
let n = 0; const nid = () => 'v_new' + n++;
|
||||
assert.equal(markerIdForBinding('device:abc', undefined, nid), 'abc');
|
||||
assert.equal(markerIdForBinding('entity:light.x', undefined, nid), 'lg_light.x');
|
||||
assert.equal(markerIdForBinding('virtual', 'v_existing', nid), 'v_existing');
|
||||
assert.equal(markerIdForBinding('virtual', undefined, nid), 'v_new0');
|
||||
assert.equal(markerIdForBinding('virtual', 'abc', nid), 'v_new1');
|
||||
});
|
||||
|
||||
test('averageLqi', () => {
|
||||
assert.equal(averageLqi([]), null);
|
||||
assert.equal(averageLqi([100]), 100);
|
||||
assert.equal(averageLqi([100, 200]), 150);
|
||||
assert.equal(averageLqi([1, 2, 2]), 2);
|
||||
});
|
||||
|
||||
test('iconFor: ключевые правила', () => {
|
||||
assert.equal(iconFor('Датчик протечки кухня', 'HOBEIAN'), 'mdi:water-alert');
|
||||
assert.equal(iconFor('Замок Терраса', 'TTLock'), 'mdi:lock');
|
||||
assert.equal(iconFor('Настенная лампа 1', 'Yandex Bulb'), 'mdi:lightbulb');
|
||||
assert.equal(iconFor('Ворота', 'Tuya Garage'), 'mdi:garage-variant');
|
||||
assert.equal(iconFor('Термоголовка', 'Aqara'), 'mdi:radiator');
|
||||
assert.equal(iconFor('Неизвестное', 'XYZ'), 'mdi:chip');
|
||||
});
|
||||
Reference in New Issue
Block a user