tawasuyu

tawasuyu/taffy

A high performance rust-powered UI layout library

HTML 5544Rust 88Markdown 11TOML 91926 Sutichaykuna

Implement "gap" property for flexbox algorithm (#248)

* Consistently use camelCase in test_helper.js

* Add support for parsing grid style properties to test_helper.js

* Add support for generating Taffy Grid styles in tests to gentest main.rs

* Add generated tests for flexbox gap

* Add gap property to style module

* Implement gap property for flexbox algorthim

* Add gap to changelog

* Add tests for percentage gutters with defined parent node size

* Add test for percentage gap with undefined parent node size

* Fix percentage main-axis column gaps in containers with undefined main size

* Gentest: delete generated tests before recreating (ensures tests are deleted if fixture is deleted)

* Cargo fmt

* Add test for percentage row gap in a flex-wrap container with undefined height

* gentest: fix clippy warnings

* Add more small benchmarks + harmonise benchmarks names with 0.1 benchmarks

* Create helper function for summing axis total gap

* Add flexbox-gap example

* Add test for fixed gaps with undefined parent size

* Remove commented out code in gentest script

Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>

* Use Size::UNDEFINED as the default for the gap style property

* Fix fixed size column gaps with undefined parent width

* Add additional flexbox gap test

Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>

9e53f03adea2b770d68954e404d2fa407dfc7d40 · ruwaq Nico Burns · (3 wata ñawpaq) · tayta ba4cd3c3b · kay commitpi sach'ata qhaway

Semántico sayk'uy · 172

benches/big_tree.rs

benches/generated/align_content_space_around.rs

benches/generated/align_content_space_between.rs

benches/generated/align_content_space_evenly.rs

benches/generated/gap_column_gap_child_margins.rs

benches/generated/gap_column_gap_flexible.rs

benches/generated/gap_column_gap_flexible_undefined_parent.rs

benches/generated/gap_column_gap_inflexible.rs

benches/generated/gap_column_gap_inflexible_undefined_parent.rs

benches/generated/gap_column_gap_justify_center.rs

benches/generated/gap_column_gap_justify_flex_end.rs

benches/generated/gap_column_gap_justify_flex_start.rs

benches/generated/gap_column_gap_justify_space_around.rs

benches/generated/gap_column_gap_justify_space_between.rs

benches/generated/gap_column_gap_justify_space_evenly.rs

benches/generated/gap_column_gap_mixed_flexible.rs

benches/generated/gap_column_gap_percentage_cyclic_partially_shrinkable.rs

benches/generated/gap_column_gap_percentage_cyclic_shrinkable.rs

benches/generated/gap_column_gap_percentage_cyclic_unshrinkable.rs

benches/generated/gap_column_gap_percentage_flexible.rs

benches/generated/gap_column_gap_percentage_inflexible.rs

benches/generated/gap_column_gap_wrap_align_center.rs

benches/generated/gap_column_gap_wrap_align_flex_end.rs

benches/generated/gap_column_gap_wrap_align_flex_start.rs

benches/generated/gap_column_gap_wrap_align_space_around.rs

benches/generated/gap_column_gap_wrap_align_space_between.rs

benches/generated/gap_column_gap_wrap_align_stretch.rs

benches/generated/gap_column_row_gap_wrapping.rs

benches/generated/gap_percentage_row_gap_wrapping.rs

benches/generated/gap_row_gap_align_items_end.rs

benches/generated/gap_row_gap_align_items_stretch.rs

benches/generated/gap_row_gap_column_child_margins.rs

benches/generated/gap_row_gap_row_wrap_child_margins.rs

examples/flexbox-gap.rs

scripts/gentest/src/main.rs

scripts/gentest/test_helper.js

src/compute/flexbox.rs

src/resolve.rs

src/style.rs

tests/generated/align_content_space_around.rs

tests/generated/align_content_space_between.rs

tests/generated/align_content_space_evenly.rs

tests/generated/gap_column_gap_child_margins.rs

tests/generated/gap_column_gap_flexible.rs

tests/generated/gap_column_gap_flexible_undefined_parent.rs

tests/generated/gap_column_gap_inflexible.rs

tests/generated/gap_column_gap_inflexible_undefined_parent.rs

tests/generated/gap_column_gap_justify_center.rs

tests/generated/gap_column_gap_justify_flex_end.rs

tests/generated/gap_column_gap_justify_flex_start.rs

tests/generated/gap_column_gap_justify_space_around.rs

tests/generated/gap_column_gap_justify_space_between.rs

tests/generated/gap_column_gap_justify_space_evenly.rs

tests/generated/gap_column_gap_mixed_flexible.rs

tests/generated/gap_column_gap_percentage_cyclic_partially_shrinkable.rs

tests/generated/gap_column_gap_percentage_cyclic_shrinkable.rs

tests/generated/gap_column_gap_percentage_cyclic_unshrinkable.rs

tests/generated/gap_column_gap_percentage_flexible.rs

tests/generated/gap_column_gap_percentage_inflexible.rs

tests/generated/gap_column_gap_wrap_align_center.rs

tests/generated/gap_column_gap_wrap_align_flex_end.rs

tests/generated/gap_column_gap_wrap_align_flex_start.rs

tests/generated/gap_column_gap_wrap_align_space_around.rs

tests/generated/gap_column_gap_wrap_align_space_between.rs

tests/generated/gap_column_gap_wrap_align_stretch.rs

tests/generated/gap_column_row_gap_wrapping.rs

tests/generated/gap_percentage_row_gap_wrapping.rs

tests/generated/gap_row_gap_align_items_end.rs

tests/generated/gap_row_gap_align_items_stretch.rs

tests/generated/gap_row_gap_column_child_margins.rs

tests/generated/gap_row_gap_row_wrap_child_margins.rs

104 qillqakuna · +5879 −854

diff --git a/RELEASES.md b/RELEASES.md
index 28dadd256..3cfa44e8a 100644
--- a/RELEASES.md
+++ b/RELEASES.md
@@ -12,6 +12,7 @@
 - Added support for `AlignContent::SpaceEvenly`
 - Added `AvailableSpace` enum
 - Added `debug` modules with a `print_tree` function, which prints a debug representation of the computed layout for a tree of nodes.
+- Added support for `gap` property (shorthand form of `row-gap`/`column-gap`)
 
 ### 0.2.0 Changed
 
diff --git a/benches/big_tree.rs b/benches/big_tree.rs
index e298127b4..97aea4183 100644
--- a/benches/big_tree.rs
+++ b/benches/big_tree.rs
@@ -126,9 +126,30 @@ fn taffy_benchmarks(c: &mut Criterion) {
     drop(group);
 
     // Decrease sample size, because the tasks take longer
-    let mut group = c.benchmark_group("big trees");
+    let mut group = c.benchmark_group("big trees (wide)");
     group.sample_size(10);
 
+    group.bench_function("10 nodes (2-level hierarchy)", |b| {
+        let mut taffy = Taffy::new();
+        let root = build_flat_hierarchy(&mut taffy, 10);
+
+        b.iter(|| taffy.compute_layout(root, Size::MAX_CONTENT).unwrap())
+    });
+
+    group.bench_function("100 nodes (2-level hierarchy)", |b| {
+        let mut taffy = Taffy::new();
+        let root = build_flat_hierarchy(&mut taffy, 100);
+
+        b.iter(|| taffy.compute_layout(root, Size::MAX_CONTENT).unwrap())
+    });
+
+    group.bench_function("1_000 nodes (2-level hierarchy)", |b| {
+        let mut taffy = Taffy::new();
+        let root = build_flat_hierarchy(&mut taffy, 1_000);
+
+        b.iter(|| taffy.compute_layout(root, Size::MAX_CONTENT).unwrap())
+    });
+
     group.bench_function("10_000 nodes (2-level hierarchy)", |b| {
         let mut taffy = Taffy::new();
         let root = build_flat_hierarchy(&mut taffy, 10_000);
@@ -150,6 +171,12 @@ fn taffy_benchmarks(c: &mut Criterion) {
         b.iter(|| taffy.compute_layout(root, Size::MAX_CONTENT).unwrap())
     });
 
+    drop(group);
+
+    // Decrease sample size, because the tasks take longer
+    let mut group = c.benchmark_group("big trees (deep)");
+    group.sample_size(10);
+
     group.bench_function("4000 nodes (12-level hierarchy)", |b| {
         let mut taffy = Taffy::new();
         let root = build_deep_hierarchy(&mut taffy, 4000, 2);
diff --git a/benches/generated/gap_column_gap_child_margins.rs b/benches/generated/gap_column_gap_child_margins.rs
new file mode 100644
index 000000000..2a95d12f3
--- /dev/null
+++ b/benches/generated/gap_column_gap_child_margins.rs
@@ -0,0 +1,66 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                margin: taffy::geometry::Rect {
+                    start: taffy::style::Dimension::Points(2f32),
+                    end: taffy::style::Dimension::Points(2f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                margin: taffy::geometry::Rect {
+                    start: taffy::style::Dimension::Points(10f32),
+                    end: taffy::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                margin: taffy::geometry::Rect {
+                    start: taffy::style::Dimension::Points(15f32),
+                    end: taffy::style::Dimension::Points(15f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(80f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_column_gap_flexible.rs b/benches/generated/gap_column_gap_flexible.rs
new file mode 100644
index 000000000..0c95be0fc
--- /dev/null
+++ b/benches/generated/gap_column_gap_flexible.rs
@@ -0,0 +1,55 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(80f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_column_gap_flexible_undefined_parent.rs b/benches/generated/gap_column_gap_flexible_undefined_parent.rs
new file mode 100644
index 000000000..c83163671
--- /dev/null
+++ b/benches/generated/gap_column_gap_flexible_undefined_parent.rs
@@ -0,0 +1,51 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                size: taffy::geometry::Size { height: taffy::style::Dimension::Points(100f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_column_gap_inflexible.rs b/benches/generated/gap_column_gap_inflexible.rs
new file mode 100644
index 000000000..eaae60b5e
--- /dev/null
+++ b/benches/generated/gap_column_gap_inflexible.rs
@@ -0,0 +1,45 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(80f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_column_gap_inflexible_undefined_parent.rs b/benches/generated/gap_column_gap_inflexible_undefined_parent.rs
new file mode 100644
index 000000000..8a7d66ced
--- /dev/null
+++ b/benches/generated/gap_column_gap_inflexible_undefined_parent.rs
@@ -0,0 +1,41 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size { height: taffy::style::Dimension::Points(100f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_column_gap_justify_center.rs b/benches/generated/gap_column_gap_justify_center.rs
new file mode 100644
index 000000000..6536fbdbe
--- /dev/null
+++ b/benches/generated/gap_column_gap_justify_center.rs
@@ -0,0 +1,46 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                justify_content: taffy::style::JustifyContent::Center,
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_column_gap_justify_flex_end.rs b/benches/generated/gap_column_gap_justify_flex_end.rs
new file mode 100644
index 000000000..c79af24e5
--- /dev/null
+++ b/benches/generated/gap_column_gap_justify_flex_end.rs
@@ -0,0 +1,46 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                justify_content: taffy::style::JustifyContent::FlexEnd,
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_column_gap_justify_flex_start.rs b/benches/generated/gap_column_gap_justify_flex_start.rs
new file mode 100644
index 000000000..ef1b65759
--- /dev/null
+++ b/benches/generated/gap_column_gap_justify_flex_start.rs
@@ -0,0 +1,45 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_column_gap_justify_space_around.rs b/benches/generated/gap_column_gap_justify_space_around.rs
new file mode 100644
index 000000000..cd9b55104
--- /dev/null
+++ b/benches/generated/gap_column_gap_justify_space_around.rs
@@ -0,0 +1,46 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                justify_content: taffy::style::JustifyContent::SpaceAround,
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_column_gap_justify_space_between.rs b/benches/generated/gap_column_gap_justify_space_between.rs
new file mode 100644
index 000000000..5850447f3
--- /dev/null
+++ b/benches/generated/gap_column_gap_justify_space_between.rs
@@ -0,0 +1,46 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                justify_content: taffy::style::JustifyContent::SpaceBetween,
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_column_gap_justify_space_evenly.rs b/benches/generated/gap_column_gap_justify_space_evenly.rs
new file mode 100644
index 000000000..c4fea81c6
--- /dev/null
+++ b/benches/generated/gap_column_gap_justify_space_evenly.rs
@@ -0,0 +1,46 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                justify_content: taffy::style::JustifyContent::SpaceEvenly,
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_column_gap_mixed_flexible.rs b/benches/generated/gap_column_gap_mixed_flexible.rs
new file mode 100644
index 000000000..7c9523d9a
--- /dev/null
+++ b/benches/generated/gap_column_gap_mixed_flexible.rs
@@ -0,0 +1,47 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(80f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_column_gap_percentage_cyclic_partially_shrinkable.rs b/benches/generated/gap_column_gap_percentage_cyclic_partially_shrinkable.rs
new file mode 100644
index 000000000..9645e298a
--- /dev/null
+++ b/benches/generated/gap_column_gap_percentage_cyclic_partially_shrinkable.rs
@@ -0,0 +1,54 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_shrink: 0f32,
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_shrink: 0f32,
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Percent(0.5f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_column_gap_percentage_cyclic_shrinkable.rs b/benches/generated/gap_column_gap_percentage_cyclic_shrinkable.rs
new file mode 100644
index 000000000..e066e9dd1
--- /dev/null
+++ b/benches/generated/gap_column_gap_percentage_cyclic_shrinkable.rs
@@ -0,0 +1,52 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Percent(0.2f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_column_gap_percentage_cyclic_unshrinkable.rs b/benches/generated/gap_column_gap_percentage_cyclic_unshrinkable.rs
new file mode 100644
index 000000000..888bf4262
--- /dev/null
+++ b/benches/generated/gap_column_gap_percentage_cyclic_unshrinkable.rs
@@ -0,0 +1,55 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_shrink: 0f32,
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_shrink: 0f32,
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_shrink: 0f32,
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Percent(0.2f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_column_gap_percentage_flexible.rs b/benches/generated/gap_column_gap_percentage_flexible.rs
new file mode 100644
index 000000000..c6ff863f9
--- /dev/null
+++ b/benches/generated/gap_column_gap_percentage_flexible.rs
@@ -0,0 +1,55 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Percent(0.1f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_column_gap_percentage_inflexible.rs b/benches/generated/gap_column_gap_percentage_inflexible.rs
new file mode 100644
index 000000000..ac84f8e89
--- /dev/null
+++ b/benches/generated/gap_column_gap_percentage_inflexible.rs
@@ -0,0 +1,45 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Percent(0.2f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/align_content_space_evenly.rs b/benches/generated/gap_column_gap_wrap_align_center.rs
similarity index 67%
rename from benches/generated/align_content_space_evenly.rs
rename to benches/generated/gap_column_gap_wrap_align_center.rs
index 812842224..82fdd3698 100644
--- a/benches/generated/align_content_space_evenly.rs
+++ b/benches/generated/gap_column_gap_wrap_align_center.rs
@@ -4,8 +4,8 @@ pub fn compute() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -17,8 +17,8 @@ pub fn compute() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -30,8 +30,8 @@ pub fn compute() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -43,8 +43,8 @@ pub fn compute() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -56,8 +56,8 @@ pub fn compute() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -69,8 +69,8 @@ pub fn compute() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -82,7 +82,12 @@ pub fn compute() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 flex_wrap: taffy::style::FlexWrap::Wrap,
-                align_content: taffy::style::AlignContent::SpaceEvenly,
+                align_content: taffy::style::AlignContent::Center,
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
                 size: taffy::geometry::Size {
                     width: taffy::style::Dimension::Points(100f32),
                     height: taffy::style::Dimension::Points(100f32),
@@ -93,5 +98,5 @@ pub fn compute() {
             &[node0, node1, node2, node3, node4, node5],
         )
         .unwrap();
-    taffy.compute_layout(node, taffy::geometry::Size::NONE).unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
 }
diff --git a/benches/generated/gap_column_gap_wrap_align_flex_end.rs b/benches/generated/gap_column_gap_wrap_align_flex_end.rs
new file mode 100644
index 000000000..358f815c8
--- /dev/null
+++ b/benches/generated/gap_column_gap_wrap_align_flex_end.rs
@@ -0,0 +1,102 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node3 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node4 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node5 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_wrap: taffy::style::FlexWrap::Wrap,
+                align_content: taffy::style::AlignContent::FlexEnd,
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2, node3, node4, node5],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_column_gap_wrap_align_flex_start.rs b/benches/generated/gap_column_gap_wrap_align_flex_start.rs
new file mode 100644
index 000000000..a418fb3c2
--- /dev/null
+++ b/benches/generated/gap_column_gap_wrap_align_flex_start.rs
@@ -0,0 +1,102 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node3 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node4 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node5 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_wrap: taffy::style::FlexWrap::Wrap,
+                align_content: taffy::style::AlignContent::FlexStart,
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2, node3, node4, node5],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/align_content_space_around.rs b/benches/generated/gap_column_gap_wrap_align_space_around.rs
similarity index 69%
rename from benches/generated/align_content_space_around.rs
rename to benches/generated/gap_column_gap_wrap_align_space_around.rs
index 667024a5a..a85afb217 100644
--- a/benches/generated/align_content_space_around.rs
+++ b/benches/generated/gap_column_gap_wrap_align_space_around.rs
@@ -4,8 +4,8 @@ pub fn compute() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -17,8 +17,8 @@ pub fn compute() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -30,8 +30,8 @@ pub fn compute() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -43,8 +43,8 @@ pub fn compute() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -56,8 +56,8 @@ pub fn compute() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -69,8 +69,8 @@ pub fn compute() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -83,6 +83,11 @@ pub fn compute() {
             taffy::style::FlexboxLayout {
                 flex_wrap: taffy::style::FlexWrap::Wrap,
                 align_content: taffy::style::AlignContent::SpaceAround,
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
                 size: taffy::geometry::Size {
                     width: taffy::style::Dimension::Points(100f32),
                     height: taffy::style::Dimension::Points(100f32),
@@ -93,5 +98,5 @@ pub fn compute() {
             &[node0, node1, node2, node3, node4, node5],
         )
         .unwrap();
-    taffy.compute_layout(node, taffy::geometry::Size::NONE).unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
 }
diff --git a/benches/generated/align_content_space_between.rs b/benches/generated/gap_column_gap_wrap_align_space_between.rs
similarity index 69%
rename from benches/generated/align_content_space_between.rs
rename to benches/generated/gap_column_gap_wrap_align_space_between.rs
index 27df4fe08..fb9e468af 100644
--- a/benches/generated/align_content_space_between.rs
+++ b/benches/generated/gap_column_gap_wrap_align_space_between.rs
@@ -4,8 +4,8 @@ pub fn compute() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -17,8 +17,8 @@ pub fn compute() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -30,8 +30,8 @@ pub fn compute() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -43,8 +43,8 @@ pub fn compute() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -56,8 +56,8 @@ pub fn compute() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -69,8 +69,8 @@ pub fn compute() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -83,6 +83,11 @@ pub fn compute() {
             taffy::style::FlexboxLayout {
                 flex_wrap: taffy::style::FlexWrap::Wrap,
                 align_content: taffy::style::AlignContent::SpaceBetween,
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
                 size: taffy::geometry::Size {
                     width: taffy::style::Dimension::Points(100f32),
                     height: taffy::style::Dimension::Points(100f32),
@@ -93,5 +98,5 @@ pub fn compute() {
             &[node0, node1, node2, node3, node4, node5],
         )
         .unwrap();
-    taffy.compute_layout(node, taffy::geometry::Size::NONE).unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
 }
diff --git a/benches/generated/gap_column_gap_wrap_align_stretch.rs b/benches/generated/gap_column_gap_wrap_align_stretch.rs
new file mode 100644
index 000000000..2bcfbfb16
--- /dev/null
+++ b/benches/generated/gap_column_gap_wrap_align_stretch.rs
@@ -0,0 +1,69 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                min_size: taffy::geometry::Size { width: taffy::style::Dimension::Points(60f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                min_size: taffy::geometry::Size { width: taffy::style::Dimension::Points(60f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                min_size: taffy::geometry::Size { width: taffy::style::Dimension::Points(60f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node3 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                min_size: taffy::geometry::Size { width: taffy::style::Dimension::Points(60f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node4 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                min_size: taffy::geometry::Size { width: taffy::style::Dimension::Points(60f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_wrap: taffy::style::FlexWrap::Wrap,
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(5f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(300f32),
+                    height: taffy::style::Dimension::Points(300f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2, node3, node4],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_column_row_gap_wrapping.rs b/benches/generated/gap_column_row_gap_wrapping.rs
new file mode 100644
index 000000000..8ebec0c5b
--- /dev/null
+++ b/benches/generated/gap_column_row_gap_wrapping.rs
@@ -0,0 +1,136 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node3 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node4 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node5 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node6 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node7 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node8 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_wrap: taffy::style::FlexWrap::Wrap,
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(80f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[node0, node1, node2, node3, node4, node5, node6, node7, node8],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_percentage_row_gap_wrapping.rs b/benches/generated/gap_percentage_row_gap_wrapping.rs
new file mode 100644
index 000000000..3b43f9b56
--- /dev/null
+++ b/benches/generated/gap_percentage_row_gap_wrapping.rs
@@ -0,0 +1,136 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node3 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node4 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node5 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node6 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node7 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node8 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_wrap: taffy::style::FlexWrap::Wrap,
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Percent(0.1f32),
+                    ..Default::default()
+                },
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(80f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[node0, node1, node2, node3, node4, node5, node6, node7, node8],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_row_gap_align_items_end.rs b/benches/generated/gap_row_gap_align_items_end.rs
new file mode 100644
index 000000000..3cfb0840f
--- /dev/null
+++ b/benches/generated/gap_row_gap_align_items_end.rs
@@ -0,0 +1,78 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node3 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node4 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node5 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_wrap: taffy::style::FlexWrap::Wrap,
+                align_items: taffy::style::AlignItems::FlexEnd,
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(200f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2, node3, node4, node5],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_row_gap_align_items_stretch.rs b/benches/generated/gap_row_gap_align_items_stretch.rs
new file mode 100644
index 000000000..208bbc903
--- /dev/null
+++ b/benches/generated/gap_row_gap_align_items_stretch.rs
@@ -0,0 +1,77 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node3 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node4 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node5 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_wrap: taffy::style::FlexWrap::Wrap,
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(200f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2, node3, node4, node5],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_row_gap_column_child_margins.rs b/benches/generated/gap_row_gap_column_child_margins.rs
new file mode 100644
index 000000000..e61d54292
--- /dev/null
+++ b/benches/generated/gap_row_gap_column_child_margins.rs
@@ -0,0 +1,67 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                margin: taffy::geometry::Rect {
+                    top: taffy::style::Dimension::Points(2f32),
+                    bottom: taffy::style::Dimension::Points(2f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                margin: taffy::geometry::Rect {
+                    top: taffy::style::Dimension::Points(10f32),
+                    bottom: taffy::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                margin: taffy::geometry::Rect {
+                    top: taffy::style::Dimension::Points(15f32),
+                    bottom: taffy::style::Dimension::Points(15f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_direction: taffy::style::FlexDirection::Column,
+                gap: taffy::geometry::Size { height: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(200f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/gap_row_gap_row_wrap_child_margins.rs b/benches/generated/gap_row_gap_row_wrap_child_margins.rs
new file mode 100644
index 000000000..9d2aa1a58
--- /dev/null
+++ b/benches/generated/gap_row_gap_row_wrap_child_margins.rs
@@ -0,0 +1,61 @@
+pub fn compute() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(60f32), ..Default::default() },
+                margin: taffy::geometry::Rect {
+                    top: taffy::style::Dimension::Points(2f32),
+                    bottom: taffy::style::Dimension::Points(2f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(60f32), ..Default::default() },
+                margin: taffy::geometry::Rect {
+                    top: taffy::style::Dimension::Points(10f32),
+                    bottom: taffy::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(60f32), ..Default::default() },
+                margin: taffy::geometry::Rect {
+                    top: taffy::style::Dimension::Points(15f32),
+                    bottom: taffy::style::Dimension::Points(15f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_wrap: taffy::style::FlexWrap::Wrap,
+                gap: taffy::geometry::Size { height: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(200f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+}
diff --git a/benches/generated/mod.rs b/benches/generated/mod.rs
index d9de95bdd..3db294a42 100644
--- a/benches/generated/mod.rs
+++ b/benches/generated/mod.rs
@@ -109,6 +109,35 @@ mod flex_shrink_to_zero;
 mod flex_wrap_align_stretch_fits_one_row;
 mod flex_wrap_children_with_min_main_overriding_flex_basis;
 mod flex_wrap_wrap_to_child_height;
+mod gap_column_gap_child_margins;
+mod gap_column_gap_flexible;
+mod gap_column_gap_flexible_undefined_parent;
+mod gap_column_gap_inflexible;
+mod gap_column_gap_inflexible_undefined_parent;
+mod gap_column_gap_justify_center;
+mod gap_column_gap_justify_flex_end;
+mod gap_column_gap_justify_flex_start;
+mod gap_column_gap_justify_space_around;
+mod gap_column_gap_justify_space_between;
+mod gap_column_gap_justify_space_evenly;
+mod gap_column_gap_mixed_flexible;
+mod gap_column_gap_percentage_cyclic_partially_shrinkable;
+mod gap_column_gap_percentage_cyclic_shrinkable;
+mod gap_column_gap_percentage_cyclic_unshrinkable;
+mod gap_column_gap_percentage_flexible;
+mod gap_column_gap_percentage_inflexible;
+mod gap_column_gap_wrap_align_center;
+mod gap_column_gap_wrap_align_flex_end;
+mod gap_column_gap_wrap_align_flex_start;
+mod gap_column_gap_wrap_align_space_around;
+mod gap_column_gap_wrap_align_space_between;
+mod gap_column_gap_wrap_align_stretch;
+mod gap_column_row_gap_wrapping;
+mod gap_percentage_row_gap_wrapping;
+mod gap_row_gap_align_items_end;
+mod gap_row_gap_align_items_stretch;
+mod gap_row_gap_column_child_margins;
+mod gap_row_gap_row_wrap_child_margins;
 mod justify_content_column_center;
 mod justify_content_column_flex_end;
 mod justify_content_column_flex_start;
@@ -356,6 +385,35 @@ fn benchmark(c: &mut Criterion) {
             flex_wrap_align_stretch_fits_one_row::compute();
             flex_wrap_children_with_min_main_overriding_flex_basis::compute();
             flex_wrap_wrap_to_child_height::compute();
+            gap_column_gap_child_margins::compute();
+            gap_column_gap_flexible::compute();
+            gap_column_gap_flexible_undefined_parent::compute();
+            gap_column_gap_inflexible::compute();
+            gap_column_gap_inflexible_undefined_parent::compute();
+            gap_column_gap_justify_center::compute();
+            gap_column_gap_justify_flex_end::compute();
+            gap_column_gap_justify_flex_start::compute();
+            gap_column_gap_justify_space_around::compute();
+            gap_column_gap_justify_space_between::compute();
+            gap_column_gap_justify_space_evenly::compute();
+            gap_column_gap_mixed_flexible::compute();
+            gap_column_gap_percentage_cyclic_partially_shrinkable::compute();
+            gap_column_gap_percentage_cyclic_shrinkable::compute();
+            gap_column_gap_percentage_cyclic_unshrinkable::compute();
+            gap_column_gap_percentage_flexible::compute();
+            gap_column_gap_percentage_inflexible::compute();
+            gap_column_gap_wrap_align_center::compute();
+            gap_column_gap_wrap_align_flex_end::compute();
+            gap_column_gap_wrap_align_flex_start::compute();
+            gap_column_gap_wrap_align_space_around::compute();
+            gap_column_gap_wrap_align_space_between::compute();
+            gap_column_gap_wrap_align_stretch::compute();
+            gap_column_row_gap_wrapping::compute();
+            gap_percentage_row_gap_wrapping::compute();
+            gap_row_gap_align_items_end::compute();
+            gap_row_gap_align_items_stretch::compute();
+            gap_row_gap_column_child_margins::compute();
+            gap_row_gap_row_wrap_child_margins::compute();
             justify_content_column_center::compute();
             justify_content_column_flex_end::compute();
             justify_content_column_flex_start::compute();
diff --git a/examples/flexbox-gap.rs b/examples/flexbox-gap.rs
new file mode 100644
index 000000000..26de3db3c
--- /dev/null
+++ b/examples/flexbox-gap.rs
@@ -0,0 +1,30 @@
+use taffy::prelude::*;
+
+// Creates three 20px x 20px children, evenly spaced 10px apart from each other
+// Thus the container is 80px x 20px.
+
+fn main() -> Result<(), taffy::error::TaffyError> {
+    let mut taffy = Taffy::new();
+
+    let child_style = FlexboxLayout {
+        size: Size { width: Dimension::Points(20.0), height: Dimension::Points(20.0) },
+        ..Default::default()
+    };
+    let child0 = taffy.new_leaf(child_style.clone())?;
+    let child1 = taffy.new_leaf(child_style.clone())?;
+    let child2 = taffy.new_leaf(child_style.clone())?;
+
+    let root = taffy.new_with_children(
+        FlexboxLayout {
+            gap: Size { width: Dimension::Points(10.0), height: Dimension::Undefined },
+            ..Default::default()
+        },
+        &[child0, child1, child2],
+    )?;
+
+    // Compute layout and print result
+    taffy.compute_layout(root, Size::MAX_CONTENT)?;
+    taffy::debug::print_tree(&taffy, root);
+
+    Ok(())
+}
diff --git a/scripts/gentest/Cargo.toml b/scripts/gentest/Cargo.toml
index 64e086c10..6a87db178 100644
--- a/scripts/gentest/Cargo.toml
+++ b/scripts/gentest/Cargo.toml
@@ -5,6 +5,7 @@ authors = ["Emil Sjölander <emil@visly.app>"]
 edition = "2018"
 
 [dependencies]
+convert_case = "0.5.0"
 env_logger = "0.9.0"
 fantoccini = "0.19.0"
 json = "0.12.0"
diff --git a/scripts/gentest/src/main.rs b/scripts/gentest/src/main.rs
index 8a1615c32..e46f9ea22 100644
--- a/scripts/gentest/src/main.rs
+++ b/scripts/gentest/src/main.rs
@@ -2,11 +2,12 @@ use std::fs;
 use std::path::{Path, PathBuf};
 use std::process::Command;
 
+use convert_case::{Case, Casing};
 use fantoccini::{Client, ClientBuilder};
 
 use log::*;
 use proc_macro2::{Span, TokenStream};
-use quote::quote;
+use quote::{format_ident, quote};
 use syn::Ident;
 
 #[tokio::main]
@@ -91,20 +92,6 @@ async fn main() {
         })
         .fold(quote!(), |a, b| quote!(#a #b));
 
-    for (name, bench_body) in bench_descs {
-        let mut bench_filename = repo_root.join("benches").join("generated").join(&name);
-        bench_filename.set_extension("rs");
-        debug!("writing {} to disk...", &name);
-        fs::write(bench_filename, bench_body.to_string()).unwrap();
-    }
-
-    for (name, test_body) in test_descs {
-        let mut test_filename = repo_root.join("tests").join("generated").join(&name);
-        test_filename.set_extension("rs");
-        debug!("writing {} to disk...", &name);
-        fs::write(test_filename, test_body.to_string()).unwrap();
-    }
-
     let bench_mods = quote!(
         use criterion::{criterion_group, criterion_main, Criterion};
 
@@ -120,9 +107,29 @@ async fn main() {
         criterion_main!(benches);
     );
 
+    info!("writing generated benchmarks file to disk...");
+    let benches_base_path = repo_root.join("benches").join("generated");
+    fs::remove_dir_all(&benches_base_path).unwrap();
+    fs::create_dir(&benches_base_path).unwrap();
+    for (name, bench_body) in bench_descs {
+        let mut bench_filename = benches_base_path.join(&name);
+        bench_filename.set_extension("rs");
+        debug!("writing {} to disk...", &name);
+        fs::write(bench_filename, bench_body.to_string()).unwrap();
+    }
+    fs::write(benches_base_path.join("mod.rs"), bench_mods.to_string()).unwrap();
+
     info!("writing generated test file to disk...");
-    fs::write(repo_root.join("benches").join("generated").join("mod.rs"), bench_mods.to_string()).unwrap();
-    fs::write(repo_root.join("tests").join("generated").join("mod.rs"), test_mods.to_string()).unwrap();
+    let tests_base_path = repo_root.join("tests").join("generated");
+    fs::remove_dir_all(&tests_base_path).unwrap();
+    fs::create_dir(&tests_base_path).unwrap();
+    for (name, test_body) in test_descs {
+        let mut test_filename = tests_base_path.join(&name);
+        test_filename.set_extension("rs");
+        debug!("writing {} to disk...", &name);
+        fs::write(test_filename, test_body.to_string()).unwrap();
+    }
+    fs::write(tests_base_path.join("mod.rs"), test_mods.to_string()).unwrap();
 
     info!("formatting the source directory");
     Command::new("cargo").arg("fmt").current_dir(repo_root).status().unwrap();
@@ -206,15 +213,90 @@ fn generate_assertions(ident: &str, node: &json::JsonValue) -> TokenStream {
 fn generate_node(ident: &str, node: &json::JsonValue) -> TokenStream {
     let style = &node["style"];
 
+    fn quote_object_prop(
+        prop_name: &str,
+        style: &json::JsonValue,
+        quoter: impl Fn(&json::object::Object) -> TokenStream,
+    ) -> TokenStream {
+        let prop_name_snake_case = prop_name.to_case(Case::Snake);
+        let prop_name_camel_case = prop_name.to_case(Case::Camel);
+        let prop_name_ident = format_ident!("{}", prop_name_snake_case);
+        match style[prop_name_camel_case] {
+            json::JsonValue::Object(ref value) => {
+                let prop_value = quoter(value);
+                quote!(#prop_name_ident: #prop_value,)
+            }
+            _ => quote!(),
+        }
+    }
+
+    fn quote_array_prop(
+        prop_name: &str,
+        style: &json::JsonValue,
+        quoter: impl Fn(&[json::JsonValue]) -> TokenStream,
+    ) -> TokenStream {
+        let prop_name_snake_case = prop_name.to_case(Case::Snake);
+        let prop_name_camel_case = prop_name.to_case(Case::Camel);
+        let prop_name_ident = format_ident!("{}", prop_name_snake_case);
+        match style[prop_name_camel_case] {
+            json::JsonValue::Array(ref value) => {
+                let prop_value = quoter(value);
+                quote!(#prop_name_ident: #prop_value,)
+            }
+            _ => quote!(),
+        }
+    }
+
+    // This is currently unused, but leaving for future use.
+    #[allow(dead_code)]
+    fn quote_string_prop(
+        prop_name: &str,
+        style: &json::JsonValue,
+        quoter: impl Fn(&str) -> TokenStream,
+    ) -> TokenStream {
+        let prop_name_snake_case = prop_name.to_case(Case::Snake);
+        let prop_name_camel_case = prop_name.to_case(Case::Camel);
+        let prop_name_ident = format_ident!("{}", prop_name_snake_case);
+        match style[prop_name_camel_case] {
+            json::JsonValue::Short(ref value) => {
+                let prop_value = quoter(value.as_ref());
+                quote!(#prop_name_ident: #prop_value,)
+            }
+            json::JsonValue::String(ref value) => {
+                let prop_value = quoter(value.as_ref());
+                quote!(#prop_name_ident: #prop_value,)
+            }
+            _ => quote!(),
+        }
+    }
+
+    fn quote_number_prop<T: From<json::number::Number>>(
+        prop_name: &str,
+        style: &json::JsonValue,
+        quoter: impl Fn(T) -> TokenStream,
+    ) -> TokenStream {
+        let prop_name_snake_case = prop_name.to_case(Case::Snake);
+        let prop_name_camel_case = prop_name.to_case(Case::Camel);
+        let prop_name_ident = format_ident!("{}", prop_name_snake_case);
+        match style[prop_name_camel_case] {
+            json::JsonValue::Number(ref value) => {
+                let prop_value = quoter((*value).into());
+                quote!(#prop_name_ident: #prop_value,)
+            }
+            _ => quote!(),
+        }
+    }
+
     let display = match style["display"] {
         json::JsonValue::Short(ref value) => match value.as_ref() {
             "none" => quote!(display: taffy::style::Display::None,),
-            _ => quote!(),
+            "grid" => quote!(display: taffy::style::Display::Grid,),
+            _ => quote!(display: taffy::style::Display::Flex,),
         },
         _ => quote!(),
     };
 
-    let position_type = match style["position_type"] {
+    let position_type = match style["positionType"] {
         json::JsonValue::Short(ref value) => match value.as_ref() {
             "absolute" => quote!(position_type: taffy::style::PositionType::Absolute,),
             _ => quote!(),
@@ -307,53 +389,26 @@ fn generate_node(ident: &str, node: &json::JsonValue) -> TokenStream {
         _ => quote!(),
     };
 
-    let flex_grow = match style["flexGrow"] {
-        json::JsonValue::Number(value) => {
-            let value: f32 = value.into();
-            quote!(flex_grow: #value,)
-        }
-        _ => quote!(),
-    };
+    let flex_grow = quote_number_prop("flex_grow", style, |value: f32| quote!(#value));
+    let flex_shrink = quote_number_prop("flex_shrink", style, |value: f32| quote!(#value));
 
-    let flex_shrink = match style["flexShrink"] {
-        json::JsonValue::Number(value) => {
-            let value: f32 = value.into();
-            quote!(flex_shrink: #value,)
-        }
-        _ => quote!(),
-    };
-
-    let flex_basis = match style["flexBasis"] {
-        json::JsonValue::Object(ref value) => {
-            let value = generate_dimension(value);
-            quote!(flex_basis: #value,)
-        }
-        _ => quote!(),
-    };
+    let flex_basis = quote_object_prop("flex_basis", style, generate_dimension);
+    let size = quote_object_prop("size", style, generate_size);
+    let min_size = quote_object_prop("min_size", style, generate_size);
+    let max_size = quote_object_prop("max_size", style, generate_size);
 
-    let size = match style["size"] {
-        json::JsonValue::Object(ref value) => {
-            let size = generate_size(value);
-            quote!(size: #size,)
-        }
-        _ => quote!(),
-    };
+    let gap = quote_object_prop("gap", style, generate_gap);
 
-    let min_size = match style["min_size"] {
-        json::JsonValue::Object(ref value) => {
-            let min_size = generate_size(value);
-            quote!(min_size: #min_size,)
-        }
-        _ => quote!(),
-    };
+    let grid_template_rows = quote_array_prop("grid_template_rows", style, generate_track_definition_list);
+    let grid_template_columns = quote_array_prop("grid_template_columns", style, generate_track_definition_list);
+    let grid_auto_rows = quote_array_prop("grid_auto_rows", style, generate_track_definition_list);
+    let grid_auto_columns = quote_array_prop("grid_auto_columns", style, generate_track_definition_list);
+    let grid_auto_flow = quote_object_prop("grid_auto_flow", style, generate_grid_auto_flow);
 
-    let max_size = match style["max_size"] {
-        json::JsonValue::Object(ref value) => {
-            let max_size = generate_size(value);
-            quote!(max_size: #max_size,)
-        }
-        _ => quote!(),
-    };
+    let grid_row_start = quote_object_prop("grid_row_start", style, generate_grid_position);
+    let grid_row_end = quote_object_prop("grid_row_end", style, generate_grid_position);
+    let grid_column_start = quote_object_prop("grid_column_start", style, generate_grid_position);
+    let grid_column_end = quote_object_prop("grid_column_end", style, generate_grid_position);
 
     macro_rules! edges_quoted {
         ($style:ident, $val:ident) => {
@@ -412,6 +467,16 @@ fn generate_node(ident: &str, node: &json::JsonValue) -> TokenStream {
             #flex_grow
             #flex_shrink
             #flex_basis
+            #gap
+            #grid_template_rows
+            #grid_template_columns
+            #grid_auto_rows
+            #grid_auto_columns
+            #grid_auto_flow
+            #grid_row_start
+            #grid_row_end
+            #grid_column_start
+            #grid_column_end
             #size
             #min_size
             #max_size
@@ -426,18 +491,24 @@ fn generate_node(ident: &str, node: &json::JsonValue) -> TokenStream {
     ).unwrap();)
 }
 
-macro_rules! dim_quoted {
-    ($obj:ident, $dim_name:ident) => {
-        let $dim_name = match $obj.get(stringify!($dim_name)) {
+macro_rules! dim_quoted_renamed {
+    ($obj:ident, $in_name:ident, $out_name:ident) => {
+        let $out_name = match $obj.get(stringify!($in_name)) {
             Some(json::JsonValue::Object(ref value)) => {
                 let dim = generate_dimension(value);
-                quote!($dim_name: #dim,)
+                quote!($out_name: #dim,)
             }
             _ => quote!(),
         };
     };
 }
 
+macro_rules! dim_quoted {
+    ($obj:ident, $dim_name:ident) => {
+        dim_quoted_renamed!($obj, $dim_name, $dim_name)
+    };
+}
+
 fn generate_size(size: &json::object::Object) -> TokenStream {
     dim_quoted!(size, width);
     dim_quoted!(size, height);
@@ -449,6 +520,17 @@ fn generate_size(size: &json::object::Object) -> TokenStream {
     )
 }
 
+fn generate_gap(size: &json::object::Object) -> TokenStream {
+    dim_quoted_renamed!(size, column, width);
+    dim_quoted_renamed!(size, row, height);
+    quote!(
+        taffy::geometry::Size {
+            #width #height
+            ..Default::default()
+        }
+    )
+}
+
 fn generate_dimension(dimen: &json::object::Object) -> TokenStream {
     let unit = dimen.get("unit").unwrap();
     let value = || dimen.get("value").unwrap().as_f32().unwrap();
@@ -481,3 +563,95 @@ fn generate_edges(dimen: &json::object::Object) -> TokenStream {
         ..Default::default()
     })
 }
+
+fn generate_grid_auto_flow(auto_flow: &json::object::Object) -> TokenStream {
+    let direction = auto_flow.get("direction").unwrap().as_str().unwrap();
+    let algorithm = auto_flow.get("algorithm").unwrap().as_str().unwrap();
+
+    match (direction, algorithm) {
+        ("row", "sparse") => quote!(taffy::style::GridAutoFlow::Row),
+        ("column", "sparse") => quote!(taffy::style::GridAutoFlow::Column),
+        ("row", "dense") => quote!(taffy::style::GridAutoFlow::RowDense),
+        ("column", "dense") => quote!(taffy::style::GridAutoFlow::ColumnDense),
+        _ => unreachable!(),
+    }
+}
+
+fn generate_grid_position(grid_position: &json::object::Object) -> TokenStream {
+    let kind = grid_position.get("kind").unwrap();
+    let value = || grid_position.get("value").unwrap().as_f32().unwrap();
+
+    match kind {
+        json::JsonValue::Short(ref kind) => match kind.as_ref() {
+            "auto" => quote!(taffy::style::GridLine::Auto),
+            "span" => {
+                let value = value() as u16;
+                quote!(taffy::style::GridLine::Span(#value))
+            }
+            "track" => {
+                let value = value() as i16;
+                quote!(taffy::style::GridLine::Track(#value))
+            }
+            _ => unreachable!(),
+        },
+        _ => unreachable!(),
+    }
+}
+
+fn generate_track_definition_list(raw_list: &[json::JsonValue]) -> TokenStream {
+    let list = raw_list.iter().map(|obj| match obj {
+        json::JsonValue::Object(inner) => generate_track_definition(inner),
+        _ => unreachable!(),
+    });
+
+    quote!(vec![#(#list),*])
+}
+
+fn generate_track_definition(track_definition: &json::object::Object) -> TokenStream {
+    let kind = track_definition.get("kind").unwrap().as_str().unwrap();
+    let name = || track_definition.get("name").unwrap().as_str().unwrap();
+    let arguments = || track_definition.get("arguments").unwrap();
+
+    match kind {
+        "scalar" => generate_scalar_definition(track_definition),
+        "function" => match (name(), arguments()) {
+            ("minmax", json::JsonValue::Array(arguments)) => {
+                if arguments.len() != 2 {
+                    panic!("minmax function with the wrong number of arguments");
+                }
+                let min = match arguments[0] {
+                    json::JsonValue::Object(ref arg) => generate_scalar_definition(arg),
+                    _ => unreachable!(),
+                };
+                let max = match arguments[1] {
+                    json::JsonValue::Object(ref arg) => generate_scalar_definition(arg),
+                    _ => unreachable!(),
+                };
+                quote!(taffy::style::GridTrackSizingFunction::MinMax{ min: #min, max: #max })
+            }
+            // TODO: Add support for fit-content
+            _ => unreachable!(),
+        },
+        _ => unreachable!(),
+    }
+}
+
+fn generate_scalar_definition(track_definition: &json::object::Object) -> TokenStream {
+    let unit = || track_definition.get("unit").unwrap().as_str().unwrap();
+    let value = || track_definition.get("value").unwrap().as_f32().unwrap();
+
+    match unit() {
+        "auto" => quote!(taffy::style::GridTrackSizingFunction::Auto),
+        "min-content" => quote!(taffy::style::GridTrackSizingFunction::MinContent),
+        "max-content" => quote!(taffy::style::GridTrackSizingFunction::MaxContent),
+        "points" | "percent" => {
+            let value = generate_dimension(track_definition);
+            quote!(taffy::style::GridTrackSizingFunction::Fixed(#value))
+        }
+        "fraction" => {
+            let value: f32 = value();
+            quote!(taffy::style::GridTrackSizingFunction::Flex(#value))
+        }
+        _ => unreachable!(),
+    }
+}
diff --git a/scripts/gentest/test_helper.js b/scripts/gentest/test_helper.js
index 4baf07b1d..184cdf7e2 100644
--- a/scripts/gentest/test_helper.js
+++ b/scripts/gentest/test_helper.js
@@ -1,79 +1,153 @@
-function define_element_prop(property, getter) {
-  if (!(property in Element.prototype)) {
-    Object.defineProperty(Element.prototype, property, {
-      get: function() {
-        return getter(this);
+
+class TrackSizingParser {
+  static INITIAL_CHAR_REGEX = /[a-z-A-Z0-9]/;
+  static TOKEN_CHAR_REGEX = /[-\.a-z-A-Z0-9%]/;
+
+  constructor(input, options = { allowFrUnits: true }) {
+    this.input = input;
+    this.index = 0;
+    this.options = options;
+  }
+
+  parseList() {
+    return this._parseItemList(' ', null);
+  }
+
+  parseSingleItem() {
+    return this.parseItem();
+  }
+
+  _parseItemList(separator, terminator = null) {
+    if (!separator) throw new Error('No terminator passed');
+    let tokenList = [];
+    // console.debug('Parse List', this.index, this.input.slice(this.index));
+
+    while (this.index < this.input.length) {
+      const char = this.input[this.index];
+      // console.debug(this.index, char);
+
+      // Skip whitespace
+      if (char === ' ') { this.index++; continue;}
+
+      if (TrackSizingParser.INITIAL_CHAR_REGEX.test(char)) {
+        const token = this._parseItem();
+        tokenList.push(token);
+
+        const nextChar = this.input[this.index];
+        if ((terminator && nextChar === terminator) || !terminator && !nextChar) {
+          return tokenList;
+        } else {
+          this.index++;
+          continue;
+        }
       }
-    });
+
+      throw new Error (`Invalid start of token ${char}`);
+    }
   }
-}
 
-define_element_prop("__stretch_description__", (e) => {
-  return JSON.stringify(describeElement(e));
-});
-
-function parseDimension(input) {
-  if (input.endsWith("px")) {
-    return {
-      unit: 'points', 
-      value: Number(input.replace('px',''))
-    };
-  } else if (input.endsWith("%")) {
-    return {
-      unit: 'percent', 
-      value: Number(input.replace('%','')) / 100
-    };
-  } else {
-    return input == "auto" ? {unit: "auto"} : undefined;
+  _parseItem() {
+    let token = '';
+    // console.debug('Parse Item', this.index, this.input.slice(this.index));
+
+    while (this.index < this.input.length) {
+      const char = this.input[this.index];
+      // console.debug(this.index, char);
+
+      if (TrackSizingParser.TOKEN_CHAR_REGEX.test(char)) {
+        token += char;
+        this.index++;
+        continue;
+      }
+
+      if (char === '(') {
+        this.index++;
+        const args = this._parseItemList(',', ')');
+        this.index++;
+        return { kind: 'function', name: token, arguments: args };
+      }
+
+      return { kind: 'scalar', ...this._parseScalarItem(token) };
+    }
+    return { kind: 'scalar', ...this._parseScalarItem(token) };
+
   }
+
+  _parseScalarItem(item) {
+    const res = parseDimension(item, { allowFrUnits: this.options.allowFrUnits });
+    if (!res) throw new Error(`Invalid scalar grid track sizing function ${item}`);
+    return res;
+  }
+
+}
+
+function parseDimension(input, options = { allowFrUnits: false }) {
+  if (options.allowFrUnits && input.endsWith('fr')) return { unit: 'fraction', value: parseFloat(input.replace('fr','')) };
+  if (input.endsWith('px')) return { unit: 'points',   value: parseFloat(input.replace('px','')) };
+  if (input.endsWith('%'))  return { unit: 'percent',  value: parseFloat(input.replace('%','')) / 100 };
+  if (input === 'auto')     return { unit: 'auto' };
+  if (input === 'min-content')     return { unit: 'min-content' };
+  if (input === 'max-content')     return { unit: 'max-content' };
+  return undefined;
 }
 
 function parseNumber(input) {
-  if (input === "" || isNaN(input)) {
-    return undefined;
-  } else {
-    return Number(input);
-  }
+  if (input === '' || isNaN(input)) return undefined;
+  return Number(input);
 }
 
 function parseEnum(input) {
-  if (input) {
-    return input;
-  } else {
-    return undefined;
-  }
+  if (input) return input;
+  return undefined;
 }
 
 function parseEdges(edges) {
-  var start = parseDimension(edges.start);
-  var end = parseDimension(edges.end);
-  var top = parseDimension(edges.top);
-  var bottom = parseDimension(edges.bottom);
+  const start = parseDimension(edges.start);
+  const end = parseDimension(edges.end);
+  const top = parseDimension(edges.top);
+  const bottom = parseDimension(edges.bottom);
   
-  if (start === undefined && end === undefined && top === undefined && bottom === undefined) {
-    return undefined;
-  }
-
-  return {
-    start: start,
-    end: end,
-    top: top,
-    bottom: bottom
-  };
+  if (!start && !end && !top && !bottom) return undefined;
+  return { start, end, top, bottom };
 }
 
 function parseSize(size) {
-  var width = parseDimension(size.width);
-  var height = parseDimension(size.height);
+  const width = parseDimension(size.width);
+  const height = parseDimension(size.height);
   
-  if (width === undefined && height === undefined) {
-    return undefined;
+  if (!width && !height) return undefined;
+  return { width, height };
+}
+
+function parseGaps(style) {
+  if (style.gap) {
+    const gaps = style.gap.trim().split(/\s+/).map(part => parseDimension(part));
+    return { row: gaps[0], column: gaps[1] ?? gaps[0] };
+  }
+  if (style.rowGap || style.columnGap) {
+    return { row: parseDimension(style.rowGap), column: parseDimension(style.columnGap) }
   }
+  return undefined;
+}
 
-  return {
-    width: width,
-    height: height,
-  };
+
+function parseGridTrackDefinitions(input) {
+  if (input === '') return undefined;
+  return new TrackSizingParser(input).parseList();
+}
+
+function parseGridAutoFlow(input) {
+  if (!/column/.test(input) && !/row/.test(input) && !/dense/.test(input)) return undefined;
+  const direction = /column/.test(input) ? 'column' : 'row';
+  const algorithm = /dense/.test(input) ? 'dense' : 'sparse';
+  return { direction, algorithm };
+}
+
+function parseGridPosition(input) {
+  if (input === 'auto') return { kind: 'auto' }
+  if (/^span +\d+$/.test(input)) return { kind: 'span', value: parseInt(input.replace(/[^\d]/g, ''), 10)}
+  if (/^-?\d+$/.test(input)) return { kind: 'track', value: parseInt(input, 10)}
+  return undefined;
 }
 
 function describeElement(e) {
@@ -81,7 +155,7 @@ function describeElement(e) {
     style: {
       display: parseEnum(e.style.display),
 
-      position_type: parseEnum(e.style.position),
+      positionType: parseEnum(e.style.position),
       direction: parseEnum(e.style.direction),
       flexDirection: parseEnum(e.style.flexDirection),
 
@@ -98,9 +172,22 @@ function describeElement(e) {
       flexShrink: parseNumber(e.style.flexShrink),
       flexBasis: parseDimension(e.style.flexBasis),
 
+      gridTemplateRows: parseGridTrackDefinitions(e.style.gridTemplateRows),
+      gridTemplateColumns: parseGridTrackDefinitions(e.style.gridTemplateColumns),
+      gridAutoRows: parseGridTrackDefinitions(e.style.gridAutoRows),
+      gridAutoColumns: parseGridTrackDefinitions(e.style.gridAutoColumns),
+      gridAutoFlow: parseGridAutoFlow(e.style.gridAutoFlow),
+
+      gridRowStart: parseGridPosition(e.style.gridRowStart),
+      gridRowEnd: parseGridPosition(e.style.gridRowEnd),
+      gridColumnStart: parseGridPosition(e.style.gridColumnStart),
+      gridColumnEnd: parseGridPosition(e.style.gridColumnEnd),
+
+      gap: parseGaps(e.style),
+
       size: parseSize({width: e.style.width, height: e.style.height}),
-      min_size: parseSize({width: e.style.minWidth, height: e.style.minHeight}),
-      max_size: parseSize({width: e.style.maxWidth, height: e.style.maxHeight}),
+      minSize: parseSize({width: e.style.minWidth, height: e.style.minHeight}),
+      maxSize: parseSize({width: e.style.maxWidth, height: e.style.maxHeight}),
 
       margin: parseEdges({
         start: e.style.marginLeft,
@@ -141,3 +228,12 @@ function describeElement(e) {
     children: Array.from(e.children).map(c => describeElement(c)),
   }
 }
+
+// Useful when developing this script. Logs the parsed style to the console when any test fixture is opened in a browser.
+window.onload = function () {
+  try {
+    console.log(describeElement(document.getElementById('test-root')));
+  } catch (e) {
+    console.error(e);
+  }
+}
diff --git a/src/compute/flexbox.rs b/src/compute/flexbox.rs
index f7a20ea37..47657a698 100644
--- a/src/compute/flexbox.rs
+++ b/src/compute/flexbox.rs
@@ -75,6 +75,9 @@ struct FlexItem {
 struct FlexLine<'a> {
     /// The slice of items to iterate over during computation of this line
     items: &'a mut [FlexItem],
+    /// The length in the main-axis that this line contributes to the overall main
+    /// main size of the container.
+    container_main_size_contribution: f32,
     /// The dimensions of the cross-axis
     cross_size: f32,
     /// The relative offset of the cross-axis
@@ -98,6 +101,8 @@ struct AlgoConstants {
     border: Rect<f32>,
     /// The padding of this section
     padding_border: Rect<f32>,
+    /// The gap of this section
+    gap: Size<f32>,
 
     /// The size of the internal node
     node_inner_size: Size<Option<f32>>,
@@ -197,11 +202,24 @@ fn compute_preliminary(
     NODE_LOGGER.log("collect_flex_lines");
     let mut flex_lines = collect_flex_lines(tree, node, &constants, available_space, &mut flex_items);
 
+    // If container size is undefined, re-resolve gap based on resolved base sizes
+    let original_gap = constants.gap;
+    if constants.node_inner_size.main(constants.dir).is_none() {
+        let longest_line_length = flex_lines.iter().fold(f32::MIN, |acc, line| {
+            let length: f32 = line.items.iter().map(|item| item.hypothetical_outer_size.main(constants.dir)).sum();
+            acc.max(length)
+        });
+
+        let style = tree.style(node);
+        let new_gap = style.gap.width.maybe_resolve(longest_line_length).unwrap_or(0.0);
+        constants.gap.set_main(constants.dir, new_gap);
+    }
+
     // 6. Resolve the flexible lengths of all the flex items to find their used main size.
     #[cfg(feature = "debug")]
     NODE_LOGGER.log("resolve_flexible_lengths");
     for line in &mut flex_lines {
-        resolve_flexible_lengths(tree, line, &constants, available_space);
+        resolve_flexible_lengths(tree, line, &constants, original_gap, available_space);
     }
 
     // TODO: Cleanup and make according to spec
@@ -209,11 +227,8 @@ fn compute_preliminary(
     constants.container_size.set_main(
         constants.dir,
         known_dimensions.main(constants.dir).unwrap_or({
-            let longest_line = flex_lines.iter().fold(f32::MIN, |acc, line| {
-                let length: f32 = line.items.iter().map(|item| item.outer_target_size.main(constants.dir)).sum();
-                acc.max(length)
-            });
-
+            let longest_line =
+                flex_lines.iter().fold(f32::MIN, |acc, line| acc.max(line.container_main_size_contribution));
             let size = longest_line + constants.padding_border.main_axis_sum(constants.dir);
             match available_space.main(constants.dir) {
                 AvailableSpace::Definite(val) if flex_lines.len() > 1 && size < val => val,
@@ -291,7 +306,7 @@ fn compute_preliminary(
     // 15. Determine the flex container’s used cross size.
     #[cfg(feature = "debug")]
     NODE_LOGGER.log("determine_container_cross_size");
-    let total_cross_size = determine_container_cross_size(&mut flex_lines, known_dimensions, &mut constants);
+    let total_line_cross_size = determine_container_cross_size(&mut flex_lines, known_dimensions, &mut constants);
 
     // We have the container size.
     // If our caller does not care about performing layout we are done now.
@@ -303,7 +318,7 @@ fn compute_preliminary(
     // 16. Align all flex lines per align-content.
     #[cfg(feature = "debug")]
     NODE_LOGGER.log("align_flex_lines_per_align_content");
-    align_flex_lines_per_align_content(tree, &mut flex_lines, node, &constants, total_cross_size);
+    align_flex_lines_per_align_content(tree, &mut flex_lines, node, &constants, total_line_cross_size);
 
     // Do a final layout pass and gather the resulting layouts
     #[cfg(feature = "debug")]
@@ -356,6 +371,7 @@ fn compute_constants(
         width: node_size.width.maybe_sub(padding_border.horizontal_axis_sum()),
         height: node_size.height.maybe_sub(padding_border.vertical_axis_sum()),
     };
+    let gap = style.gap.resolve_or_default(node_inner_size.or(Size { width: Some(0.0), height: Some(0.0) }));
 
     let container_size = Size::ZERO;
     let inner_container_size = Size::ZERO;
@@ -367,6 +383,7 @@ fn compute_constants(
         is_wrap_reverse,
         margin,
         border,
+        gap,
         padding_border,
         node_inner_size,
         container_size,
@@ -621,9 +638,15 @@ fn collect_flex_lines<'a>(
     let mut lines = crate::sys::new_vec_with_capacity(1);
 
     if tree.style(node).flex_wrap == FlexWrap::NoWrap {
-        lines.push(FlexLine { items: flex_items.as_mut_slice(), cross_size: 0.0, offset_cross: 0.0 });
+        lines.push(FlexLine {
+            items: flex_items.as_mut_slice(),
+            container_main_size_contribution: 0.0,
+            cross_size: 0.0,
+            offset_cross: 0.0,
+        });
     } else {
         let mut flex_items = &mut flex_items[..];
+        let main_axis_gap = constants.gap.main(constants.dir);
 
         while !flex_items.is_empty() {
             let mut line_length = 0.0;
@@ -631,7 +654,10 @@ fn collect_flex_lines<'a>(
                 .iter()
                 .enumerate()
                 .find(|&(idx, child)| {
-                    line_length += child.hypothetical_outer_size.main(constants.dir);
+                    // Gaps only occur between items (not before the first one or after the last one)
+                    // So first item in the line does not contribute a gap to the line length
+                    let gap_contribution = if idx == 0 { 0.0 } else { main_axis_gap };
+                    line_length += child.hypothetical_outer_size.main(constants.dir) + gap_contribution;
                     if let AvailableSpace::Definite(main) = available_space.main(constants.dir) {
                         line_length > main && idx != 0
                     } else {
@@ -642,7 +668,7 @@ fn collect_flex_lines<'a>(
                 .unwrap_or(flex_items.len());
 
             let (items, rest) = flex_items.split_at_mut(index);
-            lines.push(FlexLine { items, cross_size: 0.0, offset_cross: 0.0 });
+            lines.push(FlexLine { items, container_main_size_contribution: 0.0, cross_size: 0.0, offset_cross: 0.0 });
             flex_items = rest;
         }
     }
@@ -658,14 +684,20 @@ fn resolve_flexible_lengths(
     tree: &mut impl LayoutTree,
     line: &mut FlexLine,
     constants: &AlgoConstants,
+    original_gap: Size<f32>,
     available_space: Size<AvailableSpace>,
 ) {
+    let total_original_main_axis_gap = sum_axis_gaps(original_gap.main(constants.dir), line.items.len());
+    let total_main_axis_gap = sum_axis_gaps(constants.gap.main(constants.dir), line.items.len());
+
     // 1. Determine the used flex factor. Sum the outer hypothetical main sizes of all
     //    items on the line. If the sum is less than the flex container’s inner main size,
     //    use the flex grow factor for the rest of this algorithm; otherwise, use the
     //    flex shrink factor.
 
-    let used_flex_factor: f32 = line.items.iter().map(|child| child.hypothetical_outer_size.main(constants.dir)).sum();
+    let total_hypothetical_outer_main_size =
+        line.items.iter().map(|child| child.hypothetical_outer_size.main(constants.dir)).sum::<f32>();
+    let used_flex_factor: f32 = total_original_main_axis_gap + total_hypothetical_outer_main_size;
     let growing = used_flex_factor < constants.node_inner_size.main(constants.dir).unwrap_or(0.0);
     let shrinking = !growing;
 
@@ -713,18 +745,22 @@ fn resolve_flexible_lengths(
         }
     }
 
+    let total_target_size = line.items.iter().map(|child| child.outer_target_size.main(constants.dir)).sum::<f32>();
+    line.container_main_size_contribution = total_target_size + total_original_main_axis_gap;
+
     // 3. Calculate initial free space. Sum the outer sizes of all items on the line,
     //    and subtract this from the flex container’s inner main size. For frozen items,
     //    use their outer target main size; for other items, use their outer flex base size.
 
-    let used_space: f32 = line
-        .items
-        .iter()
-        .map(|child| {
-            child.margin.main_axis_sum(constants.dir)
-                + if child.frozen { child.target_size.main(constants.dir) } else { child.flex_basis }
-        })
-        .sum();
+    let used_space: f32 = total_main_axis_gap
+        + line
+            .items
+            .iter()
+            .map(|child| {
+                child.margin.main_axis_sum(constants.dir)
+                    + if child.frozen { child.target_size.main(constants.dir) } else { child.flex_basis }
+            })
+            .sum::<f32>();
 
     let initial_free_space = constants.node_inner_size.main(constants.dir).maybe_sub(used_space).unwrap_or(0.0);
 
@@ -744,14 +780,15 @@ fn resolve_flexible_lengths(
         //    value is less than the magnitude of the remaining free space, use this
         //    as the remaining free space.
 
-        let used_space: f32 = line
-            .items
-            .iter()
-            .map(|child| {
-                child.margin.main_axis_sum(constants.dir)
-                    + if child.frozen { child.target_size.main(constants.dir) } else { child.flex_basis }
-            })
-            .sum();
+        let used_space: f32 = total_main_axis_gap
+            + line
+                .items
+                .iter()
+                .map(|child| {
+                    child.margin.main_axis_sum(constants.dir)
+                        + if child.frozen { child.target_size.main(constants.dir) } else { child.flex_basis }
+                })
+                .sum::<f32>();
 
         let mut unfrozen: Vec<&mut FlexItem> = line.items.iter_mut().filter(|child| !child.frozen).collect();
 
@@ -762,13 +799,14 @@ fn resolve_flexible_lengths(
             });
 
         let free_space = if growing && sum_flex_grow < 1.0 {
-            (initial_free_space * sum_flex_grow)
+            (initial_free_space * sum_flex_grow - total_main_axis_gap)
                 .maybe_min(constants.node_inner_size.main(constants.dir).maybe_sub(used_space))
         } else if shrinking && sum_flex_shrink < 1.0 {
-            (initial_free_space * sum_flex_shrink)
+            (initial_free_space * sum_flex_shrink - total_main_axis_gap)
                 .maybe_max(constants.node_inner_size.main(constants.dir).maybe_sub(used_space))
         } else {
-            (constants.node_inner_size.main(constants.dir).maybe_sub(used_space)).unwrap_or(0.0)
+            (constants.node_inner_size.main(constants.dir).maybe_sub(used_space))
+                .unwrap_or(used_flex_factor - used_space)
         };
 
         // c. Distribute free space proportional to the flex factors.
@@ -1085,7 +1123,8 @@ fn handle_align_content_stretch(
     constants: &AlgoConstants,
 ) {
     if tree.style(node).align_content == AlignContent::Stretch && node_size.cross(constants.dir).is_some() {
-        let total_cross: f32 = flex_lines.iter().map(|line| line.cross_size).sum();
+        let total_cross_axis_gap = sum_axis_gaps(constants.gap.cross(constants.dir), flex_lines.len());
+        let total_cross: f32 = flex_lines.iter().map(|line| line.cross_size).sum::<f32>() + total_cross_axis_gap;
         let inner_cross =
             (node_size.cross(constants.dir).maybe_sub(constants.padding_border.cross_axis_sum(constants.dir)))
                 .unwrap_or(0.0);
@@ -1161,7 +1200,9 @@ fn distribute_remaining_free_space(
     constants: &AlgoConstants,
 ) {
     for line in flex_lines {
-        let used_space: f32 = line.items.iter().map(|child| child.outer_target_size.main(constants.dir)).sum();
+        let total_main_axis_gap = sum_axis_gaps(constants.gap.main(constants.dir), line.items.len());
+        let used_space: f32 = total_main_axis_gap
+            + line.items.iter().map(|child| child.outer_target_size.main(constants.dir)).sum::<f32>();
         let free_space = constants.inner_container_size.main(constants.dir) - used_space;
         let mut num_auto_margins = 0;
 
@@ -1198,47 +1239,62 @@ fn distribute_remaining_free_space(
         } else {
             let num_items = line.items.len();
             let layout_reverse = constants.dir.is_reverse();
+            let gap = constants.gap.main(constants.dir);
 
             let justify_item = |(i, child): (usize, &mut FlexItem)| {
                 let is_first = i == 0;
 
                 child.offset_main = match tree.style(node).justify_content {
                     JustifyContent::FlexStart => {
-                        if layout_reverse && is_first {
-                            free_space
+                        if is_first {
+                            if layout_reverse {
+                                free_space
+                            } else {
+                                0.0
+                            }
                         } else {
-                            0.0
+                            gap
                         }
                     }
                     JustifyContent::Center => {
                         if is_first {
                             free_space / 2.0
                         } else {
-                            0.0
+                            gap
                         }
                     }
                     JustifyContent::FlexEnd => {
-                        if is_first && !layout_reverse {
-                            free_space
+                        if is_first {
+                            if !layout_reverse {
+                                free_space
+                            } else {
+                                0.0
+                            }
                         } else {
-                            0.0
+                            gap
                         }
                     }
                     JustifyContent::SpaceBetween => {
                         if is_first {
                             0.0
                         } else {
-                            free_space / (num_items - 1) as f32
+                            gap + (free_space / (num_items - 1) as f32)
                         }
                     }
                     JustifyContent::SpaceAround => {
                         if is_first {
                             (free_space / num_items as f32) / 2.0
                         } else {
-                            free_space / num_items as f32
+                            gap + (free_space / num_items as f32)
+                        }
+                    }
+                    JustifyContent::SpaceEvenly => {
+                        if is_first {
+                            free_space / (num_items + 1) as f32
+                        } else {
+                            gap + (free_space / (num_items + 1) as f32)
                         }
                     }
-                    JustifyContent::SpaceEvenly => free_space / (num_items + 1) as f32,
                 };
             };
 
@@ -1388,13 +1444,14 @@ fn determine_container_cross_size(
     node_size: Size<Option<f32>>,
     constants: &mut AlgoConstants,
 ) -> f32 {
-    let total_cross_size: f32 = flex_lines.iter().map(|line| line.cross_size).sum();
+    let total_cross_axis_gap = sum_axis_gaps(constants.gap.cross(constants.dir), flex_lines.len());
+    let total_line_cross_size: f32 = flex_lines.iter().map(|line| line.cross_size).sum::<f32>();
 
     constants.container_size.set_cross(
         constants.dir,
-        node_size
-            .cross(constants.dir)
-            .unwrap_or(total_cross_size + constants.padding_border.cross_axis_sum(constants.dir)),
+        node_size.cross(constants.dir).unwrap_or(
+            total_line_cross_size + total_cross_axis_gap + constants.padding_border.cross_axis_sum(constants.dir),
+        ),
     );
 
     constants.inner_container_size.set_cross(
@@ -1402,7 +1459,7 @@ fn determine_container_cross_size(
         constants.container_size.cross(constants.dir) - constants.padding_border.cross_axis_sum(constants.dir),
     );
 
-    total_cross_size
+    total_line_cross_size
 }
 
 /// Align all flex lines per `align-content`.
@@ -1418,48 +1475,70 @@ fn align_flex_lines_per_align_content(
     constants: &AlgoConstants,
     total_cross_size: f32,
 ) {
-    let free_space = constants.inner_container_size.cross(constants.dir) - total_cross_size;
     let num_lines = flex_lines.len();
+    let gap = constants.gap.cross(constants.dir);
+    let total_cross_axis_gap = sum_axis_gaps(gap, num_lines);
+    let free_space = constants.inner_container_size.cross(constants.dir) - total_cross_size - total_cross_axis_gap;
 
     let align_line = |(i, line): (usize, &mut FlexLine)| {
         let is_first = i == 0;
 
         line.offset_cross = match tree.style(node).align_content {
             AlignContent::FlexStart => {
-                if is_first && constants.is_wrap_reverse {
-                    free_space
+                if is_first {
+                    if constants.is_wrap_reverse {
+                        free_space
+                    } else {
+                        0.0
+                    }
                 } else {
-                    0.0
+                    gap
                 }
             }
             AlignContent::FlexEnd => {
-                if is_first && !constants.is_wrap_reverse {
-                    free_space
+                if is_first {
+                    if !constants.is_wrap_reverse {
+                        free_space
+                    } else {
+                        0.0
+                    }
                 } else {
-                    0.0
+                    gap
                 }
             }
             AlignContent::Center => {
                 if is_first {
                     free_space / 2.0
                 } else {
+                    gap
+                }
+            }
+            AlignContent::Stretch => {
+                if is_first {
                     0.0
+                } else {
+                    gap
+                }
+            }
+            AlignContent::SpaceEvenly => {
+                if is_first {
+                    free_space / (num_lines + 1) as f32
+                } else {
+                    gap + (free_space / (num_lines + 1) as f32)
                 }
             }
-            AlignContent::Stretch => 0.0,
-            AlignContent::SpaceEvenly => free_space / (num_lines + 1) as f32,
             AlignContent::SpaceBetween => {
                 if is_first {
                     0.0
                 } else {
-                    free_space / (num_lines - 1) as f32
+                    gap + (free_space / (num_lines - 1) as f32)
                 }
             }
             AlignContent::SpaceAround => {
                 if is_first {
                     (free_space / num_lines as f32) / 2.0
                 } else {
-                    free_space / num_lines as f32
+                    gap + (free_space / num_lines as f32)
                 }
             }
         };
@@ -1760,6 +1839,21 @@ fn hidden_layout(tree: &mut impl LayoutTree, node: Node, order: u32) {
     }
 }
 
+/// Computes the total space taken up by gaps in an axis given:
+///   - The size of each gap
+///   - The number of items (children or flex-lines) between which there are gaps
+#[inline(always)]
+fn sum_axis_gaps(gap: f32, num_items: usize) -> f32 {
+    // Gaps only exist between items, so...
+    if num_items <= 1 {
+        // ...if there are less than 2 items then there are no gaps
+        0.0
+    } else {
+        // ...otherwise there are (num_items - 1) gaps
+        gap * (num_items - 1) as f32
+    }
+}
+
 #[cfg(test)]
 mod tests {
     use super::hidden_layout;
diff --git a/src/resolve.rs b/src/resolve.rs
index ac32b260d..e8895d213 100644
--- a/src/resolve.rs
+++ b/src/resolve.rs
@@ -65,6 +65,15 @@ impl ResolveOrDefault<Option<f32>, f32> for Dimension {
     }
 }
 
+impl ResolveOrDefault<Size<Option<f32>>, Size<f32>> for Size<Dimension> {
+    fn resolve_or_default(self, context: Size<Option<f32>>) -> Size<f32> {
+        Size {
+            width: self.width.resolve_or_default(context.width),
+            height: self.height.resolve_or_default(context.height),
+        }
+    }
+}
+
 impl ResolveOrDefault<Size<Option<f32>>, Rect<f32>> for Rect<Dimension> {
     fn resolve_or_default(self, context: Size<Option<f32>>) -> Rect<f32> {
         Rect {
diff --git a/src/style.rs b/src/style.rs
index d1f11dd86..5a9a99958 100644
--- a/src/style.rs
+++ b/src/style.rs
@@ -395,6 +395,9 @@ pub struct FlexboxLayout {
     pub padding: Rect<Dimension>,
     /// How large should the border be on each side?
     pub border: Rect<Dimension>,
+    // Gap
+    /// How large should the gaps between items in a grid or flex container be?
+    pub gap: Size<Dimension>,
     /// The relative rate at which this item grows when it is expanding to fill space
     ///
     /// 0.0 is the default value, and this value must not be negative.
@@ -433,6 +436,7 @@ impl FlexboxLayout {
         margin: Rect::UNDEFINED,
         padding: Rect::UNDEFINED,
         border: Rect::UNDEFINED,
+        gap: Size::UNDEFINED,
         flex_grow: 0.0,
         flex_shrink: 1.0,
         flex_basis: Dimension::Auto,
@@ -554,6 +558,7 @@ impl FlexboxLayout {
 #[cfg(test)]
 mod tests {
     use super::FlexboxLayout;
+    use crate::geometry::Size;
 
     #[test]
     fn defaults_match() {
@@ -570,6 +575,7 @@ mod tests {
             margin: Default::default(),
             padding: Default::default(),
             border: Default::default(),
+            gap: Size::UNDEFINED,
             flex_grow: 0.0,
             flex_shrink: 1.0,
             flex_basis: super::Dimension::Auto,
diff --git a/test_fixtures/gap_column_gap_child_margins.html b/test_fixtures/gap_column_gap_child_margins.html
new file mode 100644
index 000000000..1f115a82c
--- /dev/null
+++ b/test_fixtures/gap_column_gap_child_margins.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; width: 80px; height: 100px; column-gap: 10px;">
+  <div style="flex: 1; margin-left: 2px;margin-right: 2px;"></div>
+  <div style="flex: 1; margin-left: 10px;margin-right: 10px;"></div>
+  <div style="flex: 1; margin-left: 15px;margin-right: 15px;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_flexible.html b/test_fixtures/gap_column_gap_flexible.html
new file mode 100644
index 000000000..14a6fc14c
--- /dev/null
+++ b/test_fixtures/gap_column_gap_flexible.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; width: 80px; height: 100px; column-gap: 10px; row-gap: 20px;">
+  <div style="flex: 1;"></div>
+  <div style="flex: 1;"></div>
+  <div style="flex: 1;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_flexible_undefined_parent.html b/test_fixtures/gap_column_gap_flexible_undefined_parent.html
new file mode 100644
index 000000000..e029d0702
--- /dev/null
+++ b/test_fixtures/gap_column_gap_flexible_undefined_parent.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; height: 100px; column-gap: 10px; row-gap: 20px;">
+  <div style="flex: 1;"></div>
+  <div style="flex: 1;"></div>
+  <div style="flex: 1;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_inflexible.html b/test_fixtures/gap_column_gap_inflexible.html
new file mode 100644
index 000000000..eb7df4872
--- /dev/null
+++ b/test_fixtures/gap_column_gap_inflexible.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; width: 80px; height: 100px; column-gap: 10px;">
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_inflexible_undefined_parent.html b/test_fixtures/gap_column_gap_inflexible_undefined_parent.html
new file mode 100644
index 000000000..08d0ab8c8
--- /dev/null
+++ b/test_fixtures/gap_column_gap_inflexible_undefined_parent.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; height: 100px; column-gap: 10px;">
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_justify_center.html b/test_fixtures/gap_column_gap_justify_center.html
new file mode 100644
index 000000000..e3334fe7e
--- /dev/null
+++ b/test_fixtures/gap_column_gap_justify_center.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; justify-content: center; width: 100px; height: 100px; column-gap: 10px;">
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_justify_flex_end.html b/test_fixtures/gap_column_gap_justify_flex_end.html
new file mode 100644
index 000000000..80bed383d
--- /dev/null
+++ b/test_fixtures/gap_column_gap_justify_flex_end.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; justify-content: flex-end; width: 100px; height: 100px; column-gap: 10px;">
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_justify_flex_start.html b/test_fixtures/gap_column_gap_justify_flex_start.html
new file mode 100644
index 000000000..94f989fac
--- /dev/null
+++ b/test_fixtures/gap_column_gap_justify_flex_start.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; justify-content: flex-start; width: 100px; height: 100px; column-gap: 10px;">
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_justify_space_around.html b/test_fixtures/gap_column_gap_justify_space_around.html
new file mode 100644
index 000000000..97a5d28c8
--- /dev/null
+++ b/test_fixtures/gap_column_gap_justify_space_around.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; justify-content: space-around; width: 100px; height: 100px; column-gap: 10px;">
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_justify_space_between.html b/test_fixtures/gap_column_gap_justify_space_between.html
new file mode 100644
index 000000000..36267faa0
--- /dev/null
+++ b/test_fixtures/gap_column_gap_justify_space_between.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; justify-content: space-between; width: 100px; height: 100px; column-gap: 10px;">
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_justify_space_evenly.html b/test_fixtures/gap_column_gap_justify_space_evenly.html
new file mode 100644
index 000000000..5128393e0
--- /dev/null
+++ b/test_fixtures/gap_column_gap_justify_space_evenly.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; justify-content: space-evenly; width: 100px; height: 100px; column-gap: 10px;">
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_mixed_flexible.html b/test_fixtures/gap_column_gap_mixed_flexible.html
new file mode 100644
index 000000000..c4008ee38
--- /dev/null
+++ b/test_fixtures/gap_column_gap_mixed_flexible.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; width: 80px; height: 100px; column-gap: 10px;">
+  <div style="width: 20px;"></div>
+  <div style="flex: 1;"></div>
+  <div style="width: 20px;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_percentage_cyclic_partially_shrinkable.html b/test_fixtures/gap_column_gap_percentage_cyclic_partially_shrinkable.html
new file mode 100644
index 000000000..994f1370f
--- /dev/null
+++ b/test_fixtures/gap_column_gap_percentage_cyclic_partially_shrinkable.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; column-gap: 50%;">
+  <div style="width: 20px;height: 40px;flex-shrink: 0;"></div>
+  <div style="width: 20px;height: 40px;"></div>
+  <div style="width: 20px;height: 40px;flex-shrink: 0;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_percentage_cyclic_shrinkable.html b/test_fixtures/gap_column_gap_percentage_cyclic_shrinkable.html
new file mode 100644
index 000000000..88149a777
--- /dev/null
+++ b/test_fixtures/gap_column_gap_percentage_cyclic_shrinkable.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; column-gap: 20%;">
+  <div style="width: 20px;height: 40px;"></div>
+  <div style="width: 20px;height: 40px;"></div>
+  <div style="width: 20px;height: 40px;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_percentage_cyclic_unshrinkable.html b/test_fixtures/gap_column_gap_percentage_cyclic_unshrinkable.html
new file mode 100644
index 000000000..c86a03d68
--- /dev/null
+++ b/test_fixtures/gap_column_gap_percentage_cyclic_unshrinkable.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; column-gap: 20%;">
+  <div style="width: 20px;height: 40px;flex-shrink: 0;"></div>
+  <div style="width: 20px;height: 40px;flex-shrink: 0;"></div>
+  <div style="width: 20px;height: 40px;flex-shrink: 0;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_percentage_flexible.html b/test_fixtures/gap_column_gap_percentage_flexible.html
new file mode 100644
index 000000000..564929b6e
--- /dev/null
+++ b/test_fixtures/gap_column_gap_percentage_flexible.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; width: 100px; height: 100px; column-gap: 10%; row-gap: 20px;">
+  <div style="flex: 1;"></div>
+  <div style="flex: 1;"></div>
+  <div style="flex: 1;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_percentage_inflexible.html b/test_fixtures/gap_column_gap_percentage_inflexible.html
new file mode 100644
index 000000000..697edb824
--- /dev/null
+++ b/test_fixtures/gap_column_gap_percentage_inflexible.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; width: 100px; height: 100px; column-gap: 20%;">
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_wrap_align_center.html b/test_fixtures/gap_column_gap_wrap_align_center.html
new file mode 100644
index 000000000..4a68fbe91
--- /dev/null
+++ b/test_fixtures/gap_column_gap_wrap_align_center.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; flex-wrap: wrap; align-content: center; width: 100px; height: 100px; column-gap: 10px; row-gap: 20px;">
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_wrap_align_flex_end.html b/test_fixtures/gap_column_gap_wrap_align_flex_end.html
new file mode 100644
index 000000000..8d31ad7d0
--- /dev/null
+++ b/test_fixtures/gap_column_gap_wrap_align_flex_end.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; flex-wrap: wrap; align-content: flex-end; width: 100px; height: 100px; column-gap: 10px; row-gap: 20px;">
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_wrap_align_flex_start.html b/test_fixtures/gap_column_gap_wrap_align_flex_start.html
new file mode 100644
index 000000000..58ea7fe89
--- /dev/null
+++ b/test_fixtures/gap_column_gap_wrap_align_flex_start.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; flex-wrap: wrap; align-content: flex-start; width: 100px; height: 100px; column-gap: 10px; row-gap: 20px;">
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_wrap_align_space_around.html b/test_fixtures/gap_column_gap_wrap_align_space_around.html
new file mode 100644
index 000000000..5169e02d3
--- /dev/null
+++ b/test_fixtures/gap_column_gap_wrap_align_space_around.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; flex-wrap: wrap; align-content: space-around; width: 100px; height: 100px; column-gap: 10px; row-gap: 20px;">
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_wrap_align_space_between.html b/test_fixtures/gap_column_gap_wrap_align_space_between.html
new file mode 100644
index 000000000..03c59e551
--- /dev/null
+++ b/test_fixtures/gap_column_gap_wrap_align_space_between.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; flex-wrap: wrap; align-content: space-between; width: 100px; height: 100px; column-gap: 10px; row-gap: 20px;">
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_gap_wrap_align_stretch.html b/test_fixtures/gap_column_gap_wrap_align_stretch.html
new file mode 100644
index 000000000..30796ed9d
--- /dev/null
+++ b/test_fixtures/gap_column_gap_wrap_align_stretch.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; flex-wrap: wrap; width: 300px; height: 300px; column-gap: 5px; align-content: stretch;">
+  <div style="min-width: 60px; flex-grow: 1;"></div>
+  <div style="min-width: 60px; flex-grow: 1;"></div>
+  <div style="min-width: 60px; flex-grow: 1;"></div>
+  <div style="min-width: 60px; flex-grow: 1;"></div>
+  <div style="min-width: 60px; flex-grow: 1;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_column_row_gap_wrapping.html b/test_fixtures/gap_column_row_gap_wrapping.html
new file mode 100644
index 000000000..db64565d3
--- /dev/null
+++ b/test_fixtures/gap_column_row_gap_wrapping.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; flex-wrap: wrap; width: 80px; column-gap: 10px; row-gap: 20px;">
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_percentage_row_gap_wrapping.html b/test_fixtures/gap_percentage_row_gap_wrapping.html
new file mode 100644
index 000000000..997d9569f
--- /dev/null
+++ b/test_fixtures/gap_percentage_row_gap_wrapping.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; flex-wrap: wrap; width: 80px; column-gap: 10px; row-gap: 10%;">
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+  <div style="width: 20px; height: 20px"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_row_gap_align_items_end.html b/test_fixtures/gap_row_gap_align_items_end.html
new file mode 100644
index 000000000..ff181aac0
--- /dev/null
+++ b/test_fixtures/gap_row_gap_align_items_end.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; flex-wrap: wrap; width: 100px; height: 200px; column-gap: 10px; row-gap: 20px; align-items:flex-end;">
+  <div style="width: 20px; "></div>
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_row_gap_align_items_stretch.html b/test_fixtures/gap_row_gap_align_items_stretch.html
new file mode 100644
index 000000000..26d8aee90
--- /dev/null
+++ b/test_fixtures/gap_row_gap_align_items_stretch.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; flex-wrap: wrap; width: 100px; height: 200px; column-gap: 10px; row-gap: 20px; align-items:stretch; align-content: stretch">
+  <div style="width: 20px; "></div>
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+  <div style="width: 20px;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_row_gap_column_child_margins.html b/test_fixtures/gap_row_gap_column_child_margins.html
new file mode 100644
index 000000000..2fa48fba3
--- /dev/null
+++ b/test_fixtures/gap_row_gap_column_child_margins.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: column; width: 100px; height: 200px; row-gap: 10px;">
+  <div style="flex: 1; margin-top: 2px;margin-bottom: 2px;"></div>
+  <div style="flex: 1; margin-top: 10px;margin-bottom: 10px;"></div>
+  <div style="flex: 1; margin-top: 15px;margin-bottom: 15px;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/test_fixtures/gap_row_gap_row_wrap_child_margins.html b/test_fixtures/gap_row_gap_row_wrap_child_margins.html
new file mode 100644
index 000000000..2dd020369
--- /dev/null
+++ b/test_fixtures/gap_row_gap_row_wrap_child_margins.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <script src="../scripts/gentest/test_helper.js"></script>
+  <link rel="stylesheet" type="text/css" href="../scripts/gentest/test_base_style.css">
+  <title>
+    Test description
+  </title>
+<head/>
+<body>
+
+<div id="test-root" style="flex-direction: row; flex-wrap: wrap; width: 100px; height: 200px; row-gap: 10px;">
+  <div style="width: 60px; margin-top: 2px;margin-bottom: 2px;"></div>
+  <div style="width: 60px; margin-top: 10px;margin-bottom: 10px;"></div>
+  <div style="width: 60px; margin-top: 15px;margin-bottom: 15px;"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/tests/generated/gap_column_gap_child_margins.rs b/tests/generated/gap_column_gap_child_margins.rs
new file mode 100644
index 000000000..dfa78096f
--- /dev/null
+++ b/tests/generated/gap_column_gap_child_margins.rs
@@ -0,0 +1,83 @@
+#[test]
+fn gap_column_gap_child_margins() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                margin: taffy::geometry::Rect {
+                    start: taffy::style::Dimension::Points(2f32),
+                    end: taffy::style::Dimension::Points(2f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                margin: taffy::geometry::Rect {
+                    start: taffy::style::Dimension::Points(10f32),
+                    end: taffy::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                margin: taffy::geometry::Rect {
+                    start: taffy::style::Dimension::Points(15f32),
+                    end: taffy::style::Dimension::Points(15f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(80f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 80f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 2f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 2f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 2f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 26f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 2f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 63f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+}
diff --git a/tests/generated/gap_column_gap_flexible.rs b/tests/generated/gap_column_gap_flexible.rs
new file mode 100644
index 000000000..20c054ad5
--- /dev/null
+++ b/tests/generated/gap_column_gap_flexible.rs
@@ -0,0 +1,72 @@
+#[test]
+fn gap_column_gap_flexible() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(80f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 80f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+}
diff --git a/tests/generated/gap_column_gap_flexible_undefined_parent.rs b/tests/generated/gap_column_gap_flexible_undefined_parent.rs
new file mode 100644
index 000000000..cbb13a4ce
--- /dev/null
+++ b/tests/generated/gap_column_gap_flexible_undefined_parent.rs
@@ -0,0 +1,68 @@
+#[test]
+fn gap_column_gap_flexible_undefined_parent() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                size: taffy::geometry::Size { height: taffy::style::Dimension::Points(100f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 10f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+}
diff --git a/tests/generated/gap_column_gap_inflexible.rs b/tests/generated/gap_column_gap_inflexible.rs
new file mode 100644
index 000000000..6a563cc6a
--- /dev/null
+++ b/tests/generated/gap_column_gap_inflexible.rs
@@ -0,0 +1,62 @@
+#[test]
+fn gap_column_gap_inflexible() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(80f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 80f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+}
diff --git a/tests/generated/gap_column_gap_inflexible_undefined_parent.rs b/tests/generated/gap_column_gap_inflexible_undefined_parent.rs
new file mode 100644
index 000000000..0cf432d1d
--- /dev/null
+++ b/tests/generated/gap_column_gap_inflexible_undefined_parent.rs
@@ -0,0 +1,58 @@
+#[test]
+fn gap_column_gap_inflexible_undefined_parent() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size { height: taffy::style::Dimension::Points(100f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 80f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+}
diff --git a/tests/generated/gap_column_gap_justify_center.rs b/tests/generated/gap_column_gap_justify_center.rs
new file mode 100644
index 000000000..37ea4edf4
--- /dev/null
+++ b/tests/generated/gap_column_gap_justify_center.rs
@@ -0,0 +1,63 @@
+#[test]
+fn gap_column_gap_justify_center() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                justify_content: taffy::style::JustifyContent::Center,
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 10f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 40f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 70f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+}
diff --git a/tests/generated/gap_column_gap_justify_flex_end.rs b/tests/generated/gap_column_gap_justify_flex_end.rs
new file mode 100644
index 000000000..855bacc8a
--- /dev/null
+++ b/tests/generated/gap_column_gap_justify_flex_end.rs
@@ -0,0 +1,63 @@
+#[test]
+fn gap_column_gap_justify_flex_end() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                justify_content: taffy::style::JustifyContent::FlexEnd,
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 50f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 80f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+}
diff --git a/tests/generated/gap_column_gap_justify_flex_start.rs b/tests/generated/gap_column_gap_justify_flex_start.rs
new file mode 100644
index 000000000..835ef17bb
--- /dev/null
+++ b/tests/generated/gap_column_gap_justify_flex_start.rs
@@ -0,0 +1,62 @@
+#[test]
+fn gap_column_gap_justify_flex_start() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+}
diff --git a/tests/generated/gap_column_gap_justify_space_around.rs b/tests/generated/gap_column_gap_justify_space_around.rs
new file mode 100644
index 000000000..ab22c4f9c
--- /dev/null
+++ b/tests/generated/gap_column_gap_justify_space_around.rs
@@ -0,0 +1,63 @@
+#[test]
+fn gap_column_gap_justify_space_around() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                justify_content: taffy::style::JustifyContent::SpaceAround,
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 3f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 40f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 77f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+}
diff --git a/tests/generated/gap_column_gap_justify_space_between.rs b/tests/generated/gap_column_gap_justify_space_between.rs
new file mode 100644
index 000000000..e365c2cdf
--- /dev/null
+++ b/tests/generated/gap_column_gap_justify_space_between.rs
@@ -0,0 +1,63 @@
+#[test]
+fn gap_column_gap_justify_space_between() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                justify_content: taffy::style::JustifyContent::SpaceBetween,
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 40f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 80f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+}
diff --git a/tests/generated/gap_column_gap_justify_space_evenly.rs b/tests/generated/gap_column_gap_justify_space_evenly.rs
new file mode 100644
index 000000000..a937128c6
--- /dev/null
+++ b/tests/generated/gap_column_gap_justify_space_evenly.rs
@@ -0,0 +1,63 @@
+#[test]
+fn gap_column_gap_justify_space_evenly() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                justify_content: taffy::style::JustifyContent::SpaceEvenly,
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 5f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 40f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 75f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+}
diff --git a/tests/generated/gap_column_gap_mixed_flexible.rs b/tests/generated/gap_column_gap_mixed_flexible.rs
new file mode 100644
index 000000000..b67fe9ed1
--- /dev/null
+++ b/tests/generated/gap_column_gap_mixed_flexible.rs
@@ -0,0 +1,64 @@
+#[test]
+fn gap_column_gap_mixed_flexible() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(80f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 80f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+}
diff --git a/tests/generated/gap_column_gap_percentage_cyclic_partially_shrinkable.rs b/tests/generated/gap_column_gap_percentage_cyclic_partially_shrinkable.rs
new file mode 100644
index 000000000..70389ebbf
--- /dev/null
+++ b/tests/generated/gap_column_gap_percentage_cyclic_partially_shrinkable.rs
@@ -0,0 +1,71 @@
+#[test]
+fn gap_column_gap_percentage_cyclic_partially_shrinkable() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_shrink: 0f32,
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_shrink: 0f32,
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Percent(0.5f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 60f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 40f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 40f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 40f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 50f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 40f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 80f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+}
diff --git a/tests/generated/gap_column_gap_percentage_cyclic_shrinkable.rs b/tests/generated/gap_column_gap_percentage_cyclic_shrinkable.rs
new file mode 100644
index 000000000..cfc20adec
--- /dev/null
+++ b/tests/generated/gap_column_gap_percentage_cyclic_shrinkable.rs
@@ -0,0 +1,69 @@
+#[test]
+fn gap_column_gap_percentage_cyclic_shrinkable() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Percent(0.2f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 60f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 40f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 12f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 40f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 12f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 40f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 24f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 12f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 40f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 48f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+}
diff --git a/tests/generated/gap_column_gap_percentage_cyclic_unshrinkable.rs b/tests/generated/gap_column_gap_percentage_cyclic_unshrinkable.rs
new file mode 100644
index 000000000..ff69fe5bb
--- /dev/null
+++ b/tests/generated/gap_column_gap_percentage_cyclic_unshrinkable.rs
@@ -0,0 +1,72 @@
+#[test]
+fn gap_column_gap_percentage_cyclic_unshrinkable() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_shrink: 0f32,
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_shrink: 0f32,
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_shrink: 0f32,
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(40f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Percent(0.2f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 60f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 40f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 40f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 40f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 32f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 40f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 64f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+}
diff --git a/tests/generated/gap_column_gap_percentage_flexible.rs b/tests/generated/gap_column_gap_percentage_flexible.rs
new file mode 100644
index 000000000..d89d81c6f
--- /dev/null
+++ b/tests/generated/gap_column_gap_percentage_flexible.rs
@@ -0,0 +1,72 @@
+#[test]
+fn gap_column_gap_percentage_flexible() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Percent(0.1f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 27f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 27f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 37f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 27f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 73f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+}
diff --git a/tests/generated/gap_column_gap_percentage_inflexible.rs b/tests/generated/gap_column_gap_percentage_inflexible.rs
new file mode 100644
index 000000000..3a3332688
--- /dev/null
+++ b/tests/generated/gap_column_gap_percentage_inflexible.rs
@@ -0,0 +1,62 @@
+#[test]
+fn gap_column_gap_percentage_inflexible() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Percent(0.2f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 40f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 80f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+}
diff --git a/tests/generated/align_content_space_evenly.rs b/tests/generated/gap_column_gap_wrap_align_center.rs
similarity index 50%
rename from tests/generated/align_content_space_evenly.rs
rename to tests/generated/gap_column_gap_wrap_align_center.rs
index 060d12f50..48335cd16 100644
--- a/tests/generated/align_content_space_evenly.rs
+++ b/tests/generated/gap_column_gap_wrap_align_center.rs
@@ -1,12 +1,12 @@
 #[test]
-fn align_content_space_evenly() {
+fn gap_column_gap_wrap_align_center() {
     let mut taffy = taffy::Taffy::new();
     let node0 = taffy
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -18,8 +18,8 @@ fn align_content_space_evenly() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -31,8 +31,8 @@ fn align_content_space_evenly() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -44,8 +44,8 @@ fn align_content_space_evenly() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -57,8 +57,8 @@ fn align_content_space_evenly() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -70,8 +70,8 @@ fn align_content_space_evenly() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -83,7 +83,12 @@ fn align_content_space_evenly() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 flex_wrap: taffy::style::FlexWrap::Wrap,
-                align_content: taffy::style::AlignContent::SpaceEvenly,
+                align_content: taffy::style::AlignContent::Center,
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
                 size: taffy::geometry::Size {
                     width: taffy::style::Dimension::Points(100f32),
                     height: taffy::style::Dimension::Points(100f32),
@@ -94,33 +99,33 @@ fn align_content_space_evenly() {
             &[node0, node1, node2, node3, node4, node5],
         )
         .unwrap();
-    taffy.compute_layout(node, taffy::geometry::Size::NONE).unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
     assert_eq!(taffy.layout(node).unwrap().size.width, 100f32);
     assert_eq!(taffy.layout(node).unwrap().size.height, 100f32);
     assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
     assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
-    assert_eq!(taffy.layout(node0).unwrap().size.width, 50f32);
-    assert_eq!(taffy.layout(node0).unwrap().size.height, 10f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 20f32);
     assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
-    assert_eq!(taffy.layout(node0).unwrap().location.y, 18f32);
-    assert_eq!(taffy.layout(node1).unwrap().size.width, 50f32);
-    assert_eq!(taffy.layout(node1).unwrap().size.height, 10f32);
-    assert_eq!(taffy.layout(node1).unwrap().location.x, 50f32);
-    assert_eq!(taffy.layout(node1).unwrap().location.y, 18f32);
-    assert_eq!(taffy.layout(node2).unwrap().size.width, 50f32);
-    assert_eq!(taffy.layout(node2).unwrap().size.height, 10f32);
-    assert_eq!(taffy.layout(node2).unwrap().location.x, 0f32);
-    assert_eq!(taffy.layout(node2).unwrap().location.y, 45f32);
-    assert_eq!(taffy.layout(node3).unwrap().size.width, 50f32);
-    assert_eq!(taffy.layout(node3).unwrap().size.height, 10f32);
-    assert_eq!(taffy.layout(node3).unwrap().location.x, 50f32);
-    assert_eq!(taffy.layout(node3).unwrap().location.y, 45f32);
-    assert_eq!(taffy.layout(node4).unwrap().size.width, 50f32);
-    assert_eq!(taffy.layout(node4).unwrap().size.height, 10f32);
-    assert_eq!(taffy.layout(node4).unwrap().location.x, 0f32);
-    assert_eq!(taffy.layout(node4).unwrap().location.y, 73f32);
-    assert_eq!(taffy.layout(node5).unwrap().size.width, 50f32);
-    assert_eq!(taffy.layout(node5).unwrap().size.height, 10f32);
-    assert_eq!(taffy.layout(node5).unwrap().location.x, 50f32);
-    assert_eq!(taffy.layout(node5).unwrap().location.y, 73f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 20f32);
+    assert_eq!(taffy.layout(node3).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node3).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node3).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node3).unwrap().location.y, 60f32);
+    assert_eq!(taffy.layout(node4).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node4).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node4).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node4).unwrap().location.y, 60f32);
+    assert_eq!(taffy.layout(node5).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node5).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node5).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node5).unwrap().location.y, 60f32);
 }
diff --git a/tests/generated/gap_column_gap_wrap_align_flex_end.rs b/tests/generated/gap_column_gap_wrap_align_flex_end.rs
new file mode 100644
index 000000000..284eab40c
--- /dev/null
+++ b/tests/generated/gap_column_gap_wrap_align_flex_end.rs
@@ -0,0 +1,131 @@
+#[test]
+fn gap_column_gap_wrap_align_flex_end() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node3 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node4 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node5 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_wrap: taffy::style::FlexWrap::Wrap,
+                align_content: taffy::style::AlignContent::FlexEnd,
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2, node3, node4, node5],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 40f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 40f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 40f32);
+    assert_eq!(taffy.layout(node3).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node3).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node3).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node3).unwrap().location.y, 80f32);
+    assert_eq!(taffy.layout(node4).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node4).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node4).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node4).unwrap().location.y, 80f32);
+    assert_eq!(taffy.layout(node5).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node5).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node5).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node5).unwrap().location.y, 80f32);
+}
diff --git a/tests/generated/gap_column_gap_wrap_align_flex_start.rs b/tests/generated/gap_column_gap_wrap_align_flex_start.rs
new file mode 100644
index 000000000..95e04e9ca
--- /dev/null
+++ b/tests/generated/gap_column_gap_wrap_align_flex_start.rs
@@ -0,0 +1,131 @@
+#[test]
+fn gap_column_gap_wrap_align_flex_start() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node3 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node4 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node5 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_wrap: taffy::style::FlexWrap::Wrap,
+                align_content: taffy::style::AlignContent::FlexStart,
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(100f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2, node3, node4, node5],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node3).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node3).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node3).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node3).unwrap().location.y, 40f32);
+    assert_eq!(taffy.layout(node4).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node4).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node4).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node4).unwrap().location.y, 40f32);
+    assert_eq!(taffy.layout(node5).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node5).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node5).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node5).unwrap().location.y, 40f32);
+}
diff --git a/tests/generated/align_content_space_around.rs b/tests/generated/gap_column_gap_wrap_align_space_around.rs
similarity index 51%
rename from tests/generated/align_content_space_around.rs
rename to tests/generated/gap_column_gap_wrap_align_space_around.rs
index 3ef9bf030..250ecfafc 100644
--- a/tests/generated/align_content_space_around.rs
+++ b/tests/generated/gap_column_gap_wrap_align_space_around.rs
@@ -1,12 +1,12 @@
 #[test]
-fn align_content_space_around() {
+fn gap_column_gap_wrap_align_space_around() {
     let mut taffy = taffy::Taffy::new();
     let node0 = taffy
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -18,8 +18,8 @@ fn align_content_space_around() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -31,8 +31,8 @@ fn align_content_space_around() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -44,8 +44,8 @@ fn align_content_space_around() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -57,8 +57,8 @@ fn align_content_space_around() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -70,8 +70,8 @@ fn align_content_space_around() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -84,6 +84,11 @@ fn align_content_space_around() {
             taffy::style::FlexboxLayout {
                 flex_wrap: taffy::style::FlexWrap::Wrap,
                 align_content: taffy::style::AlignContent::SpaceAround,
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
                 size: taffy::geometry::Size {
                     width: taffy::style::Dimension::Points(100f32),
                     height: taffy::style::Dimension::Points(100f32),
@@ -94,33 +99,33 @@ fn align_content_space_around() {
             &[node0, node1, node2, node3, node4, node5],
         )
         .unwrap();
-    taffy.compute_layout(node, taffy::geometry::Size::NONE).unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
     assert_eq!(taffy.layout(node).unwrap().size.width, 100f32);
     assert_eq!(taffy.layout(node).unwrap().size.height, 100f32);
     assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
     assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
-    assert_eq!(taffy.layout(node0).unwrap().size.width, 50f32);
-    assert_eq!(taffy.layout(node0).unwrap().size.height, 10f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 20f32);
     assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
-    assert_eq!(taffy.layout(node0).unwrap().location.y, 12f32);
-    assert_eq!(taffy.layout(node1).unwrap().size.width, 50f32);
-    assert_eq!(taffy.layout(node1).unwrap().size.height, 10f32);
-    assert_eq!(taffy.layout(node1).unwrap().location.x, 50f32);
-    assert_eq!(taffy.layout(node1).unwrap().location.y, 12f32);
-    assert_eq!(taffy.layout(node2).unwrap().size.width, 50f32);
-    assert_eq!(taffy.layout(node2).unwrap().size.height, 10f32);
-    assert_eq!(taffy.layout(node2).unwrap().location.x, 0f32);
-    assert_eq!(taffy.layout(node2).unwrap().location.y, 45f32);
-    assert_eq!(taffy.layout(node3).unwrap().size.width, 50f32);
-    assert_eq!(taffy.layout(node3).unwrap().size.height, 10f32);
-    assert_eq!(taffy.layout(node3).unwrap().location.x, 50f32);
-    assert_eq!(taffy.layout(node3).unwrap().location.y, 45f32);
-    assert_eq!(taffy.layout(node4).unwrap().size.width, 50f32);
-    assert_eq!(taffy.layout(node4).unwrap().size.height, 10f32);
-    assert_eq!(taffy.layout(node4).unwrap().location.x, 0f32);
-    assert_eq!(taffy.layout(node4).unwrap().location.y, 78f32);
-    assert_eq!(taffy.layout(node5).unwrap().size.width, 50f32);
-    assert_eq!(taffy.layout(node5).unwrap().size.height, 10f32);
-    assert_eq!(taffy.layout(node5).unwrap().location.x, 50f32);
-    assert_eq!(taffy.layout(node5).unwrap().location.y, 78f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 10f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 10f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 10f32);
+    assert_eq!(taffy.layout(node3).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node3).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node3).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node3).unwrap().location.y, 70f32);
+    assert_eq!(taffy.layout(node4).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node4).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node4).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node4).unwrap().location.y, 70f32);
+    assert_eq!(taffy.layout(node5).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node5).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node5).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node5).unwrap().location.y, 70f32);
 }
diff --git a/tests/generated/align_content_space_between.rs b/tests/generated/gap_column_gap_wrap_align_space_between.rs
similarity index 54%
rename from tests/generated/align_content_space_between.rs
rename to tests/generated/gap_column_gap_wrap_align_space_between.rs
index 7ee166d46..5311320e2 100644
--- a/tests/generated/align_content_space_between.rs
+++ b/tests/generated/gap_column_gap_wrap_align_space_between.rs
@@ -1,12 +1,12 @@
 #[test]
-fn align_content_space_between() {
+fn gap_column_gap_wrap_align_space_between() {
     let mut taffy = taffy::Taffy::new();
     let node0 = taffy
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -18,8 +18,8 @@ fn align_content_space_between() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -31,8 +31,8 @@ fn align_content_space_between() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -44,8 +44,8 @@ fn align_content_space_between() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -57,8 +57,8 @@ fn align_content_space_between() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -70,8 +70,8 @@ fn align_content_space_between() {
         .new_with_children(
             taffy::style::FlexboxLayout {
                 size: taffy::geometry::Size {
-                    width: taffy::style::Dimension::Points(50f32),
-                    height: taffy::style::Dimension::Points(10f32),
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
                     ..Default::default()
                 },
                 ..Default::default()
@@ -84,6 +84,11 @@ fn align_content_space_between() {
             taffy::style::FlexboxLayout {
                 flex_wrap: taffy::style::FlexWrap::Wrap,
                 align_content: taffy::style::AlignContent::SpaceBetween,
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
                 size: taffy::geometry::Size {
                     width: taffy::style::Dimension::Points(100f32),
                     height: taffy::style::Dimension::Points(100f32),
@@ -94,33 +99,33 @@ fn align_content_space_between() {
             &[node0, node1, node2, node3, node4, node5],
         )
         .unwrap();
-    taffy.compute_layout(node, taffy::geometry::Size::NONE).unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
     assert_eq!(taffy.layout(node).unwrap().size.width, 100f32);
     assert_eq!(taffy.layout(node).unwrap().size.height, 100f32);
     assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
     assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
-    assert_eq!(taffy.layout(node0).unwrap().size.width, 50f32);
-    assert_eq!(taffy.layout(node0).unwrap().size.height, 10f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 20f32);
     assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
     assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
-    assert_eq!(taffy.layout(node1).unwrap().size.width, 50f32);
-    assert_eq!(taffy.layout(node1).unwrap().size.height, 10f32);
-    assert_eq!(taffy.layout(node1).unwrap().location.x, 50f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 30f32);
     assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
-    assert_eq!(taffy.layout(node2).unwrap().size.width, 50f32);
-    assert_eq!(taffy.layout(node2).unwrap().size.height, 10f32);
-    assert_eq!(taffy.layout(node2).unwrap().location.x, 0f32);
-    assert_eq!(taffy.layout(node2).unwrap().location.y, 45f32);
-    assert_eq!(taffy.layout(node3).unwrap().size.width, 50f32);
-    assert_eq!(taffy.layout(node3).unwrap().size.height, 10f32);
-    assert_eq!(taffy.layout(node3).unwrap().location.x, 50f32);
-    assert_eq!(taffy.layout(node3).unwrap().location.y, 45f32);
-    assert_eq!(taffy.layout(node4).unwrap().size.width, 50f32);
-    assert_eq!(taffy.layout(node4).unwrap().size.height, 10f32);
-    assert_eq!(taffy.layout(node4).unwrap().location.x, 0f32);
-    assert_eq!(taffy.layout(node4).unwrap().location.y, 90f32);
-    assert_eq!(taffy.layout(node5).unwrap().size.width, 50f32);
-    assert_eq!(taffy.layout(node5).unwrap().size.height, 10f32);
-    assert_eq!(taffy.layout(node5).unwrap().location.x, 50f32);
-    assert_eq!(taffy.layout(node5).unwrap().location.y, 90f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node3).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node3).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node3).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node3).unwrap().location.y, 80f32);
+    assert_eq!(taffy.layout(node4).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node4).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node4).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node4).unwrap().location.y, 80f32);
+    assert_eq!(taffy.layout(node5).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node5).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node5).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node5).unwrap().location.y, 80f32);
 }
diff --git a/tests/generated/gap_column_gap_wrap_align_stretch.rs b/tests/generated/gap_column_gap_wrap_align_stretch.rs
new file mode 100644
index 000000000..2db5d8769
--- /dev/null
+++ b/tests/generated/gap_column_gap_wrap_align_stretch.rs
@@ -0,0 +1,94 @@
+#[test]
+fn gap_column_gap_wrap_align_stretch() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                min_size: taffy::geometry::Size { width: taffy::style::Dimension::Points(60f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                min_size: taffy::geometry::Size { width: taffy::style::Dimension::Points(60f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                min_size: taffy::geometry::Size { width: taffy::style::Dimension::Points(60f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node3 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                min_size: taffy::geometry::Size { width: taffy::style::Dimension::Points(60f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node4 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                min_size: taffy::geometry::Size { width: taffy::style::Dimension::Points(60f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_wrap: taffy::style::FlexWrap::Wrap,
+                gap: taffy::geometry::Size { width: taffy::style::Dimension::Points(5f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(300f32),
+                    height: taffy::style::Dimension::Points(300f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2, node3, node4],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 300f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 300f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 71f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 150f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 71f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 150f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 76f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 71f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 150f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 153f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node3).unwrap().size.width, 71f32);
+    assert_eq!(taffy.layout(node3).unwrap().size.height, 150f32);
+    assert_eq!(taffy.layout(node3).unwrap().location.x, 229f32);
+    assert_eq!(taffy.layout(node3).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node4).unwrap().size.width, 300f32);
+    assert_eq!(taffy.layout(node4).unwrap().size.height, 150f32);
+    assert_eq!(taffy.layout(node4).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node4).unwrap().location.y, 150f32);
+}
diff --git a/tests/generated/gap_column_row_gap_wrapping.rs b/tests/generated/gap_column_row_gap_wrapping.rs
new file mode 100644
index 000000000..c5868f95e
--- /dev/null
+++ b/tests/generated/gap_column_row_gap_wrapping.rs
@@ -0,0 +1,177 @@
+#[test]
+fn gap_column_row_gap_wrapping() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node3 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node4 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node5 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node6 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node7 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node8 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_wrap: taffy::style::FlexWrap::Wrap,
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(80f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[node0, node1, node2, node3, node4, node5, node6, node7, node8],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 80f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node3).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node3).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node3).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node3).unwrap().location.y, 40f32);
+    assert_eq!(taffy.layout(node4).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node4).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node4).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node4).unwrap().location.y, 40f32);
+    assert_eq!(taffy.layout(node5).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node5).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node5).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node5).unwrap().location.y, 40f32);
+    assert_eq!(taffy.layout(node6).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node6).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node6).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node6).unwrap().location.y, 80f32);
+    assert_eq!(taffy.layout(node7).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node7).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node7).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node7).unwrap().location.y, 80f32);
+    assert_eq!(taffy.layout(node8).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node8).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node8).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node8).unwrap().location.y, 80f32);
+}
diff --git a/tests/generated/gap_percentage_row_gap_wrapping.rs b/tests/generated/gap_percentage_row_gap_wrapping.rs
new file mode 100644
index 000000000..2ea1a9b3f
--- /dev/null
+++ b/tests/generated/gap_percentage_row_gap_wrapping.rs
@@ -0,0 +1,177 @@
+#[test]
+fn gap_percentage_row_gap_wrapping() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node3 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node4 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node5 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node6 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node7 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node8 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(20f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_wrap: taffy::style::FlexWrap::Wrap,
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Percent(0.1f32),
+                    ..Default::default()
+                },
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(80f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[node0, node1, node2, node3, node4, node5, node6, node7, node8],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 80f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 60f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node3).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node3).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node3).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node3).unwrap().location.y, 20f32);
+    assert_eq!(taffy.layout(node4).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node4).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node4).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node4).unwrap().location.y, 20f32);
+    assert_eq!(taffy.layout(node5).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node5).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node5).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node5).unwrap().location.y, 20f32);
+    assert_eq!(taffy.layout(node6).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node6).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node6).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node6).unwrap().location.y, 40f32);
+    assert_eq!(taffy.layout(node7).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node7).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node7).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node7).unwrap().location.y, 40f32);
+    assert_eq!(taffy.layout(node8).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node8).unwrap().size.height, 20f32);
+    assert_eq!(taffy.layout(node8).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node8).unwrap().location.y, 40f32);
+}
diff --git a/tests/generated/gap_row_gap_align_items_end.rs b/tests/generated/gap_row_gap_align_items_end.rs
new file mode 100644
index 000000000..210f60ab7
--- /dev/null
+++ b/tests/generated/gap_row_gap_align_items_end.rs
@@ -0,0 +1,107 @@
+#[test]
+fn gap_row_gap_align_items_end() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node3 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node4 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node5 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_wrap: taffy::style::FlexWrap::Wrap,
+                align_items: taffy::style::AlignItems::FlexEnd,
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(200f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2, node3, node4, node5],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 200f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 90f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 90f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 90f32);
+    assert_eq!(taffy.layout(node3).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node3).unwrap().size.height, 0f32);
+    assert_eq!(taffy.layout(node3).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node3).unwrap().location.y, 200f32);
+    assert_eq!(taffy.layout(node4).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node4).unwrap().size.height, 0f32);
+    assert_eq!(taffy.layout(node4).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node4).unwrap().location.y, 200f32);
+    assert_eq!(taffy.layout(node5).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node5).unwrap().size.height, 0f32);
+    assert_eq!(taffy.layout(node5).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node5).unwrap().location.y, 200f32);
+}
diff --git a/tests/generated/gap_row_gap_align_items_stretch.rs b/tests/generated/gap_row_gap_align_items_stretch.rs
new file mode 100644
index 000000000..a0846571b
--- /dev/null
+++ b/tests/generated/gap_row_gap_align_items_stretch.rs
@@ -0,0 +1,106 @@
+#[test]
+fn gap_row_gap_align_items_stretch() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node3 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node4 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node5 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(20f32), ..Default::default() },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_wrap: taffy::style::FlexWrap::Wrap,
+                gap: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(10f32),
+                    height: taffy::style::Dimension::Points(20f32),
+                    ..Default::default()
+                },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(200f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2, node3, node4, node5],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 200f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 90f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 90f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 90f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node3).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node3).unwrap().size.height, 90f32);
+    assert_eq!(taffy.layout(node3).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node3).unwrap().location.y, 110f32);
+    assert_eq!(taffy.layout(node4).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node4).unwrap().size.height, 90f32);
+    assert_eq!(taffy.layout(node4).unwrap().location.x, 30f32);
+    assert_eq!(taffy.layout(node4).unwrap().location.y, 110f32);
+    assert_eq!(taffy.layout(node5).unwrap().size.width, 20f32);
+    assert_eq!(taffy.layout(node5).unwrap().size.height, 90f32);
+    assert_eq!(taffy.layout(node5).unwrap().location.x, 60f32);
+    assert_eq!(taffy.layout(node5).unwrap().location.y, 110f32);
+}
diff --git a/tests/generated/gap_row_gap_column_child_margins.rs b/tests/generated/gap_row_gap_column_child_margins.rs
new file mode 100644
index 000000000..1c32592e7
--- /dev/null
+++ b/tests/generated/gap_row_gap_column_child_margins.rs
@@ -0,0 +1,84 @@
+#[test]
+fn gap_row_gap_column_child_margins() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                margin: taffy::geometry::Rect {
+                    top: taffy::style::Dimension::Points(2f32),
+                    bottom: taffy::style::Dimension::Points(2f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                margin: taffy::geometry::Rect {
+                    top: taffy::style::Dimension::Points(10f32),
+                    bottom: taffy::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_grow: 1f32,
+                flex_shrink: 1f32,
+                flex_basis: taffy::style::Dimension::Percent(0f32),
+                margin: taffy::geometry::Rect {
+                    top: taffy::style::Dimension::Points(15f32),
+                    bottom: taffy::style::Dimension::Points(15f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_direction: taffy::style::FlexDirection::Column,
+                gap: taffy::geometry::Size { height: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(200f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 200f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 100f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 42f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 2f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 100f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 42f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 66f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 100f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 42f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 143f32);
+}
diff --git a/tests/generated/gap_row_gap_row_wrap_child_margins.rs b/tests/generated/gap_row_gap_row_wrap_child_margins.rs
new file mode 100644
index 000000000..3d796f606
--- /dev/null
+++ b/tests/generated/gap_row_gap_row_wrap_child_margins.rs
@@ -0,0 +1,78 @@
+#[test]
+fn gap_row_gap_row_wrap_child_margins() {
+    let mut taffy = taffy::Taffy::new();
+    let node0 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(60f32), ..Default::default() },
+                margin: taffy::geometry::Rect {
+                    top: taffy::style::Dimension::Points(2f32),
+                    bottom: taffy::style::Dimension::Points(2f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node1 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(60f32), ..Default::default() },
+                margin: taffy::geometry::Rect {
+                    top: taffy::style::Dimension::Points(10f32),
+                    bottom: taffy::style::Dimension::Points(10f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node2 = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                size: taffy::geometry::Size { width: taffy::style::Dimension::Points(60f32), ..Default::default() },
+                margin: taffy::geometry::Rect {
+                    top: taffy::style::Dimension::Points(15f32),
+                    bottom: taffy::style::Dimension::Points(15f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[],
+        )
+        .unwrap();
+    let node = taffy
+        .new_with_children(
+            taffy::style::FlexboxLayout {
+                flex_wrap: taffy::style::FlexWrap::Wrap,
+                gap: taffy::geometry::Size { height: taffy::style::Dimension::Points(10f32), ..Default::default() },
+                size: taffy::geometry::Size {
+                    width: taffy::style::Dimension::Points(100f32),
+                    height: taffy::style::Dimension::Points(200f32),
+                    ..Default::default()
+                },
+                ..Default::default()
+            },
+            &[node0, node1, node2],
+        )
+        .unwrap();
+    taffy.compute_layout(node, taffy::geometry::Size::MAX_CONTENT).unwrap();
+    assert_eq!(taffy.layout(node).unwrap().size.width, 100f32);
+    assert_eq!(taffy.layout(node).unwrap().size.height, 200f32);
+    assert_eq!(taffy.layout(node).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node).unwrap().location.y, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.width, 60f32);
+    assert_eq!(taffy.layout(node0).unwrap().size.height, 42f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node0).unwrap().location.y, 2f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.width, 60f32);
+    assert_eq!(taffy.layout(node1).unwrap().size.height, 42f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node1).unwrap().location.y, 66f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.width, 60f32);
+    assert_eq!(taffy.layout(node2).unwrap().size.height, 42f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.x, 0f32);
+    assert_eq!(taffy.layout(node2).unwrap().location.y, 143f32);
+}
diff --git a/tests/generated/mod.rs b/tests/generated/mod.rs
index 1921c8704..cda3125d5 100644
--- a/tests/generated/mod.rs
+++ b/tests/generated/mod.rs
@@ -108,6 +108,35 @@ mod flex_shrink_to_zero;
 mod flex_wrap_align_stretch_fits_one_row;
 mod flex_wrap_children_with_min_main_overriding_flex_basis;
 mod flex_wrap_wrap_to_child_height;
+mod gap_column_gap_child_margins;
+mod gap_column_gap_flexible;
+mod gap_column_gap_flexible_undefined_parent;
+mod gap_column_gap_inflexible;
+mod gap_column_gap_inflexible_undefined_parent;
+mod gap_column_gap_justify_center;
+mod gap_column_gap_justify_flex_end;
+mod gap_column_gap_justify_flex_start;
+mod gap_column_gap_justify_space_around;
+mod gap_column_gap_justify_space_between;
+mod gap_column_gap_justify_space_evenly;
+mod gap_column_gap_mixed_flexible;
+mod gap_column_gap_percentage_cyclic_partially_shrinkable;
+mod gap_column_gap_percentage_cyclic_shrinkable;
+mod gap_column_gap_percentage_cyclic_unshrinkable;
+mod gap_column_gap_percentage_flexible;
+mod gap_column_gap_percentage_inflexible;
+mod gap_column_gap_wrap_align_center;
+mod gap_column_gap_wrap_align_flex_end;
+mod gap_column_gap_wrap_align_flex_start;
+mod gap_column_gap_wrap_align_space_around;
+mod gap_column_gap_wrap_align_space_between;
+mod gap_column_gap_wrap_align_stretch;
+mod gap_column_row_gap_wrapping;
+mod gap_percentage_row_gap_wrapping;
+mod gap_row_gap_align_items_end;
+mod gap_row_gap_align_items_stretch;
+mod gap_row_gap_column_child_margins;
+mod gap_row_gap_row_wrap_child_margins;
 mod justify_content_column_center;
 mod justify_content_column_flex_end;
 mod justify_content_column_flex_start;