167 lines
4 KiB
Dart
167 lines
4 KiB
Dart
import 'package:test/test.dart';
|
|
import 'package:platform_mirrors/mirrors.dart';
|
|
import 'package:platform_support/platform_support.dart';
|
|
|
|
void main() {
|
|
late Onceable onceable;
|
|
|
|
setUp(() {
|
|
onceable = Onceable();
|
|
});
|
|
|
|
tearDown(() {
|
|
ReflectionRegistry.reset();
|
|
});
|
|
|
|
group('Onceable', () {
|
|
test('executes callback only once', () {
|
|
var count = 0;
|
|
final callback = () {
|
|
count++;
|
|
return 'result';
|
|
};
|
|
|
|
// First call should execute
|
|
final result1 = onceable.once('test', callback);
|
|
expect(count, equals(1));
|
|
expect(result1, equals('result'));
|
|
|
|
// Second call should not execute
|
|
final result2 = onceable.once('test', callback);
|
|
expect(count, equals(1));
|
|
expect(result2, equals('result'));
|
|
});
|
|
|
|
test('handles void callbacks', () {
|
|
var count = 0;
|
|
final callback = () {
|
|
count++;
|
|
};
|
|
|
|
// First call should execute
|
|
onceable.once('test', callback);
|
|
expect(count, equals(1));
|
|
|
|
// Second call should not execute
|
|
onceable.once('test', callback);
|
|
expect(count, equals(1));
|
|
});
|
|
|
|
test('maintains separate state for different keys', () {
|
|
var count1 = 0;
|
|
var count2 = 0;
|
|
|
|
final callback1 = () {
|
|
count1++;
|
|
return 'result1';
|
|
};
|
|
|
|
final callback2 = () {
|
|
count2++;
|
|
return 'result2';
|
|
};
|
|
|
|
// Execute first callback
|
|
final result1 = onceable.once('test1', callback1);
|
|
expect(count1, equals(1));
|
|
expect(count2, equals(0));
|
|
expect(result1, equals('result1'));
|
|
|
|
// Execute second callback
|
|
final result2 = onceable.once('test2', callback2);
|
|
expect(count1, equals(1));
|
|
expect(count2, equals(1));
|
|
expect(result2, equals('result2'));
|
|
});
|
|
|
|
test('reset allows callback to execute again', () {
|
|
var count = 0;
|
|
final callback = () {
|
|
count++;
|
|
return 'result';
|
|
};
|
|
|
|
// First execution
|
|
final result1 = onceable.once('test', callback);
|
|
expect(count, equals(1));
|
|
expect(result1, equals('result'));
|
|
|
|
// Reset
|
|
onceable.resetOnce('test');
|
|
|
|
// Should execute again
|
|
final result2 = onceable.once('test', callback);
|
|
expect(count, equals(2));
|
|
expect(result2, equals('result'));
|
|
});
|
|
|
|
test('resetAllOnce resets all callbacks', () {
|
|
var count1 = 0;
|
|
var count2 = 0;
|
|
|
|
final callback1 = () {
|
|
count1++;
|
|
return 'result1';
|
|
};
|
|
|
|
final callback2 = () {
|
|
count2++;
|
|
return 'result2';
|
|
};
|
|
|
|
// Execute both callbacks
|
|
onceable.once('test1', callback1);
|
|
onceable.once('test2', callback2);
|
|
expect(count1, equals(1));
|
|
expect(count2, equals(1));
|
|
|
|
// Reset all
|
|
onceable.resetAllOnce();
|
|
|
|
// Both should execute again
|
|
onceable.once('test1', callback1);
|
|
onceable.once('test2', callback2);
|
|
expect(count1, equals(2));
|
|
expect(count2, equals(2));
|
|
});
|
|
|
|
test('hasExecutedOnce returns correct state', () {
|
|
final callback = () => 'result';
|
|
|
|
expect(onceable.hasExecutedOnce('test'), isFalse);
|
|
|
|
onceable.once('test', callback);
|
|
expect(onceable.hasExecutedOnce('test'), isTrue);
|
|
|
|
onceable.resetOnce('test');
|
|
expect(onceable.hasExecutedOnce('test'), isFalse);
|
|
});
|
|
|
|
test('keys returns all registered keys', () {
|
|
final callback = () => 'result';
|
|
|
|
expect(onceable.keys, isEmpty);
|
|
|
|
onceable.once('test1', callback);
|
|
expect(onceable.keys, equals({'test1'}));
|
|
|
|
onceable.once('test2', callback);
|
|
expect(onceable.keys, equals({'test1', 'test2'}));
|
|
});
|
|
|
|
test('count returns number of registered callbacks', () {
|
|
final callback = () => 'result';
|
|
|
|
expect(onceable.count, equals(0));
|
|
|
|
onceable.once('test1', callback);
|
|
expect(onceable.count, equals(1));
|
|
|
|
onceable.once('test2', callback);
|
|
expect(onceable.count, equals(2));
|
|
|
|
onceable.resetAllOnce();
|
|
expect(onceable.count, equals(0));
|
|
});
|
|
});
|
|
}
|