platform/packages/support/test/onceable_test.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));
});
});
}