fix: automate graduate timetable read and refine blue glass Dock
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:timezone/data/latest.dart' as tzdata;
|
||||
import 'package:hepan_everyday/widgets/glass_dock.dart';
|
||||
import 'package:hepan_everyday/app/hepan_app.dart';
|
||||
|
||||
import 'navigation_test.dart' show uiController;
|
||||
|
||||
void main() {
|
||||
setUpAll(tzdata.initializeTimeZones);
|
||||
testWidgets('held cursor enlarges before dragging and returns on release', (
|
||||
tester,
|
||||
) async {
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
home: Scaffold(
|
||||
body: Center(child: GlassDock(selectedIndex: 0, onSelected: (_) {})),
|
||||
),
|
||||
),
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
final lens = find
|
||||
.descendant(
|
||||
of: find.byType(GlassDock),
|
||||
matching: find.byType(BackdropFilter),
|
||||
)
|
||||
.last;
|
||||
final resting = tester.getSize(lens);
|
||||
final gesture = await tester.startGesture(
|
||||
tester.getCenter(find.byKey(const Key('dock-cursor'))),
|
||||
);
|
||||
await tester.pump(const Duration(milliseconds: 110));
|
||||
await tester.pump(const Duration(milliseconds: 200));
|
||||
final held = tester.getSize(lens);
|
||||
expect(held.width, greaterThan(resting.width * 1.12));
|
||||
expect(held.height, greaterThan(resting.height * 1.12));
|
||||
await gesture.cancel();
|
||||
await tester.pumpAndSettle();
|
||||
expect(tester.getSize(lens).width, closeTo(resting.width, 0.5));
|
||||
expect(tester.getSize(lens).height, closeTo(resting.height, 0.5));
|
||||
});
|
||||
testWidgets(
|
||||
'Dock stays visible while sliding down instead of abruptly fading',
|
||||
(tester) async {
|
||||
tester.view.physicalSize = const Size(390, 844);
|
||||
tester.view.devicePixelRatio = 1;
|
||||
addTearDown(tester.view.resetPhysicalSize);
|
||||
addTearDown(tester.view.resetDevicePixelRatio);
|
||||
final c = uiController();
|
||||
await c.initialize();
|
||||
await c.showDemo();
|
||||
await tester.pumpWidget(HepanApp(controller: c));
|
||||
await tester.pumpAndSettle();
|
||||
final dock = find.byType(GlassDock);
|
||||
final before = tester.getRect(dock);
|
||||
final gesture = await tester.startGesture(
|
||||
tester.getCenter(find.text('周三')),
|
||||
);
|
||||
await gesture.moveBy(const Offset(0, -80));
|
||||
await tester.pump();
|
||||
await tester.pump(const Duration(milliseconds: 120));
|
||||
final fading = find.ancestor(
|
||||
of: dock,
|
||||
matching: find.byType(FadeTransition),
|
||||
);
|
||||
final opacity = fading.evaluate().isEmpty
|
||||
? 1.0
|
||||
: tester.widget<FadeTransition>(fading.first).opacity.value;
|
||||
expect(opacity, greaterThan(0.95));
|
||||
expect(tester.getRect(dock).top, greaterThan(before.top));
|
||||
expect(tester.getRect(dock).top, lessThan(844));
|
||||
await gesture.up();
|
||||
await tester.pumpAndSettle();
|
||||
expect(dock.hitTestable(), findsNothing);
|
||||
c.dispose();
|
||||
},
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
import 'dart:ui' as ui;
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
test(
|
||||
'glass samples and bends background pixels while keeping the centre stable',
|
||||
() async {
|
||||
const width = 160, height = 100;
|
||||
final sourceRecorder = ui.PictureRecorder();
|
||||
final sourceCanvas = ui.Canvas(sourceRecorder);
|
||||
for (var x = 0; x < width; x++) {
|
||||
sourceCanvas.drawRect(
|
||||
ui.Rect.fromLTWH(x.toDouble(), 0, 1, height.toDouble()),
|
||||
ui.Paint()..color = ui.Color.fromARGB(255, 40 + x, 70, 90),
|
||||
);
|
||||
}
|
||||
final sourcePicture = sourceRecorder.endRecording();
|
||||
final source = await sourcePicture.toImage(width, height);
|
||||
final program = await ui.FragmentProgram.fromAsset(
|
||||
'shaders/liquid_glass.frag',
|
||||
);
|
||||
final shader = program.fragmentShader()
|
||||
..setFloat(0, width.toDouble())
|
||||
..setFloat(1, height.toDouble())
|
||||
..setFloat(2, 0)
|
||||
..setFloat(3, 0)
|
||||
..setFloat(4, width.toDouble())
|
||||
..setFloat(5, height.toDouble())
|
||||
..setImageSampler(0, source);
|
||||
Future<ui.Image> draw(double strength) async {
|
||||
shader.setFloat(6, strength);
|
||||
final recorder = ui.PictureRecorder();
|
||||
ui.Canvas(recorder).drawRect(
|
||||
ui.Rect.fromLTWH(0, 0, width.toDouble(), height.toDouble()),
|
||||
ui.Paint()..shader = shader,
|
||||
);
|
||||
final picture = recorder.endRecording();
|
||||
final image = await picture.toImage(width, height);
|
||||
picture.dispose();
|
||||
return image;
|
||||
}
|
||||
|
||||
final plain = await draw(0), refracted = await draw(1);
|
||||
final a = (await plain.toByteData())!,
|
||||
b = (await refracted.toByteData())!;
|
||||
int red(ByteData data, int x) => data.getUint8((50 * width + x) * 4);
|
||||
expect(red(a, 12), closeTo(52, 1));
|
||||
expect((red(b, 12) - red(a, 12)).abs(), greaterThan(3));
|
||||
expect(red(b, 80), closeTo(red(a, 80), 1));
|
||||
expect(b.getUint8((50 * width + 12) * 4 + 3), 255);
|
||||
shader.dispose();
|
||||
plain.dispose();
|
||||
refracted.dispose();
|
||||
source.dispose();
|
||||
sourcePicture.dispose();
|
||||
},
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user