platform/sandbox/reactivex/test/transformers/materialize_test.dart
2024-11-12 01:00:05 -07:00

99 lines
3 KiB
Dart

import 'dart:async';
import 'package:angel3_reactivex/angel3_reactivex.dart';
import 'package:test/test.dart';
import '../utils.dart';
void main() {
test('Rx.materialize.happyPath', () async {
final stream = Stream.value(1);
final notifications = <StreamNotification<int>>[];
stream.materialize().listen(notifications.add, onDone: expectAsync0(() {
expect(notifications,
[StreamNotification.data(1), StreamNotification<int>.done()]);
}));
});
test('Rx.materialize.reusable', () async {
final transformer = MaterializeStreamTransformer<int>();
final stream = Stream.value(1).asBroadcastStream();
final notificationsA = <StreamNotification<int>>[],
notificationsB = <StreamNotification<int>>[];
stream.transform(transformer).listen(notificationsA.add,
onDone: expectAsync0(() {
expect(notificationsA,
[StreamNotification.data(1), StreamNotification<int>.done()]);
}));
stream.transform(transformer).listen(notificationsB.add,
onDone: expectAsync0(() {
expect(notificationsB,
[StreamNotification.data(1), StreamNotification<int>.done()]);
}));
});
test('materializeTransformer.happyPath', () async {
final stream = Stream.fromIterable(const [1]);
final notifications = <StreamNotification<int>>[];
stream
.transform(MaterializeStreamTransformer<int>())
.listen(notifications.add, onDone: expectAsync0(() {
expect(notifications,
[StreamNotification.data(1), StreamNotification<int>.done()]);
}));
});
test('materializeTransformer.sadPath', () async {
final stream = Stream<int>.error(Exception());
final notifications = <StreamNotification<int>>[];
stream
.transform(MaterializeStreamTransformer<int>())
.listen(notifications.add,
onError: expectAsync2((Exception e, StackTrace s) {
// Check to ensure the stream does not come to this point
expect(true, isFalse);
}, count: 0), onDone: expectAsync0(() {
expect(notifications.length, 2);
expect(notifications[0].isError, isTrue);
expect(notifications[1].isDone, isTrue);
}));
});
test('materializeTransformer.onPause.onResume', () async {
final stream = Stream.fromIterable(const [1]);
final notifications = <StreamNotification<int>>[];
stream
.transform(MaterializeStreamTransformer<int>())
.listen(notifications.add, onDone: expectAsync0(() {
expect(notifications, <StreamNotification<int>>[
StreamNotification.data(1),
StreamNotification<int>.done()
]);
}))
..pause()
..resume();
});
test('Rx.materialize accidental broadcast', () async {
final controller = StreamController<int>();
final stream = controller.stream.materialize();
stream.listen(null);
expect(() => stream.listen(null), throwsStateError);
controller.add(1);
});
test('Rx.materialize.nullable', () {
nullableTest<StreamNotification<String?>>(
(s) => s.materialize(),
);
});
}