util.dart 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import 'dart:collection';
  2. import 'package:app_flowy/plugins/grid/application/block/block_cache.dart';
  3. import 'package:app_flowy/plugins/grid/application/cell/cell_service/cell_service.dart';
  4. import 'package:app_flowy/plugins/grid/application/field/field_controller.dart';
  5. import 'package:app_flowy/plugins/grid/application/field/field_service.dart';
  6. import 'package:app_flowy/plugins/grid/application/grid_data_controller.dart';
  7. import 'package:app_flowy/plugins/grid/application/row/row_bloc.dart';
  8. import 'package:app_flowy/plugins/grid/application/row/row_cache.dart';
  9. import 'package:app_flowy/plugins/grid/application/row/row_data_controller.dart';
  10. import 'package:app_flowy/plugins/grid/grid.dart';
  11. import 'package:app_flowy/workspace/application/app/app_service.dart';
  12. import 'package:flowy_sdk/protobuf/flowy-folder/view.pb.dart';
  13. import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart';
  14. import '../../util.dart';
  15. /// Create a empty Grid for test
  16. class AppFlowyGridTest {
  17. final AppFlowyUnitTest _inner;
  18. late ViewPB gridView;
  19. late GridDataController _dataController;
  20. AppFlowyGridTest(AppFlowyUnitTest unitTest) : _inner = unitTest;
  21. static Future<AppFlowyGridTest> ensureInitialized() async {
  22. final inner = await AppFlowyUnitTest.ensureInitialized();
  23. return AppFlowyGridTest(inner);
  24. }
  25. List<RowInfo> get rowInfos => _dataController.rowInfos;
  26. UnmodifiableMapView<String, GridBlockCache> get blocks =>
  27. _dataController.blocks;
  28. List<GridFieldContext> get fieldContexts =>
  29. _dataController.fieldController.fieldContexts;
  30. GridFieldController get fieldController => _dataController.fieldController;
  31. Future<void> createRow() async {
  32. await _dataController.createRow();
  33. }
  34. GridFieldContext singleSelectFieldContext() {
  35. final fieldContext = fieldContexts
  36. .firstWhere((element) => element.fieldType == FieldType.SingleSelect);
  37. return fieldContext;
  38. }
  39. GridFieldCellContext singleSelectFieldCellContext() {
  40. final field = singleSelectFieldContext().field;
  41. return GridFieldCellContext(gridId: gridView.id, field: field);
  42. }
  43. Future<void> createTestGrid() async {
  44. final app = await _inner.createTestApp();
  45. final builder = GridPluginBuilder();
  46. final result = await AppService().createView(
  47. appId: app.id,
  48. name: "Test Grid",
  49. dataFormatType: builder.dataFormatType,
  50. pluginType: builder.pluginType,
  51. layoutType: builder.layoutType!,
  52. );
  53. await result.fold(
  54. (view) async {
  55. gridView = view;
  56. _dataController = GridDataController(view: view);
  57. final result = await _dataController.openGrid();
  58. result.fold((l) => null, (r) => throw Exception(r));
  59. },
  60. (error) {},
  61. );
  62. }
  63. }
  64. /// Create a new Grid for cell test
  65. class AppFlowyGridCellTest {
  66. final AppFlowyGridTest _gridTest;
  67. AppFlowyGridCellTest(AppFlowyGridTest gridTest) : _gridTest = gridTest;
  68. static Future<AppFlowyGridCellTest> ensureInitialized() async {
  69. final gridTest = await AppFlowyGridTest.ensureInitialized();
  70. return AppFlowyGridCellTest(gridTest);
  71. }
  72. Future<void> createTestRow() async {
  73. await _gridTest.createRow();
  74. }
  75. Future<void> createTestGrid() async {
  76. await _gridTest.createTestGrid();
  77. }
  78. Future<GridCellControllerBuilder> cellControllerBuilder(
  79. String fieldId,
  80. ) async {
  81. final RowInfo rowInfo = _gridTest.rowInfos.last;
  82. final blockCache = _gridTest.blocks[rowInfo.rowPB.blockId];
  83. final rowCache = blockCache?.rowCache;
  84. final rowDataController = GridRowDataController(
  85. rowInfo: rowInfo,
  86. fieldController: _gridTest._dataController.fieldController,
  87. rowCache: rowCache!,
  88. );
  89. final rowBloc = RowBloc(
  90. rowInfo: rowInfo,
  91. dataController: rowDataController,
  92. )..add(const RowEvent.initial());
  93. await gridResponseFuture();
  94. return GridCellControllerBuilder(
  95. cellId: rowBloc.state.gridCellMap[fieldId]!,
  96. cellCache: rowCache.cellCache,
  97. delegate: rowDataController,
  98. );
  99. }
  100. }
  101. class AppFlowyGridSelectOptionCellTest {
  102. final AppFlowyGridCellTest _gridCellTest;
  103. AppFlowyGridSelectOptionCellTest(AppFlowyGridCellTest cellTest)
  104. : _gridCellTest = cellTest;
  105. static Future<AppFlowyGridSelectOptionCellTest> ensureInitialized() async {
  106. final gridTest = await AppFlowyGridCellTest.ensureInitialized();
  107. return AppFlowyGridSelectOptionCellTest(gridTest);
  108. }
  109. Future<void> createTestGrid() async {
  110. await _gridCellTest.createTestGrid();
  111. }
  112. Future<void> createTestRow() async {
  113. await _gridCellTest.createTestRow();
  114. }
  115. Future<GridSelectOptionCellController> makeCellController(
  116. FieldType fieldType) async {
  117. assert(fieldType == FieldType.SingleSelect ||
  118. fieldType == FieldType.MultiSelect);
  119. final fieldContexts = _gridCellTest._gridTest.fieldContexts;
  120. final field =
  121. fieldContexts.firstWhere((element) => element.fieldType == fieldType);
  122. final builder = await _gridCellTest.cellControllerBuilder(field.id);
  123. final cellController = builder.build() as GridSelectOptionCellController;
  124. return cellController;
  125. }
  126. }
  127. Future<void> gridResponseFuture() {
  128. return Future.delayed(gridResponseDuration(milliseconds: 200));
  129. }
  130. Duration gridResponseDuration({int milliseconds = 200}) {
  131. return Duration(milliseconds: milliseconds);
  132. }