flutter/packages/unit/test/widget/global_key_test.dart
Adam Barth d7ba514546 Fix global key error while using fitness app
We were making local copies of the listener maps, but we were actually
iterating the underlying sets. Now we make local copies of the sets.

Fixes #803
2015-08-25 14:45:18 -07:00

154 lines
4.2 KiB
Dart

import 'package:sky/widgets.dart';
import 'package:test/test.dart';
import 'build_utils.dart';
void main() {
test('Global keys notify add and remove', () {
GlobalKey globalKey = new GlobalKey();
Container container;
bool syncListenerCalled = false;
bool removeListenerCalled = false;
void syncListener(GlobalKey key, Widget widget) {
syncListenerCalled = true;
expect(key, equals(globalKey));
expect(container, isNotNull);
expect(widget, equals(container));
}
void removeListener(GlobalKey key) {
removeListenerCalled = true;
expect(key, equals(globalKey));
}
WidgetTester tester = new WidgetTester();
GlobalKey.registerSyncListener(globalKey, syncListener);
GlobalKey.registerRemoveListener(globalKey, removeListener);
tester.pumpFrame(() {
container = new Container(key: globalKey);
return container;
});
expect(syncListenerCalled, isTrue);
expect(removeListenerCalled, isFalse);
syncListenerCalled = false;
removeListenerCalled = false;
tester.pumpFrame(() => new Container());
expect(syncListenerCalled, isFalse);
expect(removeListenerCalled, isTrue);
syncListenerCalled = false;
removeListenerCalled = false;
GlobalKey.unregisterSyncListener(globalKey, syncListener);
GlobalKey.unregisterRemoveListener(globalKey, removeListener);
tester.pumpFrame(() {
container = new Container(key: globalKey);
return container;
});
expect(syncListenerCalled, isFalse);
expect(removeListenerCalled, isFalse);
tester.pumpFrame(() => new Container());
expect(syncListenerCalled, isFalse);
expect(removeListenerCalled, isFalse);
});
test('Global key reparenting', () {
GlobalKey globalKey = new GlobalKey();
bool syncListenerCalled = false;
bool removeListenerCalled = false;
void syncListener(GlobalKey key, Widget widget) {
syncListenerCalled = true;
}
void removeListener(GlobalKey key) {
removeListenerCalled = true;
}
GlobalKey.registerSyncListener(globalKey, syncListener);
GlobalKey.registerRemoveListener(globalKey, removeListener);
WidgetTester tester = new WidgetTester();
tester.pumpFrame(() {
return new Container(
child: new Container(
key: globalKey
)
);
});
expect(syncListenerCalled, isTrue);
expect(removeListenerCalled, isFalse);
tester.pumpFrame(() {
return new Container(
key: globalKey,
child: new Container()
);
});
expect(syncListenerCalled, isTrue);
expect(removeListenerCalled, isFalse);
tester.pumpFrame(() {
return new Container(
child: new Container(
key: globalKey
)
);
});
expect(syncListenerCalled, isTrue);
expect(removeListenerCalled, isFalse);
GlobalKey.unregisterSyncListener(globalKey, syncListener);
GlobalKey.unregisterRemoveListener(globalKey, removeListener);
});
test('Global key mutate during iteration', () {
GlobalKey globalKey = new GlobalKey();
bool syncListenerCalled = false;
bool removeListenerCalled = false;
void syncListener(GlobalKey key, Widget widget) {
GlobalKey.unregisterSyncListener(globalKey, syncListener);
syncListenerCalled = true;
}
void removeListener(GlobalKey key) {
GlobalKey.unregisterRemoveListener(globalKey, removeListener);
removeListenerCalled = true;
}
GlobalKey.registerSyncListener(globalKey, syncListener);
GlobalKey.registerRemoveListener(globalKey, removeListener);
WidgetTester tester = new WidgetTester();
tester.pumpFrame(() {
return new Container(key: globalKey);
});
expect(syncListenerCalled, isTrue);
expect(removeListenerCalled, isFalse);
syncListenerCalled = false;
removeListenerCalled = false;
tester.pumpFrame(() {
return new Container();
});
expect(syncListenerCalled, isFalse);
expect(removeListenerCalled, isTrue);
syncListenerCalled = false;
removeListenerCalled = false;
tester.pumpFrame(() {
return new Container(key: globalKey);
});
expect(syncListenerCalled, isFalse);
expect(removeListenerCalled, isFalse);
});
}