Добавить общие графики, декодер KONOR и порт STM32 bxCAN

This commit is contained in:
2026-09-04 12:22:17 +03:00
parent af82687e42
commit e163d9ba55
51 changed files with 5040 additions and 15 deletions

50
python/tests/test_plot.py Normal file
View File

@@ -0,0 +1,50 @@
"""Cross-port contract: Python/ctypes and Kotlin/JNI consume the same fixtures."""
import ctypes
import json
import math
import os
from pathlib import Path
import unittest
from protocan.plot import Bounds, Marker, Markers, PlotMath, Viewport
class PlotTests(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.core = PlotMath(ctypes.CDLL(os.environ["SETPROTOCOL_LIBRARY"]))
def test_shared_numeric_fixtures(self):
path = Path(__file__).resolve().parents[2] / "c/set-protocol/tests/fixtures/plot-v1.json"
for case in json.loads(path.read_text())["cases"]:
with self.subTest(case=case["name"]):
if case["output"] is None:
with self.assertRaises(ValueError):
self.core.call(case["op"], *case["input"])
else:
actual = self.core.call(case["op"], *case["input"])
self.assertEqual(len(actual), len(case["output"]))
for a, b in zip(actual, case["output"]):
self.assertAlmostEqual(a, b, places=10)
def test_markers_stay_in_data_coordinates_and_cross(self):
bounds = Bounds(1000, 2000, -10, 10)
markers = Markers().positioned(self.core, bounds)
zoomed = bounds.visible(self.core, Viewport(.25, .25, .5, .5))
self.assertEqual(markers, markers.positioned(self.core, zoomed))
moved = markers.drag(self.core, Marker.A, 50, 500, zoomed)
self.assertAlmostEqual(moved.a, markers.a + 50)
self.assertEqual(markers.b, moved.b)
self.assertEqual(Marker.A, moved.hit(self.core, 0, 50, 500, 100, 20, zoomed))
crossed = markers.move(Marker.A, 1900).move(Marker.B, 1100)
self.assertEqual(-800, self.core.delta(crossed.a, crossed.b))
def test_invalid_numeric_inputs_do_not_escape_to_painter(self):
for value in (math.nan, math.inf, -math.inf):
self.assertEqual(Viewport(), Viewport().transform(self.core, zoom_x=value))
with self.assertRaises(ValueError):
self.core.pinch_axis(value, 10, 8)
if __name__ == "__main__":
unittest.main()