Repository: zhiburt/tabled
Pull request #197 (2022-07-22 12:07:38)

Make left alignment default


Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3919ba0..763ccbd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -22,15 +22,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - Added `Style::correct_spans` functions to correct borders when used with spans..
 - Added `HighlightColored` a version of `Highlight` which supports coloring.
 - Added `ModifyObject` trait to be like `Modify::new`.
-- Added `BorderColored` and `RawStyleColored` to colorize borders more effectively.
+- Added `Color`, `BorderColored` and `RawStyleColored` to colorize borders more effectively.
 - Added `Style::lines` setter so you it's possible to override not only header.
 
 ### Changed
 
 - Performance was improved overall.
-- Changed `Modify`; it must be more effitient when used without `Object` methods.
 - Removed a trailing `\n` from `fmt::Display` output.
+- Changed default horizontal alignment from `Center` to `Left`. (generally because it's more effitient in basic case)
 - Changed a definition of `CellChange` trait.
+- Changed `Modify`; it must be more effitient when used without `Object` methods.
 - Changed public methods of `Builder` to use `&mut self` intestead of `self`.
 - Changed logic of `Wrap::keep_words`.
 - Changed logic of `Truncate::suffix`.
diff --git a/papergrid/Cargo.toml b/papergrid/Cargo.toml
index 3c8bab8..76c7b45 100644
--- a/papergrid/Cargo.toml
+++ b/papergrid/Cargo.toml
@@ -15,7 +15,6 @@ color = ["strip-ansi-escapes", "ansi-str"]
 [dependencies]
 unicode-width = "0.1.9"
 bytecount = "0.6.3"
-fnv = "1.0.7"
 strip-ansi-escapes = { version = "0.1.1", optional = true }
 ansi-str = { version = "0.3.0", optional = true }
 
diff --git a/papergrid/src/lib.rs b/papergrid/src/lib.rs
index 6b92b4b..2cf7ff8 100644
--- a/papergrid/src/lib.rs
+++ b/papergrid/src/lib.rs
@@ -93,8 +93,8 @@ impl Default for GridConfig {
             margin: Margin::default(),
             padding: EntityMap::default(),
             formatting: EntityMap::default(),
-            alignment_h: EntityMap::new(AlignmentHorizontal::Left),
-            alignment_v: EntityMap::new(AlignmentVertical::Top),
+            alignment_h: EntityMap::new(AlignmentHorizontal::Left, HashMap::default()),
+            alignment_v: EntityMap::new(AlignmentVertical::Top, HashMap::default()),
             #[cfg(feature = "color")]
             margin_color: MarginColor::default(),
             #[cfg(feature = "color")]
@@ -2514,76 +2514,53 @@ struct EntityMap<T> {
     // we have a global type to allocate in on stack.
     // because most of the time no changes are made to the [EntityMap].
     global: T,
-    columns: fnv::FnvHashMap<usize, T>,
-    rows: fnv::FnvHashMap<usize, T>,
-    cells: fnv::FnvHashMap<Position, T>,
+    map: HashMap<Entity, T>,
 }
 
 impl<T> EntityMap<T> {
-    fn new(global: T) -> Self {
-        Self {
-            global,
-            rows: fnv::FnvHashMap::default(),
-            columns: fnv::FnvHashMap::default(),
-            cells: fnv::FnvHashMap::default(),
-        }
+    fn new(global: T, map: HashMap<Entity, T>) -> Self {
+        Self { global, map }
     }
 
     fn lookup(&self, entity: Entity) -> &T {
-        if self.rows.is_empty() && self.columns.is_empty() && self.cells.is_empty() {
-            return &self.global;
-        }
-
         match entity {
-            Entity::Column(col) => self.columns.get(&col).unwrap_or(&self.global),
-            Entity::Row(row) => self.rows.get(&row).unwrap_or(&self.global),
+            Entity::Column(col) => self.map.get(&Entity::Column(col)),
+            Entity::Row(row) => self.map.get(&Entity::Row(row)),
             Entity::Cell(row, col) => self
-                .cells
-                .get(&(row, col))
-                .or_else(|| self.columns.get(&col))
-                .or_else(|| self.rows.get(&row))
-                .unwrap_or(&self.global),
-            Entity::Global => &self.global,
+                .map
+                .get(&Entity::Cell(row, col))
+                .or_else(|| self.map.get(&Entity::Column(col)))
+                .or_else(|| self.map.get(&Entity::Row(row))),
+            Entity::Global => None,
         }
+        .unwrap_or(&self.global)
     }
 
-    fn invalidate(&mut self, entity: Entity) {
+    fn set(&mut self, entity: Entity, value: T) {
         match entity {
             Entity::Global => {
-                self.cells.clear();
-                self.rows.clear();
-                self.columns.clear();
+                self.global = value;
+            }
+            _ => {
+                self.map.insert(entity, value);
             }
-            Entity::Column(col) => self.cells.retain(|&(_, c), _| c != col),
-            Entity::Row(row) => self.cells.retain(|&(r, _), _| r != row),
-            Entity::Cell(_, _) => (),
         }
-    }
-}
 
-impl<T: Clone> EntityMap<T> {
-    fn set(&mut self, entity: Entity, value: T) {
         self.invalidate(entity);
+    }
 
+    fn invalidate(&mut self, entity: Entity) {
         match entity {
-            Entity::Column(col) => {
-                for &row in self.rows.keys() {
-                    self.cells.insert((row, col), value.clone());
-                }
-
-                self.columns.insert(col, value);
-            }
-            Entity::Row(row) => {
-                for &col in self.columns.keys() {
-                    self.cells.insert((row, col), value.clone());
-                }
-
-                self.rows.insert(row, value);
-            }
-            Entity::Cell(row, col) => {
-                self.cells.insert((row, col), value);
+            Entity::Global => {
+                self.map.clear();
             }
-            Entity::Global => self.global = value,
+            Entity::Column(col) => self
+                .map
+                .retain(|entity, _| !matches!(entity, Entity::Cell(c, _) if *c == col)),
+            Entity::Row(row) => self
+                .map
+                .retain(|entity, _| !matches!(entity, Entity::Cell(_, r) if *r == row)),
+            Entity::Cell(_, _) => (),
         }
     }
 }
diff --git a/src/builder.rs b/src/builder.rs
index 2d4adb1..faeeed9 100644
--- a/src/builder.rs
+++ b/src/builder.rs
@@ -47,13 +47,13 @@
 //!         "┌──────────┬─────────┬───────┐\n",
 //!         "│          │ Algebra │ Apolo │\n",
 //!         "├──────────┼─────────┼───────┤\n",
-//!         "│ Complete │         │   +   │\n",
+//!         "│ Complete │         │ +     │\n",
 //!         "├──────────┼─────────┼───────┤\n",
 //!         "│ Started  │         │       │\n",
 //!         "├──────────┼─────────┼───────┤\n",
-//!         "│  Ready   │         │       │\n",
+//!         "│ Ready    │         │       │\n",
 //!         "├──────────┼─────────┼───────┤\n",
-//!         "│ Unknown  │    +    │       │\n",
+//!         "│ Unknown  │ +       │       │\n",
 //!         "└──────────┴─────────┴───────┘",
 //!    ),
 //! )
@@ -100,9 +100,9 @@
 //!         "┌───────────────────┬────────────────────┬─────────┐\n",
 //!         "│ started_timestamp │ finihsed_timestamp │ Unknown │\n",
 //!         "├───────────────────┼────────────────────┼─────────┤\n",
-//!         "│                   │                    │    +    │\n",
+//!         "│                   │                    │ +       │\n",
 //!         "├───────────────────┼────────────────────┼─────────┤\n",
-//!         "│        123        │        234         │         │\n",
+//!         "│ 123               │ 234                │         │\n",
 //!         "└───────────────────┴────────────────────┴─────────┘",
 //!    ),
 //! )
@@ -110,7 +110,7 @@
 
 use std::{fmt::Display, iter::FromIterator};
 
-use papergrid::{AlignmentHorizontal, Entity, Formatting, Grid, Indent, Settings};
+use papergrid::{AlignmentHorizontal, Entity, Formatting, Grid, Indent, Padding, Settings};
 
 use crate::{Style, Table};
 
@@ -306,7 +306,7 @@ impl Builder {
     ///      +---+-------+\n\
     ///      | 1 | World |\n\
     ///      +---+-------+\n\
-    ///      | 2 |   !   |\n\
+    ///      | 2 | !     |\n\
     ///      +---+-------+"
     /// )
     /// ```
@@ -513,31 +513,32 @@ fn build_grid(
     grid
 }
 
-fn create_table_from_grid(grid: Grid) -> Table {
-    let mut table = Table { grid };
-
-    // it's crusial to set a global setting rather than a setting for an each cell
-    // as it will be hard to override that since how Grid::style method works
-    table.grid.set(Entity::Global, default_cell_style());
-    table.grid.set_tab_width(4);
+fn create_table_from_grid(mut grid: Grid) -> Table {
+    configure_grid(&mut grid);
 
+    let table = Table { grid };
     table.with(Style::ascii())
 }
 
-fn default_cell_style() -> Settings {
-    Settings::new()
-        .padding(
-            Indent::spaced(1),
-            Indent::spaced(1),
-            Indent::spaced(0),
-            Indent::spaced(0),
-        )
-        .alignment(AlignmentHorizontal::Center)
-        .formatting(Formatting {
+fn configure_grid(grid: &mut Grid) {
+    grid.set_tab_width(4);
+    grid.set_padding(
+        Entity::Global,
+        Padding {
+            left: Indent::spaced(1),
+            right: Indent::spaced(1),
+            ..Default::default()
+        },
+    );
+    grid.set_alignment_horizontal(Entity::Global, AlignmentHorizontal::Left);
+    grid.set_formatting(
+        Entity::Global,
+        Formatting {
             horizontal_trim: false,
             allow_lines_alignement: false,
             vertical_trim: false,
-        })
+        },
+    );
 }
 
 fn append_vec(v: &mut Vec<String>, n: usize, value: &str) {
@@ -596,7 +597,7 @@ impl IndexBuilder {
     /// assert_eq!(
     ///     table.to_string(),
     ///     "+---+---+---------+---------+\n\
-    ///      |   | i |  col-1  |  col-2  |\n\
+    ///      |   | i | col-1   | col-2   |\n\
     ///      +---+---+---------+---------+\n\
     ///      | 0 | 0 | value-1 | value-2 |\n\
     ///      +---+---+---------+---------+"
@@ -638,7 +639,7 @@ impl IndexBuilder {
     /// assert_eq!(
     ///     table.to_string(),
     ///     "+---+---------+---------+\n\
-    ///      | i |  col-1  |  col-2  |\n\
+    ///      | i | col-1   | col-2   |\n\
     ///      +---+---------+---------+\n\
     ///      | 0 | value-1 | value-2 |\n\
     ///      +---+---------+---------+\n\
@@ -736,7 +737,7 @@ impl IndexBuilder {
     ///     "+----------+---------+---------+---------+\n\
     ///      | column-1 | value-1 | value-4 | value-7 |\n\
     ///      +----------+---------+---------+---------+\n\
-    ///      |    i     |    0    |    1    |    2    |\n\
+    ///      | i        | 0       | 1       | 2       |\n\
     ///      +----------+---------+---------+---------+\n\
     ///      | column-2 | value-2 | value-5 | value-8 |\n\
     ///      +----------+---------+---------+---------+\n\
diff --git a/src/concat.rs b/src/concat.rs
index 6d104aa..153aa2a 100644
--- a/src/concat.rs
+++ b/src/concat.rs
@@ -34,13 +34,13 @@
 //!     table.to_string(),
 //!     concat!(
 //!         "╔════╦════════════════════╦════════════╗\n",
-//!         "║ id ║        text        ║ department ║\n",
+//!         "║ id ║ text               ║ department ║\n",
 //!         "╠════╬════════════════════╬════════════╣\n",
-//!         "║ 0  ║    Hello World     ║   Admins   ║\n",
+//!         "║ 0  ║ Hello World        ║ Admins     ║\n",
 //!         "╠════╬════════════════════╬════════════╣\n",
-//!         "║ 1  ║ Do do do something ║   DevOps   ║\n",
+//!         "║ 1  ║ Do do do something ║ DevOps     ║\n",
 //!         "╠════╬════════════════════╬════════════╣\n",
-//!         "║    ║                    ║    R&D     ║\n",
+//!         "║    ║                    ║ R&D        ║\n",
 //!         "╚════╩════════════════════╩════════════╝",
 //!     )
 //! )
diff --git a/src/disable.rs b/src/disable.rs
index e9b4b00..b5324d4 100644
--- a/src/disable.rs
+++ b/src/disable.rs
@@ -19,7 +19,7 @@
 //!      +-------+\n\
 //!      | World |\n\
 //!      +-------+\n\
-//!      |  !!!  |\n\
+//!      | !!!   |\n\
 //!      +-------+"
 //! );
 //! ```
diff --git a/src/formating.rs b/src/formating.rs
index 8eaa442..ef9a75d 100644
--- a/src/formating.rs
+++ b/src/formating.rs
@@ -35,15 +35,15 @@ impl Format<()> {
     ///                .to_string();
     ///
     /// assert_eq!(table, "+-------+-------------+-----------+\n\
-    ///                    |  i32  |    &str     |   bool    |\n\
+    ///                    | i32   | &str        | bool      |\n\
     ///                    +-------+-------------+-----------+\n\
     ///                    | : 0 : | : Grodno :  | : true :  |\n\
     ///                    +-------+-------------+-----------+\n\
-    ///                    | : 1 : |  : Minsk :  | : true :  |\n\
+    ///                    | : 1 : | : Minsk :   | : true :  |\n\
     ///                    +-------+-------------+-----------+\n\
     ///                    | : 2 : | : Hamburg : | : false : |\n\
     ///                    +-------+-------------+-----------+\n\
-    ///                    | : 3 : |  : Brest :  | : true :  |\n\
+    ///                    | : 3 : | : Brest :   | : true :  |\n\
     ///                    +-------+-------------+-----------+");
     /// ```
     ///
@@ -76,15 +76,15 @@ impl Format<()> {
     ///                .to_string();
     ///
     /// assert_eq!(table, "+---+---------+-------+\n\
-    ///                    | 0 |    1    |   2   |\n\
+    ///                    | 0 | 1       | 2     |\n\
     ///                    +---+---------+-------+\n\
     ///                    | 0 | Grodno  | true  |\n\
     ///                    +---+---------+-------+\n\
-    ///                    | 1 |  Minsk  | true  |\n\
+    ///                    | 1 | Minsk   | true  |\n\
     ///                    +---+---------+-------+\n\
     ///                    | 2 | Hamburg | false |\n\
     ///                    +---+---------+-------+\n\
-    ///                    | 3 |  Brest  | true  |\n\
+    ///                    | 3 | Brest   | true  |\n\
     ///                    +---+---------+-------+");
     /// ```
     pub fn with_index<F>(f: F) -> FormatWithIndex<F>
diff --git a/src/formatting_settings.rs b/src/formatting_settings.rs
index 352e0de..ae49d41 100644
--- a/src/formatting_settings.rs
+++ b/src/formatting_settings.rs
@@ -218,6 +218,7 @@ impl CellOption for AlignmentStrategy {
 ///     .with(Style::modern())
 ///     .with(
 ///         Modify::new(Segment::all())
+///             .with(Alignment::center())
 ///             .with(Alignment::top())
 ///             .with(TrimStrategy::Vertical)
 ///     );
diff --git a/src/highlight.rs b/src/highlight.rs
index 1452423..d08df24 100644
--- a/src/highlight.rs
+++ b/src/highlight.rs
@@ -33,11 +33,11 @@ use crate::{object::Object, style::Border, TableOption};
 ///     table,
 ///     concat!(
 ///         " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ \n",
-///         "| usize | &str  |           &str            | bool  |\n",
+///         "| usize | &str  | &str                      | bool  |\n",
 ///         "|-------|-------|---------------------------|-------|\n",
-///         "|   0   |  ELF  | Extensible Linking Format | true  |\n",
-///         "|   1   | DWARF |                           | true  |\n",
-///         "|   2   |  PE   |    Portable Executable    | false |\n",
+///         "| 0     | ELF   | Extensible Linking Format | true  |\n",
+///         "| 1     | DWARF |                           | true  |\n",
+///         "| 2     | PE    | Portable Executable       | false |\n",
 ///         " vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv ",
 ///     ),
 /// );
@@ -67,13 +67,13 @@ use crate::{object::Object, style::Border, TableOption};
 ///     table,
 ///     concat!(
 ///         "                *****************************        \n",
-///         "| usize | &str  *           &str            * bool  |\n",
+///         "| usize | &str  * &str                      * bool  |\n",
 ///         "|-------*********---------------------------*********\n",
-///         "|   0   *  ELF  | Extensible Linking Format | true  *\n",
+///         "| 0     * ELF   | Extensible Linking Format | true  *\n",
 ///         "*********                                           *\n",
-///         "*   1   | DWARF |                           | true  *\n",
+///         "* 1     | DWARF |                           | true  *\n",
 ///         "*                                                   *\n",
-///         "*   2   |  PE   |    Portable Executable    | false *\n",
+///         "* 2     | PE    | Portable Executable       | false *\n",
 ///         "*****************************************************",
 ///     ),
 /// );
diff --git a/src/lib.rs b/src/lib.rs
index bc8f663..c05a41c 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -52,13 +52,13 @@
 //! let table = Table::new(languages).to_string();
 //!
 //! let expected = "+------+----------------+---------------+\n\
-//!                 | name |  designed_by   | invented_year |\n\
+//!                 | name | designed_by    | invented_year |\n\
 //!                 +------+----------------+---------------+\n\
-//!                 |  C   | Dennis Ritchie |     1972      |\n\
+//!                 | C    | Dennis Ritchie | 1972          |\n\
 //!                 +------+----------------+---------------+\n\
-//!                 | Rust | Graydon Hoare  |     2010      |\n\
+//!                 | Rust | Graydon Hoare  | 2010          |\n\
 //!                 +------+----------------+---------------+\n\
-//!                 |  Go  |    Rob Pike    |     2009      |\n\
+//!                 | Go   | Rob Pike       | 2009          |\n\
 //!                 +------+----------------+---------------+";
 //!
 //! assert_eq!(table, expected);
@@ -100,11 +100,11 @@
 //! # let expected = "+-----+\n\
 //! #                 | i32 |\n\
 //! #                 +-----+\n\
-//! #                 |  1  |\n\
+//! #                 | 1   |\n\
 //! #                 +-----+\n\
-//! #                 |  2  |\n\
+//! #                 | 2   |\n\
 //! #                 +-----+\n\
-//! #                 |  3  |\n\
+//! #                 | 3   |\n\
 //! #                 +-----+";
 //! # assert_eq!(table.to_string(), expected);
 //! ```
@@ -120,7 +120,7 @@
 //!
 #![cfg_attr(feature = "derive", doc = "```")]
 #![cfg_attr(not(feature = "derive"), doc = "```ignore")]
-//! use tabled::{Tabled, Table, Style};
+//! use tabled::{Tabled, Table, Style, Alignment, ModifyObject, object::{Rows, Columns, Object}};
 //!
 //! #[derive(Tabled)]
 //! enum Domain {
@@ -140,17 +140,20 @@
 //!     (Developer("Maxim Zhiburt"), Domain::Unknown),
 //! ];
 //!     
-//! let table = Table::new(data).with(Style::psql()).to_string();
+//! let table = Table::new(data)
+//!     .with(Style::psql())
+//!     .with(Rows::new(1..).not(Columns::first()).modify().with(Alignment::center()))
+//!     .to_string();
 //!
 //! assert_eq!(
 //!     table,
 //!     concat!(
-//!         "      name       | Security | Embeded | Frontend | Unknown \n",
+//!         " name            | Security | Embeded | Frontend | Unknown \n",
 //!         "-----------------+----------+---------+----------+---------\n",
 //!         " Terri Kshlerin  |          |    +    |          |         \n",
 //!         " Catalina Dicki  |    +     |         |          |         \n",
 //!         " Jennie Schmeler |          |         |    +     |         \n",
-//!         "  Maxim Zhiburt  |          |         |          |    +    "
+//!         " Maxim Zhiburt   |          |         |          |    +    "
 //!     )
 //! );
 //! ```
diff --git a/src/margin.rs b/src/margin.rs
index c189b94..bdf1d53 100644
--- a/src/margin.rs
+++ b/src/margin.rs
@@ -20,7 +20,7 @@
 //!         "   |-------|   \n",
 //!         "   | Hello |   \n",
 //!         "   | World |   \n",
-//!         "   |   !   |   ",
+//!         "   | !     |   ",
 //!     )
 //! );
 //! ```
diff --git a/src/padding.rs b/src/padding.rs
index cbb19d3..a923ee5 100644
--- a/src/padding.rs
+++ b/src/padding.rs
@@ -18,17 +18,17 @@
 //!         "┌──────┐\n",
 //!         "│ char │\n",
 //!         "├──────┤\n",
-//!         "│  2   │\n",
+//!         "│ 2    │\n",
 //!         "├──────┤\n",
 //!         "│      │\n",
 //!         "│      │\n",
-//!         "│  0   │\n",
+//!         "│ 0    │\n",
 //!         "│      │\n",
 //!         "│      │\n",
 //!         "├──────┤\n",
-//!         "│  2   │\n",
+//!         "│ 2    │\n",
 //!         "├──────┤\n",
-//!         "│  2   │\n",
+//!         "│ 2    │\n",
 //!         "└──────┘",
 //!     ),
 //! );
diff --git a/src/panel.rs b/src/panel.rs
index 2d61b92..0a228b5 100644
--- a/src/panel.rs
+++ b/src/panel.rs
@@ -23,11 +23,11 @@
 //!         "+-----+-----+-----+\n",
 //!         "| Tabled Releases |\n",
 //!         "+-----+-----+-----+\n",
-//!         "|  0  |  1  |  2  |\n",
+//!         "| 0   | 1   | 2   |\n",
 //!         "+-----+-----+-----+\n",
-//!         "|     1     |  3  |\n",
+//!         "| 1         | 3   |\n",
 //!         "+-----+-----+-----+\n",
-//!         "|  4  |  5  |  6  |\n",
+//!         "| 4   | 5   | 6   |\n",
 //!         "+-----+-----+-----+",
 //!     )
 //! )
diff --git a/src/span.rs b/src/span.rs
index ec6869f..43bddbe 100644
--- a/src/span.rs
+++ b/src/span.rs
@@ -17,11 +17,11 @@
 //!     table,
 //!     concat!(
 //!         "+---+---+---+\n",
-//!         "| 0 |   1   |\n",
+//!         "| 0 | 1     |\n",
 //!         "+---+---+---+\n",
 //!         "| 1 | 2 | 3 |\n",
 //!         "+---+---+---+\n",
-//!         "|   4   | 6 |\n",
+//!         "| 4     | 6 |\n",
 //!         "+---+---+---+",
 //!     )
 //! )
diff --git a/src/style.rs b/src/style.rs
index a8a97d7..4050fe5 100644
--- a/src/style.rs
+++ b/src/style.rs
@@ -469,7 +469,7 @@ impl Style<(), (), (), (), (), ()> {
     ///     table.to_string(),
     ///     concat!(
     ///         "+----+------+------+\n",
-    ///         "|       date       |\n",
+    ///         "| date             |\n",
     ///         "+----+------+------+\n",
     ///         "| 09 | June | 2022 |\n",
     ///         "+----+------+------+\n",
@@ -484,7 +484,7 @@ impl Style<(), (), (), (), (), ()> {
     ///     table.to_string(),
     ///     concat!(
     ///         "+------------------+\n",
-    ///         "|       date       |\n",
+    ///         "| date             |\n",
     ///         "+----+------+------+\n",
     ///         "| 09 | June | 2022 |\n",
     ///         "+----+------+------+\n",
@@ -558,7 +558,7 @@ impl<T, B, L, R, H, V, Lines> Style<T, B, L, R, H, V, Lines> {
     ///     table.to_string(),
     ///     concat!(
     ///         "┌──────────────────┐\n",
-    ///         "│    0     |   1   │\n",
+    ///         "│ 0        | 1     │\n",
     ///         "└──────────────────┘\n",
     ///         "| 10:52:19 | Hello |\n",
     ///         "+----------+-------+\n",
@@ -603,9 +603,9 @@ impl<T, B, L, R, H, V, Lines> Style<T, B, L, R, H, V, Lines> {
     ///         "+-------+-------+-----+\n",
     ///         "| &str  | &str  | i32 |\n",
     ///         "├───────┼───────┼─────┤\n",
-    ///         "| Hello | World |  0  |\n",
-    ///         "| Hello | World |  1  |\n",
-    ///         "| Hello | World |  2  |\n",
+    ///         "| Hello | World | 0   |\n",
+    ///         "| Hello | World | 1   |\n",
+    ///         "| Hello | World | 2   |\n",
     ///         "+-------+-------+-----+",
     ///     )
     /// )
@@ -785,11 +785,11 @@ impl<T, B, L, R, H, V, Lines> Style<T, B, L, R, H, V, Lines> {
     ///         "╭───────┬─────╮\n",
     ///         "│ &str  │ i32 │\n",
     ///         "###############\n",
-    ///         "│ Hello │  0  │\n",
+    ///         "│ Hello │ 0   │\n",
     ///         "###############\n",
-    ///         "│ Hello │  1  │\n",
+    ///         "│ Hello │ 1   │\n",
     ///         "###############\n",
-    ///         "│ Hello │  2  │\n",
+    ///         "│ Hello │ 2   │\n",
     ///         "╰───────┴─────╯",
     ///     )
     /// )
@@ -1133,9 +1133,9 @@ impl RawStyle {
     ///         " ======= ===== \n",
     ///         "  &str    i32  \n",
     ///         "╠═══════╬═════╣\n",
-    ///         "  Hello    0   \n",
-    ///         "  Hello    1   \n",
-    ///         "  Hello    2   \n",
+    ///         "  Hello   0    \n",
+    ///         "  Hello   1    \n",
+    ///         "  Hello   2    \n",
     ///         " ======= ===== ",
     ///     ),
     /// )
@@ -1197,7 +1197,7 @@ impl TableOption for RawStyle {
 /// assert_eq!(
 ///     table.to_string(),
 ///     "+-.table------+\n\
-///      |    &str     |\n\
+///      | &str        |\n\
 ///      +-------------+\n\
 ///      | Hello World |\n\
 ///      +-------------+"
diff --git a/src/table.rs b/src/table.rs
index ff6e0b1..7336855 100644
--- a/src/table.rs
+++ b/src/table.rs
@@ -87,7 +87,7 @@ impl Table {
     ///
     #[cfg_attr(feature = "derive", doc = "```")]
     #[cfg_attr(not(feature = "derive"), doc = "```ignore")]
-    /// use tabled::{Table, Tabled};
+    /// use tabled::{Table, Tabled, object::Segment, ModifyObject, Alignment};
     ///
     /// #[derive(Tabled)]
     /// struct User {
@@ -112,14 +112,14 @@ impl Table {
     /// builder.set_index(0);
     /// builder.transpose();
     ///
-    /// let table = builder.build().to_string();
+    /// let table = builder.build().with(Segment::new(1.., 1..).modify().with(Alignment::center())).to_string();
     ///
     /// assert_eq!(
     ///     table,
     ///     "+----------------+------+---------+------+\n\
-    ///      |      name      | Vlad | Dimitry | John |\n\
+    ///      | name           | Vlad | Dimitry | John |\n\
     ///      +----------------+------+---------+------+\n\
-    ///      |   device::PC   |      |    +    |  +   |\n\
+    ///      | device::PC     |      |    +    |  +   |\n\
     ///      +----------------+------+---------+------+\n\
     ///      | device::Mobile |  +   |         |      |\n\
     ///      +----------------+------+---------+------+"


Test patch:
diff --git a/papergrid/tests/settings.rs b/papergrid/tests/settings.rs
index ccf3932..dbeaee6 100644
--- a/papergrid/tests/settings.rs
+++ b/papergrid/tests/settings.rs
@@ -1,4 +1,4 @@
-use papergrid::{Border, Borders, Entity, Indent, Padding, Settings};
+use papergrid::{Border, Borders, Entity, Settings};
 
 mod util;
 
@@ -70,64 +70,3 @@ fn remove_border_test() {
 
     assert_eq!(grid.to_string(), "0-00-1\n1-01-1");
 }
-
-#[test]
-fn entity_row_overrides_column_intersection() {
-    let mut grid = util::new_grid::<2, 2>();
-    grid.set_borders(Borders::default());
-
-    grid.set_padding(
-        Entity::Column(0),
-        Padding {
-            bottom: Indent::new(3, '$'),
-            ..Default::default()
-        },
-    );
-
-    assert_eq!(
-        grid.to_string(),
-        "0-00-1\n$$$   \n$$$   \n$$$   \n1-01-1\n$$$   \n$$$   \n$$$   "
-    );
-
-    grid.set_padding(
-        Entity::Row(1),
-        Padding {
-            bottom: Indent::new(2, '#'),
-            ..Default::default()
-        },
-    );
-
-    assert_eq!(
-        grid.to_string(),
-        "0-00-1\n$$$   \n$$$   \n$$$   \n1-01-1\n######\n######"
-    );
-}
-
-#[test]
-fn entity_column_overrides_row_intersection() {
-    let mut grid = util::new_grid::<2, 2>();
-    grid.set_borders(Borders::default());
-
-    grid.set_padding(
-        Entity::Row(0),
-        Padding {
-            bottom: Indent::new(3, '$'),
-            ..Default::default()
-        },
-    );
-
-    assert_eq!(grid.to_string(), "0-00-1\n$$$$$$\n$$$$$$\n$$$$$$\n1-01-1");
-
-    grid.set_padding(
-        Entity::Column(1),
-        Padding {
-            bottom: Indent::new(2, '#'),
-            ..Default::default()
-        },
-    );
-
-    assert_eq!(
-        grid.to_string(),
-        "0-00-1\n$$$###\n$$$###\n$$$###\n1-01-1\n   ###\n   ###"
-    );
-}
diff --git a/tests/alignment_test.rs b/tests/alignment_test.rs
index e09c7d7..eaf88b2 100644
--- a/tests/alignment_test.rs
+++ b/tests/alignment_test.rs
@@ -1,15 +1,15 @@
 use tabled::{
     object::{Columns, Rows, Segment},
-    Alignment, Modify, Padding, Style, Table,
+    Alignment, Modify, Padding, Style,
 };
 
-use crate::util::{create_vector, test_table};
+use crate::util::{create_table, init_table, test_table};
 
 mod util;
 
 test_table!(
     full_alignment,
-    Table::new(create_vector::<3, 3>()).with(Style::psql()).with(Modify::new(Segment::all()).with(Alignment::left())),
+    create_table::<3, 3>().with(Style::psql()).with(Modify::new(Segment::all()).with(Alignment::left())),
     " N | column 0 | column 1 | column 2 "
     "---+----------+----------+----------"
     " 0 | 0-0      | 0-1      | 0-2      "
@@ -19,7 +19,7 @@ test_table!(
 
 test_table!(
     head_and_data_alignment,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Modify::new(Rows::first()).with(Alignment::left()))
         .with(Modify::new(Rows::new(1..)).with(Alignment::right())),
     "+---+----------+----------+----------+"
@@ -35,11 +35,7 @@ test_table!(
 
 test_table!(
     full_alignment_multiline,
-    Table::new({
-            let mut data = create_vector::<3, 3>();
-            data[2][2] = String::from("https://\nwww\n.\nredhat\n.com\n/en");
-            data
-        })
+    init_table::<3, 3, _, _>([((2, 2), "https://\nwww\n.\nredhat\n.com\n/en")])
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Alignment::left())),
     " N | column 0 | column 1 | column 2 "
@@ -56,15 +52,13 @@ test_table!(
 
 test_table!(
     vertical_alignment_test,
-    Table::new({
-            let mut data = create_vector::<3, 3>();
-            data[1][2] = String::from("E\nnde\navou\nros");
-            data[2][2] = String::from("Red\nHat");
-            data[2][3] = String::from("https://\nwww\n.\nredhat\n.com\n/en");
-            data
-        })
-        .with(Style::psql())
-        .with(Modify::new(Columns::new(1..)).with(Alignment::bottom())),
+    init_table::<3, 3, _, _>([
+        ((1, 2), "E\nnde\navou\nros"),
+        ((2, 2), "Red\nHat"),
+        ((2, 3), "https://\nwww\n.\nredhat\n.com\n/en"),
+    ])
+    .with(Style::psql())
+    .with(Modify::new(Columns::new(1..)).with(Alignment::bottom())),
     " N | column 0 | column 1 | column 2 "
     "---+----------+----------+----------"
     " 0 |   0-0    |   0-1    |   0-2    "
@@ -82,7 +76,7 @@ test_table!(
 
 test_table!(
     alignment_doesnt_change_padding,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Padding::new(3, 0, 0, 0)))
         .with(Modify::new(Segment::all()).with(Alignment::left())),
diff --git a/tests/builder_test.rs b/tests/builder_test.rs
index 7eb63ed..bad2456 100644
--- a/tests/builder_test.rs
+++ b/tests/builder_test.rs
@@ -93,9 +93,9 @@ test_table!(
     from_iter,
     Builder::from_iter([["n", "name"], ["0", "Dmitriy"], ["1", "Vladislav"]]).build(),
     "+---+-----------+"
-    "| n |   name    |"
+    "| n | name      |"
     "+---+-----------+"
-    "| 0 |  Dmitriy  |"
+    "| 0 | Dmitriy   |"
     "+---+-----------+"
     "| 1 | Vladislav |"
     "+---+-----------+"
@@ -147,9 +147,9 @@ test_table!(
         .clone()
         .build(),
     "+---+-----+-----+"
-    "| 1 |  2  | NaN |"
+    "| 1 | 2   | NaN |"
     "+---+-----+-----+"
-    "| a |  b  |  c  |"
+    "| a | b   | c   |"
     "+---+-----+-----+"
     "| d | NaN | NaN |"
     "+---+-----+-----+"
@@ -167,9 +167,9 @@ test_table!(
     "+---+-----+-----+"
     "| 1 | NaN | NaN |"
     "+---+-----+-----+"
-    "| a |  b  | NaN |"
+    "| a | b   | NaN |"
     "+---+-----+-----+"
-    "| d |  e  |  f  |"
+    "| d | e   | f   |"
     "+---+-----+-----+"
 );
 
@@ -433,11 +433,11 @@ test_table!(
     "+------+------+------+"
     "| col1 | col2 | col3 |"
     "+------+------+------+"
-    "|  1   |  2   |  3   |"
+    "| 1    | 2    | 3    |"
     "+------+------+------+"
-    "|  a   |  b   |  c   |"
+    "| a    | b    | c    |"
     "+------+------+------+"
-    "|  d   |  e   |  f   |"
+    "| d    | e    | f    |"
     "+------+------+------+"
 );
 
@@ -447,11 +447,11 @@ test_table!(
     "+------+------+"
     "| col2 | col3 |"
     "+------+------+"
-    "|  2   |  3   |"
+    "| 2    | 3    |"
     "+------+------+"
-    "|  b   |  c   |"
+    "| b    | c    |"
     "+------+------+"
-    "|  e   |  f   |"
+    "| e    | f    |"
     "+------+------+"
 );
 
@@ -461,11 +461,11 @@ test_table!(
     "+------+------+"
     "| col1 | col3 |"
     "+------+------+"
-    "|  1   |  3   |"
+    "| 1    | 3    |"
     "+------+------+"
-    "|  a   |  c   |"
+    "| a    | c    |"
     "+------+------+"
-    "|  d   |  f   |"
+    "| d    | f    |"
     "+------+------+"
 );
 
@@ -475,11 +475,11 @@ test_table!(
     "+------+------+"
     "| col1 | col2 |"
     "+------+------+"
-    "|  1   |  2   |"
+    "| 1    | 2    |"
     "+------+------+"
-    "|  a   |  b   |"
+    "| a    | b    |"
     "+------+------+"
-    "|  d   |  e   |"
+    "| d    | e    |"
     "+------+------+"
 );
 
@@ -489,11 +489,11 @@ test_table!(
     "+------+"
     "| col3 |"
     "+------+"
-    "|  3   |"
+    "| 3    |"
     "+------+"
-    "|  c   |"
+    "| c    |"
     "+------+"
-    "|  f   |"
+    "| f    |"
     "+------+"
 );
 
@@ -503,11 +503,11 @@ test_table!(
     "+------+"
     "| col1 |"
     "+------+"
-    "|  1   |"
+    "| 1    |"
     "+------+"
-    "|  a   |"
+    "| a    |"
     "+------+"
-    "|  d   |"
+    "| d    |"
     "+------+"
 );
 
@@ -517,11 +517,11 @@ test_table!(
     "+------+"
     "| col2 |"
     "+------+"
-    "|  2   |"
+    "| 2    |"
     "+------+"
-    "|  b   |"
+    "| b    |"
     "+------+"
-    "|  e   |"
+    "| e    |"
     "+------+"
 );
 
@@ -541,9 +541,9 @@ test_table!(
     "+------+------+------+"
     "| col1 | col2 | col3 |"
     "+------+------+------+"
-    "|  a   |  b   |  c   |"
+    "| a    | b    | c    |"
     "+------+------+------+"
-    "|  d   |  e   |  f   |"
+    "| d    | e    | f    |"
     "+------+------+------+"
 );
 
@@ -553,9 +553,9 @@ test_table!(
     "+------+------+------+"
     "| col1 | col2 | col3 |"
     "+------+------+------+"
-    "|  1   |  2   |  3   |"
+    "| 1    | 2    | 3    |"
     "+------+------+------+"
-    "|  d   |  e   |  f   |"
+    "| d    | e    | f    |"
     "+------+------+------+"
 );
 
@@ -565,9 +565,9 @@ test_table!(
     "+------+------+------+"
     "| col1 | col2 | col3 |"
     "+------+------+------+"
-    "|  1   |  2   |  3   |"
+    "| 1    | 2    | 3    |"
     "+------+------+------+"
-    "|  a   |  b   |  c   |"
+    "| a    | b    | c    |"
     "+------+------+------+"
 );
 
@@ -577,7 +577,7 @@ test_table!(
     "+------+------+------+"
     "| col1 | col2 | col3 |"
     "+------+------+------+"
-    "|  d   |  e   |  f   |"
+    "| d    | e    | f    |"
     "+------+------+------+"
 );
 
@@ -587,7 +587,7 @@ test_table!(
     "+------+------+------+"
     "| col1 | col2 | col3 |"
     "+------+------+------+"
-    "|  1   |  2   |  3   |"
+    "| 1    | 2    | 3    |"
     "+------+------+------+"
 );
 
@@ -597,7 +597,7 @@ test_table!(
     "+------+------+------+"
     "| col1 | col2 | col3 |"
     "+------+------+------+"
-    "|  a   |  b   |  c   |"
+    "| a    | b    | c    |"
     "+------+------+------+"
 );
 
@@ -607,9 +607,9 @@ test_table!(
     "+------+------+"
     "| col1 | col3 |"
     "+------+------+"
-    "|  1   |  3   |"
+    "| 1    | 3    |"
     "+------+------+"
-    "|  d   |  f   |"
+    "| d    | f    |"
     "+------+------+"
 );
 
@@ -629,11 +629,11 @@ test_table!(
     index,
     Builder::from_iter([["n", "name"], ["0", "Dmitriy"], ["1", "Vladislav"]]).index().build(),
     "+---+---+-----------+"
-    "|   | 0 |     1     |"
+    "|   | 0 | 1         |"
     "+---+---+-----------+"
-    "| 0 | n |   name    |"
+    "| 0 | n | name      |"
     "+---+---+-----------+"
-    "| 1 | 0 |  Dmitriy  |"
+    "| 1 | 0 | Dmitriy   |"
     "+---+---+-----------+"
     "| 2 | 1 | Vladislav |"
     "+---+---+-----------+"
@@ -647,15 +647,15 @@ test_table!(
         .clone()
         .build(),
     "+--------------+---+-----------+"
-    "|              | 0 |     1     |"
+    "|              | 0 | 1         |"
     "+--------------+---+-----------+"
     "| A index name |   |           |"
     "+--------------+---+-----------+"
-    "|      0       | n |   name    |"
+    "| 0            | n | name      |"
     "+--------------+---+-----------+"
-    "|      1       | 0 |  Dmitriy  |"
+    "| 1            | 0 | Dmitriy   |"
     "+--------------+---+-----------+"
-    "|      2       | 1 | Vladislav |"
+    "| 2            | 1 | Vladislav |"
     "+--------------+---+-----------+"
 );
 
@@ -667,11 +667,11 @@ test_table!(
         .clone()
         .build(),
     "+---+-----------+"
-    "| 0 |     1     |"
+    "| 0 | 1         |"
     "+---+-----------+"
-    "| n |   name    |"
+    "| n | name      |"
     "+---+-----------+"
-    "| 0 |  Dmitriy  |"
+    "| 0 | Dmitriy   |"
     "+---+-----------+"
     "| 1 | Vladislav |"
     "+---+-----------+"
@@ -687,11 +687,11 @@ test_table!(
     "+-----------+---+"
     "|           | 0 |"
     "+-----------+---+"
-    "|     1     |   |"
+    "| 1         |   |"
     "+-----------+---+"
-    "|   name    | n |"
+    "| name      | n |"
     "+-----------+---+"
-    "|  Dmitriy  | 0 |"
+    "| Dmitriy   | 0 |"
     "+-----------+---+"
     "| Vladislav | 1 |"
     "+-----------+---+"
@@ -708,11 +708,11 @@ test_table!(
     "+-----------+---+"
     "|           | 0 |"
     "+-----------+---+"
-    "|   Hello   |   |"
+    "| Hello     |   |"
     "+-----------+---+"
-    "|   name    | n |"
+    "| name      | n |"
     "+-----------+---+"
-    "|  Dmitriy  | 0 |"
+    "| Dmitriy   | 0 |"
     "+-----------+---+"
     "| Vladislav | 1 |"
     "+-----------+---+"
@@ -729,9 +729,9 @@ test_table!(
     "+-----------+---+"
     "|           | 0 |"
     "+-----------+---+"
-    "|   name    | n |"
+    "| name      | n |"
     "+-----------+---+"
-    "|  Dmitriy  | 0 |"
+    "| Dmitriy   | 0 |"
     "+-----------+---+"
     "| Vladislav | 1 |"
     "+-----------+---+"
@@ -745,13 +745,13 @@ test_table!(
         .clone()
         .build(),
     "+---+------+---------+-----------+"
-    "|   |  0   |    1    |     2     |"
+    "|   | 0    | 1       | 2         |"
     "+---+------+---------+-----------+"
-    "| 0 |  n   |    0    |     1     |"
+    "| 0 | n    | 0       | 1         |"
     "+---+------+---------+-----------+"
     "| 1 | name | Dmitriy | Vladislav |"
     "+---+------+---------+-----------+"
-    "| 2 |  zz  |   123   |    123    |"
+    "| 2 | zz   | 123     | 123       |"
     "+---+------+---------+-----------+"
 );
 
diff --git a/tests/concat_test.rs b/tests/concat_test.rs
index 163d2f1..2c461c9 100644
--- a/tests/concat_test.rs
+++ b/tests/concat_test.rs
@@ -1,18 +1,14 @@
-use tabled::{Concat, Style, Table};
+use tabled::{Concat, Style};
 
-use util::{create_vector, test_table};
+use crate::util::{create_table, init_table, test_table};
 
 mod util;
 
 test_table!(
     join_vertical_0,
     {
-        let table1 = Table::new({
-            let mut data = create_vector::<2, 3>();
-            data[0][0] = "123".to_string();
-            data
-        }).with(Style::psql());
-        let table2 = Table::new(create_vector::<2, 3>());
+        let table1 = init_table::<2, 3, _, _>([((0, 0), "123")]).with(Style::psql());
+        let table2 = create_table::<2, 3>();
         table1.with(Concat::vertical(table2))
     },
     "  N  | column 0 | column 1 | column 2 "
@@ -27,12 +23,8 @@ test_table!(
 test_table!(
     join_vertical_1,
     {
-        let table1 = Table::new({
-            let mut data = create_vector::<2, 3>();
-            data[0][0] = "123".to_string();
-            data
-        }).with(Style::psql());
-        let table2 = Table::new(create_vector::<2, 3>());
+        let table1 = init_table::<2, 3, _, _>([((0, 0), "123")]).with(Style::psql());
+        let table2 = create_table::<2, 3>();
         table2.with(Concat::vertical(table1))
     },
     "+-----+----------+----------+----------+"
@@ -53,8 +45,8 @@ test_table!(
 test_table!(
     join_horizontal_0,
     {
-        let table1 = Table::new(create_vector::<2, 3>()).with(Style::ascii());
-        let table2 = Table::new(create_vector::<2, 3>()).with(Style::psql());
+        let table1 = create_table::<2, 3>().with(Style::ascii());
+        let table2 = create_table::<2, 3>().with(Style::psql());
         table2.with(Concat::horizontal(table1))
     },
     " N | column 0 | column 1 | column 2 | N | column 0 | column 1 | column 2 "
@@ -66,8 +58,8 @@ test_table!(
 test_table!(
     join_horizontal_1,
     {
-        let table1 = Table::new(create_vector::<2, 3>()).with(Style::ascii());
-        let table2 = Table::new(create_vector::<2, 3>()).with(Style::psql());
+        let table1 = create_table::<2, 3>().with(Style::ascii());
+        let table2 = create_table::<2, 3>().with(Style::psql());
         table1.with(Concat::horizontal(table2))
     },
     "+---+----------+----------+----------+---+----------+----------+----------+"
@@ -82,8 +74,8 @@ test_table!(
 test_table!(
     join_vertical_different_size,
     {
-        let table1 = Table::new(create_vector::<2, 2>()).with(Style::psql());
-        let table2 = Table::new(create_vector::<2, 3>()).with(Style::psql());
+        let table1 = create_table::<2, 2>().with(Style::psql());
+        let table2 = create_table::<2, 3>().with(Style::psql());
         table1.with(Concat::vertical(table2))
     },
     " N | column 0 | column 1 |          "
@@ -98,8 +90,8 @@ test_table!(
 test_table!(
     join_horizontal_different_size,
     {
-        let table1 = Table::new(create_vector::<2, 3>()).with(Style::psql());
-        let table2 = Table::new(create_vector::<3, 3>()).with(Style::psql());
+        let table1 = create_table::<2, 3>().with(Style::psql());
+        let table2 = create_table::<3, 3>().with(Style::psql());
         table1.with(Concat::horizontal(table2))
     },
     " N | column 0 | column 1 | column 2 | N | column 0 | column 1 | column 2 "
@@ -112,8 +104,8 @@ test_table!(
 test_table!(
     join_horizontal_with_not_default_empty_string,
     {
-        let table1 = Table::new(create_vector::<2, 3>()).with(Style::psql());
-        let table2 = Table::new(create_vector::<3, 3>()).with(Style::psql());
+        let table1 = create_table::<2, 3>().with(Style::psql());
+        let table2 = create_table::<3, 3>().with(Style::psql());
         table1.with(Concat::horizontal(table2).default_cell("NaN"))
     },
     " N | column 0 | column 1 | column 2 | N | column 0 | column 1 | column 2 "
@@ -126,8 +118,8 @@ test_table!(
 test_table!(
     join_vertical_with_not_default_empty_string,
     {
-        let table1 = Table::new(create_vector::<2, 2>()).with(Style::psql());
-        let table2 = Table::new(create_vector::<2, 3>()).with(Style::psql());
+        let table1 = create_table::<2, 2>().with(Style::psql());
+        let table2 = create_table::<2, 3>().with(Style::psql());
         table1.with(Concat::vertical(table2).default_cell("NaN"))
     },
     " N | column 0 | column 1 |NaN       "
diff --git a/tests/disable_test.rs b/tests/disable_test.rs
index 6e9c4d9..916040f 100644
--- a/tests/disable_test.rs
+++ b/tests/disable_test.rs
@@ -1,12 +1,12 @@
-use tabled::{object::Segment, Alignment, Disable, Modify, Style, Table};
+use tabled::{object::Segment, Alignment, Disable, Modify, Style};
 
-use crate::util::{create_vector, test_table};
+use crate::util::{create_table, test_table};
 
 mod util;
 
 test_table!(
     disable_rows,
-    Table::new(create_vector::<3, 3>()).with(Disable::Row(1..=2)),
+    create_table::<3, 3>().with(Disable::Row(1..=2)),
     "+---+----------+----------+----------+"
     "| N | column 0 | column 1 | column 2 |"
     "+---+----------+----------+----------+"
@@ -16,7 +16,7 @@ test_table!(
 
 test_table!(
     disable_header,
-    Table::new(create_vector::<3, 3>()).with(Style::psql()).with(Disable::Row(..1)),
+    create_table::<3, 3>().with(Style::psql()).with(Disable::Row(..1)),
     "---+-----+-----+-----"
     " 0 | 0-0 | 0-1 | 0-2 "
     " 1 | 1-0 | 1-1 | 1-2 "
@@ -25,7 +25,7 @@ test_table!(
 
 test_table!(
     disable_all_table_via_rows,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Disable::Row(..)),
     ""
@@ -33,7 +33,7 @@ test_table!(
 
 test_table!(
     disable_header_with_new_styling,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Disable::Row(..1))
         .with(Style::modern().off_horizontal().lines([(1, Style::modern().get_horizontal())])),
@@ -47,7 +47,7 @@ test_table!(
 
 test_table!(
     disable_columns,
-    Table::new(create_vector::<3, 3>()).with(Style::psql()).with(Disable::Column(..1)),
+    create_table::<3, 3>().with(Style::psql()).with(Disable::Column(..1)),
     "| column 0 | column 1 | column 2 "
     "+----------+----------+----------"
     "|   0-0    |   0-1    |   0-2    "
@@ -57,7 +57,7 @@ test_table!(
 
 test_table!(
     disable_all_table_via_columns,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Disable::Column(..)),
diff --git a/tests/extract_test.rs b/tests/extract_test.rs
index 2e51d8e..0b4bdfe 100644
--- a/tests/extract_test.rs
+++ b/tests/extract_test.rs
@@ -1,14 +1,14 @@
 use tabled::{
-    builder::Builder, object::Segment, Alignment, Disable, Extract, Format, Modify, Padding, Table,
+    builder::Builder, object::Segment, Alignment, Disable, Extract, Format, Modify, Padding,
 };
 
-use crate::util::{create_vector, test_table};
+use crate::util::{create_table, test_table};
 
 mod util;
 
 test_table!(
     extract_segment_full_test,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Segment::all()).with(Padding::new(3, 1, 0, 0)))
         .with(Modify::new(Segment::all()).with(Format::new(|s| format!("[{}]", s))))
@@ -26,7 +26,7 @@ test_table!(
 
 test_table!(
     extract_segment_skip_top_row_test,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Segment::all()).with(Padding::new(3, 1, 0, 0)))
         .with(Modify::new(Segment::all()).with(Format::new(|s| format!("[{}]", s))))
@@ -42,7 +42,7 @@ test_table!(
 
 test_table!(
     extract_segment_skip_column_test,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Segment::all()).with(Padding::new(3, 1, 0, 0)))
         .with(Modify::new(Segment::all()).with(Format::new(|s| format!("[{}]", s))))
@@ -60,7 +60,7 @@ test_table!(
 
 test_table!(
     extract_segment_bottom_right_square_test,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Segment::all()).with(Padding::new(3, 1, 0, 0)))
         .with(Modify::new(Segment::all()).with(Format::new(|s| format!("[{}]", s))))
@@ -74,7 +74,7 @@ test_table!(
 
 test_table!(
     extract_segment_middle_section_test,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Segment::all()).with(Padding::new(3, 1, 0, 0)))
         .with(Modify::new(Segment::all()).with(Format::new(|s| format!("[{}]", s))))
@@ -88,13 +88,13 @@ test_table!(
 
 test_table!(
     extract_segment_empty_test,
-    Table::new(create_vector::<3, 3>()).with(Extract::segment(1..1, 1..1)),
+    create_table::<3, 3>().with(Extract::segment(1..1, 1..1)),
     ""
 );
 
 test_table!(
     extract_rows_full_test,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Segment::all()).with(Padding::new(3, 1, 0, 0)))
         .with(Modify::new(Segment::all()).with(Format::new(|s| format!("[{}]", s))))
@@ -112,13 +112,13 @@ test_table!(
 
 test_table!(
     extract_rows_empty_test,
-    Table::new(create_vector::<3, 3>()).with(Extract::rows(0..0)),
+    create_table::<3, 3>().with(Extract::rows(0..0)),
     ""
 );
 
 test_table!(
     extract_rows_partial_view_test,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Segment::all()).with(Padding::new(3, 1, 0, 0)))
         .with(Modify::new(Segment::all()).with(Format::new(|s| format!("[{}]", s))))
@@ -134,7 +134,7 @@ test_table!(
 
 test_table!(
     extract_columns_full_test,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Segment::all()).with(Padding::new(3, 1, 0, 0)))
         .with(Modify::new(Segment::all()).with(Format::new(|s| format!("[{}]", s))))
@@ -152,13 +152,13 @@ test_table!(
 
 test_table!(
     extract_columns_empty_test,
-    Table::new(create_vector::<3, 3>()).with(Extract::columns(0..0)),
+    create_table::<3, 3>().with(Extract::columns(0..0)),
     ""
 );
 
 test_table!(
     extract_columns_partial_view_test,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Segment::all()).with(Padding::new(3, 1, 0, 0)))
         .with(Modify::new(Segment::all()).with(Format::new(|s| format!("[{}]", s))))
@@ -176,7 +176,7 @@ test_table!(
 
 test_table!(
     extract_inside_test,
-    Table::new(create_vector::<3, 3>()).with(Disable::Row(..1)).with(Extract::segment(1..2, 1..2)),
+    create_table::<3, 3>().with(Disable::Row(..1)).with(Extract::segment(1..2, 1..2)),
     "+-----+"
     "| 1-0 |"
     "+-----+"
@@ -184,7 +184,7 @@ test_table!(
 
 test_table!(
     extract_left_test,
-    Table::new(create_vector::<3, 3>()).with(Disable::Row(..1)).with(Extract::segment(.., ..1)),
+    create_table::<3, 3>().with(Disable::Row(..1)).with(Extract::segment(.., ..1)),
     "+---+"
     "| 0 |"
     "+---+"
@@ -196,7 +196,7 @@ test_table!(
 
 test_table!(
     extract_right_test,
-    Table::new(create_vector::<3, 3>()).with(Disable::Row(..1)).with(Extract::segment(.., 2..)),
+    create_table::<3, 3>().with(Disable::Row(..1)).with(Extract::segment(.., 2..)),
     "+-----+-----+"
     "| 0-1 | 0-2 |"
     "+-----+-----+"
@@ -208,7 +208,7 @@ test_table!(
 
 test_table!(
     extract_top_test,
-    Table::new(create_vector::<3, 3>()).with(Disable::Row(..1)).with(Extract::segment(..1, ..)),
+    create_table::<3, 3>().with(Disable::Row(..1)).with(Extract::segment(..1, ..)),
     "+---+-----+-----+-----+"
     "| 0 | 0-0 | 0-1 | 0-2 |"
     "+---+-----+-----+-----+"
@@ -216,7 +216,7 @@ test_table!(
 
 test_table!(
     extract_bottom_test,
-    Table::new(create_vector::<3, 3>()).with(Disable::Row(..1)).with(Extract::segment(2.., ..)),
+    create_table::<3, 3>().with(Disable::Row(..1)).with(Extract::segment(2.., ..)),
     "+---+-----+-----+-----+"
     "| 2 | 2-0 | 2-1 | 2-2 |"
     "+---+-----+-----+-----+"
@@ -224,7 +224,7 @@ test_table!(
 
 test_table!(
     extract_all_test,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Disable::Row(..1))
         .with(Extract::segment(3.., 3..)),
     ""
diff --git a/tests/format_test.rs b/tests/format_test.rs
index 05e3261..ecfe295 100644
--- a/tests/format_test.rs
+++ b/tests/format_test.rs
@@ -1,15 +1,15 @@
 use tabled::{
     object::{Cell, Columns, Object, Rows, Segment},
-    Alignment, Format, Modify, Padding, Style, Table,
+    Alignment, Format, Modify, Padding, Style,
 };
 
-use crate::util::{create_vector, test_table};
+use crate::util::{create_table, init_table, test_table};
 
 mod util;
 
 test_table!(
     formatting_full_test,
-    Table::new(create_vector::<3, 3>()).with(Modify::new(Segment::all()).with(Format::new(|s| format!("[{}]", s)))),
+    create_table::<3, 3>().with(Modify::new(Segment::all()).with(Format::new(|s| format!("[{}]", s)))),
     "+-----+------------+------------+------------+"
     "| [N] | [column 0] | [column 1] | [column 2] |"
     "+-----+------------+------------+------------+"
@@ -23,7 +23,7 @@ test_table!(
 
 test_table!(
     formatting_head_test,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::markdown())
         .with(Modify::new(Rows::first()).with(Format::new(|s| format!(":{}", s)))),
     "| :N | :column 0 | :column 1 | :column 2 |"
@@ -35,7 +35,7 @@ test_table!(
 
 test_table!(
     formatting_row_test,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Rows::new(1..)).with(Format::new(|s| format!("<{}>", s)))),
     "  N  | column 0 | column 1 | column 2 "
@@ -47,7 +47,7 @@ test_table!(
 
 test_table!(
     formatting_column_test,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Columns::single(0)).with(Format::new(|s| format!("(x) {}", s)))),
     " (x) N | column 0 | column 1 | column 2 "
@@ -59,15 +59,13 @@ test_table!(
 
 test_table!(
     formatting_multiline_test,
-    Table::new({
-            let mut data = create_vector::<3, 3>();
-            data[1][2] = String::from("E\nnde\navou\nros");
-            data[2][2] = String::from("Red\nHat");
-            data[2][3] = String::from("https://\nwww\n.\nredhat\n.com\n/en");
-            data
-        })
-        .with(Style::psql())
-        .with(Modify::new(Segment::all()).with(Format::multiline(|s| format!("(x) {}", s)))),
+    init_table::<3, 3, _, _>([
+        ((1, 2), "E\nnde\navou\nros"),
+        ((2, 2), "Red\nHat"),
+        ((2, 3), "https://\nwww\n.\nredhat\n.com\n/en"),
+    ])
+    .with(Style::psql())
+    .with(Modify::new(Segment::all()).with(Format::multiline(|s| format!("(x) {}", s)))),
     " (x) N | (x) column 0 | (x) column 1 | (x) column 2 "
     "-------+--------------+--------------+--------------"
     " (x) 0 |   (x) 0-0    |   (x) 0-1    |   (x) 0-2    "
@@ -85,7 +83,7 @@ test_table!(
 
 test_table!(
     formatting_cell_test,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Cell(0, 0)).with(Format::new(|s| format!("(x) {}", s))))
         .with(Modify::new(Cell(0, 1)).with(Format::new(|s| format!("(x) {}", s))))
@@ -99,7 +97,7 @@ test_table!(
 
 test_table!(
     formatting_combination_and_test,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(
             Modify::new(Columns::single(0).and(Rows::single(0)))
@@ -114,7 +112,7 @@ test_table!(
 
 test_table!(
     formatting_combination_not_test,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(
             Modify::new(Columns::single(0).and(Rows::single(0)).not(Cell(0, 0)))
@@ -129,7 +127,7 @@ test_table!(
 
 test_table!(
     formatting_combination_inverse_test,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Columns::single(0).inverse()).with(Format::new(|s| format!("(x) {}", s)))),
     " N | (x) column 0 | (x) column 1 | (x) column 2 "
@@ -141,7 +139,7 @@ test_table!(
 
 test_table!(
     formatting_combination_intersect_test,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(
             Modify::new(Columns::new(1..3).intersect(Rows::new(1..3)))
@@ -156,7 +154,7 @@ test_table!(
 
 test_table!(
     formatting_using_lambda_test,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::markdown())
         .with(Modify::new(Rows::first()).with(|s: &str| format!(":{}", s))),
     "| :N | :column 0 | :column 1 | :column 2 |"
@@ -168,7 +166,7 @@ test_table!(
 
 test_table!(
     formatting_using_function_test,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::markdown())
         .with(Modify::new(Rows::first()).with(str::to_uppercase)),
     "| N | COLUMN 0 | COLUMN 1 | COLUMN 2 |"
@@ -180,7 +178,7 @@ test_table!(
 
 test_table!(
     format_with_index,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::markdown())
         .with(Modify::new(Rows::first()).with(Format::with_index(|a, (b, c)| match (b, c) {
             (0, 0) => "(0, 0)".to_string(),
@@ -197,7 +195,7 @@ test_table!(
 
 test_table!(
     format_doesnt_change_padding,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Segment::all()).with(Padding::new(3, 1, 0, 0)))
         .with(Modify::new(Segment::all()).with(Format::new(|s| format!("[{}]", s)))),
@@ -219,7 +217,7 @@ mod color {
 
     test_table!(
         color_test,
-        Table::new(create_vector::<3, 3>())
+        create_table::<3, 3>()
             .with(Style::psql())
             .with(
                 Modify::new(Columns::new(..1).and(Columns::new(2..)))
@@ -235,17 +233,15 @@ mod color {
 
     test_table!(
         color_multiline_test,
-        Table::new({
-            let mut data = create_vector::<3, 3>();
-                data[1][2] = String::from("E\nnde\navou\nros");
-                data[2][2] = String::from("Red\nHat");
-                data[2][3] = String::from("https://\nwww\n.\nredhat\n.com\n/en");
-                data
-            })
-            .with(Style::psql())
-            .with(Modify::new(Columns::new(..1)).with(Format::multiline(|s| s.red().to_string())))
-            .with(Modify::new(Columns::new(1..2)).with(Format::multiline(|s| s.blue().to_string())))
-            .with(Modify::new(Columns::new(2..)).with(Format::multiline(|s| s.green().to_string()))),
+        init_table::<3, 3, _, _>([
+            ((1, 2), "E\nnde\navou\nros"),
+            ((2, 2), "Red\nHat"),
+            ((2, 3), "https://\nwww\n.\nredhat\n.com\n/en"),
+        ])
+        .with(Style::psql())
+        .with(Modify::new(Columns::new(..1)).with(Format::multiline(|s| s.red().to_string())))
+        .with(Modify::new(Columns::new(1..2)).with(Format::multiline(|s| s.blue().to_string())))
+        .with(Modify::new(Columns::new(2..)).with(Format::multiline(|s| s.green().to_string()))),
         " \u{1b}[31mN\u{1b}[39m | \u{1b}[34mcolumn 0\u{1b}[39m | \u{1b}[32mcolumn 1\u{1b}[39m | \u{1b}[32mcolumn 2\u{1b}[39m "
         "---+----------+----------+----------\n \u{1b}[31m0\u{1b}[39m |   \u{1b}[34m0-0\u{1b}[39m    |   \u{1b}[32m0-1\u{1b}[39m    |   \u{1b}[32m0-2\u{1b}[39m    "
         " \u{1b}[31m1\u{1b}[39m |   \u{1b}[34m1-0\u{1b}[39m    |   \u{1b}[32mE\u{1b}[39m      |   \u{1b}[32m1-2\u{1b}[39m    "
diff --git a/tests/highlingt_test.rs b/tests/highlingt_test.rs
index 6c6b3f5..b4ebfda 100644
--- a/tests/highlingt_test.rs
+++ b/tests/highlingt_test.rs
@@ -2,16 +2,16 @@ use tabled::{
     builder::Builder,
     object::{Cell, Columns, Frame, Object, Rows, Segment},
     style::Border,
-    Highlight, Style, Table,
+    Highlight, Style,
 };
 
-use crate::util::{create_vector, static_table, test_table};
+use crate::util::{create_table, static_table, test_table};
 
 mod util;
 
 test_table!(
     highlingt_object_exceeds_bounderies,
-    Table::new(create_vector::<3, 3>()).with(Style::modern()).with(Highlight::new(Cell(1000, 0), Border::filled('+'))),
+    create_table::<3, 3>().with(Style::modern()).with(Highlight::new(Cell(1000, 0), Border::filled('+'))),
     "┌───┬──────────┬──────────┬──────────┐"
     "│ N │ column 0 │ column 1 │ column 2 │"
     "├───┼──────────┼──────────┼──────────┤"
@@ -33,7 +33,7 @@ test_table!(
 
 test_table!(
     highlingt_cell,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::modern())
         .with(Highlight::new(Cell(0, 0), Border::filled('+')))
         .with(Highlight::new(Cell(1, 1), Border::filled('*'))),
@@ -50,7 +50,7 @@ test_table!(
 
 test_table!(
     highlingt_row,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::modern())
         .with(Highlight::new(Rows::single(0), Border::filled('+')))
         .with(Highlight::new(Rows::single(3), Border::filled('*'))),
@@ -67,7 +67,7 @@ test_table!(
 
 test_table!(
     highlingt_column,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::modern())
         .with(Highlight::new(Columns::single(0), Border::filled('+')))
         .with(Highlight::new(Columns::single(2), Border::filled('*'))),
@@ -84,7 +84,7 @@ test_table!(
 
 test_table!(
     highlingt_row_range,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::modern())
         .with(Highlight::new(Rows::new(1..3), Border::filled('+'))),
     "┌───┬──────────┬──────────┬──────────┐"
@@ -100,7 +100,7 @@ test_table!(
 
 test_table!(
     highlingt_column_range,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::modern())
         .with(Highlight::new(Columns::new(..2), Border::filled('+'))),
     "++++++++++++++++──────────┬──────────┐"
@@ -116,7 +116,7 @@ test_table!(
 
 test_table!(
     highlingt_frame,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::modern())
         .with(Highlight::new(
             Frame,
@@ -139,7 +139,7 @@ test_table!(
 
 test_table!(
     highlingt_full,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::modern())
         .with(Highlight::new(
             Segment::all(),
@@ -162,7 +162,7 @@ test_table!(
 
 test_table!(
     highlingt_single_column,
-    Table::new(create_vector::<3, 0>())
+    create_table::<3, 0>()
         .with(Style::modern())
         .with(Highlight::new(Cell(0, 0), Border::default().left('*').top('x')))
         .with(Highlight::new(Rows::new(1..3), Border::default().left('n'))),
@@ -179,7 +179,7 @@ test_table!(
 
 test_table!(
     highlingt_several_times,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::modern())
         .with(Highlight::new(Frame, Border::filled('*')))
         .with(Highlight::new(Cell(1, 1), Border::filled('#')))
@@ -224,14 +224,13 @@ test_table!(
 fn highlingt_complex_figures() {
     macro_rules! test_highlight {
         ($object:expr, $expected:expr,) => {
-            let data = create_vector::<3, 3>();
             let border = Border::filled('+')
                 .top_left_corner('*')
                 .top_right_corner('#')
                 .bottom_left_corner('@')
                 .bottom_right_corner('.');
 
-            let table = Table::new(&data)
+            let table = create_table::<3, 3>()
                 .with(Style::modern())
                 .with(Highlight::new($object, border))
                 .to_string();
diff --git a/tests/index_test.rs b/tests/index_test.rs
index 0f67519..d88792a 100644
--- a/tests/index_test.rs
+++ b/tests/index_test.rs
@@ -12,11 +12,11 @@ test_table!(
     "+---+---+----------+----------+"
     "|   | N | column 0 | column 1 |"
     "+---+---+----------+----------+"
-    "| 0 | 0 |   0-0    |   0-1    |"
+    "| 0 | 0 | 0-0      | 0-1      |"
     "+---+---+----------+----------+"
-    "| 1 | 1 |   1-0    |   1-1    |"
+    "| 1 | 1 | 1-0      | 1-1      |"
     "+---+---+----------+----------+"
-    "| 2 | 2 |   2-0    |   2-1    |"
+    "| 2 | 2 | 2-0      | 2-1      |"
     "+---+---+----------+----------+"
 );
 
@@ -24,9 +24,9 @@ test_table!(
     builder_index_transpose,
     Table::builder(create_vector::<4, 2>()).index().transpose().clone().build(),
     "+----------+-----+-----+-----+-----+"
-    "|          |  0  |  1  |  2  |  3  |"
+    "|          | 0   | 1   | 2   | 3   |"
     "+----------+-----+-----+-----+-----+"
-    "|    N     |  0  |  1  |  2  |  3  |"
+    "| N        | 0   | 1   | 2   | 3   |"
     "+----------+-----+-----+-----+-----+"
     "| column 0 | 0-0 | 1-0 | 2-0 | 3-0 |"
     "+----------+-----+-----+-----+-----+"
@@ -42,13 +42,13 @@ test_table!(
     "+---+----------+----------+"
     "| N |          |          |"
     "+---+----------+----------+"
-    "| 0 |   0-0    |   0-1    |"
+    "| 0 | 0-0      | 0-1      |"
     "+---+----------+----------+"
-    "| 1 |   1-0    |   1-1    |"
+    "| 1 | 1-0      | 1-1      |"
     "+---+----------+----------+"
-    "| 2 |   2-0    |   2-1    |"
+    "| 2 | 2-0      | 2-1      |"
     "+---+----------+----------+"
-    "| 3 |   3-0    |   3-1    |"
+    "| 3 | 3-0      | 3-1      |"
     "+---+----------+----------+"
 );
 
@@ -58,13 +58,13 @@ test_table!(
     "+---+----------+----------+"
     "|   | column 0 | column 1 |"
     "+---+----------+----------+"
-    "| 0 |   0-0    |   0-1    |"
+    "| 0 | 0-0      | 0-1      |"
     "+---+----------+----------+"
-    "| 1 |   1-0    |   1-1    |"
+    "| 1 | 1-0      | 1-1      |"
     "+---+----------+----------+"
-    "| 2 |   2-0    |   2-1    |"
+    "| 2 | 2-0      | 2-1      |"
     "+---+----------+----------+"
-    "| 3 |   3-0    |   3-1    |"
+    "| 3 | 3-0      | 3-1      |"
     "+---+----------+----------+"
 );
 
@@ -76,13 +76,13 @@ test_table!(
     "+-------------+----------+----------+"
     "| Hello World |          |          |"
     "+-------------+----------+----------+"
-    "|      0      |   0-0    |   0-1    |"
+    "| 0           | 0-0      | 0-1      |"
     "+-------------+----------+----------+"
-    "|      1      |   1-0    |   1-1    |"
+    "| 1           | 1-0      | 1-1      |"
     "+-------------+----------+----------+"
-    "|      2      |   2-0    |   2-1    |"
+    "| 2           | 2-0      | 2-1      |"
     "+-------------+----------+----------+"
-    "|      3      |   3-0    |   3-1    |"
+    "| 3           | 3-0      | 3-1      |"
     "+-------------+----------+----------+"
 );
 
@@ -90,11 +90,11 @@ test_table!(
     builder_index_0_name_transpose,
     Table::builder(create_vector::<4, 2>()).index().set_index(0).set_name(Some("Hello World".to_owned())).transpose().clone().build(),
     "+-------------+-----+-----+-----+-----+"
-    "| Hello World |  0  |  1  |  2  |  3  |"
+    "| Hello World | 0   | 1   | 2   | 3   |"
     "+-------------+-----+-----+-----+-----+"
-    "|  column 0   | 0-0 | 1-0 | 2-0 | 3-0 |"
+    "| column 0    | 0-0 | 1-0 | 2-0 | 3-0 |"
     "+-------------+-----+-----+-----+-----+"
-    "|  column 1   | 0-1 | 1-1 | 2-1 | 3-1 |"
+    "| column 1    | 0-1 | 1-1 | 2-1 | 3-1 |"
     "+-------------+-----+-----+-----+-----+"
 );
 
@@ -124,11 +124,11 @@ test_table!(
     "+-------------+---+---+---+"
     "| Hello World |   |   |   |"
     "+-------------+---+---+---+"
-    "|      0      | 1 | 2 | 3 |"
+    "| 0           | 1 | 2 | 3 |"
     "+-------------+---+---+---+"
-    "|      1      | a | b | c |"
+    "| 1           | a | b | c |"
     "+-------------+---+---+---+"
-    "|      2      | d | e | f |"
+    "| 2           | d | e | f |"
     "+-------------+---+---+---+"
 );
 
diff --git a/tests/margin_test.rs b/tests/margin_test.rs
index 6cf326f..2dd2b10 100644
--- a/tests/margin_test.rs
+++ b/tests/margin_test.rs
@@ -1,16 +1,16 @@
 use tabled::{
     object::Cell,
     style::{Border, Style},
-    Highlight, Margin, Modify, Span, Table, Width,
+    Highlight, Margin, Modify, Span, Width,
 };
 
-use crate::util::{create_vector, is_lines_equal, static_table, test_table};
+use crate::util::{create_table, init_table, is_lines_equal, static_table, test_table};
 
 mod util;
 
 test_table!(
     margin_with_table_based_on_grid_borders,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::extended())
         .with(Highlight::new(Cell(0, 0), Border::filled('+')))
         .with(Highlight::new(Cell(1, 1), Border::filled('*')))
@@ -31,11 +31,7 @@ test_table!(
 
 test_table!(
     margin_without_table_based_on_grid_borders,
-    Table::new({
-            let mut data = create_vector::<3, 3>();
-            data[2][2] = String::from("https://\nwww\n.\nredhat\n.com\n/en");
-            data
-        })
+    init_table::<3, 3, _, _>([((2, 2), "https://\nwww\n.\nredhat\n.com\n/en")])
         .with(Style::psql())
         .with(Modify::new(Cell(3, 2)).with(Span::column(2)))
         .with(Margin::new(1, 1, 1, 1).set_fill('>', '<', 'V', '^')),
@@ -55,11 +51,7 @@ test_table!(
 
 test_table!(
     table_with_empty_margin,
-    Table::new({
-            let mut data = create_vector::<3, 3>();
-            data[2][2] = String::from("https://\nwww\n.\nredhat\n.com\n/en");
-            data
-        })
+    init_table::<3, 3, _, _>([((2, 2), "https://\nwww\n.\nredhat\n.com\n/en")])
         .with(Style::psql())
         .with(Modify::new(Cell(3, 2)).with(Span::column(2)))
         .with(Margin::new(0, 0, 0, 0).set_fill('>', '<', 'V', '^')),
@@ -77,9 +69,7 @@ test_table!(
 
 #[test]
 fn table_with_margin_and_min_width() {
-    let data = create_vector::<3, 3>();
-
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Cell(1, 1)).with(Span::column(2)))
         .with(Margin::new(1, 1, 1, 1).set_fill('>', '<', 'V', '^'))
@@ -103,9 +93,7 @@ fn table_with_margin_and_min_width() {
 
 #[test]
 fn table_with_margin_and_max_width() {
-    let data = create_vector::<3, 3>();
-
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Cell(1, 1)).with(Span::column(2)))
         .with(Margin::new(1, 1, 1, 1).set_fill('>', '<', 'V', '^'))
@@ -130,16 +118,14 @@ fn table_with_margin_and_max_width() {
 #[test]
 #[ignore = "It's not yet clear what to do with such spans"]
 fn table_0_spanned_with_width() {
-    let data = create_vector::<0, 0>();
-
-    let table = Table::new(&data)
+    let table = create_table::<0, 0>()
         .with(Modify::new(Cell(0, 0)).with(Span::column(0)))
         .with(Width::increase(50))
         .to_string();
 
     assert_eq!(table, "++\n|\n++\n");
 
-    let table = Table::new(&data)
+    let table = create_table::<0, 0>()
         .with(Modify::new(Cell(0, 0)).with(Span::column(0)))
         .with(Width::truncate(50))
         .to_string();
@@ -154,7 +140,7 @@ fn margin_color_test() {
     use std::convert::TryFrom;
     use tabled::{margin::MarginColor, style::Color};
 
-    let table = Table::new(&create_vector::<3, 3>())
+    let table = create_table::<3, 3>()
         .with(Style::psql())
         .with(Margin::new(2, 2, 2, 2).set_fill('>', '<', 'V', '^'))
         .with(MarginColor::new(
diff --git a/tests/padding_test.rs b/tests/padding_test.rs
index e963cee..ed9fb1c 100644
--- a/tests/padding_test.rs
+++ b/tests/padding_test.rs
@@ -1,15 +1,15 @@
 use tabled::{
     object::{Rows, Segment},
-    Alignment, Modify, Padding, Style, Table,
+    Alignment, Modify, Padding, Style,
 };
 
-use crate::util::{create_vector, test_table};
+use crate::util::{create_table, test_table};
 
 mod util;
 
 test_table!(
     padding,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Rows::new(1..)).with(Padding::new(1, 1, 0, 2))),
@@ -28,7 +28,7 @@ test_table!(
 
 test_table!(
     padding_with_set_characters,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Padding::new(1, 2, 1, 1).set_fill('>', '<', 'V', '^'))),
     "VVVV|VVVVVVVVVVV|VVVVVVVVVVV|VVVVVVVVVVV"
@@ -48,7 +48,7 @@ test_table!(
 
 test_table!(
     padding_with_set_characters_and_zero_ident,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Padding::zero().set_fill('>', '<', '^', 'V'))),
     "N|column 0|column 1|column 2"
@@ -60,7 +60,7 @@ test_table!(
 
 test_table!(
     padding_multiline,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Rows::new(1..)).with(Padding::new(1, 1, 1, 1))),
     " N | column 0 | column 1 | column 2 "
@@ -78,7 +78,7 @@ test_table!(
 
 test_table!(
     padding_multiline_with_vertical_alignment,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Alignment::center()).with(Alignment::center_vertical()))
         .with(Modify::new(Rows::new(1..)).with(Padding::new(1, 1, 1, 1))),
@@ -110,7 +110,7 @@ test_table!(
             Color::try_from(' '.on_blue().to_string()).unwrap()
         );
 
-        Table::new(create_vector::<3, 3>())
+        create_table::<3, 3>()
             .with(Style::psql())
             .with(Modify::new(Rows::new(1..)).with(Padding::new(2, 2, 2, 2)).with(padding_color))
     },
diff --git a/tests/panel_test.rs b/tests/panel_test.rs
index 292d226..e3cf4ec 100644
--- a/tests/panel_test.rs
+++ b/tests/panel_test.rs
@@ -1,16 +1,16 @@
 use tabled::{
     object::{Cell, Object, Rows, Segment},
     style::{Border, Style},
-    Alignment, Footer, Header, Highlight, Modify, Panel, Table,
+    Alignment, Footer, Header, Highlight, Modify, Panel,
 };
 
-use crate::util::{create_vector, test_table};
+use crate::util::{create_table, new_table, test_table};
 
 mod util;
 
 test_table!(
     panel_has_no_style_by_default,
-    Table::new(create_vector::<3, 3>()).with(Style::psql()).with(Panel("Linux Distributions", 0)),
+    create_table::<3, 3>().with(Style::psql()).with(Panel("Linux Distributions", 0)),
     "        Linux Distributions         "
     " N | column 0 | column 1 | column 2 "
     "---+----------+----------+----------"
@@ -21,7 +21,7 @@ test_table!(
 
 test_table!(
     highligt_panel_0,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Panel("Linux Distributions", 0))
         .with(Style::psql())
         .with(Highlight::new(Cell(0, 0), Border::filled('#'))),
@@ -36,7 +36,7 @@ test_table!(
 
 test_table!(
     highligt_panel_1,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Panel("Linux Distributions", 0))
         .with(Style::psql())
         .with(Highlight::new(Cell(0, 0), Border::filled('#')))
@@ -54,7 +54,7 @@ test_table!(
 
 test_table!(
     top_panel,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Panel("Linux Distributions", 0))
         .with(Modify::new(Segment::all()).with(Alignment::center()))
         .with(Style::psql()),
@@ -68,7 +68,7 @@ test_table!(
 
 test_table!(
     bottom_panel,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Panel("Linux Distributions", 4))
         .with(Modify::new(Segment::all()).with(Alignment::center()))
         .with(Style::psql()),
@@ -82,7 +82,7 @@ test_table!(
 
 test_table!(
     inner_panel,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Panel("Linux Distributions", 2))
         .with(Modify::new(Rows::new(2..)).with(Alignment::center()))
         .with(Style::psql()),
@@ -96,7 +96,7 @@ test_table!(
 
 test_table!(
     header,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Header("Linux Distributions"))
         .with(Style::psql())
         .with(Modify::new(Rows::new(0..1)).with(Alignment::center())),
@@ -110,7 +110,7 @@ test_table!(
 
 test_table!(
     footer,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Header("Linux Distributions"))
         .with(Footer("The end"))
         .with(Style::psql())
@@ -126,7 +126,7 @@ test_table!(
 
 test_table!(
     panel_style_uses_most_left_and_right_cell_styles,
-    Table::new(&[(0, 1)]).with(tabled::Panel("Numbers", 0)).with(Style::modern()),
+    new_table(&[(0, 1)]).with(tabled::Panel("Numbers", 0)).with(Style::modern()),
     "┌─────┬─────┐"
     "│  Numbers  │"
     "├─────┼─────┤"
@@ -138,7 +138,7 @@ test_table!(
 
 test_table!(
     panel_style_change,
-    Table::new(&[(0, 1)])
+    new_table(&[(0, 1)])
         .with(tabled::Panel("Numbers", 0))
         .with(Style::modern().top_intersection('─').lines([(1, Style::modern().get_horizontal().intersection(Some('┬')))]))
         .with(Modify::new(Cell(0, 0)).with(Alignment::center())),
@@ -153,7 +153,7 @@ test_table!(
 
 test_table!(
     panel_style_uses_most_left_and_right_cell_styles_correct,
-    Table::new(&[(0, 1)])
+    new_table(&[(0, 1)])
         .with(tabled::Panel("Numbers", 0))
         .with(Style::modern())
         .with(Style::correct_spans()),
@@ -168,7 +168,7 @@ test_table!(
 
 test_table!(
     panel_style_change_corect,
-    Table::new(&[(0, 1)])
+    new_table(&[(0, 1)])
         .with(tabled::Panel("Numbers", 0))
         .with(Style::modern().top_intersection('─').lines([(1, Style::modern().get_horizontal().intersection(Some('┬')))]))
         .with(Style::correct_spans())
@@ -184,7 +184,7 @@ test_table!(
 
 test_table!(
     panel_in_single_column,
-    Table::new(&[(0)]).with(tabled::Panel("Numbers", 0)).with(Style::modern()),
+    new_table(&[(0)]).with(tabled::Panel("Numbers", 0)).with(Style::modern()),
     "┌─────────┐"
     "│ Numbers │"
     "├─────────┤"
diff --git a/tests/render_settings.rs b/tests/render_settings.rs
index fd5279b..93b2198 100644
--- a/tests/render_settings.rs
+++ b/tests/render_settings.rs
@@ -1,16 +1,16 @@
 use tabled::{
     formatting_settings::{AlignmentStrategy, TabSize, TrimStrategy},
     object::{Cell, Segment},
-    Alignment, Modify, Span, Style, Table,
+    Alignment, Modify, Span, Style,
 };
 
-use crate::util::{create_vector, test_table};
+use crate::util::{create_vector, new_table, test_table};
 
 mod util;
 
 test_table!(
     alignment_per_line,
-    Table::new(multiline_data1())
+    new_table(multiline_data1())
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Alignment::right()).with(AlignmentStrategy::PerLine)),
     "         N | column 0 | column 1 | column 2 "
@@ -32,7 +32,7 @@ test_table!(
 
 test_table!(
     alignment_per_line_with_trim_0,
-    Table::new(multiline_data1())
+    new_table(multiline_data1())
         .with(Style::psql())
         .with(Modify::new(Segment::all())
             .with(Alignment::right())
@@ -57,7 +57,7 @@ test_table!(
 
 test_table!(
     alignment_per_line_with_trim_1,
-    Table::new(multiline_data2())
+    new_table(multiline_data2())
         .with(Style::psql())
         .with(Modify::new(Segment::all())
             .with(Alignment::center_vertical())
@@ -85,7 +85,7 @@ test_table!(
 
 test_table!(
     tab_size_test,
-    Table::new(tab_data1()).with(Style::psql()),
+    new_table(tab_data1()).with(Style::psql()),
     "          N           | column 0 |   column 1   | column 2 "
     "----------------------+----------+--------------+----------"
     "          0           |   0-0    |     0-1      |   0-2    "
@@ -100,7 +100,7 @@ test_table!(
 
 test_table!(
     tab_size_test_0,
-    Table::new(tab_data1()).with(Style::psql()),
+    new_table(tab_data1()).with(Style::psql()),
     "          N           | column 0 |   column 1   | column 2 "
     "----------------------+----------+--------------+----------"
     "          0           |   0-0    |     0-1      |   0-2    "
@@ -115,7 +115,7 @@ test_table!(
 
 test_table!(
     tab_size_test_1,
-    Table::new(tab_data1()).with(Style::psql()).with(Modify::new(Segment::all()).with(Alignment::right())).with(TabSize(2)),
+    new_table(tab_data1()).with(Style::psql()).with(Modify::new(Segment::all()).with(Alignment::right())).with(TabSize(2)),
     "                N | column 0 |   column 1 | column 2 "
     "------------------+----------+------------+----------"
     "                0 |      0-0 |        0-1 |      0-2 "
@@ -130,7 +130,7 @@ test_table!(
 
 test_table!(
     tab_size_test_2,
-    Table::new(tab_data1()).with(Style::psql()).with(Modify::new(Segment::all()).with(Alignment::right())).with(TabSize(0)),
+    new_table(tab_data1()).with(Style::psql()).with(Modify::new(Segment::all()).with(Alignment::right())).with(TabSize(0)),
     "            N | column 0 | column 1 | column 2 "
     "--------------+----------+----------+----------"
     "            0 |      0-0 |      0-1 |      0-2 "
@@ -145,7 +145,7 @@ test_table!(
 
 test_table!(
     tab_size_span_test,
-    Table::new(tab_data2())
+    new_table(tab_data2())
         .with(Style::psql())
         .with(Modify::new(Cell(0, 0)).with(Span::column(3)))
         .with(Modify::new(Cell(1, 0)).with(Span::column(2)))
@@ -164,7 +164,7 @@ test_table!(
 
 test_table!(
     test_top_alignment_and_vertical_trim_1,
-    Table::new(&["   \n\n\n    Hello World"])
+    new_table(&["   \n\n\n    Hello World"])
         .with(Style::modern())
         .with(Modify::new(Segment::all()).with(Alignment::top()).with(TrimStrategy::Vertical)),
     "┌─────────────────┐"
@@ -180,7 +180,7 @@ test_table!(
 #[cfg(feature = "color")]
 test_table!(
     trim_colored_string_test_2,
-    Table::new(colored_data())
+    new_table(colored_data())
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Alignment::right()).with(TrimStrategy::None)),
     "         N | column 0 | column 1 | column 2 "
@@ -203,7 +203,7 @@ test_table!(
 #[cfg(feature = "color")]
 test_table!(
     trim_colored_string_test_1,
-    Table::new(colored_data())
+    new_table(colored_data())
         .with(Style::psql())
         .with(
             Modify::new(Segment::all())
@@ -230,7 +230,7 @@ test_table!(
 #[cfg(feature = "color")]
 test_table!(
     trim_colored_string_test_0,
-    Table::new(colored_data())
+    new_table(colored_data())
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Alignment::right()).with(TrimStrategy::Horizontal)),
     "         N | column 0 | column 1 | column 2 "
diff --git a/tests/rotate_test.rs b/tests/rotate_test.rs
index 6e2dd8e..5cd0de2 100644
--- a/tests/rotate_test.rs
+++ b/tests/rotate_test.rs
@@ -3,16 +3,16 @@
 use tabled::{
     object::{Cell, Rows},
     style::Border,
-    Highlight, Rotate, Table,
+    Highlight, Rotate,
 };
 
-use crate::util::test_table;
+use crate::util::{new_table, test_table};
 
 mod util;
 
 #[test]
 fn test_rotate() {
-    let table = || Table::new([(123, 456, 789), (234, 567, 891)]);
+    let table = || new_table([(123, 456, 789), (234, 567, 891)]);
 
     assert_eq!(
         table()
@@ -59,7 +59,7 @@ fn test_rotate() {
 
 test_table!(
     test_3x3_box_0,
-    Table::new([(123, 456, 789), (234, 567, 891)]).with(Rotate::Left),
+    new_table([(123, 456, 789), (234, 567, 891)]).with(Rotate::Left),
     "+-----+-----+-----+"
     "| i32 | 789 | 891 |"
     "+-----+-----+-----+"
@@ -71,7 +71,7 @@ test_table!(
 
 test_table!(
     test_3x3_box_1,
-    Table::new([(123, 456, 789), (234, 567, 891)]).with(Rotate::Left).with(Rotate::Right).with(Rotate::Right),
+    new_table([(123, 456, 789), (234, 567, 891)]).with(Rotate::Left).with(Rotate::Right).with(Rotate::Right),
     "+-----+-----+-----+"
     "| 234 | 123 | i32 |"
     "+-----+-----+-----+"
@@ -83,7 +83,7 @@ test_table!(
 
 test_table!(
     test_left_rotate,
-    Table::new([(123, 456, 789), (234, 567, 891), (111, 222, 333)]).with(Rotate::Left),
+    new_table([(123, 456, 789), (234, 567, 891), (111, 222, 333)]).with(Rotate::Left),
     "+-----+-----+-----+-----+"
     "| i32 | 789 | 891 | 333 |"
     "+-----+-----+-----+-----+"
@@ -95,7 +95,7 @@ test_table!(
 
 test_table!(
     test_right_rotate,
-    Table::new([(123, 456, 789), (234, 567, 891), (111, 222, 333)]).with(Rotate::Right),
+    new_table([(123, 456, 789), (234, 567, 891), (111, 222, 333)]).with(Rotate::Right),
     "+-----+-----+-----+-----+"
     "| 111 | 234 | 123 | i32 |"
     "+-----+-----+-----+-----+"
@@ -107,7 +107,7 @@ test_table!(
 
 test_table!(
     test_bottom_rotate,
-    Table::new([(123, 456, 789), (234, 567, 891), (111, 222, 333)]).with(Rotate::Bottom),
+    new_table([(123, 456, 789), (234, 567, 891), (111, 222, 333)]).with(Rotate::Bottom),
     "+-----+-----+-----+"
     "| 111 | 222 | 333 |"
     "+-----+-----+-----+"
@@ -121,7 +121,7 @@ test_table!(
 
 test_table!(
     test_top_rotate,
-    Table::new([(123, 456, 789), (234, 567, 891), (111, 222, 333)]).with(Rotate::Top),
+    new_table([(123, 456, 789), (234, 567, 891), (111, 222, 333)]).with(Rotate::Top),
     "+-----+-----+-----+"
     "| 111 | 222 | 333 |"
     "+-----+-----+-----+"
@@ -135,7 +135,7 @@ test_table!(
 
 test_table!(
     rotate_preserve_border_styles_test_0,
-    Table::new([(123, 456, 789), (234, 567, 891), (111, 222, 333)])
+    new_table([(123, 456, 789), (234, 567, 891), (111, 222, 333)])
         .with(Highlight::new(Rows::single(0), Border::default().top('*')))
         .with(Rotate::Left),
     "******+-----+-----+-----+"
@@ -153,7 +153,7 @@ test_table!(
 // todo: determine if it's correct
 test_table!(
     rotate_preserve_border_styles_test_1,
-    Table::new([(123, 456, 789), (234, 567, 891), (111, 222, 333)])
+    new_table([(123, 456, 789), (234, 567, 891), (111, 222, 333)])
         .with(Highlight::new(Cell(0, 2), Border::default().bottom('*')))
         .with(Rotate::Left),
     "+-----+*****+-----+-----+"
diff --git a/tests/span_test.rs b/tests/span_test.rs
index 8de591e..82a3191 100644
--- a/tests/span_test.rs
+++ b/tests/span_test.rs
@@ -1,15 +1,15 @@
 use tabled::{
     object::{Cell, Columns, Segment},
-    Alignment, Modify, Padding, Panel, Span, Style, Table,
+    Alignment, Modify, Padding, Panel, Span, Style,
 };
 
-use crate::util::{create_vector, static_table, test_table};
+use crate::util::{create_table, init_table, new_table, static_table, test_table};
 
 mod util;
 
 test_table!(
     span_column_test_0,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Columns::single(0)).with(Span::column(2))),
@@ -22,7 +22,7 @@ test_table!(
 
 test_table!(
     span_column_test_1,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Columns::new(1..2)).with(Span::column(2))),
@@ -35,7 +35,7 @@ test_table!(
 
 test_table!(
     span_column_test_2,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Columns::single(0)).with(Span::column(4))),
@@ -48,7 +48,7 @@ test_table!(
 
 test_table!(
     cell_span_test_0,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Cell(0, 0)).with(Span::column(2))),
@@ -61,7 +61,7 @@ test_table!(
 
 test_table!(
     cell_span_test_1,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Cell(1, 0)).with(Span::column(2))),
@@ -74,7 +74,7 @@ test_table!(
 
 test_table!(
     cell_span_test_2,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Cell(2, 0)).with(Span::column(2))),
     " N | column 0 | column 1 | column 2 "
@@ -86,7 +86,7 @@ test_table!(
 
 test_table!(
     cell_span_test_3,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Cell(3, 0)).with(Span::column(2))),
@@ -99,7 +99,7 @@ test_table!(
 
 test_table!(
     cell_span_test_4,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Cell(0, 1)).with(Span::column(2))),
@@ -112,7 +112,7 @@ test_table!(
 
 test_table!(
     cell_span_test_5,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Cell(1, 1)).with(Span::column(2))),
@@ -125,7 +125,7 @@ test_table!(
 
 test_table!(
     cell_span_test_6,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Cell(2, 1)).with(Span::column(2))),
@@ -138,7 +138,7 @@ test_table!(
 
 test_table!(
     cell_span_test_7,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Cell(3, 1)).with(Span::column(2))),
@@ -151,7 +151,7 @@ test_table!(
 
 test_table!(
     cell_span_test_8,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Cell(0, 2)).with(Span::column(2))),
     " N | column 0 | column 1  "
@@ -163,7 +163,7 @@ test_table!(
 
 test_table!(
     cell_span_test_9,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Cell(1, 2)).with(Span::column(2))),
     " N | column 0 | column 1 | column 2 "
@@ -175,7 +175,7 @@ test_table!(
 
 test_table!(
     cell_span_test_10,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Cell(2, 2)).with(Span::column(2))),
     " N | column 0 | column 1 | column 2 "
@@ -187,7 +187,7 @@ test_table!(
 
 test_table!(
     cell_span_test_11,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Cell(3, 2)).with(Span::column(2))),
     " N | column 0 | column 1 | column 2 "
@@ -199,11 +199,7 @@ test_table!(
 
 test_table!(
     span_multiline,
-    Table::new({
-            let mut data = create_vector::<3, 3>();
-            data[2][2] = String::from("https://\nwww\n.\nredhat\n.com\n/en");
-            data
-        })
+    init_table::<3, 3, _, _>([((2, 2), "https://\nwww\n.\nredhat\n.com\n/en")])
         .with(Style::psql())
         .with(Modify::new(Cell(3, 2)).with(Span::column(2))),
     " N | column 0 | column 1 | column 2 "
@@ -220,7 +216,7 @@ test_table!(
 
 test_table!(
     indent_works_in_spaned_columns,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Padding::new(3, 0, 0, 0)))
         .with(Modify::new(Segment::all()).with(Alignment::left()))
@@ -235,7 +231,7 @@ test_table!(
 
 test_table!(
     spaned_columns_with_colision,
-    Table::new([["just 1 column"; 5]; 5])
+    new_table([["just 1 column"; 5]; 5])
         .with(Style::modern())
         .with(
             Modify::new(Cell(0, 0))
@@ -289,7 +285,7 @@ test_table!(
 
 test_table!(
     span_with_panel_test_0,
-    Table::new([[1, 2, 3]])
+    new_table([[1, 2, 3]])
         .with(Panel("Tabled Releases", 0))
         .with(Modify::new(Cell(1, 0)).with(Span::column(2)))
         .with(Style::ascii()),
@@ -304,7 +300,7 @@ test_table!(
 
 test_table!(
     span_with_panel_test_1,
-    Table::new([[1, 2, 3], [4, 5, 6]])
+    new_table([[1, 2, 3], [4, 5, 6]])
         .with(Panel("Tabled Releases", 0))
         .with(Modify::new(Cell(2, 0)).with(Span::column(2)))
         .with(Style::ascii()),
@@ -321,7 +317,7 @@ test_table!(
 
 test_table!(
     span_with_panel_test_2,
-    Table::new([[1, 2, 3], [4, 5, 6]])
+    new_table([[1, 2, 3], [4, 5, 6]])
         .with(Panel("Tabled Releases", 0))
         .with(Modify::new(Cell(1, 0)).with(Span::column(2)))
         .with(Modify::new(Cell(2, 0)).with(Span::column(2)))
@@ -339,7 +335,7 @@ test_table!(
 
 test_table!(
     span_with_panel_with_correction_test_0,
-    Table::new([[1, 2, 3]])
+    new_table([[1, 2, 3]])
         .with(Panel("Tabled Releases", 0))
         .with(Modify::new(Cell(1, 0)).with(Span::column(2)))
         .with(Style::ascii())
@@ -355,7 +351,7 @@ test_table!(
 
 test_table!(
     span_with_panel_with_correction_test_1,
-    Table::new([[1, 2, 3], [4, 5, 6]])
+    new_table([[1, 2, 3], [4, 5, 6]])
         .with(Panel("Tabled Releases", 0))
         .with(Modify::new(Cell(2, 0)).with(Span::column(2)))
         .with(Style::ascii())
@@ -373,7 +369,7 @@ test_table!(
 
 test_table!(
     span_with_panel_with_correction_test_2,
-    Table::new([[1, 2, 3], [4, 5, 6]])
+    new_table([[1, 2, 3], [4, 5, 6]])
         .with(Panel("Tabled Releases", 0))
         .with(Modify::new(Cell(1, 0)).with(Span::column(2)))
         .with(Modify::new(Cell(2, 0)).with(Span::column(2)))
@@ -396,8 +392,7 @@ test_table!(
 fn span_column_exceeds_boundries_test() {
     // todo: determine if it's the right behaiviour
 
-    let data = create_vector::<3, 3>();
-    Table::new(&data)
+    create_table::<3, 3>()
         .with(Modify::new(Columns::single(0)).with(Span::column(100)))
         .to_string();
 }
@@ -409,8 +404,7 @@ fn span_cell_exceeds_boundries_test() {
     //
     // todo: determine if it's the right behaiviour
 
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Cell(0, 0)).with(Span::column(20)))
@@ -427,8 +421,7 @@ fn span_cell_exceeds_boundries_test() {
         )
     );
 
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Cell(1, 1)).with(Span::column(20)))
@@ -445,8 +438,7 @@ fn span_cell_exceeds_boundries_test() {
         )
     );
 
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Cell(1, 0)).with(Span::column(20)))
@@ -467,9 +459,7 @@ fn span_cell_exceeds_boundries_test() {
 #[test]
 #[ignore = "span zero not yet decided"]
 fn span_zero_test() {
-    let data = create_vector::<3, 3>();
-
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Cell(0, 0)).with(Span::column(0)))
         .to_string();
@@ -485,7 +475,7 @@ fn span_zero_test() {
         )
     );
 
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Cell(0, 1)).with(Span::column(0)))
         .to_string();
@@ -501,7 +491,7 @@ fn span_zero_test() {
         )
     );
 
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Cell(0, 2)).with(Span::column(0)))
         .to_string();
@@ -517,7 +507,7 @@ fn span_zero_test() {
         )
     );
 
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Cell(0, 3)).with(Span::column(0)))
         .to_string();
@@ -533,7 +523,7 @@ fn span_zero_test() {
         )
     );
 
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Cell(0, 4)).with(Span::column(0)))
         .to_string();
@@ -549,7 +539,7 @@ fn span_zero_test() {
         )
     );
 
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::psql())
         .with(Modify::new(Cell(0, 0)).with(Span::column(0)))
         .with(Modify::new(Cell(1, 1)).with(Span::column(0)))
@@ -573,9 +563,7 @@ fn span_zero_test() {
 #[test]
 #[ignore = "span zero not yet decided"]
 fn span_all_table_to_zero_test() {
-    let data = create_vector::<2, 2>();
-
-    let table = Table::new(&data)
+    let table = create_table::<2, 2>()
         .with(Style::psql())
         .with(Modify::new(Segment::all()).with(Span::column(0)))
         .to_string();
diff --git a/tests/style_test.rs b/tests/style_test.rs
index 04cec96..4b57591 100644
--- a/tests/style_test.rs
+++ b/tests/style_test.rs
@@ -1,19 +1,19 @@
 use std::iter::FromIterator;
 
-use crate::util::{create_vector, static_table, test_table};
+use crate::util::{create_table, init_table, static_table, test_table};
 
 use tabled::{
     builder::Builder,
     object::{Cell, Columns, Rows, Segment},
     style::{Border, BorderText, Line, RawStyle},
-    Highlight, Modify, Padding, Span, Style, Table, TableIteratorExt,
+    Highlight, Modify, Padding, Span, Style,
 };
 
 mod util;
 
 test_table!(
     default_style,
-    Table::new(create_vector::<3, 3>()).with(Style::ascii()),
+    create_table::<3, 3>().with(Style::ascii()),
     "+---+----------+----------+----------+"
     "| N | column 0 | column 1 | column 2 |"
     "+---+----------+----------+----------+"
@@ -27,7 +27,7 @@ test_table!(
 
 test_table!(
     psql_style,
-    Table::new(create_vector::<3, 3>()).with(Style::psql()),
+    create_table::<3, 3>().with(Style::psql()),
     " N | column 0 | column 1 | column 2 "
     "---+----------+----------+----------"
     " 0 |   0-0    |   0-1    |   0-2    "
@@ -37,7 +37,7 @@ test_table!(
 
 test_table!(
     markdown_style,
-    Table::new(create_vector::<3, 3>()).with(Style::markdown()),
+    create_table::<3, 3>().with(Style::markdown()),
     "| N | column 0 | column 1 | column 2 |"
     "|---|----------|----------|----------|"
     "| 0 |   0-0    |   0-1    |   0-2    |"
@@ -47,7 +47,7 @@ test_table!(
 
 test_table!(
     modern_style,
-    Table::new(create_vector::<3, 3>()).with(Style::modern()),
+    create_table::<3, 3>().with(Style::modern()),
     "┌───┬──────────┬──────────┬──────────┐"
     "│ N │ column 0 │ column 1 │ column 2 │"
     "├───┼──────────┼──────────┼──────────┤"
@@ -61,7 +61,7 @@ test_table!(
 
 test_table!(
     rounded_style,
-    Table::new(create_vector::<3, 3>()).with(Style::rounded()),
+    create_table::<3, 3>().with(Style::rounded()),
     "╭───┬──────────┬──────────┬──────────╮"
     "│ N │ column 0 │ column 1 │ column 2 │"
     "├───┼──────────┼──────────┼──────────┤"
@@ -73,7 +73,7 @@ test_table!(
 
 test_table!(
     modern_clean_style,
-    Table::new(create_vector::<3, 3>()).with(Style::modern().off_horizontal().lines(vec![(1, Style::modern().get_horizontal())])),
+    create_table::<3, 3>().with(Style::modern().off_horizontal().lines(vec![(1, Style::modern().get_horizontal())])),
     "┌───┬──────────┬──────────┬──────────┐"
     "│ N │ column 0 │ column 1 │ column 2 │"
     "├───┼──────────┼──────────┼──────────┤"
@@ -85,7 +85,7 @@ test_table!(
 
 test_table!(
     blank_style,
-    Table::new(create_vector::<3, 3>()).with(Style::blank()),
+    create_table::<3, 3>().with(Style::blank()),
     " N   column 0   column 1   column 2 "
     " 0     0-0        0-1        0-2    "
     " 1     1-0        1-1        1-2    "
@@ -94,7 +94,7 @@ test_table!(
 
 test_table!(
     extended_style,
-    Table::new(create_vector::<3, 3>()).with(Style::extended()),
+    create_table::<3, 3>().with(Style::extended()),
     "╔═══╦══════════╦══════════╦══════════╗"
     "║ N ║ column 0 ║ column 1 ║ column 2 ║"
     "╠═══╬══════════╬══════════╬══════════╣"
@@ -108,7 +108,7 @@ test_table!(
 
 test_table!(
     ascii_dots_style,
-    Table::new(create_vector::<3, 3>()).with(Style::dots()),
+    create_table::<3, 3>().with(Style::dots()),
     "......................................"
     ": N : column 0 : column 1 : column 2 :"
     ":...:..........:..........:..........:"
@@ -122,7 +122,7 @@ test_table!(
 
 test_table!(
     re_structured_text_style,
-    Table::new(create_vector::<3, 3>()).with(Style::re_structured_text()),
+    create_table::<3, 3>().with(Style::re_structured_text()),
     "=== ========== ========== =========="
     " N   column 0   column 1   column 2 "
     "=== ========== ========== =========="
@@ -134,7 +134,7 @@ test_table!(
 
 test_table!(
     ascii_rounded_style,
-    Table::new(create_vector::<3, 3>()).with(Style::ascii_rounded()),
+    create_table::<3, 3>().with(Style::ascii_rounded()),
     ".------------------------------------."
     "| N | column 0 | column 1 | column 2 |"
     "| 0 |   0-0    |   0-1    |   0-2    |"
@@ -145,7 +145,7 @@ test_table!(
 
 test_table!(
     style_head_changes,
-    Table::new(create_vector::<3, 3>()).with(Style::modern().off_horizontal()),
+    create_table::<3, 3>().with(Style::modern().off_horizontal()),
     "┌───┬──────────┬──────────┬──────────┐"
     "│ N │ column 0 │ column 1 │ column 2 │"
     "│ 0 │   0-0    │   0-1    │   0-2    │"
@@ -156,7 +156,7 @@ test_table!(
 
 test_table!(
     style_frame_changes,
-    Table::new(create_vector::<3, 3>()).with(Style::modern().off_top().off_bottom().off_horizontal()),
+    create_table::<3, 3>().with(Style::modern().off_top().off_bottom().off_horizontal()),
     "│ N │ column 0 │ column 1 │ column 2 │"
     "│ 0 │   0-0    │   0-1    │   0-2    │"
     "│ 1 │   1-0    │   1-1    │   1-2    │"
@@ -165,7 +165,7 @@ test_table!(
 
 test_table!(
     custom_style,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::blank()
             .bottom('*')
             .bottom_intersection('\'')
@@ -185,7 +185,7 @@ test_table!(
 
 test_table!(
     style_single_cell_0,
-    Table::new(create_vector::<0, 0>()),
+    create_table::<0, 0>(),
     "+---+"
     "| N |"
     "+---+"
@@ -193,13 +193,13 @@ test_table!(
 
 test_table!(
     style_single_cell_1,
-    Table::new(create_vector::<0, 0>()).with(Style::blank()),
+    create_table::<0, 0>().with(Style::blank()),
     " N "
 );
 
 test_table!(
     top_border_override_first_test,
-    Table::new(create_vector::<2, 2>()).with(BorderText::first("-Table")),
+    create_table::<2, 2>().with(BorderText::first("-Table")),
     "-Table---------+----------+"
     "| N | column 0 | column 1 |"
     "+---+----------+----------+"
@@ -211,7 +211,7 @@ test_table!(
 
 test_table!(
     top_border_override_last_test,
-    Table::new(create_vector::<2, 2>()).with(BorderText::last("-Table")),
+    create_table::<2, 2>().with(BorderText::last("-Table")),
     "+---+----------+----------+"
     "| N | column 0 | column 1 |"
     "+---+----------+----------+"
@@ -223,7 +223,7 @@ test_table!(
 
 test_table!(
     top_border_override_new_test,
-    Table::new(create_vector::<2, 2>())
+    create_table::<2, 2>()
         .with(BorderText::new(1, "-Table"))
         .with(BorderText::new(2, "-Table")),
     "+---+----------+----------+"
@@ -237,7 +237,7 @@ test_table!(
 
 test_table!(
     top_border_override_new_doesnt_panic_when_index_is_invalid,
-    Table::new(create_vector::<2, 2>()).with(BorderText::new(100, "-Table")),
+    create_table::<2, 2>().with(BorderText::new(100, "-Table")),
     "+---+----------+----------+"
     "| N | column 0 | column 1 |"
     "+---+----------+----------+"
@@ -249,7 +249,7 @@ test_table!(
 
 test_table!(
     top_override_doesnt_work_with_style_with_no_top_border_test,
-    Table::new(create_vector::<2, 2>())
+    create_table::<2, 2>()
         .with(Style::psql())
         .with(BorderText::first("-Table")),
     " N | column 0 | column 1 "
@@ -260,7 +260,7 @@ test_table!(
 
 test_table!(
     top_border_override_cleared_after_restyling_test,
-    Table::new(create_vector::<2, 2>())
+    create_table::<2, 2>()
         .with(BorderText::first("-Table"))
         .with(Style::ascii()),
     "+---+----------+----------+"
@@ -274,7 +274,7 @@ test_table!(
 
 test_table!(
     top_border_override_with_big_string_test,
-    Table::new(create_vector::<2, 2>())
+    create_table::<2, 2>()
         .with(BorderText::first("-Tableeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1231")),
     "-Tableeeeeeeeeeeeeeeeeeeeee"
     "| N | column 0 | column 1 |"
@@ -287,7 +287,7 @@ test_table!(
 
 test_table!(
     empty_style,
-    Table::new(create_vector::<3, 3>())
+    create_table::<3, 3>()
         .with(Style::empty())
         .with(Modify::new(Segment::all()).with(Padding::zero())),
     "Ncolumn 0column 1column 2"
@@ -298,7 +298,7 @@ test_table!(
 
 test_table!(
     single_column_style_0,
-    Table::new(create_vector::<2, 0>()).with(Style::modern()),
+    create_table::<2, 0>().with(Style::modern()),
     "┌───┐"
     "│ N │"
     "├───┤"
@@ -310,7 +310,7 @@ test_table!(
 
 test_table!(
     single_column_style_1,
-    Table::new(create_vector::<2, 0>()).with(Style::blank()),
+    create_table::<2, 0>().with(Style::blank()),
     " N "
     " 0 "
     " 1 "
@@ -318,7 +318,7 @@ test_table!(
 
 test_table!(
     single_column_last_row_style,
-    Table::new(create_vector::<3, 0>()).with(Style::re_structured_text()),
+    create_table::<3, 0>().with(Style::re_structured_text()),
     "==="
     " N "
     "==="
@@ -338,7 +338,7 @@ test_table!(
 
 test_table!(
     border_test_0,
-    Table::new(create_vector::<2, 2>()).with(Modify::new(Rows::single(1)).with(Border::filled('*').top('#'))),
+    create_table::<2, 2>().with(Modify::new(Rows::single(1)).with(Border::filled('*').top('#'))),
     "+---+----------+----------+"
     "| N | column 0 | column 1 |"
     "*###*##########*##########*"
@@ -350,7 +350,7 @@ test_table!(
 
 test_table!(
     border_test_1,
-    Table::new(create_vector::<2, 2>())
+    create_table::<2, 2>()
         .with(Style::empty())
         .with(Modify::new(Rows::single(1)).with(Border::filled('*').top('#'))),
     "  N   column 0   column 1  "
@@ -362,7 +362,7 @@ test_table!(
 
 test_table!(
     style_frame_test_0,
-    Table::new(create_vector::<2, 2>()).with(Highlight::new(Rows::single(1), Style::modern().frame())),
+    create_table::<2, 2>().with(Highlight::new(Rows::single(1), Style::modern().frame())),
     "+---+----------+----------+"
     "| N | column 0 | column 1 |"
     "┌─────────────────────────┐"
@@ -374,7 +374,7 @@ test_table!(
 
 test_table!(
     style_frame_test_1,
-    Table::new(create_vector::<2, 2>())
+    create_table::<2, 2>()
         .with(Style::blank())
         .with(Highlight::new(Rows::single(0), Style::extended().frame()))
         .with(Highlight::new(Rows::single(2), Style::extended().frame())),
@@ -389,7 +389,7 @@ test_table!(
 
 test_table!(
     single_column_off_horizontal_test,
-    Table::new(create_vector::<3, 0>()).with(Style::ascii().off_horizontal().off_vertical()),
+    create_table::<3, 0>().with(Style::ascii().off_horizontal().off_vertical()),
     "+---+"
     "| N |"
     "| 0 |"
@@ -400,7 +400,7 @@ test_table!(
 
 test_table!(
     single_row_test,
-    Table::new(create_vector::<0, 3>()).with(Style::modern()),
+    create_table::<0, 3>().with(Style::modern()),
     "┌───┬──────────┬──────────┬──────────┐"
     "│ N │ column 0 │ column 1 │ column 2 │"
     "└───┴──────────┴──────────┴──────────┘"
@@ -408,7 +408,7 @@ test_table!(
 
 test_table!(
     empty_border_text_doesnt_panic_test,
-    Table::new(create_vector::<2, 2>()).with(BorderText::first("")),
+    create_table::<2, 2>().with(BorderText::first("")),
     "+---+----------+----------+"
     "| N | column 0 | column 1 |"
     "+---+----------+----------+"
@@ -420,7 +420,7 @@ test_table!(
 
 test_table!(
     span_correct_test_0,
-    Table::new(create_vector::<6, 4>())
+    create_table::<6, 4>()
         .with(Modify::new(Cell(0, 3)).with(Span::column(2)))
         .with(Modify::new(Cell(1, 0)).with(Span::column(3)))
         .with(Modify::new(Cell(2, 0)).with(Span::column(2)))
@@ -449,7 +449,7 @@ test_table!(
 
 test_table!(
     span_correct_test_1,
-    Table::new(create_vector::<6, 4>())
+    create_table::<6, 4>()
         .with(Modify::new(Cell(0, 0)).with(Span::column(5)))
         .with(Modify::new(Cell(1, 0)).with(Span::column(3)))
         .with(Modify::new(Cell(2, 0)).with(Span::column(2)))
@@ -478,11 +478,7 @@ test_table!(
 
 test_table!(
     style_settings_usage_test_0,
-    Table::new({
-            let mut data = create_vector::<3, 3>();
-            data[0][1] = "a longer string".to_owned();
-            data
-        })
+    init_table::<3, 3, _, _>([((0, 1), "a longer string")])
         .with({
             let mut style: RawStyle = Style::modern().into();
             style
@@ -508,11 +504,8 @@ test_table!(
 
 test_table!(
     style_settings_usage_test_1,
-    Table::new({
-        let mut data = create_vector::<3, 3>();
-        data[0][1] = "a longer string".to_owned();
-        data
-        }).with({
+    init_table::<3, 3, _, _>([((0, 1), "a longer string")])
+        .with({
             let mut style: RawStyle = Style::modern().into();
             style.set_bottom(None);
             style
@@ -530,11 +523,8 @@ test_table!(
 
 test_table!(
     style_settings_usage_test_2,
-    Table::new({
-        let mut data = create_vector::<3, 3>();
-        data[0][1] = "a longer string".to_owned();
-        data
-    }).with({
+    init_table::<3, 3, _, _>([((0, 1), "a longer string")])
+        .with({
             let mut style: RawStyle = Style::modern().into();
             style.set_bottom(None);
             style
@@ -553,7 +543,7 @@ test_table!(
 
 test_table!(
     border_none_test_0,
-    Table::new(create_vector::<2, 2>())
+    create_table::<2, 2>()
         .with(Style::ascii())
         .with(Modify::new(Rows::single(1)).with(Border::filled('*').top('#')))
         .with(Modify::new(Rows::single(1)).with(Border::none())),
@@ -568,7 +558,7 @@ test_table!(
 
 test_table!(
     border_none_test_1,
-    Table::new(create_vector::<2, 2>())
+    create_table::<2, 2>()
         .with(Style::empty())
         .with(Modify::new(Rows::single(1)).with(Border::filled('*').top('#')))
         .with(Modify::new(Columns::single(1)).with(Border::none())),
@@ -583,8 +573,7 @@ test_table!(
 fn custom_style_test() {
     macro_rules! test_style {
         ($style:expr, $expected:expr $(,)*) => {
-            let data = create_vector::<3, 3>();
-            let table = data.table().with($style).to_string();
+            let table = create_table::<3, 3>().with($style).to_string();
             assert_eq!(table, $expected);
         };
     }
@@ -1424,10 +1413,7 @@ fn custom_style_test() {
 fn test_default_border_usage() {
     macro_rules! test_border {
         ($modify:expr, $expected:expr) => {
-            let mut data = create_vector::<3, 3>();
-            data[0][1] = "a longer string".to_owned();
-
-            let table = Table::new(&data)
+            let table = init_table::<3, 3, _, _>([((0, 1), "a longer string")])
                 .with(Style::empty())
                 .with($modify)
                 .to_string();
@@ -1902,8 +1888,7 @@ fn border_colored_test() {
     use owo_colors::OwoColorize;
     use tabled::style::{BorderColored, Symbol};
 
-    let data = create_vector::<2, 2>();
-    let table = Table::new(&data)
+    let table = create_table::<2, 2>()
         .with(Style::ascii())
         .with(
             Modify::new(Rows::single(1)).with(
@@ -1939,7 +1924,7 @@ fn border_colored_test() {
         )
     );
 
-    let table = Table::new(&data)
+    let table = create_table::<2, 2>()
         .with(Style::empty())
         .with(
             Modify::new(Rows::single(1)).with(
@@ -1982,8 +1967,7 @@ fn style_with_color_test() {
         .set_vertical(Some(Symbol::ansi('|'.yellow().to_string()).unwrap()))
         .set_internal(Some(Symbol::ansi('+'.purple().to_string()).unwrap()));
 
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data).with(style).to_string();
+    let table = create_table::<3, 3>().with(style).to_string();
 
     assert_eq!(
         ansi_str::AnsiStr::ansi_strip(&table),
@@ -2005,7 +1989,7 @@ fn style_with_color_test() {
 
 test_table!(
     empty_line_clears_lines,
-    Table::new(create_vector::<3, 3>()).with(Style::rounded().lines(vec![(1, Line::empty())])),
+    create_table::<3, 3>().with(Style::rounded().lines(vec![(1, Line::empty())])),
     "╭───┬──────────┬──────────┬──────────╮"
     "│ N │ column 0 │ column 1 │ column 2 │"
     "│ 0 │   0-0    │   0-1    │   0-2    │"
@@ -2024,7 +2008,7 @@ test_table!(
 
         let color = Color::try_from(' '.on_green().to_string()).unwrap();
 
-        Table::new(create_vector::<3, 3>()).with(Style::psql()).with(color)
+        create_table::<3, 3>().with(Style::psql()).with(color)
     },
     " N \u{1b}[42m|\u{1b}[49m column 0 \u{1b}[42m|\u{1b}[49m column 1 \u{1b}[42m|\u{1b}[49m column 2 \n\u{1b}[42m---+----------+----------+----------\u{1b}[49m\n 0 \u{1b}[42m|\u{1b}[49m   0-0    \u{1b}[42m|\u{1b}[49m   0-1    \u{1b}[42m|\u{1b}[49m   0-2    \n 1 \u{1b}[42m|\u{1b}[49m   1-0    \u{1b}[42m|\u{1b}[49m   1-1    \u{1b}[42m|\u{1b}[49m   1-2    \n 2 \u{1b}[42m|\u{1b}[49m   2-0    \u{1b}[42m|\u{1b}[49m   2-1    \u{1b}[42m|\u{1b}[49m   2-2    "
 );
@@ -2039,7 +2023,7 @@ test_table!(
 
         let color = Color::try_from(' '.on_green().to_string()).unwrap();
 
-        Table::new(create_vector::<3, 3>()).with(Style::psql()).with(Modify::new(Segment::all()).with(color))
+        create_table::<3, 3>().with(Style::psql()).with(Modify::new(Segment::all()).with(color))
     },
     " \u{1b}[42mN\u{1b}[49m | \u{1b}[42mcolumn 0\u{1b}[49m | \u{1b}[42mcolumn 1\u{1b}[49m | \u{1b}[42mcolumn 2\u{1b}[49m \n---+----------+----------+----------\n \u{1b}[42m0\u{1b}[49m |   \u{1b}[42m0-0\u{1b}[49m    |   \u{1b}[42m0-1\u{1b}[49m    |   \u{1b}[42m0-2\u{1b}[49m    \n \u{1b}[42m1\u{1b}[49m |   \u{1b}[42m1-0\u{1b}[49m    |   \u{1b}[42m1-1\u{1b}[49m    |   \u{1b}[42m1-2\u{1b}[49m    \n \u{1b}[42m2\u{1b}[49m |   \u{1b}[42m2-0\u{1b}[49m    |   \u{1b}[42m2-1\u{1b}[49m    |   \u{1b}[42m2-2\u{1b}[49m    "
 );
diff --git a/tests/table_test.rs b/tests/table_test.rs
index fec37a9..b4953e5 100644
--- a/tests/table_test.rs
+++ b/tests/table_test.rs
@@ -1,6 +1,6 @@
 use tabled::{Style, Table, Width};
 
-use crate::util::{create_vector, test_table};
+use crate::util::{create_table, test_table};
 
 mod util;
 
@@ -25,11 +25,11 @@ mod default_types {
         "+------+"
         "| char |"
         "+------+"
-        "|  a   |"
+        "| a    |"
         "+------+"
-        "|  b   |"
+        "| b    |"
         "+------+"
-        "|  c   |"
+        "| c    |"
         "+------+"
     );
 
@@ -53,11 +53,11 @@ mod default_types {
         "+-------+"
         "| usize |"
         "+-------+"
-        "|   0   |"
+        "| 0     |"
         "+-------+"
-        "|   1   |"
+        "| 1     |"
         "+-------+"
-        "|   2   |"
+        "| 2     |"
         "+-------+"
     );
 
@@ -67,11 +67,11 @@ mod default_types {
         "+-------+"
         "| isize |"
         "+-------+"
-        "|   0   |"
+        "| 0     |"
         "+-------+"
-        "|   1   |"
+        "| 1     |"
         "+-------+"
-        "|   2   |"
+        "| 2     |"
         "+-------+"
     );
 
@@ -95,11 +95,11 @@ mod default_types {
         "+-----+"
         "| u16 |"
         "+-----+"
-        "|  0  |"
+        "| 0   |"
         "+-----+"
-        "|  1  |"
+        "| 1   |"
         "+-----+"
-        "|  2  |"
+        "| 2   |"
         "+-----+"
     );
 
@@ -109,11 +109,11 @@ mod default_types {
         "+-----+"
         "| u32 |"
         "+-----+"
-        "|  0  |"
+        "| 0   |"
         "+-----+"
-        "|  1  |"
+        "| 1   |"
         "+-----+"
-        "|  2  |"
+        "| 2   |"
         "+-----+"
     );
 
@@ -123,11 +123,11 @@ mod default_types {
         "+-----+"
         "| u64 |"
         "+-----+"
-        "|  0  |"
+        "| 0   |"
         "+-----+"
-        "|  1  |"
+        "| 1   |"
         "+-----+"
-        "|  2  |"
+        "| 2   |"
         "+-----+"
     );
 
@@ -137,11 +137,11 @@ mod default_types {
         "+------+"
         "| u128 |"
         "+------+"
-        "|  0   |"
+        "| 0    |"
         "+------+"
-        "|  1   |"
+        "| 1    |"
         "+------+"
-        "|  2   |"
+        "| 2    |"
         "+------+"
     );
 
@@ -165,11 +165,11 @@ mod default_types {
         "+-----+"
         "| i16 |"
         "+-----+"
-        "|  0  |"
+        "| 0   |"
         "+-----+"
-        "|  1  |"
+        "| 1   |"
         "+-----+"
-        "|  2  |"
+        "| 2   |"
         "+-----+"
     );
 
@@ -179,11 +179,11 @@ mod default_types {
         "+-----+"
         "| i32 |"
         "+-----+"
-        "|  0  |"
+        "| 0   |"
         "+-----+"
-        "|  1  |"
+        "| 1   |"
         "+-----+"
-        "|  2  |"
+        "| 2   |"
         "+-----+"
     );
 
@@ -193,11 +193,11 @@ mod default_types {
         "+-----+"
         "| i64 |"
         "+-----+"
-        "|  0  |"
+        "| 0   |"
         "+-----+"
-        "|  1  |"
+        "| 1   |"
         "+-----+"
-        "|  2  |"
+        "| 2   |"
         "+-----+"
     );
 
@@ -207,11 +207,11 @@ mod default_types {
         "+------+"
         "| i128 |"
         "+------+"
-        "|  0   |"
+        "| 0    |"
         "+------+"
-        "|  1   |"
+        "| 1    |"
         "+------+"
-        "|  2   |"
+        "| 2    |"
         "+------+"
     );
 
@@ -234,7 +234,7 @@ test_table!(
     table_tuple,
     Table::new(&[("we are in", 2020)]),
     "+-----------+------+"
-    "|   &str    | i32  |"
+    "| &str      | i32  |"
     "+-----------+------+"
     "| we are in | 2020 |"
     "+-----------+------+"
@@ -254,17 +254,17 @@ test_table!(
     table_tuple_vec,
     Table::new(&[(0, "Monday"), (1, "Thursday")]),
     "+-----+----------+"
-    "| i32 |   &str   |"
+    "| i32 | &str     |"
     "+-----+----------+"
-    "|  0  |  Monday  |"
+    "| 0   | Monday   |"
     "+-----+----------+"
-    "|  1  | Thursday |"
+    "| 1   | Thursday |"
     "+-----+----------+"
 );
 
 test_table!(
     build_table_from_iterator,
-    Table::new(create_vector::<3, 3>()).with(Style::psql()),
+    create_table::<3, 3>().with(Style::psql()),
     " N | column 0 | column 1 | column 2 "
     "---+----------+----------+----------"
     " 0 |   0-0    |   0-1    |   0-2    "
@@ -277,7 +277,7 @@ test_table!(
     Table::new(&[["This is the 0.19 release of Nushell. If you'd like to read more about it, please check out: https://www.nushell.sh/blog/2020/09/01/nushell_0_19.html\r\n\r\nFor convenience, we are providing full builds for Windows, Linux, and macOS. These are the \"all extra features\" builds, so be sure you have the requirements to enable all capabilities: https://github.com/nushell/book/blob/master/en/installation.md#dependencies\r\n"]])
         .with(tabled::Style::modern()),
     r#"┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐"#
-    r#"│                                                                                                                                  0                                                                                                                                   │"#
+    r#"│ 0                                                                                                                                                                                                                                                                    │"#
     r#"├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤"#
     r#"│ This is the 0.19 release of Nushell. If you'd like to read more about it, please check out: https://www.nushell.sh/blog/2020/09/01/nushell_0_19.html                                                                                                                 │"#
     r#"│                                                                                                                                                                                                                                                                      │"#
@@ -292,7 +292,7 @@ test_table!(
         .with(tabled::Style::modern())
         .with(Width::wrap(100)),
     "┌──────────────────────────────────────────────────────────────────────────────────────────────────┐"
-    "│                                                0                                                 │"
+    "│ 0                                                                                                │"
     "├──────────────────────────────────────────────────────────────────────────────────────────────────┤"
     "│ This is the 0.19 release of Nushell. If you'd like to read more about it, please check out: http │"
     "│ s://www.nushell.sh/blog/2020/09/01/nushell_0_19.html                                             │"
@@ -361,11 +361,11 @@ mod derived {
         table_tuple_with_structure_vec,
         Table::new([(0, TestType { f1: 0, f2: "0str" }), (1, TestType { f1: 1, f2: "1str" })]),
         "+-----+----+------+"
-        "| i32 | f1 |  f2  |"
+        "| i32 | f1 | f2   |"
         "+-----+----+------+"
-        "|  0  | 0  | 0str |"
+        "| 0   | 0  | 0str |"
         "+-----+----+------+"
-        "|  1  | 1  | 1str |"
+        "| 1   | 1  | 1str |"
         "+-----+----+------+"
     );
 
@@ -421,15 +421,15 @@ mod derived {
         "+--------+-----------+-------+"
         "| Vowels | Consonant | Digit |"
         "+--------+-----------+-------+"
-        "|   +    |           |       |"
+        "| +      |           |       |"
         "+--------+-----------+-------+"
-        "|        |     +     |       |"
+        "|        | +         |       |"
         "+--------+-----------+-------+"
-        "|   +    |           |       |"
+        "| +      |           |       |"
         "+--------+-----------+-------+"
-        "|   +    |           |       |"
+        "| +      |           |       |"
         "+--------+-----------+-------+"
-        "|        |           |   +   |"
+        "|        |           | +     |"
         "+--------+-----------+-------+"
     );
 
@@ -468,13 +468,13 @@ mod derived {
         "+--------+-----------+"
         "| Vowels | Consonant |"
         "+--------+-----------+"
-        "|   +    |           |"
+        "| +      |           |"
         "+--------+-----------+"
-        "|        |     +     |"
+        "|        | +         |"
         "+--------+-----------+"
-        "|   +    |           |"
+        "| +      |           |"
         "+--------+-----------+"
-        "|   +    |           |"
+        "| +      |           |"
         "+--------+-----------+"
         "|        |           |"
         "+--------+-----------+"
@@ -499,11 +499,11 @@ mod derived {
         "+-----+---+----+"
         "| i32 | b | c  |"
         "+-----+---+----+"
-        "|  0  | 1 | s1 |"
+        "| 0   | 1 | s1 |"
         "+-----+---+----+"
-        "|  1  | 2 | s2 |"
+        "| 1   | 2 | s2 |"
         "+-----+---+----+"
-        "|  3  | 3 | s3 |"
+        "| 3   | 3 | s3 |"
         "+-----+---+----+"
     );
 
@@ -537,10 +537,10 @@ mod derived {
         }).with(Style::modern().off_horizontal()),
         // Note: It doesn't look good in VS Code
         "┌─────────┬────────────────┬───────────────┐"
-        "│  name   │  designed_by   │ invented_year │"
-        "│  C 💕   │ Dennis Ritchie │     1972      │"
-        "│ Rust 👍 │ Graydon Hoare  │     2010      │"
-        "│  Go 🧋  │    Rob Pike    │     2009      │"
+        "│ name    │ designed_by    │ invented_year │"
+        "│ C 💕    │ Dennis Ritchie │ 1972          │"
+        "│ Rust 👍 │ Graydon Hoare  │ 2010          │"
+        "│ Go 🧋   │ Rob Pike       │ 2009          │"
         "└─────────┴────────────────┴───────────────┘"
     );
 
@@ -600,13 +600,13 @@ mod derived {
             ]
         }),
         "+---------+----------------+---------------+"
-        "|  name   |  designed_by   | invented_year |"
+        "| name    | designed_by    | invented_year |"
         "+---------+----------------+---------------+"
-        "|  C 💕   | Dennis Ritchie |     1972      |"
+        "| C 💕    | Dennis Ritchie | 1972          |"
         "+---------+----------------+---------------+"
-        "| Rust 👍 | Graydon Hoare  |     2010      |"
+        "| Rust 👍 | Graydon Hoare  | 2010          |"
         "+---------+----------------+---------------+"
-        "|  Go 🧋  |    Rob Pike    |     2009      |"
+        "| Go 🧋   | Rob Pike       | 2009          |"
         "+---------+----------------+---------------+"
     );
 
@@ -632,15 +632,15 @@ mod derived {
             ]
         }),
         "+-----------------+----------+---------+----------+---------+"
-        "|      name       | Security | Embeded | Frontend | Unknown |"
+        "| name            | Security | Embeded | Frontend | Unknown |"
         "+-----------------+----------+---------+----------+---------+"
-        "| Terri Kshlerin  |          |    +    |          |         |"
+        "| Terri Kshlerin  |          | +       |          |         |"
         "+-----------------+----------+---------+----------+---------+"
-        "| Catalina Dicki  |    +     |         |          |         |"
+        "| Catalina Dicki  | +        |         |          |         |"
         "+-----------------+----------+---------+----------+---------+"
-        "| Jennie Schmeler |          |         |    +     |         |"
+        "| Jennie Schmeler |          |         | +        |         |"
         "+-----------------+----------+---------+----------+---------+"
-        "|  Maxim Zhiburt  |          |         |          |    +    |"
+        "| Maxim Zhiburt   |          |         |          | +       |"
         "+-----------------+----------+---------+----------+---------+"
 
     );
@@ -667,15 +667,15 @@ mod derived {
             ]
         }),
         "+-----------------+----------+---------+----------+---------+"
-        "|      name       | Security | Embeded | Frontend | Unknown |"
+        "| name            | Security | Embeded | Frontend | Unknown |"
         "+-----------------+----------+---------+----------+---------+"
-        "| Terri Kshlerin  |          |    +    |          |         |"
+        "| Terri Kshlerin  |          | +       |          |         |"
         "+-----------------+----------+---------+----------+---------+"
-        "| Catalina Dicki  |    +     |         |          |         |"
+        "| Catalina Dicki  | +        |         |          |         |"
         "+-----------------+----------+---------+----------+---------+"
-        "| Jennie Schmeler |          |         |    +     |         |"
+        "| Jennie Schmeler |          |         | +        |         |"
         "+-----------------+----------+---------+----------+---------+"
-        "|  Maxim Zhiburt  |          |         |          |    +    |"
+        "| Maxim Zhiburt   |          |         |          | +       |"
         "+-----------------+----------+---------+----------+---------+"
     );
 
@@ -706,13 +706,13 @@ mod derived {
             ]
         }),
         "+------------------------------------+-----------------+-------------------------------+--------+"
-        "|                name                |     author      |             text              | rating |"
+        "| name                               | author          | text                          | rating |"
         "+------------------------------------+-----------------+-------------------------------+--------+"
-        "| Rebase vs Merge commit in depth 👋 | Rose Kuphal DVM | A multiline                   |   43   |"
+        "| Rebase vs Merge commit in depth 👋 | Rose Kuphal DVM | A multiline                   | 43     |"
         "|                                    |                 |  text with 🤯 😳 🥵 🥶        |        |"
         "|                                    |                 |  a bunch of emojies ☄\u{fe0f} 💥 🔥 🌪 |        |"
         "+------------------------------------+-----------------+-------------------------------+--------+"
-        "|           Keep it simple           |     Unknown     |              🍳               |  100   |"
+        "| Keep it simple                     | Unknown         | 🍳                            | 100    |"
         "+------------------------------------+-----------------+-------------------------------+--------+"
     );
 }
@@ -730,7 +730,7 @@ fn multiline_table_test2() {
         ansi_str::AnsiStr::ansi_strip(&table.to_string()),
         util::static_table!(
             r#"┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐"#
-            r#"│                                                                                                                                  0                                                                                                                                   │"#
+            r#"│ 0                                                                                                                                                                                                                                                                    │"#
             r#"├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤"#
             r#"│ This is the 0.19 release of Nushell. If you'd like to read more about it, please check out: https://www.nushell.sh/blog/2020/09/01/nushell_0_19.html                                                                                                                 │"#
             r#"│                                                                                                                                                                                                                                                                      │"#
@@ -746,7 +746,7 @@ fn multiline_table_test2() {
         ansi_str::AnsiStr::ansi_strip(&table.to_string()),
         util::static_table!(
             "┌──────────────────────────────────────────────────────────────────────────────────────────────────┐"
-            "│                                                0                                                 │"
+            "│ 0                                                                                                │"
             "├──────────────────────────────────────────────────────────────────────────────────────────────────┤"
             "│ This is the 0.19 release of Nushell. If you'd like to read more about it, please check out: http │"
             "│ s://www.nushell.sh/blog/2020/09/01/nushell_0_19.html                                             │"
diff --git a/tests/util.rs b/tests/util.rs
index 6c678b5..f21b477 100644
--- a/tests/util.rs
+++ b/tests/util.rs
@@ -4,7 +4,49 @@
 
 use std::ops::{Index, IndexMut};
 
-use tabled::{papergrid::string_width_multiline, Tabled};
+use papergrid::Position;
+use tabled::{
+    object::SegmentAll, papergrid::string_width_multiline, Alignment, ModifyObject, Table, Tabled,
+};
+
+/// A helper table factory.
+///
+/// It uses center alignment by default, because it's more complex and may spot more issues.
+pub fn create_table<const ROWS: usize, const COLUMNS: usize>() -> Table {
+    init_table::<ROWS, COLUMNS, _, &str>(std::iter::empty())
+}
+
+pub fn init_table<const ROWS: usize, const COLUMNS: usize, I, S>(init: I) -> Table
+where
+    I: IntoIterator<Item = (Position, S)>,
+    S: Into<String>,
+{
+    let mut data = create_vector::<ROWS, COLUMNS>();
+    for (pos, value) in init {
+        data[pos.0][pos.1] = value.into();
+    }
+
+    new_table(data)
+}
+
+pub fn new_table<T: Tabled>(iter: impl IntoIterator<Item = T>) -> Table {
+    Table::new(iter).with(SegmentAll.modify().with(Alignment::center()))
+}
+
+pub fn create_vector<const ROWS: usize, const COLUMNS: usize>() -> Vec<Obj<COLUMNS>> {
+    let mut arr = Vec::with_capacity(ROWS);
+    for row in 0..ROWS {
+        let mut data = Vec::with_capacity(COLUMNS);
+        for column in 0..COLUMNS {
+            let text = format!("{}-{}", row, column);
+            data.push(text);
+        }
+
+        arr.push(Obj::new(row, data));
+    }
+
+    arr
+}
 
 #[derive(Debug)]
 pub struct Obj<const N: usize> {
@@ -47,21 +89,6 @@ impl<const N: usize> Tabled for Obj<N> {
     }
 }
 
-pub fn create_vector<const ROWS: usize, const COLUMNS: usize>() -> Vec<Obj<COLUMNS>> {
-    let mut arr = Vec::with_capacity(ROWS);
-    for row in 0..ROWS {
-        let mut data = Vec::with_capacity(COLUMNS);
-        for column in 0..COLUMNS {
-            let text = format!("{}-{}", row, column);
-            data.push(text);
-        }
-
-        arr.push(Obj::new(row, data));
-    }
-
-    arr
-}
-
 pub fn is_lines_equal(s: &str, width: usize) -> bool {
     string_width_multiline(s) == width
 }
diff --git a/tests/width_test.rs b/tests/width_test.rs
index b36c2e9..57bfff6 100644
--- a/tests/width_test.rs
+++ b/tests/width_test.rs
@@ -4,17 +4,16 @@ use tabled::{
     papergrid::string_width_multiline,
     width::{Justify, MinWidth, Width},
     width::{PriorityMax, PriorityMin, SuffixLimit},
-    Alignment, Modify, Padding, Panel, Span, Style, Table,
+    Alignment, Modify, Padding, Panel, Span, Style,
 };
 
-use crate::util::{create_vector, is_lines_equal, static_table};
+use crate::util::{create_table, init_table, is_lines_equal, new_table, static_table};
 
 mod util;
 
 #[test]
 fn max_width() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
         .with(Modify::new(Columns::new(1..).not(Rows::single(0))).with(Width::truncate(1)))
         .to_string();
@@ -33,8 +32,7 @@ fn max_width() {
 
 #[test]
 fn max_width_with_suffix() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
         .with(
             Modify::new(Columns::new(1..).not(Rows::single(0)))
@@ -56,8 +54,7 @@ fn max_width_with_suffix() {
 
 #[test]
 fn max_width_doesnt_icrease_width_if_it_is_smaller() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
         .with(Modify::new(Columns::new(1..).not(Rows::single(0))).with(Width::truncate(50)))
         .to_string();
@@ -76,8 +73,7 @@ fn max_width_doesnt_icrease_width_if_it_is_smaller() {
 
 #[test]
 fn max_width_wrapped() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
         .with(Modify::new(Columns::new(1..).not(Rows::single(0))).with(Width::wrap(2)))
         .to_string();
@@ -99,8 +95,7 @@ fn max_width_wrapped() {
 
 #[test]
 fn max_width_wrapped_does_nothing_if_str_is_smaller() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
         .with(Modify::new(Columns::new(1..).not(Rows::single(0))).with(Width::wrap(100)))
         .to_string();
@@ -121,7 +116,7 @@ fn max_width_wrapped_does_nothing_if_str_is_smaller() {
 #[test]
 fn max_width_wrapped_keep_words() {
     let data = vec!["this is a long sentence"];
-    let table = Table::new(&data)
+    let table = new_table(&data)
         .with(Style::markdown())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Segment::all()).with(Width::wrap(17).keep_words()))
@@ -139,7 +134,7 @@ fn max_width_wrapped_keep_words() {
     assert!(is_lines_equal(&table, 17 + 2 + 2));
 
     let data = vec!["this is a long  sentence"];
-    let table = Table::new(&data)
+    let table = new_table(&data)
         .with(Style::markdown())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Segment::all()).with(Width::wrap(17).keep_words()))
@@ -157,7 +152,7 @@ fn max_width_wrapped_keep_words() {
     assert!(is_lines_equal(&table, 17 + 2 + 2));
 
     let data = vec!["this is a long   sentence"];
-    let table = Table::new(&data)
+    let table = new_table(&data)
         .with(Style::markdown())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Segment::all()).with(Width::wrap(17).keep_words()))
@@ -174,7 +169,7 @@ fn max_width_wrapped_keep_words() {
     );
 
     let data = vec!["this is a long    sentence"];
-    let table = Table::new(&data)
+    let table = new_table(&data)
         .with(Style::markdown())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Segment::all()).with(Width::wrap(17).keep_words()))
@@ -193,7 +188,7 @@ fn max_width_wrapped_keep_words() {
     assert!(is_lines_equal(&table, 17 + 2 + 2));
 
     let data = vec!["this"];
-    let table = Table::new(&data)
+    let table = new_table(&data)
         .with(Style::markdown())
         .with(Modify::new(Segment::all()).with(Width::wrap(10).keep_words()))
         .to_string();
@@ -215,7 +210,7 @@ fn max_width_wrapped_keep_words_color() {
     use owo_colors::OwoColorize;
 
     let data = vec!["this is a long sentence".on_black().green().to_string()];
-    let table = Table::new(&data)
+    let table = new_table(&data)
         .with(Style::markdown())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Segment::all()).with(Width::wrap(17).keep_words()))
@@ -242,7 +237,7 @@ fn max_width_wrapped_keep_words_color() {
     );
 
     let data = vec!["this is a long  sentence".on_black().green().to_string()];
-    let table = Table::new(&data)
+    let table = new_table(&data)
         .with(Style::markdown())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Segment::all()).with(Width::wrap(17).keep_words()))
@@ -269,7 +264,7 @@ fn max_width_wrapped_keep_words_color() {
     );
 
     let data = vec!["this is a long   sentence".on_black().green().to_string()];
-    let table = Table::new(&data)
+    let table = new_table(&data)
         .with(Style::markdown())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Segment::all()).with(Width::wrap(17).keep_words()))
@@ -291,7 +286,7 @@ fn max_width_wrapped_keep_words_color() {
     );
 
     let data = vec!["this is a long    sentence".on_black().green().to_string()];
-    let table = Table::new(&data)
+    let table = new_table(&data)
         .with(Style::markdown())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Segment::all()).with(Width::wrap(17).keep_words()))
@@ -318,7 +313,7 @@ fn max_width_wrapped_keep_words_color() {
     );
 
     let data = vec!["this".on_black().green().to_string()];
-    let table = Table::new(&data)
+    let table = new_table(&data)
         .with(Style::markdown())
         .with(Modify::new(Segment::all()).with(Width::wrap(10).keep_words()))
         .to_string();
@@ -345,7 +340,7 @@ fn max_width_wrapped_keep_words_color() {
 #[test]
 fn max_width_wrapped_keep_words_long_word() {
     let data = vec!["this is a long sentencesentencesentence"];
-    let table = Table::new(&data)
+    let table = new_table(&data)
         .with(Style::markdown())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Segment::all()).with(Width::wrap(17).keep_words()))
@@ -372,7 +367,7 @@ fn max_width_wrapped_keep_words_long_word_color() {
         .on_black()
         .green()
         .to_string()];
-    let table = Table::new(&data)
+    let table = new_table(&data)
         .with(Style::markdown())
         .with(Modify::new(Segment::all()).with(Alignment::left()))
         .with(Modify::new(Segment::all()).with(Width::wrap(17).keep_words()))
@@ -412,7 +407,7 @@ fn max_width_wrapped_collored() {
         "asdasd".on_black().green().to_string(),
     ];
 
-    let table = Table::new(data)
+    let table = new_table(data)
         .with(Style::markdown())
         .with(Modify::new(Segment::all()).with(Width::wrap(2)))
         .to_string();
@@ -425,8 +420,7 @@ fn max_width_wrapped_collored() {
 
 #[test]
 fn dont_change_content_if_width_is_less_then_max_width() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
         .with(Modify::new(Segment::all()).with(Width::truncate(1000).suffix("...")))
         .to_string();
@@ -447,7 +441,7 @@ fn dont_change_content_if_width_is_less_then_max_width() {
 fn max_width_with_emoji() {
     let data = &["🤠", "😳🥵🥶😱😨", "🚴🏻‍♀️🚴🏻🚴🏻‍♂️🚵🏻‍♀️🚵🏻🚵🏻‍♂️"];
 
-    let table = Table::new(data)
+    let table = new_table(data)
         .with(Style::markdown())
         .with(Modify::new(Segment::all()).with(Width::truncate(6).suffix("...")))
         .to_string();
@@ -475,7 +469,7 @@ fn color_chars_are_stripped() {
         "asdasd".on_black().green().to_string(),
     ];
 
-    let table = Table::new(data)
+    let table = new_table(data)
         .with(Style::markdown())
         .with(Modify::new(Segment::all()).with(Width::truncate(4).suffix("...")))
         .to_string();
@@ -499,8 +493,7 @@ fn color_chars_are_stripped() {
 
 #[test]
 fn min_width() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
         .with(Modify::new(Rows::single(0)).with(MinWidth::new(12)));
 
@@ -531,8 +524,7 @@ fn min_width() {
 
 #[test]
 fn min_width_with_filler() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
         .with(Modify::new(Rows::single(0)).with(MinWidth::new(12).fill_with('.')))
         .to_string();
@@ -551,8 +543,7 @@ fn min_width_with_filler() {
 
 #[test]
 fn min_width_one_column() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
         .with(Modify::new(Cell(0, 0)).with(MinWidth::new(5)));
 
@@ -583,21 +574,18 @@ fn min_width_one_column() {
 
 #[test]
 fn min_width_on_smaller_content() {
-    let data = create_vector::<3, 3>();
-
     assert_eq!(
-        Table::new(&data)
+        create_table::<3, 3>()
             .with(Style::markdown())
             .with(Modify::new(Rows::single(0)).with(MinWidth::new(1)))
             .to_string(),
-        Table::new(&data).with(Style::markdown()).to_string()
+        create_table::<3, 3>().with(Style::markdown()).to_string()
     );
 }
 
 #[test]
 fn min_with_max_width() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
         .with(Modify::new(Rows::single(0)).with(MinWidth::new(3)))
         .with(Modify::new(Rows::single(0)).with(Width::truncate(3)));
@@ -629,8 +617,7 @@ fn min_with_max_width() {
 
 #[test]
 fn min_with_max_width_truncate_suffix() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
         .with(Modify::new(Rows::single(0)).with(MinWidth::new(3)))
         .with(Modify::new(Rows::single(0)).with(Width::truncate(3).suffix("...")));
@@ -662,8 +649,7 @@ fn min_with_max_width_truncate_suffix() {
 
 #[test]
 fn min_with_max_width_truncate_suffix_limit_replace() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data).with(Style::markdown()).with(
+    let table = create_table::<3, 3>().with(Style::markdown()).with(
         Modify::new(Rows::single(0)).with(
             Width::truncate(3)
                 .suffix("...")
@@ -685,8 +671,7 @@ fn min_with_max_width_truncate_suffix_limit_replace() {
 
 #[test]
 fn min_with_max_width_truncate_suffix_limit_cut() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data).with(Style::markdown()).with(
+    let table = create_table::<3, 3>().with(Style::markdown()).with(
         Modify::new(Rows::single(0)).with(
             Width::truncate(3)
                 .suffix("qwert")
@@ -708,8 +693,7 @@ fn min_with_max_width_truncate_suffix_limit_cut() {
 
 #[test]
 fn min_with_max_width_truncate_suffix_limit_ignore() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data).with(Style::markdown()).with(
+    let table = create_table::<3, 3>().with(Style::markdown()).with(
         Modify::new(Rows::single(0)).with(
             Width::truncate(3)
                 .suffix("qwert")
@@ -740,7 +724,7 @@ fn min_with_max_width_truncate_suffix_try_color() {
         "asdasd".on_black().green().to_string(),
     ];
 
-    let table = Table::new(data)
+    let table = new_table(data)
         .with(Style::markdown())
         .with(Width::truncate(7).suffix("..").suffix_try_color(true));
 
@@ -767,7 +751,7 @@ fn min_width_color() {
         "asdasd".on_black().green().to_string(),
     ];
 
-    let table = Table::new(data)
+    let table = new_table(data)
         .with(Style::markdown())
         .with(Modify::new(Segment::all()).with(MinWidth::new(10)))
         .to_string();
@@ -801,17 +785,16 @@ fn min_width_color_with_smaller_then_width() {
     ];
 
     assert_eq!(
-        Table::new(data)
+        new_table(data)
             .with(Modify::new(Segment::all()).with(MinWidth::new(1)))
             .to_string(),
-        Table::new(data).to_string()
+        new_table(data).to_string()
     );
 }
 
 #[test]
 fn total_width_big() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
         .with(Width::truncate(80))
         .with(MinWidth::new(80))
@@ -829,7 +812,7 @@ fn total_width_big() {
         )
     );
 
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
         .with(Width::truncate(80))
         .with(MinWidth::new(80))
@@ -851,8 +834,7 @@ fn total_width_big() {
 
 #[test]
 fn total_width_big_with_panel() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Panel("Hello World", 0))
         .with(
             Modify::new(Segment::all())
@@ -880,8 +862,7 @@ fn total_width_big_with_panel() {
 
 #[test]
 fn total_width_big_with_panel_with_wrapping_doesnt_affect_increase() {
-    let data = create_vector::<3, 3>();
-    let table1 = Table::new(&data)
+    let table1 = create_table::<3, 3>()
         .with(Panel("Hello World", 0))
         .with(Modify::new(Segment::all()).with(Alignment::center()))
         .with(Style::markdown())
@@ -889,7 +870,7 @@ fn total_width_big_with_panel_with_wrapping_doesnt_affect_increase() {
         .with(MinWidth::new(80))
         .to_string();
 
-    let table2 = Table::new(&data)
+    let table2 = create_table::<3, 3>()
         .with(Panel("Hello World", 0))
         .with(Modify::new(Segment::all()).with(Alignment::center()))
         .with(Style::markdown())
@@ -902,8 +883,7 @@ fn total_width_big_with_panel_with_wrapping_doesnt_affect_increase() {
 
 #[test]
 fn total_width_small() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
         .with(Width::truncate(14))
         .with(MinWidth::new(14))
@@ -924,8 +904,7 @@ fn total_width_small() {
 
 #[test]
 fn total_width_smaller_then_content() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
         .with(Width::truncate(8))
         .with(MinWidth::new(8))
@@ -945,9 +924,7 @@ fn total_width_smaller_then_content() {
 
 #[test]
 fn total_width_small_with_panel() {
-    let data = create_vector::<3, 3>();
-
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Modify::new(Segment::all()).with(Alignment::center()))
         .with(Style::markdown())
         .with(Width::truncate(20))
@@ -966,7 +943,7 @@ fn total_width_small_with_panel() {
     );
     assert!(is_lines_equal(&table, 20));
 
-    let table = Table::new(Vec::<usize>::new())
+    let table = new_table(Vec::<usize>::new())
         .with(Panel("Hello World", 0))
         .with(
             Modify::new(Segment::all())
@@ -983,7 +960,7 @@ fn total_width_small_with_panel() {
     );
     assert!(is_lines_equal(&table, 5));
 
-    let table = Table::new(&create_vector::<1, 2>())
+    let table = create_table::<1, 2>()
         .with(Panel("Hello World", 0))
         .with(Modify::new(Segment::all()).with(Alignment::center()))
         .with(Style::markdown())
@@ -1002,7 +979,7 @@ fn total_width_small_with_panel() {
     );
     assert!(is_lines_equal(&table, 20));
 
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Panel("Hello World", 0))
         .with(Modify::new(Segment::all()).with(Alignment::center()))
         .with(Style::markdown())
@@ -1023,7 +1000,7 @@ fn total_width_small_with_panel() {
     );
     assert!(is_lines_equal(&table, 20));
 
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Panel("Hello World", 0))
         .with(Modify::new(Segment::all()).with(Alignment::center()))
         .with(Style::markdown())
@@ -1044,7 +1021,7 @@ fn total_width_small_with_panel() {
     );
     assert!(is_lines_equal(&table, 13));
 
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Panel("Hello World", 0))
         .with(Modify::new(Segment::all()).with(Alignment::center()))
         .with(Style::markdown())
@@ -1065,7 +1042,7 @@ fn total_width_small_with_panel() {
     );
     assert!(is_lines_equal(&table, 14));
 
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Panel("Hello World 123", 0))
         .with(Modify::new(Segment::all()).with(Alignment::center()))
         .with(Style::markdown())
@@ -1090,8 +1067,7 @@ fn total_width_small_with_panel() {
 #[cfg(feature = "color")]
 #[test]
 fn total_width_wrapping() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Modify::new(Segment::all()).with(Alignment::center()))
         .with(Style::markdown())
         .with(Width::wrap(20))
@@ -1116,9 +1092,7 @@ fn total_width_wrapping() {
     );
     assert!(is_lines_equal(&table, 20));
 
-    let mut data = create_vector::<3, 3>();
-    data[2][2] = "some loong string".to_owned();
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((2, 2), "some loong string")])
         .with(Modify::new(Segment::all()).with(Alignment::center()))
         .with(Style::markdown())
         .with(Width::wrap(20).keep_words())
@@ -1143,8 +1117,7 @@ fn total_width_wrapping() {
 
 #[test]
 fn total_width_small_with_panel_using_wrapping() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Panel("Hello World", 0))
         .with(Modify::new(Segment::all()).with(Alignment::center()))
         .with(Style::markdown())
@@ -1171,7 +1144,7 @@ fn total_width_small_with_panel_using_wrapping() {
     );
     assert!(is_lines_equal(&table, 20));
 
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Panel("Hello World", 0))
         .with(Modify::new(Segment::all()).with(Alignment::center()))
         .with(Style::markdown())
@@ -1206,7 +1179,7 @@ fn total_width_small_with_panel_using_wrapping() {
     );
     assert!(is_lines_equal(&table, 14));
 
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Panel("Hello World 123", 0))
         .with(Modify::new(Segment::all()).with(Alignment::center()))
         .with(Style::markdown())
@@ -1244,10 +1217,7 @@ fn total_width_small_with_panel_using_wrapping() {
 
 #[test]
 fn max_width_with_span() {
-    let mut data = create_vector::<3, 3>();
-    data[0][1] = "a long string".to_string();
-
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((0, 1), "a long string")])
         .with(Style::psql())
         .with(Modify::new(Cell(1, 1)).with(Span::column(2)))
         .with(Modify::new(Cell(2, 2)).with(Span::column(2)));
@@ -1308,7 +1278,7 @@ fn min_width_works_with_right_alignment() {
     }
     "#;
 
-    let table = Table::new([json])
+    let table = new_table([json])
         .with(Style::markdown())
         .with(MinWidth::new(50))
         .with(
@@ -1378,7 +1348,7 @@ fn min_width_works_with_right_alignment() {
     );
     assert!(is_lines_equal(&table.to_string(), 50));
 
-    let table = Table::new([json])
+    let table = new_table([json])
         .with(Style::markdown())
         .with(MinWidth::new(50))
         .with(
@@ -1457,7 +1427,7 @@ fn min_width_with_span_1() {
         ["2", "3"],
     ];
 
-    let table = Table::new(data)
+    let table = new_table(data)
         .with(Style::markdown())
         .with(Modify::new(Cell(1, 0)).with(Span::column(2)))
         .with(MinWidth::new(100))
@@ -1484,7 +1454,7 @@ fn min_width_with_span_2() {
         ["2", "3"],
     ];
 
-    let table = Table::new(data)
+    let table = new_table(data)
         .with(Style::markdown())
         .with(Modify::new(Cell(2, 0)).with(Span::column(2)))
         .with(MinWidth::new(100))
@@ -1505,8 +1475,7 @@ fn min_width_with_span_2() {
 
 #[test]
 fn justify_width_constant_test() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
         .with(Justify::new(3))
         .to_string();
@@ -1525,14 +1494,11 @@ fn justify_width_constant_test() {
 
 #[test]
 fn justify_width_constant_different_sizes_test() {
-    let mut data = create_vector::<3, 3>();
-    data[0][1] = "Hello World".to_owned();
-    data[2][2] = "multi\nline string\n".to_owned();
-
-    let table = Table::new(&data)
-        .with(Style::markdown())
-        .with(Justify::new(3))
-        .to_string();
+    let table =
+        init_table::<3, 3, _, _>([((0, 1), "Hello World"), ((2, 2), "multi\nline string\n")])
+            .with(Style::markdown())
+            .with(Justify::new(3))
+            .to_string();
 
     assert_eq!(
         table,
@@ -1548,8 +1514,7 @@ fn justify_width_constant_different_sizes_test() {
 
 #[test]
 fn justify_width_constant_0_test() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
         .with(Justify::new(0))
         .to_string();
@@ -1568,11 +1533,9 @@ fn justify_width_constant_0_test() {
 
 #[test]
 fn justify_width_min_test() {
-    let data = create_vector::<3, 3>();
-    let m = Justify::min();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
-        .with(m)
+        .with(Justify::min())
         .to_string();
 
     assert_eq!(
@@ -1589,8 +1552,7 @@ fn justify_width_min_test() {
 
 #[test]
 fn justify_width_max_test() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
         .with(Justify::max())
         .to_string();
@@ -1609,10 +1571,7 @@ fn justify_width_max_test() {
 
 #[test]
 fn max_width_when_cell_has_tabs() {
-    let mut data = create_vector::<3, 3>();
-    data[1][1] = String::from("\tHello\tWorld\t");
-
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((1, 1), "\tHello\tWorld\t")])
         .with(Style::markdown())
         .with(Modify::new(Columns::new(..)).with(Width::truncate(1)))
         .to_string();
@@ -1631,10 +1590,7 @@ fn max_width_when_cell_has_tabs() {
 
 #[test]
 fn max_width_table_when_cell_has_tabs() {
-    let mut data = create_vector::<3, 3>();
-    data[1][1] = String::from("\tHello\tWorld\t");
-
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((1, 1), "\tHello\tWorld\t")])
         .with(Style::markdown())
         .with(Width::truncate(15))
         .to_string();
@@ -1665,10 +1621,7 @@ fn max_width_table_when_cell_has_tabs() {
 
 #[test]
 fn max_width_truncate_with_big_span() {
-    let mut data = create_vector::<3, 3>();
-    data[1][1] = String::from("Hello World With Big Line; Here we gooooooo");
-
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((1, 1), "Hello World With Big Line; Here we gooooooo")])
         .with(Style::markdown())
         .with(Modify::new(Cell(2, 1)).with(Span::column(3)))
         .with(Width::truncate(40))
@@ -1686,15 +1639,14 @@ fn max_width_truncate_with_big_span() {
         )
     );
 
-    let mut data = create_vector::<3, 3>();
-    data[1][1] = String::from("Hello World With Big Line; Here we gooooooo");
-    data[2][2] = String::from("Hello World With Big Line; Here");
-
-    let table = Table::new(&data)
-        .with(Style::markdown())
-        .with(Modify::new(Cell(2, 1)).with(Span::column(3)))
-        .with(Modify::new(Cell(3, 2)).with(Span::column(2)))
-        .to_string();
+    let table = init_table::<3, 3, _, _>([
+        ((1, 1), "Hello World With Big Line; Here we gooooooo"),
+        ((2, 2), "Hello World With Big Line; Here"),
+    ])
+    .with(Style::markdown())
+    .with(Modify::new(Cell(2, 1)).with(Span::column(3)))
+    .with(Modify::new(Cell(3, 2)).with(Span::column(2)))
+    .to_string();
 
     assert_eq!(
         table,
@@ -1707,12 +1659,15 @@ fn max_width_truncate_with_big_span() {
         )
     );
 
-    let table = Table::new(&data)
-        .with(Style::markdown())
-        .with(Modify::new(Cell(2, 1)).with(Span::column(3)))
-        .with(Modify::new(Cell(3, 2)).with(Span::column(2)))
-        .with(Width::truncate(40))
-        .to_string();
+    let table = init_table::<3, 3, _, _>([
+        ((1, 1), "Hello World With Big Line; Here we gooooooo"),
+        ((2, 2), "Hello World With Big Line; Here"),
+    ])
+    .with(Style::markdown())
+    .with(Modify::new(Cell(2, 1)).with(Span::column(3)))
+    .with(Modify::new(Cell(3, 2)).with(Span::column(2)))
+    .with(Width::truncate(40))
+    .to_string();
 
     assert_eq!(
         table,
@@ -1726,16 +1681,15 @@ fn max_width_truncate_with_big_span() {
     );
     assert_eq!(string_width_multiline(&table), 40);
 
-    let mut data = create_vector::<3, 3>();
-    data[1][1] = String::from("Hello World With Big Line; Here we gooooooo");
-    data[2][2] = String::from("Hello World With Big Line; Here");
-
-    let table = Table::new(&data)
-        .with(Style::markdown())
-        .with(Modify::new(Cell(2, 1)).with(Span::column(2)))
-        .with(Modify::new(Cell(3, 2)).with(Span::column(2)))
-        .with(Width::truncate(40))
-        .to_string();
+    let table = init_table::<3, 3, _, _>([
+        ((1, 1), "Hello World With Big Line; Here we gooooooo"),
+        ((2, 2), "Hello World With Big Line; Here"),
+    ])
+    .with(Style::markdown())
+    .with(Modify::new(Cell(2, 1)).with(Span::column(2)))
+    .with(Modify::new(Cell(3, 2)).with(Span::column(2)))
+    .with(Width::truncate(40))
+    .to_string();
 
     assert_eq!(string_width_multiline(&table), 40);
     assert_eq!(
@@ -1749,15 +1703,14 @@ fn max_width_truncate_with_big_span() {
         )
     );
 
-    let mut data = create_vector::<3, 3>();
-    data[1][1] = String::from("Hello World With Big Line; Here w");
-    data[2][2] = String::from("Hello World With Big L");
-
-    let table = Table::new(&data)
-        .with(Style::markdown())
-        .with(Modify::new(Cell(2, 1)).with(Span::column(3)))
-        .with(Modify::new(Cell(3, 2)).with(Span::column(2)))
-        .to_string();
+    let table = init_table::<3, 3, _, _>([
+        ((1, 1), "Hello World With Big Line; Here w"),
+        ((2, 2), "Hello World With Big L"),
+    ])
+    .with(Style::markdown())
+    .with(Modify::new(Cell(2, 1)).with(Span::column(3)))
+    .with(Modify::new(Cell(3, 2)).with(Span::column(2)))
+    .to_string();
 
     assert_eq!(
         table,
@@ -1773,10 +1726,7 @@ fn max_width_truncate_with_big_span() {
 
 #[test]
 fn max_width_truncate_priority_max() {
-    let mut data = create_vector::<3, 3>();
-    data[1][1] = String::from("Hello World With Big Line");
-
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((1, 1), "Hello World With Big Line")])
         .with(Style::markdown())
         .with(Width::truncate(35).priority::<PriorityMax>())
         .to_string();
@@ -1793,7 +1743,7 @@ fn max_width_truncate_priority_max() {
         )
     );
 
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((1, 1), "Hello World With Big Line")])
         .with(Style::markdown())
         .with(Width::truncate(20).priority::<PriorityMax>())
         .to_string();
@@ -1810,7 +1760,7 @@ fn max_width_truncate_priority_max() {
         )
     );
 
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((1, 1), "Hello World With Big Line")])
         .with(Style::markdown())
         .with(Width::truncate(0).priority::<PriorityMax>())
         .to_string();
@@ -1830,10 +1780,7 @@ fn max_width_truncate_priority_max() {
 
 #[test]
 fn max_width_truncate_priority_max_with_span() {
-    let mut data = create_vector::<3, 3>();
-    data[1][1] = String::from("Hello World With Big Line");
-
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((1, 1), "Hello World With Big Line")])
         .with(Style::markdown())
         .with(Modify::new(Cell(2, 1)).with(Span::column(2)))
         .with(Width::truncate(15).priority::<PriorityMax>())
@@ -1854,10 +1801,7 @@ fn max_width_truncate_priority_max_with_span() {
 
 #[test]
 fn max_width_wrap_priority_max() {
-    let mut data = create_vector::<3, 3>();
-    data[1][1] = String::from("Hello World With Big Line");
-
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((1, 1), "Hello World With Big Line")])
         .with(Style::markdown())
         .with(Width::wrap(35).priority::<PriorityMax>())
         .to_string();
@@ -1878,7 +1822,7 @@ fn max_width_wrap_priority_max() {
         )
     );
 
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((1, 1), "Hello World With Big Line")])
         .with(Style::markdown())
         .with(Width::wrap(20).priority::<PriorityMax>())
         .to_string();
@@ -1912,7 +1856,7 @@ fn max_width_wrap_priority_max() {
         )
     );
 
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((1, 1), "Hello World With Big Line")])
         .with(Style::markdown())
         .with(Width::wrap(0).priority::<PriorityMax>())
         .to_string();
@@ -1932,10 +1876,7 @@ fn max_width_wrap_priority_max() {
 
 #[test]
 fn max_width_wrap_priority_max_with_span() {
-    let mut data = create_vector::<3, 3>();
-    data[1][1] = String::from("Hello World With Big Line");
-
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((1, 1), "Hello World With Big Line")])
         .with(Style::markdown())
         .with(Modify::new(Cell(2, 1)).with(Span::column(2)))
         .with(Width::wrap(15).priority::<PriorityMax>())
@@ -1973,10 +1914,7 @@ fn max_width_wrap_priority_max_with_span() {
 
 #[test]
 fn max_width_truncate_priority_min() {
-    let mut data = create_vector::<3, 3>();
-    data[1][1] = String::from("Hello World With Big Line");
-
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((1, 1), "Hello World With Big Line")])
         .with(Style::markdown())
         .with(Width::truncate(35).priority::<PriorityMin>())
         .to_string();
@@ -1993,7 +1931,7 @@ fn max_width_truncate_priority_min() {
         )
     );
 
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((1, 1), "Hello World With Big Line")])
         .with(Style::markdown())
         .with(Width::truncate(20).priority::<PriorityMin>())
         .to_string();
@@ -2010,7 +1948,7 @@ fn max_width_truncate_priority_min() {
         )
     );
 
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((1, 1), "Hello World With Big Line")])
         .with(Style::markdown())
         .with(Width::truncate(0).priority::<PriorityMin>())
         .to_string();
@@ -2030,10 +1968,7 @@ fn max_width_truncate_priority_min() {
 
 #[test]
 fn max_width_truncate_priority_min_with_span() {
-    let mut data = create_vector::<3, 3>();
-    data[1][1] = String::from("Hello World With Big Line");
-
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((1, 1), "Hello World With Big Line")])
         .with(Style::markdown())
         .with(Modify::new(Cell(2, 1)).with(Span::column(2)))
         .with(Width::truncate(15).priority::<PriorityMin>())
@@ -2051,7 +1986,7 @@ fn max_width_truncate_priority_min_with_span() {
         )
     );
 
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((1, 1), "Hello World With Big Line")])
         .with(Style::markdown())
         .with(Modify::new(Cell(2, 1)).with(Span::column(2)))
         .with(Width::truncate(17).priority::<PriorityMin>())
@@ -2072,10 +2007,7 @@ fn max_width_truncate_priority_min_with_span() {
 
 #[test]
 fn max_width_wrap_priority_min() {
-    let mut data = create_vector::<3, 3>();
-    data[1][1] = String::from("Hello World With Big Line");
-
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((1, 1), "Hello World With Big Line")])
         .with(Style::markdown())
         .with(Width::wrap(35).priority::<PriorityMin>())
         .to_string();
@@ -2093,7 +2025,7 @@ fn max_width_wrap_priority_min() {
         )
     );
 
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((1, 1), "Hello World With Big Line")])
         .with(Style::markdown())
         .with(Width::wrap(20).priority::<PriorityMin>())
         .to_string();
@@ -2114,7 +2046,7 @@ fn max_width_wrap_priority_min() {
         )
     );
 
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((1, 1), "Hello World With Big Line")])
         .with(Style::markdown())
         .with(Width::wrap(0).priority::<PriorityMin>())
         .to_string();
@@ -2134,10 +2066,7 @@ fn max_width_wrap_priority_min() {
 
 #[test]
 fn max_width_wrap_priority_min_with_span() {
-    let mut data = create_vector::<3, 3>();
-    data[1][1] = String::from("Hello World With Big Line");
-
-    let table = Table::new(&data)
+    let table = init_table::<3, 3, _, _>([((1, 1), "Hello World With Big Line")])
         .with(Style::markdown())
         .with(Modify::new(Cell(2, 1)).with(Span::column(2)))
         .with(Width::wrap(15).priority::<PriorityMin>())
@@ -2167,8 +2096,7 @@ fn max_width_wrap_priority_min_with_span() {
 
 #[test]
 fn min_width_priority_max() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
         .with(MinWidth::new(60).priority::<PriorityMax>());
 
@@ -2186,8 +2114,7 @@ fn min_width_priority_max() {
 
 #[test]
 fn min_width_priority_min() {
-    let data = create_vector::<3, 3>();
-    let table = Table::new(&data)
+    let table = create_table::<3, 3>()
         .with(Style::markdown())
         .with(MinWidth::new(60).priority::<PriorityMin>());
 
@@ -2206,7 +2133,7 @@ fn min_width_priority_min() {
 #[test]
 fn max_width_tab_0() {
     let table =
-        Table::new(&["\t\tTigre Ecuador\tOMYA Andina\t3824909999\tCalcium carbonate\tColombia\t"])
+        new_table(&["\t\tTigre Ecuador\tOMYA Andina\t3824909999\tCalcium carbonate\tColombia\t"])
             .with(Style::markdown())
             .with(Width::wrap(60))
             .to_string();
@@ -2245,7 +2172,7 @@ mod derived {
             D("0.1.4", "2021-06-07", "false", "display_with attribute"),
         ];
 
-        let table = Table::new(&data)
+        let table = new_table(&data)
             .with(Style::markdown())
             .with(Modify::new(Segment::all()).with(Alignment::left()))
             .with(Width::wrap(57))
@@ -2268,7 +2195,7 @@ mod derived {
         );
         assert!(is_lines_equal(&table, 57));
 
-        let table = Table::new(&data)
+        let table = new_table(&data)
             .with(Style::markdown())
             .with(Modify::new(Segment::all()).with(Alignment::left()))
             .with(Width::wrap(57).keep_words())
@@ -2332,7 +2259,7 @@ mod derived {
             ),
         ];
 
-        let table = Table::new(&data)
+        let table = new_table(&data)
             .with(Style::markdown())
             .with(Modify::new(Segment::all()).with(Alignment::left()))
             .with(Width::wrap(57))
@@ -2355,7 +2282,7 @@ mod derived {
         );
         assert!(is_lines_equal(&table, 57));
 
-        let table = Table::new(&data)
+        let table = new_table(&data)
             .with(Style::markdown())
             .with(Modify::new(Segment::all()).with(Alignment::left()))
             .with(Width::wrap(57).keep_words())
@@ -2419,7 +2346,7 @@ mod derived {
             ),
         ];
 
-        let table = Table::new(&data)
+        let table = new_table(&data)
             .with(Style::markdown())
             .with(Modify::new(Segment::all()).with(Alignment::left()))
             .with(Width::truncate(57))