| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- // 绘图组件的纯逻辑测试。
- //
- // "圆看起来是不是圆的"没法靠断言像素,所以把决定比例的那步抽成纯函数来测。
- 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));
- });
- });
- }
|