6238b86dcb
- 登录/注册(login.html/register.html 1:1):两栏卡片+品牌渐变面板+主题小衣服 pill(onSurface 变体)+记住我(记录并预填最近账号)+原型式 toast 校验; 登录 fidelity 1.4–2.1% 三主题全绿;注册暂不入闸(少 门店编号/兑换券 字段, 已记 CONTRACT,screens.mjs 留存根) - ds 原子补齐:DsToast(.toast 单例)/DsCheck(.check/.agree)/DsButton lg 档/ DsSelect 替换全部旧 DropdownButton/DsField label 在上/DsInput 后缀与密码形态 - 全屏统一:对话框按钮全 DsButton、盒式输入主题钉死(visualDensity.standard、 h38、InputDecorationTheme 渗漏修复)、图标全 lucide、JetBrains Mono 三端同源、 BrandMark 真相源 logo、只读模式写操作全量守卫(WriteGuard+DsToast) - 出入库列表:版式对齐原型(卡片对齐+搜索框居中)、KPI 近30天滚动、结清后 失效财务应收应付表;商品编辑抽屉介绍库改搜索下拉、图片双击全屏预览 - 删除旧 UI 死代码:DataTableCard/FormDialog/PageScaffold/SearchChip/ SelectProductDialog/tabStateProvider - golden/fidelity:stock-in/out 补注册(9%)、login 入册(8%)、goldens 全量重打; 修复 pubspec flutter_web_plugins 非法声明(CI pub get 阻断) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
84 lines
2.9 KiB
Dart
84 lines
2.9 KiB
Dart
import 'package:lucide_icons_flutter/lucide_icons.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:jiu_client/core/theme/themes.dart';
|
|
import 'package:jiu_client/core/utils/date_util.dart';
|
|
import 'package:jiu_client/widgets/date_picker_field.dart';
|
|
|
|
void main() {
|
|
group('date_util', () {
|
|
test('formatYmd 补零', () {
|
|
expect(formatYmd(DateTime(2026, 6, 9)), '2026-06-09');
|
|
expect(formatYmd(DateTime(2026, 12, 31)), '2026-12-31');
|
|
});
|
|
test('parseYmd 解析/容错', () {
|
|
expect(parseYmd('2026-06-19'), DateTime(2026, 6, 19));
|
|
expect(parseYmd('2026-06-19T08:00:00'), DateTime(2026, 6, 19));
|
|
expect(parseYmd(null), isNull);
|
|
expect(parseYmd(''), isNull);
|
|
});
|
|
test('composeYmd 正常组合', () {
|
|
expect(composeYmd(2026, 6, 15), '2026-06-15');
|
|
});
|
|
test('composeYmd 把超界的日 clamp 回当月最大值', () {
|
|
expect(composeYmd(2026, 2, 31), '2026-02-28'); // 平年 2 月
|
|
expect(composeYmd(2024, 2, 31), '2024-02-29'); // 闰年 2 月
|
|
expect(composeYmd(2026, 4, 31), '2026-04-30'); // 4 月 30 天
|
|
});
|
|
test('composeYmd 任一为空返回 null', () {
|
|
expect(composeYmd(null, 6, 15), isNull);
|
|
expect(composeYmd(2026, null, 15), isNull);
|
|
expect(composeYmd(2026, 6, null), isNull);
|
|
});
|
|
});
|
|
|
|
group('DatePickerField', () {
|
|
testWidgets('渲染可键入框 + 日历图标', (tester) async {
|
|
await tester.pumpWidget(MaterialApp(
|
|
theme: buildTheme('a'),
|
|
home: Scaffold(
|
|
body: DatePickerField(value: '2026-06-19', onChanged: (_) {}),
|
|
),
|
|
));
|
|
await tester.pumpAndSettle();
|
|
expect(find.byType(TextField), findsOneWidget);
|
|
expect(find.byIcon(LucideIcons.calendar), findsOneWidget);
|
|
});
|
|
|
|
testWidgets('初始值回显到输入框', (tester) async {
|
|
await tester.pumpWidget(MaterialApp(
|
|
theme: buildTheme('a'),
|
|
home: Scaffold(
|
|
body: DatePickerField(value: '2026-06-19', onChanged: (_) {}),
|
|
),
|
|
));
|
|
await tester.pumpAndSettle();
|
|
expect(find.text('2026-06-19'), findsOneWidget);
|
|
});
|
|
|
|
testWidgets('只输年份归一为 yyyy-01-01', (tester) async {
|
|
String? out;
|
|
await tester.pumpWidget(MaterialApp(
|
|
theme: buildTheme('a'),
|
|
home: Scaffold(
|
|
body: DatePickerField(onChanged: (v) => out = v),
|
|
),
|
|
));
|
|
await tester.enterText(find.byType(TextField), '2024');
|
|
expect(out, '2024-01-01');
|
|
});
|
|
|
|
testWidgets('年月归一为 yyyy-MM-01', (tester) async {
|
|
String? out;
|
|
await tester.pumpWidget(MaterialApp(
|
|
theme: buildTheme('a'),
|
|
home: Scaffold(
|
|
body: DatePickerField(onChanged: (v) => out = v),
|
|
),
|
|
));
|
|
await tester.enterText(find.byType(TextField), '2024-5');
|
|
expect(out, '2024-05-01');
|
|
});
|
|
});
|
|
}
|