| 
									
										
										
										
											2022-07-13 22:56:34 +08:00
										 |  |  | use crate::grid::block_test::script::RowScript::{AssertCell, CreateRow};
 | 
					
						
							| 
									
										
										
										
											2022-07-12 15:49:14 +08:00
										 |  |  | use crate::grid::block_test::util::GridRowTestBuilder;
 | 
					
						
							| 
									
										
										
										
											2022-07-11 17:15:16 +08:00
										 |  |  | use crate::grid::grid_editor::GridEditorTest;
 | 
					
						
							| 
									
										
										
										
											2022-11-14 09:59:23 +08:00
										 |  |  | use flowy_grid::entities::{CellPathParams, CreateRowParams, FieldType, GridLayout, RowPB};
 | 
					
						
							| 
									
										
										
										
											2022-07-14 09:29:05 +08:00
										 |  |  | use flowy_grid::services::field::*;
 | 
					
						
							| 
									
										
										
										
											2022-12-11 11:35:42 +08:00
										 |  |  | use flowy_grid::services::row::GridBlockRow;
 | 
					
						
							| 
									
										
										
										
											2022-11-08 13:51:12 +08:00
										 |  |  | use grid_rev_model::{GridBlockMetaRevision, GridBlockMetaRevisionChangeset, RowChangeset, RowRevision};
 | 
					
						
							| 
									
										
										
										
											2022-07-13 22:56:34 +08:00
										 |  |  | use std::collections::HashMap;
 | 
					
						
							| 
									
										
										
										
											2022-07-11 17:15:16 +08:00
										 |  |  | use std::sync::Arc;
 | 
					
						
							| 
									
										
										
										
											2022-07-13 22:56:34 +08:00
										 |  |  | use strum::IntoEnumIterator;
 | 
					
						
							| 
									
										
										
										
											2022-07-11 17:15:16 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | pub enum RowScript {
 | 
					
						
							|  |  |  |     CreateEmptyRow,
 | 
					
						
							|  |  |  |     CreateRow {
 | 
					
						
							| 
									
										
										
										
											2022-07-12 15:49:14 +08:00
										 |  |  |         row_rev: RowRevision,
 | 
					
						
							| 
									
										
										
										
											2022-07-11 17:15:16 +08:00
										 |  |  |     },
 | 
					
						
							|  |  |  |     UpdateRow {
 | 
					
						
							| 
									
										
										
										
											2022-08-18 15:02:44 +08:00
										 |  |  |         changeset: RowChangeset,
 | 
					
						
							| 
									
										
										
										
											2022-07-11 17:15:16 +08:00
										 |  |  |     },
 | 
					
						
							|  |  |  |     AssertRow {
 | 
					
						
							|  |  |  |         expected_row: RowRevision,
 | 
					
						
							|  |  |  |     },
 | 
					
						
							|  |  |  |     DeleteRows {
 | 
					
						
							|  |  |  |         row_ids: Vec<String>,
 | 
					
						
							|  |  |  |     },
 | 
					
						
							| 
									
										
										
										
											2022-07-12 15:49:14 +08:00
										 |  |  |     AssertCell {
 | 
					
						
							|  |  |  |         row_id: String,
 | 
					
						
							|  |  |  |         field_id: String,
 | 
					
						
							| 
									
										
										
										
											2022-07-13 17:25:03 +08:00
										 |  |  |         field_type: FieldType,
 | 
					
						
							|  |  |  |         expected: String,
 | 
					
						
							| 
									
										
										
										
											2022-07-12 15:49:14 +08:00
										 |  |  |     },
 | 
					
						
							| 
									
										
										
										
											2022-07-11 17:15:16 +08:00
										 |  |  |     AssertRowCount(usize),
 | 
					
						
							|  |  |  |     CreateBlock {
 | 
					
						
							|  |  |  |         block: GridBlockMetaRevision,
 | 
					
						
							|  |  |  |     },
 | 
					
						
							|  |  |  |     UpdateBlock {
 | 
					
						
							|  |  |  |         changeset: GridBlockMetaRevisionChangeset,
 | 
					
						
							|  |  |  |     },
 | 
					
						
							|  |  |  |     AssertBlockCount(usize),
 | 
					
						
							|  |  |  |     AssertBlock {
 | 
					
						
							|  |  |  |         block_index: usize,
 | 
					
						
							|  |  |  |         row_count: i32,
 | 
					
						
							|  |  |  |         start_row_index: i32,
 | 
					
						
							|  |  |  |     },
 | 
					
						
							|  |  |  |     AssertBlockEqual {
 | 
					
						
							|  |  |  |         block_index: usize,
 | 
					
						
							|  |  |  |         block: GridBlockMetaRevision,
 | 
					
						
							|  |  |  |     },
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | pub struct GridRowTest {
 | 
					
						
							|  |  |  |     inner: GridEditorTest,
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | impl GridRowTest {
 | 
					
						
							|  |  |  |     pub async fn new() -> Self {
 | 
					
						
							| 
									
										
										
										
											2022-08-18 21:43:05 +08:00
										 |  |  |         let editor_test = GridEditorTest::new_table().await;
 | 
					
						
							| 
									
										
										
										
											2022-07-11 17:15:16 +08:00
										 |  |  |         Self { inner: editor_test }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub fn last_row(&self) -> Option<RowRevision> {
 | 
					
						
							|  |  |  |         self.row_revs.last().map(|a| a.clone().as_ref().clone())
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub async fn run_scripts(&mut self, scripts: Vec<RowScript>) {
 | 
					
						
							|  |  |  |         for script in scripts {
 | 
					
						
							|  |  |  |             self.run_script(script).await;
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-12 15:49:14 +08:00
										 |  |  |     pub fn row_builder(&self) -> GridRowTestBuilder {
 | 
					
						
							| 
									
										
										
										
											2022-07-14 09:29:05 +08:00
										 |  |  |         GridRowTestBuilder::new(self.block_id(), &self.field_revs)
 | 
					
						
							| 
									
										
										
										
											2022-07-11 17:15:16 +08:00
										 |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub async fn run_script(&mut self, script: RowScript) {
 | 
					
						
							|  |  |  |         match script {
 | 
					
						
							|  |  |  |             RowScript::CreateEmptyRow => {
 | 
					
						
							| 
									
										
										
										
											2022-08-15 20:07:01 +08:00
										 |  |  |                 let params = CreateRowParams {
 | 
					
						
							|  |  |  |                     grid_id: self.editor.grid_id.clone(),
 | 
					
						
							|  |  |  |                     start_row_id: None,
 | 
					
						
							|  |  |  |                     group_id: None,
 | 
					
						
							| 
									
										
										
										
											2022-08-16 15:49:54 +08:00
										 |  |  |                     layout: GridLayout::Table,
 | 
					
						
							| 
									
										
										
										
											2022-08-15 20:07:01 +08:00
										 |  |  |                 };
 | 
					
						
							|  |  |  |                 let row_order = self.editor.create_row(params).await.unwrap();
 | 
					
						
							| 
									
										
										
										
											2022-12-11 11:35:42 +08:00
										 |  |  |                 self.row_by_row_id.insert(row_order.row_id().to_owned(), row_order);
 | 
					
						
							| 
									
										
										
										
											2022-07-11 17:15:16 +08:00
										 |  |  |                 self.row_revs = self.get_row_revs().await;
 | 
					
						
							|  |  |  |                 self.block_meta_revs = self.editor.get_block_meta_revs().await.unwrap();
 | 
					
						
							|  |  |  |             }
 | 
					
						
							| 
									
										
										
										
											2022-07-12 15:49:14 +08:00
										 |  |  |             RowScript::CreateRow { row_rev } => {
 | 
					
						
							|  |  |  |                 let row_orders = self.editor.insert_rows(vec![row_rev]).await.unwrap();
 | 
					
						
							| 
									
										
										
										
											2022-07-11 17:15:16 +08:00
										 |  |  |                 for row_order in row_orders {
 | 
					
						
							| 
									
										
										
										
											2022-12-11 11:35:42 +08:00
										 |  |  |                     self.row_by_row_id.insert(row_order.row_id().to_owned(), row_order);
 | 
					
						
							| 
									
										
										
										
											2022-07-11 17:15:16 +08:00
										 |  |  |                 }
 | 
					
						
							|  |  |  |                 self.row_revs = self.get_row_revs().await;
 | 
					
						
							|  |  |  |                 self.block_meta_revs = self.editor.get_block_meta_revs().await.unwrap();
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |             RowScript::UpdateRow { changeset: change } => self.editor.update_row(change).await.unwrap(),
 | 
					
						
							|  |  |  |             RowScript::DeleteRows { row_ids } => {
 | 
					
						
							| 
									
										
										
										
											2022-12-11 11:35:42 +08:00
										 |  |  |                 let row_pbs = row_ids
 | 
					
						
							| 
									
										
										
										
											2022-07-11 17:15:16 +08:00
										 |  |  |                     .into_iter()
 | 
					
						
							| 
									
										
										
										
											2022-12-11 11:35:42 +08:00
										 |  |  |                     .map(|row_id| self.row_by_row_id.get(&row_id).unwrap().clone())
 | 
					
						
							| 
									
										
										
										
											2022-08-11 13:25:55 +08:00
										 |  |  |                     .collect::<Vec<RowPB>>();
 | 
					
						
							| 
									
										
										
										
											2022-07-11 17:15:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-11 11:35:42 +08:00
										 |  |  |                 let block_rows = block_from_row_pbs(row_pbs);
 | 
					
						
							|  |  |  |                 self.editor.delete_rows(block_rows).await.unwrap();
 | 
					
						
							| 
									
										
										
										
											2022-07-11 17:15:16 +08:00
										 |  |  |                 self.row_revs = self.get_row_revs().await;
 | 
					
						
							|  |  |  |                 self.block_meta_revs = self.editor.get_block_meta_revs().await.unwrap();
 | 
					
						
							|  |  |  |             }
 | 
					
						
							| 
									
										
										
										
											2022-07-12 15:49:14 +08:00
										 |  |  |             RowScript::AssertCell {
 | 
					
						
							|  |  |  |                 row_id,
 | 
					
						
							|  |  |  |                 field_id,
 | 
					
						
							| 
									
										
										
										
											2022-07-13 17:25:03 +08:00
										 |  |  |                 field_type,
 | 
					
						
							|  |  |  |                 expected,
 | 
					
						
							| 
									
										
										
										
											2022-07-12 15:49:14 +08:00
										 |  |  |             } => {
 | 
					
						
							| 
									
										
										
										
											2022-11-14 09:59:23 +08:00
										 |  |  |                 let id = CellPathParams {
 | 
					
						
							| 
									
										
										
										
											2022-07-12 15:49:14 +08:00
										 |  |  |                     grid_id: self.grid_id.clone(),
 | 
					
						
							|  |  |  |                     field_id,
 | 
					
						
							|  |  |  |                     row_id,
 | 
					
						
							|  |  |  |                 };
 | 
					
						
							| 
									
										
										
										
											2022-07-13 17:25:03 +08:00
										 |  |  |                 self.compare_cell_content(id, field_type, expected).await;
 | 
					
						
							| 
									
										
										
										
											2022-07-12 15:49:14 +08:00
										 |  |  |             }
 | 
					
						
							| 
									
										
										
										
											2022-07-11 17:15:16 +08:00
										 |  |  |             RowScript::AssertRow { expected_row } => {
 | 
					
						
							|  |  |  |                 let row = &*self
 | 
					
						
							|  |  |  |                     .row_revs
 | 
					
						
							|  |  |  |                     .iter()
 | 
					
						
							|  |  |  |                     .find(|row| row.id == expected_row.id)
 | 
					
						
							|  |  |  |                     .cloned()
 | 
					
						
							|  |  |  |                     .unwrap();
 | 
					
						
							|  |  |  |                 assert_eq!(&expected_row, row);
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |             RowScript::AssertRowCount(expected_row_count) => {
 | 
					
						
							|  |  |  |                 assert_eq!(expected_row_count, self.row_revs.len());
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |             RowScript::CreateBlock { block } => {
 | 
					
						
							|  |  |  |                 self.editor.create_block(block).await.unwrap();
 | 
					
						
							|  |  |  |                 self.block_meta_revs = self.editor.get_block_meta_revs().await.unwrap();
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |             RowScript::UpdateBlock { changeset: change } => {
 | 
					
						
							|  |  |  |                 self.editor.update_block(change).await.unwrap();
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |             RowScript::AssertBlockCount(count) => {
 | 
					
						
							|  |  |  |                 assert_eq!(self.editor.get_block_meta_revs().await.unwrap().len(), count);
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |             RowScript::AssertBlock {
 | 
					
						
							|  |  |  |                 block_index,
 | 
					
						
							|  |  |  |                 row_count,
 | 
					
						
							|  |  |  |                 start_row_index,
 | 
					
						
							|  |  |  |             } => {
 | 
					
						
							|  |  |  |                 assert_eq!(self.block_meta_revs[block_index].row_count, row_count);
 | 
					
						
							|  |  |  |                 assert_eq!(self.block_meta_revs[block_index].start_row_index, start_row_index);
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |             RowScript::AssertBlockEqual { block_index, block } => {
 | 
					
						
							|  |  |  |                 let blocks = self.editor.get_block_meta_revs().await.unwrap();
 | 
					
						
							|  |  |  |                 let compared_block = blocks[block_index].clone();
 | 
					
						
							|  |  |  |                 assert_eq!(compared_block, Arc::new(block));
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							| 
									
										
										
										
											2022-07-13 17:25:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-14 09:59:23 +08:00
										 |  |  |     async fn compare_cell_content(&self, cell_id: CellPathParams, field_type: FieldType, expected: String) {
 | 
					
						
							| 
									
										
										
										
											2022-07-13 17:25:03 +08:00
										 |  |  |         match field_type {
 | 
					
						
							|  |  |  |             FieldType::RichText => {
 | 
					
						
							|  |  |  |                 let cell_data = self
 | 
					
						
							|  |  |  |                     .editor
 | 
					
						
							|  |  |  |                     .get_cell_bytes(&cell_id)
 | 
					
						
							|  |  |  |                     .await
 | 
					
						
							|  |  |  |                     .unwrap()
 | 
					
						
							| 
									
										
										
										
											2022-08-12 16:05:56 +08:00
										 |  |  |                     .parser::<TextCellDataParser>()
 | 
					
						
							| 
									
										
										
										
											2022-07-13 17:25:03 +08:00
										 |  |  |                     .unwrap();
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 assert_eq!(cell_data.as_ref(), &expected);
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |             FieldType::Number => {
 | 
					
						
							|  |  |  |                 let field_rev = self.editor.get_field_rev(&cell_id.field_id).await.unwrap();
 | 
					
						
							|  |  |  |                 let number_type_option = field_rev
 | 
					
						
							| 
									
										
										
										
											2022-09-02 09:49:26 +08:00
										 |  |  |                     .get_type_option::<NumberTypeOptionPB>(FieldType::Number.into())
 | 
					
						
							| 
									
										
										
										
											2022-07-13 17:25:03 +08:00
										 |  |  |                     .unwrap();
 | 
					
						
							|  |  |  |                 let cell_data = self
 | 
					
						
							|  |  |  |                     .editor
 | 
					
						
							|  |  |  |                     .get_cell_bytes(&cell_id)
 | 
					
						
							|  |  |  |                     .await
 | 
					
						
							|  |  |  |                     .unwrap()
 | 
					
						
							| 
									
										
										
										
											2022-08-12 16:05:56 +08:00
										 |  |  |                     .custom_parser(NumberCellCustomDataParser(number_type_option.format))
 | 
					
						
							| 
									
										
										
										
											2022-07-13 17:25:03 +08:00
										 |  |  |                     .unwrap();
 | 
					
						
							|  |  |  |                 assert_eq!(cell_data.to_string(), expected);
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |             FieldType::DateTime => {
 | 
					
						
							|  |  |  |                 let cell_data = self
 | 
					
						
							|  |  |  |                     .editor
 | 
					
						
							|  |  |  |                     .get_cell_bytes(&cell_id)
 | 
					
						
							|  |  |  |                     .await
 | 
					
						
							|  |  |  |                     .unwrap()
 | 
					
						
							| 
									
										
										
										
											2022-08-12 16:05:56 +08:00
										 |  |  |                     .parser::<DateCellDataParser>()
 | 
					
						
							| 
									
										
										
										
											2022-07-13 17:25:03 +08:00
										 |  |  |                     .unwrap();
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 assert_eq!(cell_data.date, expected);
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |             FieldType::SingleSelect => {
 | 
					
						
							| 
									
										
										
										
											2022-07-13 22:56:34 +08:00
										 |  |  |                 let cell_data = self
 | 
					
						
							| 
									
										
										
										
											2022-07-13 17:25:03 +08:00
										 |  |  |                     .editor
 | 
					
						
							|  |  |  |                     .get_cell_bytes(&cell_id)
 | 
					
						
							|  |  |  |                     .await
 | 
					
						
							|  |  |  |                     .unwrap()
 | 
					
						
							| 
									
										
										
										
											2022-08-12 16:05:56 +08:00
										 |  |  |                     .parser::<SelectOptionCellDataParser>()
 | 
					
						
							| 
									
										
										
										
											2022-07-13 17:25:03 +08:00
										 |  |  |                     .unwrap();
 | 
					
						
							| 
									
										
										
										
											2022-07-13 22:56:34 +08:00
										 |  |  |                 let select_option = cell_data.select_options.first().unwrap();
 | 
					
						
							| 
									
										
										
										
											2022-07-13 17:25:03 +08:00
										 |  |  |                 assert_eq!(select_option.name, expected);
 | 
					
						
							|  |  |  |             }
 | 
					
						
							| 
									
										
										
										
											2022-07-13 22:56:34 +08:00
										 |  |  |             FieldType::MultiSelect => {
 | 
					
						
							|  |  |  |                 let cell_data = self
 | 
					
						
							|  |  |  |                     .editor
 | 
					
						
							|  |  |  |                     .get_cell_bytes(&cell_id)
 | 
					
						
							|  |  |  |                     .await
 | 
					
						
							|  |  |  |                     .unwrap()
 | 
					
						
							| 
									
										
										
										
											2022-08-12 16:05:56 +08:00
										 |  |  |                     .parser::<SelectOptionCellDataParser>()
 | 
					
						
							| 
									
										
										
										
											2022-07-13 22:56:34 +08:00
										 |  |  |                     .unwrap();
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 let s = cell_data
 | 
					
						
							|  |  |  |                     .select_options
 | 
					
						
							|  |  |  |                     .into_iter()
 | 
					
						
							|  |  |  |                     .map(|option| option.name)
 | 
					
						
							|  |  |  |                     .collect::<Vec<String>>()
 | 
					
						
							|  |  |  |                     .join(SELECTION_IDS_SEPARATOR);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 assert_eq!(s, expected);
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-29 22:40:49 +08:00
										 |  |  |             FieldType::Checklist => {
 | 
					
						
							| 
									
										
										
										
											2022-11-29 14:17:43 +08:00
										 |  |  |                 let cell_data = self
 | 
					
						
							|  |  |  |                     .editor
 | 
					
						
							|  |  |  |                     .get_cell_bytes(&cell_id)
 | 
					
						
							|  |  |  |                     .await
 | 
					
						
							|  |  |  |                     .unwrap()
 | 
					
						
							|  |  |  |                     .parser::<SelectOptionCellDataParser>()
 | 
					
						
							|  |  |  |                     .unwrap();
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 let s = cell_data
 | 
					
						
							|  |  |  |                     .select_options
 | 
					
						
							|  |  |  |                     .into_iter()
 | 
					
						
							|  |  |  |                     .map(|option| option.name)
 | 
					
						
							|  |  |  |                     .collect::<Vec<String>>()
 | 
					
						
							|  |  |  |                     .join(SELECTION_IDS_SEPARATOR);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 assert_eq!(s, expected);
 | 
					
						
							|  |  |  |             }
 | 
					
						
							| 
									
										
										
										
											2022-07-13 22:56:34 +08:00
										 |  |  |             FieldType::Checkbox => {
 | 
					
						
							|  |  |  |                 let cell_data = self
 | 
					
						
							|  |  |  |                     .editor
 | 
					
						
							|  |  |  |                     .get_cell_bytes(&cell_id)
 | 
					
						
							|  |  |  |                     .await
 | 
					
						
							|  |  |  |                     .unwrap()
 | 
					
						
							| 
									
										
										
										
											2022-08-12 16:05:56 +08:00
										 |  |  |                     .parser::<CheckboxCellDataParser>()
 | 
					
						
							| 
									
										
										
										
											2022-07-13 22:56:34 +08:00
										 |  |  |                     .unwrap();
 | 
					
						
							|  |  |  |                 assert_eq!(cell_data.to_string(), expected);
 | 
					
						
							|  |  |  |             }
 | 
					
						
							| 
									
										
										
										
											2022-07-13 17:25:03 +08:00
										 |  |  |             FieldType::URL => {
 | 
					
						
							|  |  |  |                 let cell_data = self
 | 
					
						
							|  |  |  |                     .editor
 | 
					
						
							|  |  |  |                     .get_cell_bytes(&cell_id)
 | 
					
						
							|  |  |  |                     .await
 | 
					
						
							|  |  |  |                     .unwrap()
 | 
					
						
							| 
									
										
										
										
											2022-08-12 16:05:56 +08:00
										 |  |  |                     .parser::<URLCellDataParser>()
 | 
					
						
							| 
									
										
										
										
											2022-07-13 17:25:03 +08:00
										 |  |  |                     .unwrap();
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 assert_eq!(cell_data.content, expected);
 | 
					
						
							| 
									
										
										
										
											2022-07-13 22:56:34 +08:00
										 |  |  |                 // assert_eq!(cell_data.url, expected);
 | 
					
						
							| 
									
										
										
										
											2022-07-13 17:25:03 +08:00
										 |  |  |             }
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							| 
									
										
										
										
											2022-07-11 17:15:16 +08:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-11 11:35:42 +08:00
										 |  |  | fn block_from_row_pbs(row_orders: Vec<RowPB>) -> Vec<GridBlockRow> {
 | 
					
						
							|  |  |  |     let mut map: HashMap<String, GridBlockRow> = HashMap::new();
 | 
					
						
							|  |  |  |     row_orders.into_iter().for_each(|row_pb| {
 | 
					
						
							|  |  |  |         let block_id = row_pb.block_id().to_owned();
 | 
					
						
							|  |  |  |         let cloned_block_id = block_id.clone();
 | 
					
						
							|  |  |  |         map.entry(block_id)
 | 
					
						
							|  |  |  |             .or_insert_with(|| GridBlockRow::new(cloned_block_id, vec![]))
 | 
					
						
							|  |  |  |             .row_ids
 | 
					
						
							|  |  |  |             .push(row_pb.id);
 | 
					
						
							|  |  |  |     });
 | 
					
						
							|  |  |  |     map.into_values().collect::<Vec<_>>()
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-11 17:15:16 +08:00
										 |  |  | impl std::ops::Deref for GridRowTest {
 | 
					
						
							|  |  |  |     type Target = GridEditorTest;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     fn deref(&self) -> &Self::Target {
 | 
					
						
							|  |  |  |         &self.inner
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | impl std::ops::DerefMut for GridRowTest {
 | 
					
						
							|  |  |  |     fn deref_mut(&mut self) -> &mut Self::Target {
 | 
					
						
							|  |  |  |         &mut self.inner
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | }
 | 
					
						
							| 
									
										
										
										
											2022-07-13 22:56:34 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | pub struct CreateRowScriptBuilder<'a> {
 | 
					
						
							|  |  |  |     builder: GridRowTestBuilder<'a>,
 | 
					
						
							|  |  |  |     data_by_field_type: HashMap<FieldType, CellTestData>,
 | 
					
						
							|  |  |  |     output_by_field_type: HashMap<FieldType, CellTestOutput>,
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | impl<'a> CreateRowScriptBuilder<'a> {
 | 
					
						
							|  |  |  |     pub fn new(test: &'a GridRowTest) -> Self {
 | 
					
						
							|  |  |  |         Self {
 | 
					
						
							|  |  |  |             builder: test.row_builder(),
 | 
					
						
							|  |  |  |             data_by_field_type: HashMap::new(),
 | 
					
						
							|  |  |  |             output_by_field_type: HashMap::new(),
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub fn insert(&mut self, field_type: FieldType, input: &str, expected: &str) {
 | 
					
						
							|  |  |  |         self.data_by_field_type.insert(
 | 
					
						
							|  |  |  |             field_type,
 | 
					
						
							|  |  |  |             CellTestData {
 | 
					
						
							|  |  |  |                 input: input.to_string(),
 | 
					
						
							|  |  |  |                 expected: expected.to_owned(),
 | 
					
						
							|  |  |  |             },
 | 
					
						
							|  |  |  |         );
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub fn insert_single_select_cell<F>(&mut self, f: F, expected: &str)
 | 
					
						
							|  |  |  |     where
 | 
					
						
							| 
									
										
										
										
											2022-07-17 13:38:53 +08:00
										 |  |  |         F: Fn(Vec<SelectOptionPB>) -> SelectOptionPB,
 | 
					
						
							| 
									
										
										
										
											2022-07-13 22:56:34 +08:00
										 |  |  |     {
 | 
					
						
							|  |  |  |         let field_id = self.builder.insert_single_select_cell(f);
 | 
					
						
							|  |  |  |         self.output_by_field_type.insert(
 | 
					
						
							|  |  |  |             FieldType::SingleSelect,
 | 
					
						
							|  |  |  |             CellTestOutput {
 | 
					
						
							|  |  |  |                 field_id,
 | 
					
						
							|  |  |  |                 expected: expected.to_owned(),
 | 
					
						
							|  |  |  |             },
 | 
					
						
							|  |  |  |         );
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub fn insert_multi_select_cell<F>(&mut self, f: F, expected: &str)
 | 
					
						
							|  |  |  |     where
 | 
					
						
							| 
									
										
										
										
											2022-07-17 13:38:53 +08:00
										 |  |  |         F: Fn(Vec<SelectOptionPB>) -> Vec<SelectOptionPB>,
 | 
					
						
							| 
									
										
										
										
											2022-07-13 22:56:34 +08:00
										 |  |  |     {
 | 
					
						
							|  |  |  |         let field_id = self.builder.insert_multi_select_cell(f);
 | 
					
						
							|  |  |  |         self.output_by_field_type.insert(
 | 
					
						
							|  |  |  |             FieldType::MultiSelect,
 | 
					
						
							|  |  |  |             CellTestOutput {
 | 
					
						
							|  |  |  |                 field_id,
 | 
					
						
							|  |  |  |                 expected: expected.to_owned(),
 | 
					
						
							|  |  |  |             },
 | 
					
						
							|  |  |  |         );
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub fn build(mut self) -> Vec<RowScript> {
 | 
					
						
							|  |  |  |         let mut scripts = vec![];
 | 
					
						
							|  |  |  |         let output_by_field_type = &mut self.output_by_field_type;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for field_type in FieldType::iter() {
 | 
					
						
							|  |  |  |             let field_type: FieldType = field_type;
 | 
					
						
							|  |  |  |             if let Some(data) = self.data_by_field_type.get(&field_type) {
 | 
					
						
							|  |  |  |                 let field_id = match field_type {
 | 
					
						
							|  |  |  |                     FieldType::RichText => self.builder.insert_text_cell(&data.input),
 | 
					
						
							|  |  |  |                     FieldType::Number => self.builder.insert_number_cell(&data.input),
 | 
					
						
							|  |  |  |                     FieldType::DateTime => self.builder.insert_date_cell(&data.input),
 | 
					
						
							|  |  |  |                     FieldType::Checkbox => self.builder.insert_checkbox_cell(&data.input),
 | 
					
						
							|  |  |  |                     FieldType::URL => self.builder.insert_url_cell(&data.input),
 | 
					
						
							|  |  |  |                     _ => "".to_owned(),
 | 
					
						
							|  |  |  |                 };
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if !field_id.is_empty() {
 | 
					
						
							|  |  |  |                     output_by_field_type.insert(
 | 
					
						
							|  |  |  |                         field_type,
 | 
					
						
							|  |  |  |                         CellTestOutput {
 | 
					
						
							|  |  |  |                             field_id,
 | 
					
						
							|  |  |  |                             expected: data.expected.clone(),
 | 
					
						
							|  |  |  |                         },
 | 
					
						
							|  |  |  |                     );
 | 
					
						
							|  |  |  |                 }
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let row_rev = self.builder.build();
 | 
					
						
							|  |  |  |         let row_id = row_rev.id.clone();
 | 
					
						
							|  |  |  |         scripts.push(CreateRow { row_rev });
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for field_type in FieldType::iter() {
 | 
					
						
							|  |  |  |             if let Some(data) = output_by_field_type.get(&field_type) {
 | 
					
						
							|  |  |  |                 let script = AssertCell {
 | 
					
						
							|  |  |  |                     row_id: row_id.clone(),
 | 
					
						
							|  |  |  |                     field_id: data.field_id.clone(),
 | 
					
						
							|  |  |  |                     field_type,
 | 
					
						
							|  |  |  |                     expected: data.expected.clone(),
 | 
					
						
							|  |  |  |                 };
 | 
					
						
							|  |  |  |                 scripts.push(script);
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         scripts
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | pub struct CellTestData {
 | 
					
						
							|  |  |  |     pub input: String,
 | 
					
						
							|  |  |  |     pub expected: String,
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct CellTestOutput {
 | 
					
						
							|  |  |  |     field_id: String,
 | 
					
						
							|  |  |  |     expected: String,
 | 
					
						
							|  |  |  | }
 |