script.rs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. use crate::grid::grid_editor::GridEditorTest;
  2. use flowy_grid::entities::RowInfo;
  3. use flowy_grid::services::row::{CreateRowRevisionBuilder, CreateRowRevisionPayload};
  4. use flowy_grid_data_model::revision::{
  5. FieldRevision, GridBlockMetaRevision, GridBlockMetaRevisionChangeset, RowMetaChangeset, RowRevision,
  6. };
  7. use std::sync::Arc;
  8. pub enum RowScript {
  9. CreateEmptyRow,
  10. CreateRow {
  11. payload: CreateRowRevisionPayload,
  12. },
  13. UpdateRow {
  14. changeset: RowMetaChangeset,
  15. },
  16. AssertRow {
  17. expected_row: RowRevision,
  18. },
  19. DeleteRows {
  20. row_ids: Vec<String>,
  21. },
  22. AssertRowCount(usize),
  23. CreateBlock {
  24. block: GridBlockMetaRevision,
  25. },
  26. UpdateBlock {
  27. changeset: GridBlockMetaRevisionChangeset,
  28. },
  29. AssertBlockCount(usize),
  30. AssertBlock {
  31. block_index: usize,
  32. row_count: i32,
  33. start_row_index: i32,
  34. },
  35. AssertBlockEqual {
  36. block_index: usize,
  37. block: GridBlockMetaRevision,
  38. },
  39. }
  40. pub struct GridRowTest {
  41. inner: GridEditorTest,
  42. }
  43. impl GridRowTest {
  44. pub async fn new() -> Self {
  45. let editor_test = GridEditorTest::new().await;
  46. Self { inner: editor_test }
  47. }
  48. pub fn field_revs(&self) -> &Vec<Arc<FieldRevision>> {
  49. &self.field_revs
  50. }
  51. pub fn last_row(&self) -> Option<RowRevision> {
  52. self.row_revs.last().map(|a| a.clone().as_ref().clone())
  53. }
  54. pub async fn run_scripts(&mut self, scripts: Vec<RowScript>) {
  55. for script in scripts {
  56. self.run_script(script).await;
  57. }
  58. }
  59. pub fn builder(&self) -> CreateRowRevisionBuilder {
  60. CreateRowRevisionBuilder::new(&self.field_revs)
  61. }
  62. pub async fn run_script(&mut self, script: RowScript) {
  63. match script {
  64. RowScript::CreateEmptyRow => {
  65. let row_order = self.editor.create_row(None).await.unwrap();
  66. self.row_order_by_row_id
  67. .insert(row_order.row_id().to_owned(), row_order);
  68. self.row_revs = self.get_row_revs().await;
  69. self.block_meta_revs = self.editor.get_block_meta_revs().await.unwrap();
  70. }
  71. RowScript::CreateRow { payload: context } => {
  72. let row_orders = self.editor.insert_rows(vec![context]).await.unwrap();
  73. for row_order in row_orders {
  74. self.row_order_by_row_id
  75. .insert(row_order.row_id().to_owned(), row_order);
  76. }
  77. self.row_revs = self.get_row_revs().await;
  78. self.block_meta_revs = self.editor.get_block_meta_revs().await.unwrap();
  79. }
  80. RowScript::UpdateRow { changeset: change } => self.editor.update_row(change).await.unwrap(),
  81. RowScript::DeleteRows { row_ids } => {
  82. let row_orders = row_ids
  83. .into_iter()
  84. .map(|row_id| self.row_order_by_row_id.get(&row_id).unwrap().clone())
  85. .collect::<Vec<RowInfo>>();
  86. self.editor.delete_rows(row_orders).await.unwrap();
  87. self.row_revs = self.get_row_revs().await;
  88. self.block_meta_revs = self.editor.get_block_meta_revs().await.unwrap();
  89. }
  90. RowScript::AssertRow { expected_row } => {
  91. let row = &*self
  92. .row_revs
  93. .iter()
  94. .find(|row| row.id == expected_row.id)
  95. .cloned()
  96. .unwrap();
  97. assert_eq!(&expected_row, row);
  98. }
  99. RowScript::AssertRowCount(expected_row_count) => {
  100. assert_eq!(expected_row_count, self.row_revs.len());
  101. }
  102. RowScript::CreateBlock { block } => {
  103. self.editor.create_block(block).await.unwrap();
  104. self.block_meta_revs = self.editor.get_block_meta_revs().await.unwrap();
  105. }
  106. RowScript::UpdateBlock { changeset: change } => {
  107. self.editor.update_block(change).await.unwrap();
  108. }
  109. RowScript::AssertBlockCount(count) => {
  110. assert_eq!(self.editor.get_block_meta_revs().await.unwrap().len(), count);
  111. }
  112. RowScript::AssertBlock {
  113. block_index,
  114. row_count,
  115. start_row_index,
  116. } => {
  117. assert_eq!(self.block_meta_revs[block_index].row_count, row_count);
  118. assert_eq!(self.block_meta_revs[block_index].start_row_index, start_row_index);
  119. }
  120. RowScript::AssertBlockEqual { block_index, block } => {
  121. let blocks = self.editor.get_block_meta_revs().await.unwrap();
  122. let compared_block = blocks[block_index].clone();
  123. assert_eq!(compared_block, Arc::new(block));
  124. }
  125. }
  126. }
  127. }
  128. impl std::ops::Deref for GridRowTest {
  129. type Target = GridEditorTest;
  130. fn deref(&self) -> &Self::Target {
  131. &self.inner
  132. }
  133. }
  134. impl std::ops::DerefMut for GridRowTest {
  135. fn deref_mut(&mut self) -> &mut Self::Target {
  136. &mut self.inner
  137. }
  138. }