145 lines
5.0 KiB
Dart
145 lines
5.0 KiB
Dart
// Copyright 2014 The Flutter Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
import 'package:flutter/gestures.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
void main() {
|
|
test('wrapped HitTestResult gets HitTestEntry added to wrapping HitTestResult', () async {
|
|
final HitTestEntry entry1 = HitTestEntry(_DummyHitTestTarget());
|
|
final HitTestEntry entry2 = HitTestEntry(_DummyHitTestTarget());
|
|
final HitTestEntry entry3 = HitTestEntry(_DummyHitTestTarget());
|
|
final Matrix4 transform = Matrix4.translationValues(40.0, 150.0, 0.0);
|
|
|
|
final HitTestResult wrapped = MyHitTestResult()
|
|
..publicPushTransform(transform);
|
|
wrapped.add(entry1);
|
|
expect(wrapped.path, equals(<HitTestEntry>[entry1]));
|
|
expect(entry1.transform, transform);
|
|
|
|
final HitTestResult wrapping = HitTestResult.wrap(wrapped);
|
|
expect(wrapping.path, equals(<HitTestEntry>[entry1]));
|
|
expect(wrapping.path, same(wrapped.path));
|
|
|
|
wrapping.add(entry2);
|
|
expect(wrapping.path, equals(<HitTestEntry>[entry1, entry2]));
|
|
expect(wrapped.path, equals(<HitTestEntry>[entry1, entry2]));
|
|
expect(entry2.transform, transform);
|
|
|
|
wrapped.add(entry3);
|
|
expect(wrapping.path, equals(<HitTestEntry>[entry1, entry2, entry3]));
|
|
expect(wrapped.path, equals(<HitTestEntry>[entry1, entry2, entry3]));
|
|
expect(entry3.transform, transform);
|
|
});
|
|
|
|
test('HitTestResult should correctly push and pop transforms', () {
|
|
Matrix4? currentTransform(HitTestResult targetResult) {
|
|
final HitTestEntry entry = HitTestEntry(_DummyHitTestTarget());
|
|
targetResult.add(entry);
|
|
return entry.transform;
|
|
}
|
|
|
|
final MyHitTestResult result = MyHitTestResult();
|
|
|
|
final Matrix4 m1 = Matrix4.translationValues(10, 20, 0);
|
|
final Matrix4 m2 = Matrix4.rotationZ(1);
|
|
final Matrix4 m3 = Matrix4.diagonal3Values(1.1, 1.2, 1.0);
|
|
|
|
result.publicPushTransform(m1);
|
|
expect(currentTransform(result), equals(m1));
|
|
|
|
result.publicPushTransform(m2);
|
|
expect(currentTransform(result), equals(m2 * m1));
|
|
expect(currentTransform(result), equals(m2 * m1)); // Test repeated add
|
|
|
|
// The `wrapped` is wrapped at [m1, m2]
|
|
final MyHitTestResult wrapped = MyHitTestResult.wrap(result);
|
|
expect(currentTransform(wrapped), equals(m2 * m1));
|
|
|
|
result.publicPushTransform(m3);
|
|
// ignore: avoid_dynamic_calls
|
|
expect(currentTransform(result), equals(m3 * m2 * m1));
|
|
// ignore: avoid_dynamic_calls
|
|
expect(currentTransform(wrapped), equals(m3 * m2 * m1));
|
|
|
|
result.publicPopTransform();
|
|
result.publicPopTransform();
|
|
expect(currentTransform(result), equals(m1));
|
|
|
|
result.publicPopTransform();
|
|
result.publicPushTransform(m3);
|
|
expect(currentTransform(result), equals(m3));
|
|
|
|
result.publicPushTransform(m2);
|
|
expect(currentTransform(result), equals(m2 * m3));
|
|
});
|
|
|
|
test('HitTestResult should correctly push and pop offsets', () {
|
|
Matrix4? currentTransform(HitTestResult targetResult) {
|
|
final HitTestEntry entry = HitTestEntry(_DummyHitTestTarget());
|
|
targetResult.add(entry);
|
|
return entry.transform;
|
|
}
|
|
|
|
final MyHitTestResult result = MyHitTestResult();
|
|
|
|
final Matrix4 m1 = Matrix4.rotationZ(1);
|
|
final Matrix4 m2 = Matrix4.diagonal3Values(1.1, 1.2, 1.0);
|
|
const Offset o3 = Offset(10, 20);
|
|
final Matrix4 m3 = Matrix4.translationValues(o3.dx, o3.dy, 0.0);
|
|
|
|
// Test pushing offset as the first element
|
|
result.publicPushOffset(o3);
|
|
expect(currentTransform(result), equals(m3));
|
|
result.publicPopTransform();
|
|
|
|
result.publicPushOffset(o3);
|
|
result.publicPushTransform(m1);
|
|
expect(currentTransform(result), equals(m1 * m3));
|
|
expect(currentTransform(result), equals(m1 * m3)); // Test repeated add
|
|
|
|
// The `wrapped` is wrapped at [m1, m2]
|
|
final MyHitTestResult wrapped = MyHitTestResult.wrap(result);
|
|
expect(currentTransform(wrapped), equals(m1 * m3));
|
|
|
|
result.publicPushTransform(m2);
|
|
// ignore: avoid_dynamic_calls
|
|
expect(currentTransform(result), equals(m2 * m1 * m3));
|
|
// ignore: avoid_dynamic_calls
|
|
expect(currentTransform(wrapped), equals(m2 * m1 * m3));
|
|
|
|
result.publicPopTransform();
|
|
result.publicPopTransform();
|
|
result.publicPopTransform();
|
|
expect(currentTransform(result), equals(Matrix4.identity()));
|
|
|
|
result.publicPushTransform(m2);
|
|
result.publicPushOffset(o3);
|
|
result.publicPushTransform(m1);
|
|
|
|
// ignore: avoid_dynamic_calls
|
|
expect(currentTransform(result), equals(m1 * m3 * m2));
|
|
|
|
result.publicPopTransform();
|
|
|
|
expect(currentTransform(result), equals(m3 * m2));
|
|
});
|
|
}
|
|
|
|
class _DummyHitTestTarget implements HitTestTarget {
|
|
@override
|
|
void handleEvent(PointerEvent event, HitTestEntry entry) {
|
|
// Nothing to do.
|
|
}
|
|
}
|
|
|
|
class MyHitTestResult extends HitTestResult {
|
|
MyHitTestResult();
|
|
MyHitTestResult.wrap(super.result) : super.wrap();
|
|
|
|
void publicPushTransform(Matrix4 transform) => pushTransform(transform);
|
|
void publicPushOffset(Offset offset) => pushOffset(offset);
|
|
void publicPopTransform() => popTransform();
|
|
}
|