curve_plot_test.dart 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. // 绘图组件的纯逻辑测试。
  2. //
  3. // "圆看起来是不是圆的"没法靠断言像素,所以把决定比例的那步抽成纯函数来测。
  4. import 'package:flutter_test/flutter_test.dart';
  5. import 'package:cal/curve_plot.dart';
  6. void main() {
  7. group('等比例:两轴调成同跨度同中心', () {
  8. test('数据本来就对称(cos/sin)→ 两轴跨度严格相等', () {
  9. final (x0, x1, y0, y1) = equalizeAspect(-1, 1, -1, 1);
  10. expect(x1 - x0, closeTo(y1 - y0, 1e-12));
  11. expect((x0 + x1) / 2, closeTo((y0 + y1) / 2, 1e-12));
  12. });
  13. test('两轴跨度不同 → 取大的那个,小的被撑开', () {
  14. final (x0, x1, y0, y1) = equalizeAspect(0, 10, 0, 2);
  15. expect(x1 - x0, closeTo(y1 - y0, 1e-9));
  16. // 以大的跨度为准
  17. expect(x1 - x0, closeTo(11, 1e-9));
  18. // 中心不变
  19. expect((x0 + x1) / 2, closeTo(5, 1e-9));
  20. expect((y0 + y1) / 2, closeTo(1, 1e-9));
  21. });
  22. test('圆不会被压成椭圆 —— 单位长度在两轴上占的跨度一样', () {
  23. final (x0, x1, y0, y1) = equalizeAspect(-1, 1, -1, 1);
  24. final xSpan = x1 - x0, ySpan = y1 - y0;
  25. // 半径 1 的圆:x 和 y 各自占的屏幕比例必须相同
  26. expect(1 / xSpan, closeTo(1 / ySpan, 1e-12));
  27. });
  28. test('退化的数据(单点)也不会崩', () {
  29. final (x0, x1, y0, y1) = equalizeAspect(3, 3, 5, 5);
  30. expect(x1 > x0, isTrue);
  31. expect(y1 > y0, isTrue);
  32. expect(x1 - x0, closeTo(y1 - y0, 1e-9));
  33. });
  34. });
  35. }