diff --git a/CSSLayout/CSSLayout.c b/CSSLayout/CSSLayout.c
index c8fb9673..d49acc02 100644
--- a/CSSLayout/CSSLayout.c
+++ b/CSSLayout/CSSLayout.c
@@ -1040,8 +1040,7 @@ static void layoutNodeImpl(const CSSNodeRef node,
child->layout.computedFlexBasis =
fmaxf(child->style.dimensions[CSSDimensionHeight],
getPaddingAndBorderAxis(child, CSSFlexDirectionColumn));
- } else if (!CSSValueIsUndefined(child->style.flexBasis) &&
- !CSSValueIsUndefined(availableInnerMainDim)) {
+ } else if (!CSSValueIsUndefined(child->style.flexBasis)) {
child->layout.computedFlexBasis =
fmaxf(child->style.flexBasis, getPaddingAndBorderAxis(child, mainAxis));
} else {
diff --git a/java/com/facebook/csslayout/LayoutEngine.java b/java/com/facebook/csslayout/LayoutEngine.java
index f704879a..e7108f08 100644
--- a/java/com/facebook/csslayout/LayoutEngine.java
+++ b/java/com/facebook/csslayout/LayoutEngine.java
@@ -694,7 +694,7 @@ public class LayoutEngine {
// The height is definite, so use that as the flex basis.
child.layout.computedFlexBasis = Math.max(child.style.dimensions[DIMENSION_HEIGHT], ((child.style.padding.getWithFallback(leadingSpacing[CSS_FLEX_DIRECTION_COLUMN], leading[CSS_FLEX_DIRECTION_COLUMN]) + child.style.border.getWithFallback(leadingSpacing[CSS_FLEX_DIRECTION_COLUMN], leading[CSS_FLEX_DIRECTION_COLUMN])) + (child.style.padding.getWithFallback(trailingSpacing[CSS_FLEX_DIRECTION_COLUMN], trailing[CSS_FLEX_DIRECTION_COLUMN]) + child.style.border.getWithFallback(trailingSpacing[CSS_FLEX_DIRECTION_COLUMN], trailing[CSS_FLEX_DIRECTION_COLUMN]))));
- } else if (!isFlexBasisAuto(child) && !Float.isNaN(availableInnerMainDim)) {
+ } else if (!isFlexBasisAuto(child)) {
// If the basis isn't 'auto', it is assumed to be zero.
child.layout.computedFlexBasis = Math.max(child.style.flexBasis, ((child.style.padding.getWithFallback(leadingSpacing[mainAxis], leading[mainAxis]) + child.style.border.getWithFallback(leadingSpacing[mainAxis], leading[mainAxis])) + (child.style.padding.getWithFallback(trailingSpacing[mainAxis], trailing[mainAxis]) + child.style.border.getWithFallback(trailingSpacing[mainAxis], trailing[mainAxis]))));
diff --git a/tests/CSSLayoutFlexBasisTest.cpp b/tests/CSSLayoutFlexBasisTest.cpp
deleted file mode 100644
index 2fe8e344..00000000
--- a/tests/CSSLayoutFlexBasisTest.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * Copyright (c) 2014-present, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- */
-
-/**
- * @Generated by gentest/gentest.sh with the following input
- *
- *
- *
- */
-
-#include
-#include
-#include
-
-TEST(CSSLayoutTest, flex_basis) {
- const CSSNodeRef root = CSSNodeNew();
- CSSNodeStyleSetFlexDirection(root, CSSFlexDirectionRow);
- CSSNodeStyleSetWidth(root, 300);
- CSSNodeStyleSetHeight(root, 100);
-
- const CSSNodeRef root_child0 = CSSNodeNew();
- CSSNodeStyleSetFlexGrow(root_child0, 1);
- CSSNodeStyleSetFlexBasis(root_child0, 100);
- CSSNodeInsertChild(root, root_child0, 0);
-
- const CSSNodeRef root_child1 = CSSNodeNew();
- CSSNodeStyleSetFlexGrow(root_child1, 1);
- CSSNodeInsertChild(root, root_child1, 1);
- CSSNodeCalculateLayout(root, CSSUndefined, CSSUndefined, CSSDirectionLTR);
-
- ASSERT_EQ(0, CSSNodeLayoutGetLeft(root));
- ASSERT_EQ(0, CSSNodeLayoutGetTop(root));
- ASSERT_EQ(300, CSSNodeLayoutGetWidth(root));
- ASSERT_EQ(100, CSSNodeLayoutGetHeight(root));
-
- ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child0));
- ASSERT_EQ(0, CSSNodeLayoutGetTop(root_child0));
- ASSERT_EQ(200, CSSNodeLayoutGetWidth(root_child0));
- ASSERT_EQ(100, CSSNodeLayoutGetHeight(root_child0));
-
- ASSERT_EQ(200, CSSNodeLayoutGetLeft(root_child1));
- ASSERT_EQ(0, CSSNodeLayoutGetTop(root_child1));
- ASSERT_EQ(100, CSSNodeLayoutGetWidth(root_child1));
- ASSERT_EQ(100, CSSNodeLayoutGetHeight(root_child1));
- }
diff --git a/tests/CSSLayoutFlexTest.cpp b/tests/CSSLayoutFlexTest.cpp
new file mode 100644
index 00000000..05750443
--- /dev/null
+++ b/tests/CSSLayoutFlexTest.cpp
@@ -0,0 +1,196 @@
+/**
+ * Copyright (c) 2014-present, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree. An additional grant
+ * of patent rights can be found in the PATENTS file in the same directory.
+ */
+
+/**
+ * @Generated by gentest/gentest.sh with the following input
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+
+#include
+#include
+#include
+
+TEST(CSSLayoutTest, flex_basis_flex_grow_column) {
+ const CSSNodeRef root = CSSNodeNew();
+ CSSNodeStyleSetWidth(root, 100);
+ CSSNodeStyleSetHeight(root, 100);
+
+ const CSSNodeRef root_child0 = CSSNodeNew();
+ CSSNodeStyleSetFlexGrow(root_child0, 1);
+ CSSNodeStyleSetFlexBasis(root_child0, 50);
+ CSSNodeInsertChild(root, root_child0, 0);
+
+ const CSSNodeRef root_child1 = CSSNodeNew();
+ CSSNodeStyleSetFlexGrow(root_child1, 1);
+ CSSNodeInsertChild(root, root_child1, 1);
+ CSSNodeCalculateLayout(root, CSSUndefined, CSSUndefined, CSSDirectionLTR);
+
+ ASSERT_EQ(0, CSSNodeLayoutGetLeft(root));
+ ASSERT_EQ(0, CSSNodeLayoutGetTop(root));
+ ASSERT_EQ(100, CSSNodeLayoutGetWidth(root));
+ ASSERT_EQ(100, CSSNodeLayoutGetHeight(root));
+
+ ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child0));
+ ASSERT_EQ(0, CSSNodeLayoutGetTop(root_child0));
+ ASSERT_EQ(100, CSSNodeLayoutGetWidth(root_child0));
+ ASSERT_EQ(75, CSSNodeLayoutGetHeight(root_child0));
+
+ ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child1));
+ ASSERT_EQ(75, CSSNodeLayoutGetTop(root_child1));
+ ASSERT_EQ(100, CSSNodeLayoutGetWidth(root_child1));
+ ASSERT_EQ(25, CSSNodeLayoutGetHeight(root_child1));
+}
+
+TEST(CSSLayoutTest, flex_basis_flex_grow_row) {
+ const CSSNodeRef root = CSSNodeNew();
+ CSSNodeStyleSetFlexDirection(root, CSSFlexDirectionRow);
+ CSSNodeStyleSetWidth(root, 100);
+ CSSNodeStyleSetHeight(root, 100);
+
+ const CSSNodeRef root_child0 = CSSNodeNew();
+ CSSNodeStyleSetFlexGrow(root_child0, 1);
+ CSSNodeStyleSetFlexBasis(root_child0, 50);
+ CSSNodeInsertChild(root, root_child0, 0);
+
+ const CSSNodeRef root_child1 = CSSNodeNew();
+ CSSNodeStyleSetFlexGrow(root_child1, 1);
+ CSSNodeInsertChild(root, root_child1, 1);
+ CSSNodeCalculateLayout(root, CSSUndefined, CSSUndefined, CSSDirectionLTR);
+
+ ASSERT_EQ(0, CSSNodeLayoutGetLeft(root));
+ ASSERT_EQ(0, CSSNodeLayoutGetTop(root));
+ ASSERT_EQ(100, CSSNodeLayoutGetWidth(root));
+ ASSERT_EQ(100, CSSNodeLayoutGetHeight(root));
+
+ ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child0));
+ ASSERT_EQ(0, CSSNodeLayoutGetTop(root_child0));
+ ASSERT_EQ(75, CSSNodeLayoutGetWidth(root_child0));
+ ASSERT_EQ(100, CSSNodeLayoutGetHeight(root_child0));
+
+ ASSERT_EQ(75, CSSNodeLayoutGetLeft(root_child1));
+ ASSERT_EQ(0, CSSNodeLayoutGetTop(root_child1));
+ ASSERT_EQ(25, CSSNodeLayoutGetWidth(root_child1));
+ ASSERT_EQ(100, CSSNodeLayoutGetHeight(root_child1));
+}
+
+TEST(CSSLayoutTest, flex_basis_flex_shrink_column) {
+ const CSSNodeRef root = CSSNodeNew();
+ CSSNodeStyleSetWidth(root, 100);
+ CSSNodeStyleSetHeight(root, 100);
+
+ const CSSNodeRef root_child0 = CSSNodeNew();
+ CSSNodeStyleSetFlexShrink(root_child0, 1);
+ CSSNodeStyleSetFlexBasis(root_child0, 100);
+ CSSNodeInsertChild(root, root_child0, 0);
+
+ const CSSNodeRef root_child1 = CSSNodeNew();
+ CSSNodeStyleSetFlexBasis(root_child1, 50);
+ CSSNodeInsertChild(root, root_child1, 1);
+ CSSNodeCalculateLayout(root, CSSUndefined, CSSUndefined, CSSDirectionLTR);
+
+ ASSERT_EQ(0, CSSNodeLayoutGetLeft(root));
+ ASSERT_EQ(0, CSSNodeLayoutGetTop(root));
+ ASSERT_EQ(100, CSSNodeLayoutGetWidth(root));
+ ASSERT_EQ(100, CSSNodeLayoutGetHeight(root));
+
+ ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child0));
+ ASSERT_EQ(0, CSSNodeLayoutGetTop(root_child0));
+ ASSERT_EQ(100, CSSNodeLayoutGetWidth(root_child0));
+ ASSERT_EQ(50, CSSNodeLayoutGetHeight(root_child0));
+
+ ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child1));
+ ASSERT_EQ(50, CSSNodeLayoutGetTop(root_child1));
+ ASSERT_EQ(100, CSSNodeLayoutGetWidth(root_child1));
+ ASSERT_EQ(50, CSSNodeLayoutGetHeight(root_child1));
+}
+
+TEST(CSSLayoutTest, flex_basis_flex_shrink_row) {
+ const CSSNodeRef root = CSSNodeNew();
+ CSSNodeStyleSetFlexDirection(root, CSSFlexDirectionRow);
+ CSSNodeStyleSetWidth(root, 100);
+ CSSNodeStyleSetHeight(root, 100);
+
+ const CSSNodeRef root_child0 = CSSNodeNew();
+ CSSNodeStyleSetFlexShrink(root_child0, 1);
+ CSSNodeStyleSetFlexBasis(root_child0, 100);
+ CSSNodeInsertChild(root, root_child0, 0);
+
+ const CSSNodeRef root_child1 = CSSNodeNew();
+ CSSNodeStyleSetFlexBasis(root_child1, 50);
+ CSSNodeInsertChild(root, root_child1, 1);
+ CSSNodeCalculateLayout(root, CSSUndefined, CSSUndefined, CSSDirectionLTR);
+
+ ASSERT_EQ(0, CSSNodeLayoutGetLeft(root));
+ ASSERT_EQ(0, CSSNodeLayoutGetTop(root));
+ ASSERT_EQ(100, CSSNodeLayoutGetWidth(root));
+ ASSERT_EQ(100, CSSNodeLayoutGetHeight(root));
+
+ ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child0));
+ ASSERT_EQ(0, CSSNodeLayoutGetTop(root_child0));
+ ASSERT_EQ(50, CSSNodeLayoutGetWidth(root_child0));
+ ASSERT_EQ(100, CSSNodeLayoutGetHeight(root_child0));
+
+ ASSERT_EQ(50, CSSNodeLayoutGetLeft(root_child1));
+ ASSERT_EQ(0, CSSNodeLayoutGetTop(root_child1));
+ ASSERT_EQ(50, CSSNodeLayoutGetWidth(root_child1));
+ ASSERT_EQ(100, CSSNodeLayoutGetHeight(root_child1));
+}
+
+TEST(CSSLayoutTest, flex_basis_flex_grow_undefined_main) {
+ const CSSNodeRef root = CSSNodeNew();
+ CSSNodeStyleSetWidth(root, 100);
+
+ const CSSNodeRef root_child0 = CSSNodeNew();
+ CSSNodeStyleSetFlexGrow(root_child0, 1);
+ CSSNodeStyleSetFlexBasis(root_child0, 100);
+ CSSNodeStyleSetWidth(root_child0, 100);
+ CSSNodeInsertChild(root, root_child0, 0);
+
+ const CSSNodeRef root_child1 = CSSNodeNew();
+ CSSNodeStyleSetFlexBasis(root_child1, 50);
+ CSSNodeStyleSetWidth(root_child1, 100);
+ CSSNodeInsertChild(root, root_child1, 1);
+ CSSNodeCalculateLayout(root, CSSUndefined, CSSUndefined, CSSDirectionLTR);
+
+ ASSERT_EQ(0, CSSNodeLayoutGetLeft(root));
+ ASSERT_EQ(0, CSSNodeLayoutGetTop(root));
+ ASSERT_EQ(100, CSSNodeLayoutGetWidth(root));
+ ASSERT_EQ(150, CSSNodeLayoutGetHeight(root));
+
+ ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child0));
+ ASSERT_EQ(0, CSSNodeLayoutGetTop(root_child0));
+ ASSERT_EQ(100, CSSNodeLayoutGetWidth(root_child0));
+ ASSERT_EQ(100, CSSNodeLayoutGetHeight(root_child0));
+
+ ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child1));
+ ASSERT_EQ(100, CSSNodeLayoutGetTop(root_child1));
+ ASSERT_EQ(100, CSSNodeLayoutGetWidth(root_child1));
+ ASSERT_EQ(50, CSSNodeLayoutGetHeight(root_child1));
+}