2024-04-29 17:41:19 +00:00
|
|
|
import 'dart:convert';
|
|
|
|
|
2024-05-21 19:19:27 +00:00
|
|
|
import 'package:test/test.dart';
|
2024-04-29 17:41:19 +00:00
|
|
|
import 'package:veilid_support/veilid_support.dart';
|
|
|
|
|
2024-05-09 15:54:52 +00:00
|
|
|
Future<void> Function() makeTestDHTShortArrayCreateDelete(
|
|
|
|
{required int stride}) =>
|
|
|
|
() async {
|
|
|
|
// Close before delete
|
|
|
|
{
|
|
|
|
final arr = await DHTShortArray.create(
|
|
|
|
debugName: 'sa_create_delete 1 stride $stride', stride: stride);
|
|
|
|
expect(await arr.operate((r) async => r.length), isZero);
|
|
|
|
expect(arr.isOpen, isTrue);
|
|
|
|
await arr.close();
|
|
|
|
expect(arr.isOpen, isFalse);
|
|
|
|
await arr.delete();
|
|
|
|
// Operate should fail
|
|
|
|
await expectLater(() async => arr.operate((r) async => r.length),
|
|
|
|
throwsA(isA<StateError>()));
|
|
|
|
}
|
|
|
|
|
|
|
|
// Close after delete
|
|
|
|
{
|
|
|
|
final arr = await DHTShortArray.create(
|
|
|
|
debugName: 'sa_create_delete 2 stride $stride', stride: stride);
|
|
|
|
await arr.delete();
|
|
|
|
// Operate should still succeed because things aren't closed
|
|
|
|
expect(await arr.operate((r) async => r.length), isZero);
|
|
|
|
await arr.close();
|
|
|
|
// Operate should fail
|
|
|
|
await expectLater(() async => arr.operate((r) async => r.length),
|
|
|
|
throwsA(isA<StateError>()));
|
|
|
|
}
|
|
|
|
|
|
|
|
// Close after delete multiple
|
|
|
|
// Okay to request delete multiple times before close
|
|
|
|
{
|
|
|
|
final arr = await DHTShortArray.create(
|
|
|
|
debugName: 'sa_create_delete 3 stride $stride', stride: stride);
|
|
|
|
await arr.delete();
|
|
|
|
await arr.delete();
|
|
|
|
// Operate should still succeed because things aren't closed
|
|
|
|
expect(await arr.operate((r) async => r.length), isZero);
|
|
|
|
await arr.close();
|
2024-05-16 18:07:25 +00:00
|
|
|
await expectLater(() async => arr.close(), throwsA(isA<StateError>()));
|
2024-05-09 15:54:52 +00:00
|
|
|
// Operate should fail
|
|
|
|
await expectLater(() async => arr.operate((r) async => r.length),
|
|
|
|
throwsA(isA<StateError>()));
|
|
|
|
}
|
|
|
|
};
|
2024-05-02 00:58:25 +00:00
|
|
|
|
2024-05-09 15:54:52 +00:00
|
|
|
Future<void> Function() makeTestDHTShortArrayAdd({required int stride}) =>
|
|
|
|
() async {
|
|
|
|
final arr = await DHTShortArray.create(
|
|
|
|
debugName: 'sa_add 1 stride $stride', stride: stride);
|
2024-05-02 00:58:25 +00:00
|
|
|
|
2024-05-09 15:54:52 +00:00
|
|
|
final dataset = Iterable<int>.generate(256)
|
|
|
|
.map((n) => utf8.encode('elem $n'))
|
|
|
|
.toList();
|
2024-05-02 00:58:25 +00:00
|
|
|
|
2024-05-16 02:45:50 +00:00
|
|
|
print('adding singles\n');
|
2024-05-09 15:54:52 +00:00
|
|
|
{
|
2024-06-08 01:38:19 +00:00
|
|
|
for (var n = 4; n < 8; n++) {
|
|
|
|
await arr.operateWriteEventual((w) async {
|
2024-05-09 15:54:52 +00:00
|
|
|
print('$n ');
|
2024-06-09 18:43:28 +00:00
|
|
|
await w.add(dataset[n]);
|
2024-06-08 01:38:19 +00:00
|
|
|
});
|
|
|
|
}
|
2024-05-09 15:54:52 +00:00
|
|
|
}
|
2024-05-02 00:58:25 +00:00
|
|
|
|
2024-05-16 02:45:50 +00:00
|
|
|
print('adding batch\n');
|
|
|
|
{
|
2024-06-08 01:38:19 +00:00
|
|
|
await arr.operateWriteEventual((w) async {
|
2024-05-16 02:45:50 +00:00
|
|
|
print('${dataset.length ~/ 2}-${dataset.length}');
|
2024-06-09 18:43:28 +00:00
|
|
|
await w.addAll(dataset.sublist(dataset.length ~/ 2, dataset.length));
|
2024-05-16 02:45:50 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
print('inserting singles\n');
|
|
|
|
{
|
2024-06-08 01:38:19 +00:00
|
|
|
for (var n = 0; n < 4; n++) {
|
|
|
|
await arr.operateWriteEventual((w) async {
|
2024-05-16 02:45:50 +00:00
|
|
|
print('$n ');
|
2024-06-09 18:43:28 +00:00
|
|
|
await w.insert(n, dataset[n]);
|
2024-06-08 01:38:19 +00:00
|
|
|
});
|
|
|
|
}
|
2024-05-16 02:45:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
print('inserting batch\n');
|
|
|
|
{
|
2024-06-08 01:38:19 +00:00
|
|
|
await arr.operateWriteEventual((w) async {
|
2024-05-16 02:45:50 +00:00
|
|
|
print('8-${dataset.length ~/ 2}');
|
2024-06-09 18:43:28 +00:00
|
|
|
await w.insertAll(8, dataset.sublist(8, dataset.length ~/ 2));
|
2024-05-16 02:45:50 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2024-05-09 15:54:52 +00:00
|
|
|
//print('get all\n');
|
|
|
|
{
|
2024-05-29 02:01:50 +00:00
|
|
|
final dataset2 = await arr.operate((r) async => r.getRange(0));
|
2024-05-09 15:54:52 +00:00
|
|
|
expect(dataset2, equals(dataset));
|
2024-05-02 00:58:25 +00:00
|
|
|
}
|
2024-05-13 14:03:25 +00:00
|
|
|
{
|
|
|
|
final dataset3 =
|
2024-05-29 02:01:50 +00:00
|
|
|
await arr.operate((r) async => r.getRange(64, length: 128));
|
2024-05-13 14:03:25 +00:00
|
|
|
expect(dataset3, equals(dataset.sublist(64, 64 + 128)));
|
|
|
|
}
|
2024-05-02 00:58:25 +00:00
|
|
|
|
2024-05-09 15:54:52 +00:00
|
|
|
//print('clear\n');
|
|
|
|
{
|
2024-05-21 19:19:27 +00:00
|
|
|
await arr.operateWriteEventual((w) async {
|
|
|
|
await w.clear();
|
|
|
|
});
|
2024-05-09 15:54:52 +00:00
|
|
|
}
|
2024-05-02 00:58:25 +00:00
|
|
|
|
2024-05-09 15:54:52 +00:00
|
|
|
//print('get all\n');
|
|
|
|
{
|
2024-05-29 02:01:50 +00:00
|
|
|
final dataset4 = await arr.operate((r) async => r.getRange(0));
|
2024-05-13 14:03:25 +00:00
|
|
|
expect(dataset4, isEmpty);
|
2024-05-09 15:54:52 +00:00
|
|
|
}
|
2024-05-02 00:58:25 +00:00
|
|
|
|
2024-05-09 15:54:52 +00:00
|
|
|
await arr.delete();
|
|
|
|
await arr.close();
|
|
|
|
};
|