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