From bbdd1afe596b3f78fa5887410513d9a98b944715 Mon Sep 17 00:00:00 2001 From: Bela Bohlender Date: Mon, 8 Apr 2024 12:04:08 -0700 Subject: [PATCH 01/24] Entry point without TLA for js package (#1638) Summary: Follow up on https://github.com/facebook/yoga/issues/1637 TLDR: tooling for TLA is not there yet; An additional entry point without top-level-await is appropriate - adds ./load entry to js package - uses .js file extensions to prevent requiring [allowImportingTsExtensions](https://www.typescriptlang.org/tsconfig#allowImportingTsExtensions) Pull Request resolved: https://github.com/facebook/yoga/pull/1638 Reviewed By: joevilches Differential Revision: D55614636 Pulled By: NickGerleman fbshipit-source-id: 126a94aa68d22d32b938282cfa1a5059bb9df337 --- javascript/README.md | 9 +++++++++ javascript/package.json | 4 ++++ javascript/src/load.ts | 25 +++++++++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 javascript/src/load.ts diff --git a/javascript/README.md b/javascript/README.md index 73a95462b1..da4fe27f58 100644 --- a/javascript/README.md +++ b/javascript/README.md @@ -29,3 +29,12 @@ node.free(); ## Requirements `yoga-layout` requires a toolchain that supports ES Modules and top-level await. + +If top-level-await is not supported, use the `yoga-layout/load` entry point instead. This requires to load yoga manually: + +```ts +import {loadYoga, Align} from 'yoga-layout/load'; + +const node = (await loadYoga).Node.create(); +node.setAlignContent(Align.Center); +``` diff --git a/javascript/package.json b/javascript/package.json index c06b6a2036..42aab81e39 100644 --- a/javascript/package.json +++ b/javascript/package.json @@ -11,6 +11,10 @@ }, "type": "module", "main": "./src/index.ts", + "exports": { + ".": "./src/index.ts", + "./load": "./src/load.ts" + }, "files": [ "binaries/**", "src/**" diff --git a/javascript/src/load.ts b/javascript/src/load.ts new file mode 100644 index 0000000000..a415a0dd71 --- /dev/null +++ b/javascript/src/load.ts @@ -0,0 +1,25 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +// @ts-ignore untyped from Emscripten +import loadYogaImpl from '../binaries/yoga-wasm-base64-esm.js'; +import wrapAssembly from './wrapAssembly.ts'; + +export type { + Config, + DirtiedFunction, + MeasureFunction, + Node, + Yoga, +} from './wrapAssembly.ts'; + +export async function loadYoga() { + return wrapAssembly(await loadYogaImpl()); +} +export * from './generated/YGEnums.ts'; From 70de2da05f4cb3e82e7da57938bad12da87c0063 Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Wed, 10 Apr 2024 22:15:25 -0700 Subject: [PATCH 02/24] Make new nodes dirty by default (#1641) Summary: X-link: https://github.com/facebook/react-native/pull/44010 Pull Request resolved: https://github.com/facebook/yoga/pull/1641 Yoga has quirk where newly constructed nodes are clean, which isn't really correct. Normally never shows in in real code because setting a style or children will dirty. Fabric doesn't use the public APIs that do this dirtying, so it ends up getting creative instead. We should fix so that newly constructed nodes are dirty. Copy-constructed Nodes (also only a Fabric thing, will retain original dirty flag. Changelog: [Internal] Reviewed By: sammy-SC Differential Revision: D55855328 fbshipit-source-id: be49efaf8ac29351f8e5ec509bd9912546944332 --- tests/YGStyleTest.cpp | 6 ------ yoga/node/Node.h | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/tests/YGStyleTest.cpp b/tests/YGStyleTest.cpp index 5651dc31b3..ec2fb33f3b 100644 --- a/tests/YGStyleTest.cpp +++ b/tests/YGStyleTest.cpp @@ -11,10 +11,8 @@ TEST(YogaTest, copy_style_same) { const YGNodeRef node0 = YGNodeNew(); const YGNodeRef node1 = YGNodeNew(); - ASSERT_FALSE(YGNodeIsDirty(node0)); YGNodeCopyStyle(node0, node1); - ASSERT_FALSE(YGNodeIsDirty(node0)); YGNodeFree(node0); YGNodeFree(node1); @@ -22,7 +20,6 @@ TEST(YogaTest, copy_style_same) { TEST(YogaTest, copy_style_modified) { const YGNodeRef node0 = YGNodeNew(); - ASSERT_FALSE(YGNodeIsDirty(node0)); ASSERT_EQ(YGFlexDirectionColumn, YGNodeStyleGetFlexDirection(node0)); ASSERT_FALSE(YGNodeStyleGetMaxHeight(node0).unit != YGUnitUndefined); @@ -31,7 +28,6 @@ TEST(YogaTest, copy_style_modified) { YGNodeStyleSetMaxHeight(node1, 10); YGNodeCopyStyle(node0, node1); - ASSERT_TRUE(YGNodeIsDirty(node0)); ASSERT_EQ(YGFlexDirectionRow, YGNodeStyleGetFlexDirection(node0)); ASSERT_FLOAT_EQ(10, YGNodeStyleGetMaxHeight(node0).value); @@ -44,14 +40,12 @@ TEST(YogaTest, copy_style_modified_same) { YGNodeStyleSetFlexDirection(node0, YGFlexDirectionRow); YGNodeStyleSetMaxHeight(node0, 10); YGNodeCalculateLayout(node0, YGUndefined, YGUndefined, YGDirectionLTR); - ASSERT_FALSE(YGNodeIsDirty(node0)); const YGNodeRef node1 = YGNodeNew(); YGNodeStyleSetFlexDirection(node1, YGFlexDirectionRow); YGNodeStyleSetMaxHeight(node1, 10); YGNodeCopyStyle(node0, node1); - ASSERT_FALSE(YGNodeIsDirty(node0)); YGNodeFree(node0); YGNodeFree(node1); diff --git a/yoga/node/Node.h b/yoga/node/Node.h index ec28f2db91..8f5ee591cc 100644 --- a/yoga/node/Node.h +++ b/yoga/node/Node.h @@ -271,7 +271,7 @@ class YG_EXPORT Node : public ::YGNode { bool hasNewLayout_ : 1 = true; bool isReferenceBaseline_ : 1 = false; - bool isDirty_ : 1 = false; + bool isDirty_ : 1 = true; bool alwaysFormsContainingBlock_ : 1 = false; NodeType nodeType_ : bitCount() = NodeType::Default; void* context_ = nullptr; From 617fd3a6b7dea99a1157e2d478a0fed83d20f270 Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Mon, 15 Apr 2024 09:28:23 -0700 Subject: [PATCH 03/24] Isolate Distributed JavaScript (#1645) Summary: Pull Request resolved: https://github.com/facebook/yoga/pull/1645 Right now we publish Yoga by transforming in-place, and rewriting the entrypoint to point to the generated vanilla JavaScript. It is nice to include the original source, e.g. so that users can use sourcemaps when debugging, but putting these files on top of each other has been causing problems, like https://github.com/facebook/yoga/issues/1637#issuecomment-2049099690 This changes the packaging step to instead put all the outputs into a "dist" folder, and point the package entrypoints there. We still include original source for sourcemap usage. Reviewed By: yungsters Differential Revision: D56093470 fbshipit-source-id: ecd52dddd9040294aae66747cf1fdf48c7f602e7 --- javascript/just.config.cjs | 32 ++++++++++++++++++++++++-------- javascript/package.json | 4 +++- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/javascript/just.config.cjs b/javascript/just.config.cjs index db3cd3891a..8373808d04 100644 --- a/javascript/just.config.cjs +++ b/javascript/just.config.cjs @@ -13,11 +13,11 @@ const { logger, jestTask, option, - parallel, series, spawn, task, tscTask, + copyTask, } = require('just-scripts'); const {existsSync} = require('fs'); @@ -58,16 +58,32 @@ task('prepack-package-json', async () => { const packageJsonContents = await readFile(packageJsonPath); const packageJson = JSON.parse(packageJsonContents.toString('utf-8')); - recursiveReplace(packageJson, /(.\/src\/.*)\.ts/, '$1.js'); - packageJson.typings = packageJson.main.replace(/(.\/src\/.*)\.js/, '$1.d.ts'); + packageJson.main = packageJson.main.replace( + /^.\/src\/(.*)\.ts/, + './dist/src/$1.js', + ); + packageJson.types = packageJson.main.replace(/(.*)\.js/, '$1.d.ts'); + + recursiveReplace( + packageJson.exports, + /^.\/src\/(.*)\.ts/, + './dist/src/$1.js', + ); + await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2)); }); task( 'prepack', series( - parallel('build', tscTask({emitDeclarationOnly: true})), - babelTransformTask({dir: 'src'}), + 'build', + copyTask({paths: ['binaries'], dest: 'dist/binaries'}), + tscTask({ + emitDeclarationOnly: true, + rootDir: '.', + declarationDir: 'dist', + }), + babelTransformTask({src: 'src', dst: 'dist/src'}), 'prepack-package-json', ), ); @@ -85,14 +101,14 @@ function recursiveReplace(obj, pattern, replacement) { function babelTransformTask(opts) { return () => { const args = [ - opts.dir, + opts.src, '--source-maps', '--out-dir', - opts.dir, + opts.dst, '--extensions', '.js,.cjs,.mjs,.ts,.cts,.mts', ]; - logger.info(`Transforming "${path.resolve(opts.dir)}"`); + logger.info(`Transforming "${path.resolve(opts.src)}"`); return spawn(node, [require.resolve('@babel/cli/bin/babel'), ...args], { cwd: __dirname, diff --git a/javascript/package.json b/javascript/package.json index 42aab81e39..9025d083fd 100644 --- a/javascript/package.json +++ b/javascript/package.json @@ -11,12 +11,14 @@ }, "type": "module", "main": "./src/index.ts", + "types": "./src/index.ts", "exports": { ".": "./src/index.ts", "./load": "./src/load.ts" }, "files": [ - "binaries/**", + "dist/binaries/**", + "dist/src/**", "src/**" ], "scripts": { From d4247d65c0f5fe6c696e8bc3068984c1d6b6c30a Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Mon, 15 Apr 2024 10:43:25 -0700 Subject: [PATCH 04/24] Don't run test validation off main branch (#1644) Summary: Pull Request resolved: https://github.com/facebook/yoga/pull/1644 Because Chrome behaviors can change Reviewed By: cortinico Differential Revision: D56088135 fbshipit-source-id: 7f760786dde061df9af034368e2184117e6e6846 --- .github/workflows/validate-tests.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/validate-tests.yml b/.github/workflows/validate-tests.yml index 16b4be49a7..2ca0c39894 100644 --- a/.github/workflows/validate-tests.yml +++ b/.github/workflows/validate-tests.yml @@ -5,7 +5,6 @@ on: push: branches: - main - - 'release-*' workflow_dispatch: jobs: From cd4a1b8cf63cf09a62d6aefcd16843cc8869488c Mon Sep 17 00:00:00 2001 From: Soe Lynn Date: Mon, 15 Apr 2024 16:44:16 -0700 Subject: [PATCH 05/24] Implement Percentage support for gap styles (#1643) Summary: X-link: https://github.com/facebook/react-native/pull/44067 X-link: https://github.com/facebook/litho/pull/980 Pull Request resolved: https://github.com/facebook/yoga/pull/1643 Changelog [Internal]: - Added percentage value for flex layout gap - Wired up to pass proper available width and height to implement this feature Reviewed By: NickGerleman Differential Revision: D56002340 fbshipit-source-id: c0bc86ac70a1391f115c87da99c2ef411535f68b --- gentest/fixtures/YGGapTest.html | 69 ++ java/com/facebook/yoga/YogaNative.java | 1 + java/com/facebook/yoga/YogaNode.java | 2 + java/com/facebook/yoga/YogaNodeJNIBase.java | 5 + java/jni/YGJNIVanilla.cpp | 15 + java/tests/com/facebook/yoga/YGGapTest.java | 921 +++++++++++++++++- javascript/src/Node.cpp | 4 + javascript/src/Node.h | 1 + javascript/src/embind.cpp | 1 + javascript/src/wrapAssembly.ts | 4 +- javascript/tests/generated/YGGapTest.test.ts | 965 ++++++++++++++++++- tests/StyleTest.cpp | 2 +- tests/generated/YGGapTest.cpp | 931 +++++++++++++++++- yoga/YGNodeStyle.cpp | 5 + yoga/YGNodeStyle.h | 2 + yoga/algorithm/CalculateLayout.cpp | 9 +- yoga/algorithm/FlexLine.cpp | 3 +- yoga/style/Style.h | 6 +- 18 files changed, 2933 insertions(+), 13 deletions(-) diff --git a/gentest/fixtures/YGGapTest.html b/gentest/fixtures/YGGapTest.html index e714265953..9f18bbc1b7 100644 --- a/gentest/fixtures/YGGapTest.html +++ b/gentest/fixtures/YGGapTest.html @@ -171,3 +171,72 @@
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ + +
+
+
+
+
+
+
diff --git a/java/com/facebook/yoga/YogaNative.java b/java/com/facebook/yoga/YogaNative.java index 9be9edcf87..363e85f584 100644 --- a/java/com/facebook/yoga/YogaNative.java +++ b/java/com/facebook/yoga/YogaNative.java @@ -108,6 +108,7 @@ public class YogaNative { static native void jni_YGNodeStyleSetAspectRatioJNI(long nativePointer, float aspectRatio); static native float jni_YGNodeStyleGetGapJNI(long nativePointer, int gutter); static native void jni_YGNodeStyleSetGapJNI(long nativePointer, int gutter, float gapLength); + static native void jni_YGNodeStyleSetGapPercentJNI(long nativePointer, int gutter, float gapLength); static native void jni_YGNodeSetHasMeasureFuncJNI(long nativePointer, boolean hasMeasureFunc); static native void jni_YGNodeSetHasBaselineFuncJNI(long nativePointer, boolean hasMeasureFunc); static native void jni_YGNodeSetStyleInputsJNI(long nativePointer, float[] styleInputsArray, int size); diff --git a/java/com/facebook/yoga/YogaNode.java b/java/com/facebook/yoga/YogaNode.java index 4875ac3e8c..97ad8ac2c2 100644 --- a/java/com/facebook/yoga/YogaNode.java +++ b/java/com/facebook/yoga/YogaNode.java @@ -192,6 +192,8 @@ public interface Inputs { public abstract void setGap(YogaGutter gutter, float gapLength); + public abstract void setGapPercent(YogaGutter gutter, float gapLength); + public abstract float getLayoutX(); public abstract float getLayoutY(); diff --git a/java/com/facebook/yoga/YogaNodeJNIBase.java b/java/com/facebook/yoga/YogaNodeJNIBase.java index df958df166..2f3c446c34 100644 --- a/java/com/facebook/yoga/YogaNodeJNIBase.java +++ b/java/com/facebook/yoga/YogaNodeJNIBase.java @@ -721,4 +721,9 @@ public float getGap(YogaGutter gutter) { public void setGap(YogaGutter gutter, float gapLength) { YogaNative.jni_YGNodeStyleSetGapJNI(mNativePointer, gutter.intValue(), gapLength); } + + @Override + public void setGapPercent(YogaGutter gutter, float gapLength) { + YogaNative.jni_YGNodeStyleSetGapPercentJNI(mNativePointer, gutter.intValue(), gapLength); + } } diff --git a/java/jni/YGJNIVanilla.cpp b/java/jni/YGJNIVanilla.cpp index 82e0dc17b1..4d017037b4 100644 --- a/java/jni/YGJNIVanilla.cpp +++ b/java/jni/YGJNIVanilla.cpp @@ -715,6 +715,18 @@ static void jni_YGNodeStyleSetGapJNI( static_cast(gapLength)); } +static void jni_YGNodeStyleSetGapPercentJNI( + JNIEnv* /*env*/, + jobject /*obj*/, + jlong nativePointer, + jint gutter, + jfloat gapLength) { + YGNodeStyleSetGapPercent( + _jlong2YGNodeRef(nativePointer), + static_cast(gutter), + static_cast(gapLength)); +} + // Yoga specific properties, not compatible with flexbox specification YG_NODE_JNI_STYLE_PROP(jfloat, float, AspectRatio); @@ -944,6 +956,9 @@ static JNINativeMethod methods[] = { (void*)jni_YGNodeSetHasMeasureFuncJNI}, {"jni_YGNodeStyleGetGapJNI", "(JI)F", (void*)jni_YGNodeStyleGetGapJNI}, {"jni_YGNodeStyleSetGapJNI", "(JIF)V", (void*)jni_YGNodeStyleSetGapJNI}, + {"jni_YGNodeStyleSetGapPercentJNI", + "(JIF)V", + (void*)jni_YGNodeStyleSetGapPercentJNI}, {"jni_YGNodeSetHasBaselineFuncJNI", "(JZ)V", (void*)jni_YGNodeSetHasBaselineFuncJNI}, diff --git a/java/tests/com/facebook/yoga/YGGapTest.java b/java/tests/com/facebook/yoga/YGGapTest.java index 17e7ae079f..7124cfb6c9 100644 --- a/java/tests/com/facebook/yoga/YGGapTest.java +++ b/java/tests/com/facebook/yoga/YGGapTest.java @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> * generated by gentest/gentest-driver.ts from gentest/fixtures/YGGapTest.html */ @@ -2216,6 +2216,925 @@ public void test_row_gap_determines_parent_height() { assertEquals(30f, root_child2.getLayoutHeight(), 0.0f); } + @Test + public void test_row_gap_percent_wrapping() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setFlexDirection(YogaFlexDirection.ROW); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setWrap(YogaWrap.WRAP); + root.setPadding(YogaEdge.LEFT, 10); + root.setPadding(YogaEdge.TOP, 10); + root.setPadding(YogaEdge.RIGHT, 10); + root.setPadding(YogaEdge.BOTTOM, 10); + root.setWidth(300f); + root.setHeight(700f); + root.setGapPercent(YogaGutter.COLUMN, 10f); + root.setGapPercent(YogaGutter.ROW, 10f); + + final YogaNode root_child0 = createNode(config); + root_child0.setWidth(100f); + root_child0.setHeight(100f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child1 = createNode(config); + root_child1.setWidth(100f); + root_child1.setHeight(100f); + root.addChildAt(root_child1, 1); + + final YogaNode root_child2 = createNode(config); + root_child2.setWidth(100f); + root_child2.setHeight(100f); + root.addChildAt(root_child2, 2); + + final YogaNode root_child3 = createNode(config); + root_child3.setWidth(100f); + root_child3.setHeight(100f); + root.addChildAt(root_child3, 3); + + final YogaNode root_child4 = createNode(config); + root_child4.setWidth(100f); + root_child4.setHeight(100f); + root.addChildAt(root_child4, 4); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(300f, root.getLayoutWidth(), 0.0f); + assertEquals(700f, root.getLayoutHeight(), 0.0f); + + assertEquals(10f, root_child0.getLayoutX(), 0.0f); + assertEquals(10f, root_child0.getLayoutY(), 0.0f); + assertEquals(100f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(138f, root_child1.getLayoutX(), 0.0f); + assertEquals(10f, root_child1.getLayoutY(), 0.0f); + assertEquals(100f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(10f, root_child2.getLayoutX(), 0.0f); + assertEquals(178f, root_child2.getLayoutY(), 0.0f); + assertEquals(100f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child2.getLayoutHeight(), 0.0f); + + assertEquals(138f, root_child3.getLayoutX(), 0.0f); + assertEquals(178f, root_child3.getLayoutY(), 0.0f); + assertEquals(100f, root_child3.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child3.getLayoutHeight(), 0.0f); + + assertEquals(10f, root_child4.getLayoutX(), 0.0f); + assertEquals(346f, root_child4.getLayoutY(), 0.0f); + assertEquals(100f, root_child4.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child4.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(300f, root.getLayoutWidth(), 0.0f); + assertEquals(700f, root.getLayoutHeight(), 0.0f); + + assertEquals(190f, root_child0.getLayoutX(), 0.0f); + assertEquals(10f, root_child0.getLayoutY(), 0.0f); + assertEquals(100f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(62f, root_child1.getLayoutX(), 0.0f); + assertEquals(10f, root_child1.getLayoutY(), 0.0f); + assertEquals(100f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(190f, root_child2.getLayoutX(), 0.0f); + assertEquals(178f, root_child2.getLayoutY(), 0.0f); + assertEquals(100f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child2.getLayoutHeight(), 0.0f); + + assertEquals(62f, root_child3.getLayoutX(), 0.0f); + assertEquals(178f, root_child3.getLayoutY(), 0.0f); + assertEquals(100f, root_child3.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child3.getLayoutHeight(), 0.0f); + + assertEquals(190f, root_child4.getLayoutX(), 0.0f); + assertEquals(346f, root_child4.getLayoutY(), 0.0f); + assertEquals(100f, root_child4.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child4.getLayoutHeight(), 0.0f); + } + + @Test + public void test_row_gap_percent_determines_parent_height() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setFlexDirection(YogaFlexDirection.ROW); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setWrap(YogaWrap.WRAP); + root.setWidth(300f); + root.setGapPercent(YogaGutter.COLUMN, 10f); + root.setGapPercent(YogaGutter.ROW, 10f); + + final YogaNode root_child0 = createNode(config); + root_child0.setWidth(100f); + root_child0.setHeight(100f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child1 = createNode(config); + root_child1.setWidth(100f); + root_child1.setHeight(100f); + root.addChildAt(root_child1, 1); + + final YogaNode root_child2 = createNode(config); + root_child2.setWidth(100f); + root_child2.setHeight(100f); + root.addChildAt(root_child2, 2); + + final YogaNode root_child3 = createNode(config); + root_child3.setWidth(100f); + root_child3.setHeight(100f); + root.addChildAt(root_child3, 3); + + final YogaNode root_child4 = createNode(config); + root_child4.setWidth(100f); + root_child4.setHeight(100f); + root.addChildAt(root_child4, 4); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(300f, root.getLayoutWidth(), 0.0f); + assertEquals(300f, root.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(100f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(130f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(100f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child2.getLayoutX(), 0.0f); + assertEquals(100f, root_child2.getLayoutY(), 0.0f); + assertEquals(100f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child2.getLayoutHeight(), 0.0f); + + assertEquals(130f, root_child3.getLayoutX(), 0.0f); + assertEquals(100f, root_child3.getLayoutY(), 0.0f); + assertEquals(100f, root_child3.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child3.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child4.getLayoutX(), 0.0f); + assertEquals(200f, root_child4.getLayoutY(), 0.0f); + assertEquals(100f, root_child4.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child4.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(300f, root.getLayoutWidth(), 0.0f); + assertEquals(300f, root.getLayoutHeight(), 0.0f); + + assertEquals(200f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(100f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(70f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(100f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(200f, root_child2.getLayoutX(), 0.0f); + assertEquals(100f, root_child2.getLayoutY(), 0.0f); + assertEquals(100f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child2.getLayoutHeight(), 0.0f); + + assertEquals(70f, root_child3.getLayoutX(), 0.0f); + assertEquals(100f, root_child3.getLayoutY(), 0.0f); + assertEquals(100f, root_child3.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child3.getLayoutHeight(), 0.0f); + + assertEquals(200f, root_child4.getLayoutX(), 0.0f); + assertEquals(200f, root_child4.getLayoutY(), 0.0f); + assertEquals(100f, root_child4.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child4.getLayoutHeight(), 0.0f); + } + + @Test + public void test_row_gap_percent_wrapping_with_both_content_padding_and_item_padding() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setFlexDirection(YogaFlexDirection.ROW); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setWrap(YogaWrap.WRAP); + root.setPadding(YogaEdge.LEFT, 10); + root.setPadding(YogaEdge.TOP, 10); + root.setPadding(YogaEdge.RIGHT, 10); + root.setPadding(YogaEdge.BOTTOM, 10); + root.setWidth(300f); + root.setHeight(700f); + root.setGapPercent(YogaGutter.COLUMN, 10f); + root.setGapPercent(YogaGutter.ROW, 10f); + + final YogaNode root_child0 = createNode(config); + root_child0.setPadding(YogaEdge.LEFT, 10); + root_child0.setPadding(YogaEdge.TOP, 10); + root_child0.setPadding(YogaEdge.RIGHT, 10); + root_child0.setPadding(YogaEdge.BOTTOM, 10); + root_child0.setWidth(100f); + root_child0.setHeight(100f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child1 = createNode(config); + root_child1.setPadding(YogaEdge.LEFT, 10); + root_child1.setPadding(YogaEdge.TOP, 10); + root_child1.setPadding(YogaEdge.RIGHT, 10); + root_child1.setPadding(YogaEdge.BOTTOM, 10); + root_child1.setWidth(100f); + root_child1.setHeight(100f); + root.addChildAt(root_child1, 1); + + final YogaNode root_child2 = createNode(config); + root_child2.setPadding(YogaEdge.LEFT, 10); + root_child2.setPadding(YogaEdge.TOP, 10); + root_child2.setPadding(YogaEdge.RIGHT, 10); + root_child2.setPadding(YogaEdge.BOTTOM, 10); + root_child2.setWidth(100f); + root_child2.setHeight(100f); + root.addChildAt(root_child2, 2); + + final YogaNode root_child3 = createNode(config); + root_child3.setPadding(YogaEdge.LEFT, 10); + root_child3.setPadding(YogaEdge.TOP, 10); + root_child3.setPadding(YogaEdge.RIGHT, 10); + root_child3.setPadding(YogaEdge.BOTTOM, 10); + root_child3.setWidth(100f); + root_child3.setHeight(100f); + root.addChildAt(root_child3, 3); + + final YogaNode root_child4 = createNode(config); + root_child4.setPadding(YogaEdge.LEFT, 10); + root_child4.setPadding(YogaEdge.TOP, 10); + root_child4.setPadding(YogaEdge.RIGHT, 10); + root_child4.setPadding(YogaEdge.BOTTOM, 10); + root_child4.setWidth(100f); + root_child4.setHeight(100f); + root.addChildAt(root_child4, 4); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(300f, root.getLayoutWidth(), 0.0f); + assertEquals(700f, root.getLayoutHeight(), 0.0f); + + assertEquals(10f, root_child0.getLayoutX(), 0.0f); + assertEquals(10f, root_child0.getLayoutY(), 0.0f); + assertEquals(100f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(138f, root_child1.getLayoutX(), 0.0f); + assertEquals(10f, root_child1.getLayoutY(), 0.0f); + assertEquals(100f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(10f, root_child2.getLayoutX(), 0.0f); + assertEquals(178f, root_child2.getLayoutY(), 0.0f); + assertEquals(100f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child2.getLayoutHeight(), 0.0f); + + assertEquals(138f, root_child3.getLayoutX(), 0.0f); + assertEquals(178f, root_child3.getLayoutY(), 0.0f); + assertEquals(100f, root_child3.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child3.getLayoutHeight(), 0.0f); + + assertEquals(10f, root_child4.getLayoutX(), 0.0f); + assertEquals(346f, root_child4.getLayoutY(), 0.0f); + assertEquals(100f, root_child4.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child4.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(300f, root.getLayoutWidth(), 0.0f); + assertEquals(700f, root.getLayoutHeight(), 0.0f); + + assertEquals(190f, root_child0.getLayoutX(), 0.0f); + assertEquals(10f, root_child0.getLayoutY(), 0.0f); + assertEquals(100f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(62f, root_child1.getLayoutX(), 0.0f); + assertEquals(10f, root_child1.getLayoutY(), 0.0f); + assertEquals(100f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(190f, root_child2.getLayoutX(), 0.0f); + assertEquals(178f, root_child2.getLayoutY(), 0.0f); + assertEquals(100f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child2.getLayoutHeight(), 0.0f); + + assertEquals(62f, root_child3.getLayoutX(), 0.0f); + assertEquals(178f, root_child3.getLayoutY(), 0.0f); + assertEquals(100f, root_child3.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child3.getLayoutHeight(), 0.0f); + + assertEquals(190f, root_child4.getLayoutX(), 0.0f); + assertEquals(346f, root_child4.getLayoutY(), 0.0f); + assertEquals(100f, root_child4.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child4.getLayoutHeight(), 0.0f); + } + + @Test + public void test_row_gap_percent_wrapping_with_both_content_padding() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setFlexDirection(YogaFlexDirection.ROW); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setWrap(YogaWrap.WRAP); + root.setPadding(YogaEdge.LEFT, 10); + root.setPadding(YogaEdge.TOP, 10); + root.setPadding(YogaEdge.RIGHT, 10); + root.setPadding(YogaEdge.BOTTOM, 10); + root.setWidth(300f); + root.setHeight(700f); + root.setGapPercent(YogaGutter.COLUMN, 10f); + root.setGapPercent(YogaGutter.ROW, 10f); + + final YogaNode root_child0 = createNode(config); + root_child0.setWidth(100f); + root_child0.setHeight(100f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child1 = createNode(config); + root_child1.setWidth(100f); + root_child1.setHeight(100f); + root.addChildAt(root_child1, 1); + + final YogaNode root_child2 = createNode(config); + root_child2.setWidth(100f); + root_child2.setHeight(100f); + root.addChildAt(root_child2, 2); + + final YogaNode root_child3 = createNode(config); + root_child3.setWidth(100f); + root_child3.setHeight(100f); + root.addChildAt(root_child3, 3); + + final YogaNode root_child4 = createNode(config); + root_child4.setWidth(100f); + root_child4.setHeight(100f); + root.addChildAt(root_child4, 4); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(300f, root.getLayoutWidth(), 0.0f); + assertEquals(700f, root.getLayoutHeight(), 0.0f); + + assertEquals(10f, root_child0.getLayoutX(), 0.0f); + assertEquals(10f, root_child0.getLayoutY(), 0.0f); + assertEquals(100f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(138f, root_child1.getLayoutX(), 0.0f); + assertEquals(10f, root_child1.getLayoutY(), 0.0f); + assertEquals(100f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(10f, root_child2.getLayoutX(), 0.0f); + assertEquals(178f, root_child2.getLayoutY(), 0.0f); + assertEquals(100f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child2.getLayoutHeight(), 0.0f); + + assertEquals(138f, root_child3.getLayoutX(), 0.0f); + assertEquals(178f, root_child3.getLayoutY(), 0.0f); + assertEquals(100f, root_child3.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child3.getLayoutHeight(), 0.0f); + + assertEquals(10f, root_child4.getLayoutX(), 0.0f); + assertEquals(346f, root_child4.getLayoutY(), 0.0f); + assertEquals(100f, root_child4.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child4.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(300f, root.getLayoutWidth(), 0.0f); + assertEquals(700f, root.getLayoutHeight(), 0.0f); + + assertEquals(190f, root_child0.getLayoutX(), 0.0f); + assertEquals(10f, root_child0.getLayoutY(), 0.0f); + assertEquals(100f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(62f, root_child1.getLayoutX(), 0.0f); + assertEquals(10f, root_child1.getLayoutY(), 0.0f); + assertEquals(100f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(190f, root_child2.getLayoutX(), 0.0f); + assertEquals(178f, root_child2.getLayoutY(), 0.0f); + assertEquals(100f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child2.getLayoutHeight(), 0.0f); + + assertEquals(62f, root_child3.getLayoutX(), 0.0f); + assertEquals(178f, root_child3.getLayoutY(), 0.0f); + assertEquals(100f, root_child3.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child3.getLayoutHeight(), 0.0f); + + assertEquals(190f, root_child4.getLayoutX(), 0.0f); + assertEquals(346f, root_child4.getLayoutY(), 0.0f); + assertEquals(100f, root_child4.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child4.getLayoutHeight(), 0.0f); + } + + @Test + public void test_row_gap_percent_wrapping_with_content_margin() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setFlexDirection(YogaFlexDirection.ROW); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setWrap(YogaWrap.WRAP); + root.setMargin(YogaEdge.LEFT, 10f); + root.setMargin(YogaEdge.TOP, 10f); + root.setMargin(YogaEdge.RIGHT, 10f); + root.setMargin(YogaEdge.BOTTOM, 10f); + root.setWidth(300f); + root.setHeight(700f); + root.setGapPercent(YogaGutter.COLUMN, 10f); + root.setGapPercent(YogaGutter.ROW, 10f); + + final YogaNode root_child0 = createNode(config); + root_child0.setWidth(100f); + root_child0.setHeight(100f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child1 = createNode(config); + root_child1.setWidth(100f); + root_child1.setHeight(100f); + root.addChildAt(root_child1, 1); + + final YogaNode root_child2 = createNode(config); + root_child2.setWidth(100f); + root_child2.setHeight(100f); + root.addChildAt(root_child2, 2); + + final YogaNode root_child3 = createNode(config); + root_child3.setWidth(100f); + root_child3.setHeight(100f); + root.addChildAt(root_child3, 3); + + final YogaNode root_child4 = createNode(config); + root_child4.setWidth(100f); + root_child4.setHeight(100f); + root.addChildAt(root_child4, 4); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(10f, root.getLayoutX(), 0.0f); + assertEquals(10f, root.getLayoutY(), 0.0f); + assertEquals(300f, root.getLayoutWidth(), 0.0f); + assertEquals(700f, root.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(100f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(130f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(100f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child2.getLayoutX(), 0.0f); + assertEquals(170f, root_child2.getLayoutY(), 0.0f); + assertEquals(100f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child2.getLayoutHeight(), 0.0f); + + assertEquals(130f, root_child3.getLayoutX(), 0.0f); + assertEquals(170f, root_child3.getLayoutY(), 0.0f); + assertEquals(100f, root_child3.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child3.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child4.getLayoutX(), 0.0f); + assertEquals(340f, root_child4.getLayoutY(), 0.0f); + assertEquals(100f, root_child4.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child4.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(10f, root.getLayoutX(), 0.0f); + assertEquals(10f, root.getLayoutY(), 0.0f); + assertEquals(300f, root.getLayoutWidth(), 0.0f); + assertEquals(700f, root.getLayoutHeight(), 0.0f); + + assertEquals(200f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(100f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(70f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(100f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(200f, root_child2.getLayoutX(), 0.0f); + assertEquals(170f, root_child2.getLayoutY(), 0.0f); + assertEquals(100f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child2.getLayoutHeight(), 0.0f); + + assertEquals(70f, root_child3.getLayoutX(), 0.0f); + assertEquals(170f, root_child3.getLayoutY(), 0.0f); + assertEquals(100f, root_child3.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child3.getLayoutHeight(), 0.0f); + + assertEquals(200f, root_child4.getLayoutX(), 0.0f); + assertEquals(340f, root_child4.getLayoutY(), 0.0f); + assertEquals(100f, root_child4.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child4.getLayoutHeight(), 0.0f); + } + + @Test + public void test_row_gap_percent_wrapping_with_content_margin_and_padding() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setFlexDirection(YogaFlexDirection.ROW); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setWrap(YogaWrap.WRAP); + root.setMargin(YogaEdge.LEFT, 10f); + root.setMargin(YogaEdge.TOP, 10f); + root.setMargin(YogaEdge.RIGHT, 10f); + root.setMargin(YogaEdge.BOTTOM, 10f); + root.setPadding(YogaEdge.LEFT, 10); + root.setPadding(YogaEdge.TOP, 10); + root.setPadding(YogaEdge.RIGHT, 10); + root.setPadding(YogaEdge.BOTTOM, 10); + root.setWidth(300f); + root.setHeight(700f); + root.setGapPercent(YogaGutter.COLUMN, 10f); + root.setGapPercent(YogaGutter.ROW, 10f); + + final YogaNode root_child0 = createNode(config); + root_child0.setWidth(100f); + root_child0.setHeight(100f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child1 = createNode(config); + root_child1.setWidth(100f); + root_child1.setHeight(100f); + root.addChildAt(root_child1, 1); + + final YogaNode root_child2 = createNode(config); + root_child2.setWidth(100f); + root_child2.setHeight(100f); + root.addChildAt(root_child2, 2); + + final YogaNode root_child3 = createNode(config); + root_child3.setWidth(100f); + root_child3.setHeight(100f); + root.addChildAt(root_child3, 3); + + final YogaNode root_child4 = createNode(config); + root_child4.setWidth(100f); + root_child4.setHeight(100f); + root.addChildAt(root_child4, 4); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(10f, root.getLayoutX(), 0.0f); + assertEquals(10f, root.getLayoutY(), 0.0f); + assertEquals(300f, root.getLayoutWidth(), 0.0f); + assertEquals(700f, root.getLayoutHeight(), 0.0f); + + assertEquals(10f, root_child0.getLayoutX(), 0.0f); + assertEquals(10f, root_child0.getLayoutY(), 0.0f); + assertEquals(100f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(138f, root_child1.getLayoutX(), 0.0f); + assertEquals(10f, root_child1.getLayoutY(), 0.0f); + assertEquals(100f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(10f, root_child2.getLayoutX(), 0.0f); + assertEquals(178f, root_child2.getLayoutY(), 0.0f); + assertEquals(100f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child2.getLayoutHeight(), 0.0f); + + assertEquals(138f, root_child3.getLayoutX(), 0.0f); + assertEquals(178f, root_child3.getLayoutY(), 0.0f); + assertEquals(100f, root_child3.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child3.getLayoutHeight(), 0.0f); + + assertEquals(10f, root_child4.getLayoutX(), 0.0f); + assertEquals(346f, root_child4.getLayoutY(), 0.0f); + assertEquals(100f, root_child4.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child4.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(10f, root.getLayoutX(), 0.0f); + assertEquals(10f, root.getLayoutY(), 0.0f); + assertEquals(300f, root.getLayoutWidth(), 0.0f); + assertEquals(700f, root.getLayoutHeight(), 0.0f); + + assertEquals(190f, root_child0.getLayoutX(), 0.0f); + assertEquals(10f, root_child0.getLayoutY(), 0.0f); + assertEquals(100f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(62f, root_child1.getLayoutX(), 0.0f); + assertEquals(10f, root_child1.getLayoutY(), 0.0f); + assertEquals(100f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(190f, root_child2.getLayoutX(), 0.0f); + assertEquals(178f, root_child2.getLayoutY(), 0.0f); + assertEquals(100f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child2.getLayoutHeight(), 0.0f); + + assertEquals(62f, root_child3.getLayoutX(), 0.0f); + assertEquals(178f, root_child3.getLayoutY(), 0.0f); + assertEquals(100f, root_child3.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child3.getLayoutHeight(), 0.0f); + + assertEquals(190f, root_child4.getLayoutX(), 0.0f); + assertEquals(346f, root_child4.getLayoutY(), 0.0f); + assertEquals(100f, root_child4.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child4.getLayoutHeight(), 0.0f); + } + + @Test + public void test_row_gap_percent_wrapping_with_flexible_content() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setFlexDirection(YogaFlexDirection.ROW); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setWidth(300f); + root.setHeight(300f); + root.setGapPercent(YogaGutter.COLUMN, 10f); + root.setGapPercent(YogaGutter.ROW, 10f); + + final YogaNode root_child0 = createNode(config); + root_child0.setFlexGrow(1f); + root_child0.setFlexShrink(1f); + root_child0.setFlexBasisPercent(0f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child1 = createNode(config); + root_child1.setFlexGrow(1f); + root_child1.setFlexShrink(1f); + root_child1.setFlexBasisPercent(0f); + root.addChildAt(root_child1, 1); + + final YogaNode root_child2 = createNode(config); + root_child2.setFlexGrow(1f); + root_child2.setFlexShrink(1f); + root_child2.setFlexBasisPercent(0f); + root.addChildAt(root_child2, 2); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(300f, root.getLayoutWidth(), 0.0f); + assertEquals(300f, root.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(80f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(300f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(110f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(80f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(300f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(220f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(80f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(300f, root_child2.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(300f, root.getLayoutWidth(), 0.0f); + assertEquals(300f, root.getLayoutHeight(), 0.0f); + + assertEquals(220f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(80f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(300f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(110f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(80f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(300f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(80f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(300f, root_child2.getLayoutHeight(), 0.0f); + } + + @Test + public void test_row_gap_percent_wrapping_with_mixed_flexible_content() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setFlexDirection(YogaFlexDirection.ROW); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setWidth(300f); + root.setHeight(300f); + root.setGapPercent(YogaGutter.COLUMN, 10f); + root.setGapPercent(YogaGutter.ROW, 10f); + + final YogaNode root_child0 = createNode(config); + root_child0.setWidth(10f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child1 = createNode(config); + root_child1.setFlexGrow(1f); + root_child1.setFlexShrink(1f); + root_child1.setFlexBasisPercent(0f); + root.addChildAt(root_child1, 1); + + final YogaNode root_child2 = createNode(config); + root_child2.setWidthPercent(10f); + root.addChildAt(root_child2, 2); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(300f, root.getLayoutWidth(), 0.0f); + assertEquals(300f, root.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(10f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(300f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(40f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(200f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(300f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(270f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(30f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(300f, root_child2.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(300f, root.getLayoutWidth(), 0.0f); + assertEquals(300f, root.getLayoutHeight(), 0.0f); + + assertEquals(290f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(10f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(300f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(60f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(200f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(300f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(30f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(300f, root_child2.getLayoutHeight(), 0.0f); + } + + @Test + @Ignore + public void test_row_gap_percent_wrapping_with_min_width() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setFlexDirection(YogaFlexDirection.ROW); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setWrap(YogaWrap.WRAP); + root.setMinWidth(300f); + root.setGapPercent(YogaGutter.COLUMN, 10f); + root.setGapPercent(YogaGutter.ROW, 10f); + + final YogaNode root_child0 = createNode(config); + root_child0.setWidth(100f); + root_child0.setHeight(100f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child1 = createNode(config); + root_child1.setWidth(100f); + root_child1.setHeight(100f); + root.addChildAt(root_child1, 1); + + final YogaNode root_child2 = createNode(config); + root_child2.setWidth(100f); + root_child2.setHeight(100f); + root.addChildAt(root_child2, 2); + + final YogaNode root_child3 = createNode(config); + root_child3.setWidth(100f); + root_child3.setHeight(100f); + root.addChildAt(root_child3, 3); + + final YogaNode root_child4 = createNode(config); + root_child4.setWidth(100f); + root_child4.setHeight(100f); + root.addChildAt(root_child4, 4); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(300f, root.getLayoutWidth(), 0.0f); + assertEquals(300f, root.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(100f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(130f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(100f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child2.getLayoutX(), 0.0f); + assertEquals(100f, root_child2.getLayoutY(), 0.0f); + assertEquals(100f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child2.getLayoutHeight(), 0.0f); + + assertEquals(130f, root_child3.getLayoutX(), 0.0f); + assertEquals(100f, root_child3.getLayoutY(), 0.0f); + assertEquals(100f, root_child3.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child3.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child4.getLayoutX(), 0.0f); + assertEquals(200f, root_child4.getLayoutY(), 0.0f); + assertEquals(100f, root_child4.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child4.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(300f, root.getLayoutWidth(), 0.0f); + assertEquals(300f, root.getLayoutHeight(), 0.0f); + + assertEquals(200f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(100f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(70f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(100f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(200f, root_child2.getLayoutX(), 0.0f); + assertEquals(100f, root_child2.getLayoutY(), 0.0f); + assertEquals(100f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child2.getLayoutHeight(), 0.0f); + + assertEquals(70f, root_child3.getLayoutX(), 0.0f); + assertEquals(100f, root_child3.getLayoutY(), 0.0f); + assertEquals(100f, root_child3.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child3.getLayoutHeight(), 0.0f); + + assertEquals(200f, root_child4.getLayoutX(), 0.0f); + assertEquals(200f, root_child4.getLayoutY(), 0.0f); + assertEquals(100f, root_child4.getLayoutWidth(), 0.0f); + assertEquals(100f, root_child4.getLayoutHeight(), 0.0f); + } + private YogaNode createNode(YogaConfig config) { return mNodeFactory.create(config); } diff --git a/javascript/src/Node.cpp b/javascript/src/Node.cpp index 06ca672cdc..e8bcaf6e53 100644 --- a/javascript/src/Node.cpp +++ b/javascript/src/Node.cpp @@ -240,6 +240,10 @@ void Node::setGap(int gutter, double gapLength) { YGNodeStyleSetGap(m_node, static_cast(gutter), gapLength); } +void Node::setGapPercent(int gutter, double gapLength) { + YGNodeStyleSetGapPercent(m_node, static_cast(gutter), gapLength); +} + int Node::getPositionType(void) const { return YGNodeStyleGetPositionType(m_node); } diff --git a/javascript/src/Node.h b/javascript/src/Node.h index 57494db275..f5cb7a34e6 100644 --- a/javascript/src/Node.h +++ b/javascript/src/Node.h @@ -124,6 +124,7 @@ class Node { void setPaddingPercent(int edge, double padding); void setGap(int gutter, double gapLength); + void setGapPercent(int gutter, double gapLength); public: // Style getters int getPositionType(void) const; diff --git a/javascript/src/embind.cpp b/javascript/src/embind.cpp index 5ed4807ba4..b8e1bbcb9b 100644 --- a/javascript/src/embind.cpp +++ b/javascript/src/embind.cpp @@ -116,6 +116,7 @@ EMSCRIPTEN_BINDINGS(YOGA_LAYOUT) { .function("setPadding", &Node::setPadding) .function("setPaddingPercent", &Node::setPaddingPercent) .function("setGap", &Node::setGap) + .function("setGapPercent", &Node::setGapPercent) .function("setDirection", &Node::setDirection) diff --git a/javascript/src/wrapAssembly.ts b/javascript/src/wrapAssembly.ts index 797a42c7d7..bc6c7c546b 100644 --- a/javascript/src/wrapAssembly.ts +++ b/javascript/src/wrapAssembly.ts @@ -144,7 +144,8 @@ export type Node = { setHeightAuto(): void; setHeightPercent(height: number | undefined): void; setJustifyContent(justifyContent: Justify): void; - setGap(gutter: Gutter, gapLength: number | undefined): Value; + setGap(gutter: Gutter, gapLength: number | `${number}%` | undefined): Value; + setGapPercent(gutter: Gutter, gapLength: number | undefined): Value; setMargin( edge: Edge, margin: number | 'auto' | `${number}%` | undefined, @@ -209,6 +210,7 @@ export default function wrapAssembly(lib: any): Yoga { 'setMaxWidth', 'setMaxHeight', 'setPadding', + 'setGap', ]) { const methods = { [Unit.Point]: lib.Node.prototype[fnName], diff --git a/javascript/tests/generated/YGGapTest.test.ts b/javascript/tests/generated/YGGapTest.test.ts index d40fe15fcd..1a1604f028 100644 --- a/javascript/tests/generated/YGGapTest.test.ts +++ b/javascript/tests/generated/YGGapTest.test.ts @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> * generated by gentest/gentest-driver.ts from gentest/fixtures/YGGapTest.html */ @@ -2336,3 +2336,966 @@ test('row_gap_determines_parent_height', () => { config.free(); } }); +test('row_gap_percent_wrapping', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setFlexDirection(FlexDirection.Row); + root.setPositionType(PositionType.Absolute); + root.setFlexWrap(Wrap.Wrap); + root.setPadding(Edge.Left, 10); + root.setPadding(Edge.Top, 10); + root.setPadding(Edge.Right, 10); + root.setPadding(Edge.Bottom, 10); + root.setWidth(300); + root.setHeight(700); + root.setGap(Gutter.Column, "10%"); + root.setGap(Gutter.Row, "10%"); + + const root_child0 = Yoga.Node.create(config); + root_child0.setWidth(100); + root_child0.setHeight(100); + root.insertChild(root_child0, 0); + + const root_child1 = Yoga.Node.create(config); + root_child1.setWidth(100); + root_child1.setHeight(100); + root.insertChild(root_child1, 1); + + const root_child2 = Yoga.Node.create(config); + root_child2.setWidth(100); + root_child2.setHeight(100); + root.insertChild(root_child2, 2); + + const root_child3 = Yoga.Node.create(config); + root_child3.setWidth(100); + root_child3.setHeight(100); + root.insertChild(root_child3, 3); + + const root_child4 = Yoga.Node.create(config); + root_child4.setWidth(100); + root_child4.setHeight(100); + root.insertChild(root_child4, 4); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(300); + expect(root.getComputedHeight()).toBe(700); + + expect(root_child0.getComputedLeft()).toBe(10); + expect(root_child0.getComputedTop()).toBe(10); + expect(root_child0.getComputedWidth()).toBe(100); + expect(root_child0.getComputedHeight()).toBe(100); + + expect(root_child1.getComputedLeft()).toBe(138); + expect(root_child1.getComputedTop()).toBe(10); + expect(root_child1.getComputedWidth()).toBe(100); + expect(root_child1.getComputedHeight()).toBe(100); + + expect(root_child2.getComputedLeft()).toBe(10); + expect(root_child2.getComputedTop()).toBe(178); + expect(root_child2.getComputedWidth()).toBe(100); + expect(root_child2.getComputedHeight()).toBe(100); + + expect(root_child3.getComputedLeft()).toBe(138); + expect(root_child3.getComputedTop()).toBe(178); + expect(root_child3.getComputedWidth()).toBe(100); + expect(root_child3.getComputedHeight()).toBe(100); + + expect(root_child4.getComputedLeft()).toBe(10); + expect(root_child4.getComputedTop()).toBe(346); + expect(root_child4.getComputedWidth()).toBe(100); + expect(root_child4.getComputedHeight()).toBe(100); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(300); + expect(root.getComputedHeight()).toBe(700); + + expect(root_child0.getComputedLeft()).toBe(190); + expect(root_child0.getComputedTop()).toBe(10); + expect(root_child0.getComputedWidth()).toBe(100); + expect(root_child0.getComputedHeight()).toBe(100); + + expect(root_child1.getComputedLeft()).toBe(62); + expect(root_child1.getComputedTop()).toBe(10); + expect(root_child1.getComputedWidth()).toBe(100); + expect(root_child1.getComputedHeight()).toBe(100); + + expect(root_child2.getComputedLeft()).toBe(190); + expect(root_child2.getComputedTop()).toBe(178); + expect(root_child2.getComputedWidth()).toBe(100); + expect(root_child2.getComputedHeight()).toBe(100); + + expect(root_child3.getComputedLeft()).toBe(62); + expect(root_child3.getComputedTop()).toBe(178); + expect(root_child3.getComputedWidth()).toBe(100); + expect(root_child3.getComputedHeight()).toBe(100); + + expect(root_child4.getComputedLeft()).toBe(190); + expect(root_child4.getComputedTop()).toBe(346); + expect(root_child4.getComputedWidth()).toBe(100); + expect(root_child4.getComputedHeight()).toBe(100); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); +test('row_gap_percent_determines_parent_height', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setFlexDirection(FlexDirection.Row); + root.setPositionType(PositionType.Absolute); + root.setFlexWrap(Wrap.Wrap); + root.setWidth(300); + root.setGap(Gutter.Column, "10%"); + root.setGap(Gutter.Row, "10%"); + + const root_child0 = Yoga.Node.create(config); + root_child0.setWidth(100); + root_child0.setHeight(100); + root.insertChild(root_child0, 0); + + const root_child1 = Yoga.Node.create(config); + root_child1.setWidth(100); + root_child1.setHeight(100); + root.insertChild(root_child1, 1); + + const root_child2 = Yoga.Node.create(config); + root_child2.setWidth(100); + root_child2.setHeight(100); + root.insertChild(root_child2, 2); + + const root_child3 = Yoga.Node.create(config); + root_child3.setWidth(100); + root_child3.setHeight(100); + root.insertChild(root_child3, 3); + + const root_child4 = Yoga.Node.create(config); + root_child4.setWidth(100); + root_child4.setHeight(100); + root.insertChild(root_child4, 4); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(300); + expect(root.getComputedHeight()).toBe(300); + + expect(root_child0.getComputedLeft()).toBe(0); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(100); + expect(root_child0.getComputedHeight()).toBe(100); + + expect(root_child1.getComputedLeft()).toBe(130); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(100); + expect(root_child1.getComputedHeight()).toBe(100); + + expect(root_child2.getComputedLeft()).toBe(0); + expect(root_child2.getComputedTop()).toBe(100); + expect(root_child2.getComputedWidth()).toBe(100); + expect(root_child2.getComputedHeight()).toBe(100); + + expect(root_child3.getComputedLeft()).toBe(130); + expect(root_child3.getComputedTop()).toBe(100); + expect(root_child3.getComputedWidth()).toBe(100); + expect(root_child3.getComputedHeight()).toBe(100); + + expect(root_child4.getComputedLeft()).toBe(0); + expect(root_child4.getComputedTop()).toBe(200); + expect(root_child4.getComputedWidth()).toBe(100); + expect(root_child4.getComputedHeight()).toBe(100); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(300); + expect(root.getComputedHeight()).toBe(300); + + expect(root_child0.getComputedLeft()).toBe(200); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(100); + expect(root_child0.getComputedHeight()).toBe(100); + + expect(root_child1.getComputedLeft()).toBe(70); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(100); + expect(root_child1.getComputedHeight()).toBe(100); + + expect(root_child2.getComputedLeft()).toBe(200); + expect(root_child2.getComputedTop()).toBe(100); + expect(root_child2.getComputedWidth()).toBe(100); + expect(root_child2.getComputedHeight()).toBe(100); + + expect(root_child3.getComputedLeft()).toBe(70); + expect(root_child3.getComputedTop()).toBe(100); + expect(root_child3.getComputedWidth()).toBe(100); + expect(root_child3.getComputedHeight()).toBe(100); + + expect(root_child4.getComputedLeft()).toBe(200); + expect(root_child4.getComputedTop()).toBe(200); + expect(root_child4.getComputedWidth()).toBe(100); + expect(root_child4.getComputedHeight()).toBe(100); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); +test('row_gap_percent_wrapping_with_both_content_padding_and_item_padding', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setFlexDirection(FlexDirection.Row); + root.setPositionType(PositionType.Absolute); + root.setFlexWrap(Wrap.Wrap); + root.setPadding(Edge.Left, 10); + root.setPadding(Edge.Top, 10); + root.setPadding(Edge.Right, 10); + root.setPadding(Edge.Bottom, 10); + root.setWidth(300); + root.setHeight(700); + root.setGap(Gutter.Column, "10%"); + root.setGap(Gutter.Row, "10%"); + + const root_child0 = Yoga.Node.create(config); + root_child0.setPadding(Edge.Left, 10); + root_child0.setPadding(Edge.Top, 10); + root_child0.setPadding(Edge.Right, 10); + root_child0.setPadding(Edge.Bottom, 10); + root_child0.setWidth(100); + root_child0.setHeight(100); + root.insertChild(root_child0, 0); + + const root_child1 = Yoga.Node.create(config); + root_child1.setPadding(Edge.Left, 10); + root_child1.setPadding(Edge.Top, 10); + root_child1.setPadding(Edge.Right, 10); + root_child1.setPadding(Edge.Bottom, 10); + root_child1.setWidth(100); + root_child1.setHeight(100); + root.insertChild(root_child1, 1); + + const root_child2 = Yoga.Node.create(config); + root_child2.setPadding(Edge.Left, 10); + root_child2.setPadding(Edge.Top, 10); + root_child2.setPadding(Edge.Right, 10); + root_child2.setPadding(Edge.Bottom, 10); + root_child2.setWidth(100); + root_child2.setHeight(100); + root.insertChild(root_child2, 2); + + const root_child3 = Yoga.Node.create(config); + root_child3.setPadding(Edge.Left, 10); + root_child3.setPadding(Edge.Top, 10); + root_child3.setPadding(Edge.Right, 10); + root_child3.setPadding(Edge.Bottom, 10); + root_child3.setWidth(100); + root_child3.setHeight(100); + root.insertChild(root_child3, 3); + + const root_child4 = Yoga.Node.create(config); + root_child4.setPadding(Edge.Left, 10); + root_child4.setPadding(Edge.Top, 10); + root_child4.setPadding(Edge.Right, 10); + root_child4.setPadding(Edge.Bottom, 10); + root_child4.setWidth(100); + root_child4.setHeight(100); + root.insertChild(root_child4, 4); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(300); + expect(root.getComputedHeight()).toBe(700); + + expect(root_child0.getComputedLeft()).toBe(10); + expect(root_child0.getComputedTop()).toBe(10); + expect(root_child0.getComputedWidth()).toBe(100); + expect(root_child0.getComputedHeight()).toBe(100); + + expect(root_child1.getComputedLeft()).toBe(138); + expect(root_child1.getComputedTop()).toBe(10); + expect(root_child1.getComputedWidth()).toBe(100); + expect(root_child1.getComputedHeight()).toBe(100); + + expect(root_child2.getComputedLeft()).toBe(10); + expect(root_child2.getComputedTop()).toBe(178); + expect(root_child2.getComputedWidth()).toBe(100); + expect(root_child2.getComputedHeight()).toBe(100); + + expect(root_child3.getComputedLeft()).toBe(138); + expect(root_child3.getComputedTop()).toBe(178); + expect(root_child3.getComputedWidth()).toBe(100); + expect(root_child3.getComputedHeight()).toBe(100); + + expect(root_child4.getComputedLeft()).toBe(10); + expect(root_child4.getComputedTop()).toBe(346); + expect(root_child4.getComputedWidth()).toBe(100); + expect(root_child4.getComputedHeight()).toBe(100); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(300); + expect(root.getComputedHeight()).toBe(700); + + expect(root_child0.getComputedLeft()).toBe(190); + expect(root_child0.getComputedTop()).toBe(10); + expect(root_child0.getComputedWidth()).toBe(100); + expect(root_child0.getComputedHeight()).toBe(100); + + expect(root_child1.getComputedLeft()).toBe(62); + expect(root_child1.getComputedTop()).toBe(10); + expect(root_child1.getComputedWidth()).toBe(100); + expect(root_child1.getComputedHeight()).toBe(100); + + expect(root_child2.getComputedLeft()).toBe(190); + expect(root_child2.getComputedTop()).toBe(178); + expect(root_child2.getComputedWidth()).toBe(100); + expect(root_child2.getComputedHeight()).toBe(100); + + expect(root_child3.getComputedLeft()).toBe(62); + expect(root_child3.getComputedTop()).toBe(178); + expect(root_child3.getComputedWidth()).toBe(100); + expect(root_child3.getComputedHeight()).toBe(100); + + expect(root_child4.getComputedLeft()).toBe(190); + expect(root_child4.getComputedTop()).toBe(346); + expect(root_child4.getComputedWidth()).toBe(100); + expect(root_child4.getComputedHeight()).toBe(100); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); +test('row_gap_percent_wrapping_with_both_content_padding', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setFlexDirection(FlexDirection.Row); + root.setPositionType(PositionType.Absolute); + root.setFlexWrap(Wrap.Wrap); + root.setPadding(Edge.Left, 10); + root.setPadding(Edge.Top, 10); + root.setPadding(Edge.Right, 10); + root.setPadding(Edge.Bottom, 10); + root.setWidth(300); + root.setHeight(700); + root.setGap(Gutter.Column, "10%"); + root.setGap(Gutter.Row, "10%"); + + const root_child0 = Yoga.Node.create(config); + root_child0.setWidth(100); + root_child0.setHeight(100); + root.insertChild(root_child0, 0); + + const root_child1 = Yoga.Node.create(config); + root_child1.setWidth(100); + root_child1.setHeight(100); + root.insertChild(root_child1, 1); + + const root_child2 = Yoga.Node.create(config); + root_child2.setWidth(100); + root_child2.setHeight(100); + root.insertChild(root_child2, 2); + + const root_child3 = Yoga.Node.create(config); + root_child3.setWidth(100); + root_child3.setHeight(100); + root.insertChild(root_child3, 3); + + const root_child4 = Yoga.Node.create(config); + root_child4.setWidth(100); + root_child4.setHeight(100); + root.insertChild(root_child4, 4); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(300); + expect(root.getComputedHeight()).toBe(700); + + expect(root_child0.getComputedLeft()).toBe(10); + expect(root_child0.getComputedTop()).toBe(10); + expect(root_child0.getComputedWidth()).toBe(100); + expect(root_child0.getComputedHeight()).toBe(100); + + expect(root_child1.getComputedLeft()).toBe(138); + expect(root_child1.getComputedTop()).toBe(10); + expect(root_child1.getComputedWidth()).toBe(100); + expect(root_child1.getComputedHeight()).toBe(100); + + expect(root_child2.getComputedLeft()).toBe(10); + expect(root_child2.getComputedTop()).toBe(178); + expect(root_child2.getComputedWidth()).toBe(100); + expect(root_child2.getComputedHeight()).toBe(100); + + expect(root_child3.getComputedLeft()).toBe(138); + expect(root_child3.getComputedTop()).toBe(178); + expect(root_child3.getComputedWidth()).toBe(100); + expect(root_child3.getComputedHeight()).toBe(100); + + expect(root_child4.getComputedLeft()).toBe(10); + expect(root_child4.getComputedTop()).toBe(346); + expect(root_child4.getComputedWidth()).toBe(100); + expect(root_child4.getComputedHeight()).toBe(100); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(300); + expect(root.getComputedHeight()).toBe(700); + + expect(root_child0.getComputedLeft()).toBe(190); + expect(root_child0.getComputedTop()).toBe(10); + expect(root_child0.getComputedWidth()).toBe(100); + expect(root_child0.getComputedHeight()).toBe(100); + + expect(root_child1.getComputedLeft()).toBe(62); + expect(root_child1.getComputedTop()).toBe(10); + expect(root_child1.getComputedWidth()).toBe(100); + expect(root_child1.getComputedHeight()).toBe(100); + + expect(root_child2.getComputedLeft()).toBe(190); + expect(root_child2.getComputedTop()).toBe(178); + expect(root_child2.getComputedWidth()).toBe(100); + expect(root_child2.getComputedHeight()).toBe(100); + + expect(root_child3.getComputedLeft()).toBe(62); + expect(root_child3.getComputedTop()).toBe(178); + expect(root_child3.getComputedWidth()).toBe(100); + expect(root_child3.getComputedHeight()).toBe(100); + + expect(root_child4.getComputedLeft()).toBe(190); + expect(root_child4.getComputedTop()).toBe(346); + expect(root_child4.getComputedWidth()).toBe(100); + expect(root_child4.getComputedHeight()).toBe(100); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); +test('row_gap_percent_wrapping_with_content_margin', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setFlexDirection(FlexDirection.Row); + root.setPositionType(PositionType.Absolute); + root.setFlexWrap(Wrap.Wrap); + root.setMargin(Edge.Left, 10); + root.setMargin(Edge.Top, 10); + root.setMargin(Edge.Right, 10); + root.setMargin(Edge.Bottom, 10); + root.setWidth(300); + root.setHeight(700); + root.setGap(Gutter.Column, "10%"); + root.setGap(Gutter.Row, "10%"); + + const root_child0 = Yoga.Node.create(config); + root_child0.setWidth(100); + root_child0.setHeight(100); + root.insertChild(root_child0, 0); + + const root_child1 = Yoga.Node.create(config); + root_child1.setWidth(100); + root_child1.setHeight(100); + root.insertChild(root_child1, 1); + + const root_child2 = Yoga.Node.create(config); + root_child2.setWidth(100); + root_child2.setHeight(100); + root.insertChild(root_child2, 2); + + const root_child3 = Yoga.Node.create(config); + root_child3.setWidth(100); + root_child3.setHeight(100); + root.insertChild(root_child3, 3); + + const root_child4 = Yoga.Node.create(config); + root_child4.setWidth(100); + root_child4.setHeight(100); + root.insertChild(root_child4, 4); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(10); + expect(root.getComputedTop()).toBe(10); + expect(root.getComputedWidth()).toBe(300); + expect(root.getComputedHeight()).toBe(700); + + expect(root_child0.getComputedLeft()).toBe(0); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(100); + expect(root_child0.getComputedHeight()).toBe(100); + + expect(root_child1.getComputedLeft()).toBe(130); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(100); + expect(root_child1.getComputedHeight()).toBe(100); + + expect(root_child2.getComputedLeft()).toBe(0); + expect(root_child2.getComputedTop()).toBe(170); + expect(root_child2.getComputedWidth()).toBe(100); + expect(root_child2.getComputedHeight()).toBe(100); + + expect(root_child3.getComputedLeft()).toBe(130); + expect(root_child3.getComputedTop()).toBe(170); + expect(root_child3.getComputedWidth()).toBe(100); + expect(root_child3.getComputedHeight()).toBe(100); + + expect(root_child4.getComputedLeft()).toBe(0); + expect(root_child4.getComputedTop()).toBe(340); + expect(root_child4.getComputedWidth()).toBe(100); + expect(root_child4.getComputedHeight()).toBe(100); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(10); + expect(root.getComputedTop()).toBe(10); + expect(root.getComputedWidth()).toBe(300); + expect(root.getComputedHeight()).toBe(700); + + expect(root_child0.getComputedLeft()).toBe(200); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(100); + expect(root_child0.getComputedHeight()).toBe(100); + + expect(root_child1.getComputedLeft()).toBe(70); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(100); + expect(root_child1.getComputedHeight()).toBe(100); + + expect(root_child2.getComputedLeft()).toBe(200); + expect(root_child2.getComputedTop()).toBe(170); + expect(root_child2.getComputedWidth()).toBe(100); + expect(root_child2.getComputedHeight()).toBe(100); + + expect(root_child3.getComputedLeft()).toBe(70); + expect(root_child3.getComputedTop()).toBe(170); + expect(root_child3.getComputedWidth()).toBe(100); + expect(root_child3.getComputedHeight()).toBe(100); + + expect(root_child4.getComputedLeft()).toBe(200); + expect(root_child4.getComputedTop()).toBe(340); + expect(root_child4.getComputedWidth()).toBe(100); + expect(root_child4.getComputedHeight()).toBe(100); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); +test('row_gap_percent_wrapping_with_content_margin_and_padding', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setFlexDirection(FlexDirection.Row); + root.setPositionType(PositionType.Absolute); + root.setFlexWrap(Wrap.Wrap); + root.setMargin(Edge.Left, 10); + root.setMargin(Edge.Top, 10); + root.setMargin(Edge.Right, 10); + root.setMargin(Edge.Bottom, 10); + root.setPadding(Edge.Left, 10); + root.setPadding(Edge.Top, 10); + root.setPadding(Edge.Right, 10); + root.setPadding(Edge.Bottom, 10); + root.setWidth(300); + root.setHeight(700); + root.setGap(Gutter.Column, "10%"); + root.setGap(Gutter.Row, "10%"); + + const root_child0 = Yoga.Node.create(config); + root_child0.setWidth(100); + root_child0.setHeight(100); + root.insertChild(root_child0, 0); + + const root_child1 = Yoga.Node.create(config); + root_child1.setWidth(100); + root_child1.setHeight(100); + root.insertChild(root_child1, 1); + + const root_child2 = Yoga.Node.create(config); + root_child2.setWidth(100); + root_child2.setHeight(100); + root.insertChild(root_child2, 2); + + const root_child3 = Yoga.Node.create(config); + root_child3.setWidth(100); + root_child3.setHeight(100); + root.insertChild(root_child3, 3); + + const root_child4 = Yoga.Node.create(config); + root_child4.setWidth(100); + root_child4.setHeight(100); + root.insertChild(root_child4, 4); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(10); + expect(root.getComputedTop()).toBe(10); + expect(root.getComputedWidth()).toBe(300); + expect(root.getComputedHeight()).toBe(700); + + expect(root_child0.getComputedLeft()).toBe(10); + expect(root_child0.getComputedTop()).toBe(10); + expect(root_child0.getComputedWidth()).toBe(100); + expect(root_child0.getComputedHeight()).toBe(100); + + expect(root_child1.getComputedLeft()).toBe(138); + expect(root_child1.getComputedTop()).toBe(10); + expect(root_child1.getComputedWidth()).toBe(100); + expect(root_child1.getComputedHeight()).toBe(100); + + expect(root_child2.getComputedLeft()).toBe(10); + expect(root_child2.getComputedTop()).toBe(178); + expect(root_child2.getComputedWidth()).toBe(100); + expect(root_child2.getComputedHeight()).toBe(100); + + expect(root_child3.getComputedLeft()).toBe(138); + expect(root_child3.getComputedTop()).toBe(178); + expect(root_child3.getComputedWidth()).toBe(100); + expect(root_child3.getComputedHeight()).toBe(100); + + expect(root_child4.getComputedLeft()).toBe(10); + expect(root_child4.getComputedTop()).toBe(346); + expect(root_child4.getComputedWidth()).toBe(100); + expect(root_child4.getComputedHeight()).toBe(100); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(10); + expect(root.getComputedTop()).toBe(10); + expect(root.getComputedWidth()).toBe(300); + expect(root.getComputedHeight()).toBe(700); + + expect(root_child0.getComputedLeft()).toBe(190); + expect(root_child0.getComputedTop()).toBe(10); + expect(root_child0.getComputedWidth()).toBe(100); + expect(root_child0.getComputedHeight()).toBe(100); + + expect(root_child1.getComputedLeft()).toBe(62); + expect(root_child1.getComputedTop()).toBe(10); + expect(root_child1.getComputedWidth()).toBe(100); + expect(root_child1.getComputedHeight()).toBe(100); + + expect(root_child2.getComputedLeft()).toBe(190); + expect(root_child2.getComputedTop()).toBe(178); + expect(root_child2.getComputedWidth()).toBe(100); + expect(root_child2.getComputedHeight()).toBe(100); + + expect(root_child3.getComputedLeft()).toBe(62); + expect(root_child3.getComputedTop()).toBe(178); + expect(root_child3.getComputedWidth()).toBe(100); + expect(root_child3.getComputedHeight()).toBe(100); + + expect(root_child4.getComputedLeft()).toBe(190); + expect(root_child4.getComputedTop()).toBe(346); + expect(root_child4.getComputedWidth()).toBe(100); + expect(root_child4.getComputedHeight()).toBe(100); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); +test('row_gap_percent_wrapping_with_flexible_content', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setFlexDirection(FlexDirection.Row); + root.setPositionType(PositionType.Absolute); + root.setWidth(300); + root.setHeight(300); + root.setGap(Gutter.Column, "10%"); + root.setGap(Gutter.Row, "10%"); + + const root_child0 = Yoga.Node.create(config); + root_child0.setFlexGrow(1); + root_child0.setFlexShrink(1); + root_child0.setFlexBasis("0%"); + root.insertChild(root_child0, 0); + + const root_child1 = Yoga.Node.create(config); + root_child1.setFlexGrow(1); + root_child1.setFlexShrink(1); + root_child1.setFlexBasis("0%"); + root.insertChild(root_child1, 1); + + const root_child2 = Yoga.Node.create(config); + root_child2.setFlexGrow(1); + root_child2.setFlexShrink(1); + root_child2.setFlexBasis("0%"); + root.insertChild(root_child2, 2); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(300); + expect(root.getComputedHeight()).toBe(300); + + expect(root_child0.getComputedLeft()).toBe(0); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(80); + expect(root_child0.getComputedHeight()).toBe(300); + + expect(root_child1.getComputedLeft()).toBe(110); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(80); + expect(root_child1.getComputedHeight()).toBe(300); + + expect(root_child2.getComputedLeft()).toBe(220); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(80); + expect(root_child2.getComputedHeight()).toBe(300); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(300); + expect(root.getComputedHeight()).toBe(300); + + expect(root_child0.getComputedLeft()).toBe(220); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(80); + expect(root_child0.getComputedHeight()).toBe(300); + + expect(root_child1.getComputedLeft()).toBe(110); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(80); + expect(root_child1.getComputedHeight()).toBe(300); + + expect(root_child2.getComputedLeft()).toBe(0); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(80); + expect(root_child2.getComputedHeight()).toBe(300); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); +test('row_gap_percent_wrapping_with_mixed_flexible_content', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setFlexDirection(FlexDirection.Row); + root.setPositionType(PositionType.Absolute); + root.setWidth(300); + root.setHeight(300); + root.setGap(Gutter.Column, "10%"); + root.setGap(Gutter.Row, "10%"); + + const root_child0 = Yoga.Node.create(config); + root_child0.setWidth(10); + root.insertChild(root_child0, 0); + + const root_child1 = Yoga.Node.create(config); + root_child1.setFlexGrow(1); + root_child1.setFlexShrink(1); + root_child1.setFlexBasis("0%"); + root.insertChild(root_child1, 1); + + const root_child2 = Yoga.Node.create(config); + root_child2.setWidth("10%"); + root.insertChild(root_child2, 2); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(300); + expect(root.getComputedHeight()).toBe(300); + + expect(root_child0.getComputedLeft()).toBe(0); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(10); + expect(root_child0.getComputedHeight()).toBe(300); + + expect(root_child1.getComputedLeft()).toBe(40); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(200); + expect(root_child1.getComputedHeight()).toBe(300); + + expect(root_child2.getComputedLeft()).toBe(270); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(30); + expect(root_child2.getComputedHeight()).toBe(300); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(300); + expect(root.getComputedHeight()).toBe(300); + + expect(root_child0.getComputedLeft()).toBe(290); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(10); + expect(root_child0.getComputedHeight()).toBe(300); + + expect(root_child1.getComputedLeft()).toBe(60); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(200); + expect(root_child1.getComputedHeight()).toBe(300); + + expect(root_child2.getComputedLeft()).toBe(0); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(30); + expect(root_child2.getComputedHeight()).toBe(300); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); +test.skip('row_gap_percent_wrapping_with_min_width', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setFlexDirection(FlexDirection.Row); + root.setPositionType(PositionType.Absolute); + root.setFlexWrap(Wrap.Wrap); + root.setMinWidth(300); + root.setGap(Gutter.Column, "10%"); + root.setGap(Gutter.Row, "10%"); + + const root_child0 = Yoga.Node.create(config); + root_child0.setWidth(100); + root_child0.setHeight(100); + root.insertChild(root_child0, 0); + + const root_child1 = Yoga.Node.create(config); + root_child1.setWidth(100); + root_child1.setHeight(100); + root.insertChild(root_child1, 1); + + const root_child2 = Yoga.Node.create(config); + root_child2.setWidth(100); + root_child2.setHeight(100); + root.insertChild(root_child2, 2); + + const root_child3 = Yoga.Node.create(config); + root_child3.setWidth(100); + root_child3.setHeight(100); + root.insertChild(root_child3, 3); + + const root_child4 = Yoga.Node.create(config); + root_child4.setWidth(100); + root_child4.setHeight(100); + root.insertChild(root_child4, 4); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(300); + expect(root.getComputedHeight()).toBe(300); + + expect(root_child0.getComputedLeft()).toBe(0); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(100); + expect(root_child0.getComputedHeight()).toBe(100); + + expect(root_child1.getComputedLeft()).toBe(130); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(100); + expect(root_child1.getComputedHeight()).toBe(100); + + expect(root_child2.getComputedLeft()).toBe(0); + expect(root_child2.getComputedTop()).toBe(100); + expect(root_child2.getComputedWidth()).toBe(100); + expect(root_child2.getComputedHeight()).toBe(100); + + expect(root_child3.getComputedLeft()).toBe(130); + expect(root_child3.getComputedTop()).toBe(100); + expect(root_child3.getComputedWidth()).toBe(100); + expect(root_child3.getComputedHeight()).toBe(100); + + expect(root_child4.getComputedLeft()).toBe(0); + expect(root_child4.getComputedTop()).toBe(200); + expect(root_child4.getComputedWidth()).toBe(100); + expect(root_child4.getComputedHeight()).toBe(100); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(300); + expect(root.getComputedHeight()).toBe(300); + + expect(root_child0.getComputedLeft()).toBe(200); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(100); + expect(root_child0.getComputedHeight()).toBe(100); + + expect(root_child1.getComputedLeft()).toBe(70); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(100); + expect(root_child1.getComputedHeight()).toBe(100); + + expect(root_child2.getComputedLeft()).toBe(200); + expect(root_child2.getComputedTop()).toBe(100); + expect(root_child2.getComputedWidth()).toBe(100); + expect(root_child2.getComputedHeight()).toBe(100); + + expect(root_child3.getComputedLeft()).toBe(70); + expect(root_child3.getComputedTop()).toBe(100); + expect(root_child3.getComputedWidth()).toBe(100); + expect(root_child3.getComputedHeight()).toBe(100); + + expect(root_child4.getComputedLeft()).toBe(200); + expect(root_child4.getComputedTop()).toBe(200); + expect(root_child4.getComputedWidth()).toBe(100); + expect(root_child4.getComputedHeight()).toBe(100); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); diff --git a/tests/StyleTest.cpp b/tests/StyleTest.cpp index 5a85fe6fc8..4832aeaead 100644 --- a/tests/StyleTest.cpp +++ b/tests/StyleTest.cpp @@ -29,7 +29,7 @@ TEST(Style, computed_border_is_floored) { TEST(Style, computed_gap_is_floored) { yoga::Style style; style.setGap(Gutter::Column, value::points(-1.0f)); - auto gapBetweenColumns = style.computeGapForAxis(FlexDirection::Row); + auto gapBetweenColumns = style.computeGapForAxis(FlexDirection::Row, 0.0); ASSERT_EQ(gapBetweenColumns, 0.0f); } diff --git a/tests/generated/YGGapTest.cpp b/tests/generated/YGGapTest.cpp index 06cb8ae449..433d90c46b 100644 --- a/tests/generated/YGGapTest.cpp +++ b/tests/generated/YGGapTest.cpp @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. * * clang-format off - * @generated SignedSource<<708ff5088d96b0a989669c1d86006e37>> + * @generated SignedSource<<74302d39e18c0539a6a9f75d1dcd3fd3>> * generated by gentest/gentest-driver.ts from gentest/fixtures/YGGapTest.html */ @@ -2225,3 +2225,932 @@ TEST(YogaTest, row_gap_determines_parent_height) { YGConfigFree(config); } + +TEST(YogaTest, row_gap_percent_wrapping) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetFlexWrap(root, YGWrapWrap); + YGNodeStyleSetPadding(root, YGEdgeLeft, 10); + YGNodeStyleSetPadding(root, YGEdgeTop, 10); + YGNodeStyleSetPadding(root, YGEdgeRight, 10); + YGNodeStyleSetPadding(root, YGEdgeBottom, 10); + YGNodeStyleSetWidth(root, 300); + YGNodeStyleSetHeight(root, 700); + YGNodeStyleSetGapPercent(root, YGGutterColumn, 10); + YGNodeStyleSetGapPercent(root, YGGutterRow, 10); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child0, 100); + YGNodeStyleSetHeight(root_child0, 100); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child1 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child1, 100); + YGNodeStyleSetHeight(root_child1, 100); + YGNodeInsertChild(root, root_child1, 1); + + const YGNodeRef root_child2 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child2, 100); + YGNodeStyleSetHeight(root_child2, 100); + YGNodeInsertChild(root, root_child2, 2); + + const YGNodeRef root_child3 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child3, 100); + YGNodeStyleSetHeight(root_child3, 100); + YGNodeInsertChild(root, root_child3, 3); + + const YGNodeRef root_child4 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child4, 100); + YGNodeStyleSetHeight(root_child4, 100); + YGNodeInsertChild(root, root_child4, 4); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(700, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(138, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(178, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2)); + + ASSERT_FLOAT_EQ(138, YGNodeLayoutGetLeft(root_child3)); + ASSERT_FLOAT_EQ(178, YGNodeLayoutGetTop(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child3)); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child4)); + ASSERT_FLOAT_EQ(346, YGNodeLayoutGetTop(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child4)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(700, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(190, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(62, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(190, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(178, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2)); + + ASSERT_FLOAT_EQ(62, YGNodeLayoutGetLeft(root_child3)); + ASSERT_FLOAT_EQ(178, YGNodeLayoutGetTop(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child3)); + + ASSERT_FLOAT_EQ(190, YGNodeLayoutGetLeft(root_child4)); + ASSERT_FLOAT_EQ(346, YGNodeLayoutGetTop(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child4)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} + +TEST(YogaTest, row_gap_percent_determines_parent_height) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetFlexWrap(root, YGWrapWrap); + YGNodeStyleSetWidth(root, 300); + YGNodeStyleSetGapPercent(root, YGGutterColumn, 10); + YGNodeStyleSetGapPercent(root, YGGutterRow, 10); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child0, 100); + YGNodeStyleSetHeight(root_child0, 100); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child1 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child1, 100); + YGNodeStyleSetHeight(root_child1, 100); + YGNodeInsertChild(root, root_child1, 1); + + const YGNodeRef root_child2 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child2, 100); + YGNodeStyleSetHeight(root_child2, 100); + YGNodeInsertChild(root, root_child2, 2); + + const YGNodeRef root_child3 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child3, 100); + YGNodeStyleSetHeight(root_child3, 100); + YGNodeInsertChild(root, root_child3, 3); + + const YGNodeRef root_child4 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child4, 100); + YGNodeStyleSetHeight(root_child4, 100); + YGNodeInsertChild(root, root_child4, 4); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(130, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2)); + + ASSERT_FLOAT_EQ(130, YGNodeLayoutGetLeft(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetTop(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child3)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child4)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetTop(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child4)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(70, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2)); + + ASSERT_FLOAT_EQ(70, YGNodeLayoutGetLeft(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetTop(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child3)); + + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetLeft(root_child4)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetTop(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child4)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} + +TEST(YogaTest, row_gap_percent_wrapping_with_both_content_padding_and_item_padding) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetFlexWrap(root, YGWrapWrap); + YGNodeStyleSetPadding(root, YGEdgeLeft, 10); + YGNodeStyleSetPadding(root, YGEdgeTop, 10); + YGNodeStyleSetPadding(root, YGEdgeRight, 10); + YGNodeStyleSetPadding(root, YGEdgeBottom, 10); + YGNodeStyleSetWidth(root, 300); + YGNodeStyleSetHeight(root, 700); + YGNodeStyleSetGapPercent(root, YGGutterColumn, 10); + YGNodeStyleSetGapPercent(root, YGGutterRow, 10); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetPadding(root_child0, YGEdgeLeft, 10); + YGNodeStyleSetPadding(root_child0, YGEdgeTop, 10); + YGNodeStyleSetPadding(root_child0, YGEdgeRight, 10); + YGNodeStyleSetPadding(root_child0, YGEdgeBottom, 10); + YGNodeStyleSetWidth(root_child0, 100); + YGNodeStyleSetHeight(root_child0, 100); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child1 = YGNodeNewWithConfig(config); + YGNodeStyleSetPadding(root_child1, YGEdgeLeft, 10); + YGNodeStyleSetPadding(root_child1, YGEdgeTop, 10); + YGNodeStyleSetPadding(root_child1, YGEdgeRight, 10); + YGNodeStyleSetPadding(root_child1, YGEdgeBottom, 10); + YGNodeStyleSetWidth(root_child1, 100); + YGNodeStyleSetHeight(root_child1, 100); + YGNodeInsertChild(root, root_child1, 1); + + const YGNodeRef root_child2 = YGNodeNewWithConfig(config); + YGNodeStyleSetPadding(root_child2, YGEdgeLeft, 10); + YGNodeStyleSetPadding(root_child2, YGEdgeTop, 10); + YGNodeStyleSetPadding(root_child2, YGEdgeRight, 10); + YGNodeStyleSetPadding(root_child2, YGEdgeBottom, 10); + YGNodeStyleSetWidth(root_child2, 100); + YGNodeStyleSetHeight(root_child2, 100); + YGNodeInsertChild(root, root_child2, 2); + + const YGNodeRef root_child3 = YGNodeNewWithConfig(config); + YGNodeStyleSetPadding(root_child3, YGEdgeLeft, 10); + YGNodeStyleSetPadding(root_child3, YGEdgeTop, 10); + YGNodeStyleSetPadding(root_child3, YGEdgeRight, 10); + YGNodeStyleSetPadding(root_child3, YGEdgeBottom, 10); + YGNodeStyleSetWidth(root_child3, 100); + YGNodeStyleSetHeight(root_child3, 100); + YGNodeInsertChild(root, root_child3, 3); + + const YGNodeRef root_child4 = YGNodeNewWithConfig(config); + YGNodeStyleSetPadding(root_child4, YGEdgeLeft, 10); + YGNodeStyleSetPadding(root_child4, YGEdgeTop, 10); + YGNodeStyleSetPadding(root_child4, YGEdgeRight, 10); + YGNodeStyleSetPadding(root_child4, YGEdgeBottom, 10); + YGNodeStyleSetWidth(root_child4, 100); + YGNodeStyleSetHeight(root_child4, 100); + YGNodeInsertChild(root, root_child4, 4); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(700, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(138, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(178, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2)); + + ASSERT_FLOAT_EQ(138, YGNodeLayoutGetLeft(root_child3)); + ASSERT_FLOAT_EQ(178, YGNodeLayoutGetTop(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child3)); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child4)); + ASSERT_FLOAT_EQ(346, YGNodeLayoutGetTop(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child4)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(700, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(190, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(62, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(190, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(178, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2)); + + ASSERT_FLOAT_EQ(62, YGNodeLayoutGetLeft(root_child3)); + ASSERT_FLOAT_EQ(178, YGNodeLayoutGetTop(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child3)); + + ASSERT_FLOAT_EQ(190, YGNodeLayoutGetLeft(root_child4)); + ASSERT_FLOAT_EQ(346, YGNodeLayoutGetTop(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child4)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} + +TEST(YogaTest, row_gap_percent_wrapping_with_both_content_padding) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetFlexWrap(root, YGWrapWrap); + YGNodeStyleSetPadding(root, YGEdgeLeft, 10); + YGNodeStyleSetPadding(root, YGEdgeTop, 10); + YGNodeStyleSetPadding(root, YGEdgeRight, 10); + YGNodeStyleSetPadding(root, YGEdgeBottom, 10); + YGNodeStyleSetWidth(root, 300); + YGNodeStyleSetHeight(root, 700); + YGNodeStyleSetGapPercent(root, YGGutterColumn, 10); + YGNodeStyleSetGapPercent(root, YGGutterRow, 10); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child0, 100); + YGNodeStyleSetHeight(root_child0, 100); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child1 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child1, 100); + YGNodeStyleSetHeight(root_child1, 100); + YGNodeInsertChild(root, root_child1, 1); + + const YGNodeRef root_child2 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child2, 100); + YGNodeStyleSetHeight(root_child2, 100); + YGNodeInsertChild(root, root_child2, 2); + + const YGNodeRef root_child3 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child3, 100); + YGNodeStyleSetHeight(root_child3, 100); + YGNodeInsertChild(root, root_child3, 3); + + const YGNodeRef root_child4 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child4, 100); + YGNodeStyleSetHeight(root_child4, 100); + YGNodeInsertChild(root, root_child4, 4); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(700, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(138, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(178, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2)); + + ASSERT_FLOAT_EQ(138, YGNodeLayoutGetLeft(root_child3)); + ASSERT_FLOAT_EQ(178, YGNodeLayoutGetTop(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child3)); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child4)); + ASSERT_FLOAT_EQ(346, YGNodeLayoutGetTop(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child4)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(700, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(190, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(62, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(190, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(178, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2)); + + ASSERT_FLOAT_EQ(62, YGNodeLayoutGetLeft(root_child3)); + ASSERT_FLOAT_EQ(178, YGNodeLayoutGetTop(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child3)); + + ASSERT_FLOAT_EQ(190, YGNodeLayoutGetLeft(root_child4)); + ASSERT_FLOAT_EQ(346, YGNodeLayoutGetTop(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child4)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} + +TEST(YogaTest, row_gap_percent_wrapping_with_content_margin) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetFlexWrap(root, YGWrapWrap); + YGNodeStyleSetMargin(root, YGEdgeLeft, 10); + YGNodeStyleSetMargin(root, YGEdgeTop, 10); + YGNodeStyleSetMargin(root, YGEdgeRight, 10); + YGNodeStyleSetMargin(root, YGEdgeBottom, 10); + YGNodeStyleSetWidth(root, 300); + YGNodeStyleSetHeight(root, 700); + YGNodeStyleSetGapPercent(root, YGGutterColumn, 10); + YGNodeStyleSetGapPercent(root, YGGutterRow, 10); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child0, 100); + YGNodeStyleSetHeight(root_child0, 100); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child1 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child1, 100); + YGNodeStyleSetHeight(root_child1, 100); + YGNodeInsertChild(root, root_child1, 1); + + const YGNodeRef root_child2 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child2, 100); + YGNodeStyleSetHeight(root_child2, 100); + YGNodeInsertChild(root, root_child2, 2); + + const YGNodeRef root_child3 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child3, 100); + YGNodeStyleSetHeight(root_child3, 100); + YGNodeInsertChild(root, root_child3, 3); + + const YGNodeRef root_child4 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child4, 100); + YGNodeStyleSetHeight(root_child4, 100); + YGNodeInsertChild(root, root_child4, 4); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(700, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(130, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(170, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2)); + + ASSERT_FLOAT_EQ(130, YGNodeLayoutGetLeft(root_child3)); + ASSERT_FLOAT_EQ(170, YGNodeLayoutGetTop(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child3)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child4)); + ASSERT_FLOAT_EQ(340, YGNodeLayoutGetTop(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child4)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(700, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(70, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(170, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2)); + + ASSERT_FLOAT_EQ(70, YGNodeLayoutGetLeft(root_child3)); + ASSERT_FLOAT_EQ(170, YGNodeLayoutGetTop(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child3)); + + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetLeft(root_child4)); + ASSERT_FLOAT_EQ(340, YGNodeLayoutGetTop(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child4)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} + +TEST(YogaTest, row_gap_percent_wrapping_with_content_margin_and_padding) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetFlexWrap(root, YGWrapWrap); + YGNodeStyleSetMargin(root, YGEdgeLeft, 10); + YGNodeStyleSetMargin(root, YGEdgeTop, 10); + YGNodeStyleSetMargin(root, YGEdgeRight, 10); + YGNodeStyleSetMargin(root, YGEdgeBottom, 10); + YGNodeStyleSetPadding(root, YGEdgeLeft, 10); + YGNodeStyleSetPadding(root, YGEdgeTop, 10); + YGNodeStyleSetPadding(root, YGEdgeRight, 10); + YGNodeStyleSetPadding(root, YGEdgeBottom, 10); + YGNodeStyleSetWidth(root, 300); + YGNodeStyleSetHeight(root, 700); + YGNodeStyleSetGapPercent(root, YGGutterColumn, 10); + YGNodeStyleSetGapPercent(root, YGGutterRow, 10); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child0, 100); + YGNodeStyleSetHeight(root_child0, 100); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child1 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child1, 100); + YGNodeStyleSetHeight(root_child1, 100); + YGNodeInsertChild(root, root_child1, 1); + + const YGNodeRef root_child2 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child2, 100); + YGNodeStyleSetHeight(root_child2, 100); + YGNodeInsertChild(root, root_child2, 2); + + const YGNodeRef root_child3 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child3, 100); + YGNodeStyleSetHeight(root_child3, 100); + YGNodeInsertChild(root, root_child3, 3); + + const YGNodeRef root_child4 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child4, 100); + YGNodeStyleSetHeight(root_child4, 100); + YGNodeInsertChild(root, root_child4, 4); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(700, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(138, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(178, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2)); + + ASSERT_FLOAT_EQ(138, YGNodeLayoutGetLeft(root_child3)); + ASSERT_FLOAT_EQ(178, YGNodeLayoutGetTop(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child3)); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child4)); + ASSERT_FLOAT_EQ(346, YGNodeLayoutGetTop(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child4)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(700, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(190, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(62, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(190, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(178, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2)); + + ASSERT_FLOAT_EQ(62, YGNodeLayoutGetLeft(root_child3)); + ASSERT_FLOAT_EQ(178, YGNodeLayoutGetTop(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child3)); + + ASSERT_FLOAT_EQ(190, YGNodeLayoutGetLeft(root_child4)); + ASSERT_FLOAT_EQ(346, YGNodeLayoutGetTop(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child4)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} + +TEST(YogaTest, row_gap_percent_wrapping_with_flexible_content) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetWidth(root, 300); + YGNodeStyleSetHeight(root, 300); + YGNodeStyleSetGapPercent(root, YGGutterColumn, 10); + YGNodeStyleSetGapPercent(root, YGGutterRow, 10); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexGrow(root_child0, 1); + YGNodeStyleSetFlexShrink(root_child0, 1); + YGNodeStyleSetFlexBasisPercent(root_child0, 0); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child1 = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexGrow(root_child1, 1); + YGNodeStyleSetFlexShrink(root_child1, 1); + YGNodeStyleSetFlexBasisPercent(root_child1, 0); + YGNodeInsertChild(root, root_child1, 1); + + const YGNodeRef root_child2 = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexGrow(root_child2, 1); + YGNodeStyleSetFlexShrink(root_child2, 1); + YGNodeStyleSetFlexBasisPercent(root_child2, 0); + YGNodeInsertChild(root, root_child2, 2); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(80, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(110, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(80, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(220, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(80, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root_child2)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(220, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(80, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(110, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(80, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(80, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root_child2)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} + +TEST(YogaTest, row_gap_percent_wrapping_with_mixed_flexible_content) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetWidth(root, 300); + YGNodeStyleSetHeight(root, 300); + YGNodeStyleSetGapPercent(root, YGGutterColumn, 10); + YGNodeStyleSetGapPercent(root, YGGutterRow, 10); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child0, 10); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child1 = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexGrow(root_child1, 1); + YGNodeStyleSetFlexShrink(root_child1, 1); + YGNodeStyleSetFlexBasisPercent(root_child1, 0); + YGNodeInsertChild(root, root_child1, 1); + + const YGNodeRef root_child2 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidthPercent(root_child2, 10); + YGNodeInsertChild(root, root_child2, 2); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(270, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root_child2)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(290, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(60, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(30, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root_child2)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} + +TEST(YogaTest, row_gap_percent_wrapping_with_min_width) { + GTEST_SKIP(); + + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetFlexWrap(root, YGWrapWrap); + YGNodeStyleSetMinWidth(root, 300); + YGNodeStyleSetGapPercent(root, YGGutterColumn, 10); + YGNodeStyleSetGapPercent(root, YGGutterRow, 10); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child0, 100); + YGNodeStyleSetHeight(root_child0, 100); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child1 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child1, 100); + YGNodeStyleSetHeight(root_child1, 100); + YGNodeInsertChild(root, root_child1, 1); + + const YGNodeRef root_child2 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child2, 100); + YGNodeStyleSetHeight(root_child2, 100); + YGNodeInsertChild(root, root_child2, 2); + + const YGNodeRef root_child3 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child3, 100); + YGNodeStyleSetHeight(root_child3, 100); + YGNodeInsertChild(root, root_child3, 3); + + const YGNodeRef root_child4 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child4, 100); + YGNodeStyleSetHeight(root_child4, 100); + YGNodeInsertChild(root, root_child4, 4); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(130, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2)); + + ASSERT_FLOAT_EQ(130, YGNodeLayoutGetLeft(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetTop(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child3)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child4)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetTop(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child4)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(70, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2)); + + ASSERT_FLOAT_EQ(70, YGNodeLayoutGetLeft(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetTop(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child3)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child3)); + + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetLeft(root_child4)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetTop(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child4)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child4)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} diff --git a/yoga/YGNodeStyle.cpp b/yoga/YGNodeStyle.cpp index d8454053de..d14d70930f 100644 --- a/yoga/YGNodeStyle.cpp +++ b/yoga/YGNodeStyle.cpp @@ -267,6 +267,11 @@ void YGNodeStyleSetGap( node, scopedEnum(gutter), value::points(gapLength)); } +void YGNodeStyleSetGapPercent(YGNodeRef node, YGGutter gutter, float percent) { + updateStyle<&Style::gap, &Style::setGap>( + node, scopedEnum(gutter), value::percent(percent)); +} + float YGNodeStyleGetGap(const YGNodeConstRef node, const YGGutter gutter) { auto gapLength = resolveRef(node)->style().gap(scopedEnum(gutter)); if (gapLength.isUndefined() || gapLength.isAuto()) { diff --git a/yoga/YGNodeStyle.h b/yoga/YGNodeStyle.h index 09727087ba..2934194f85 100644 --- a/yoga/YGNodeStyle.h +++ b/yoga/YGNodeStyle.h @@ -89,6 +89,8 @@ YG_EXPORT float YGNodeStyleGetBorder(YGNodeConstRef node, YGEdge edge); YG_EXPORT void YGNodeStyleSetGap(YGNodeRef node, YGGutter gutter, float gapLength); +YG_EXPORT void +YGNodeStyleSetGapPercent(YGNodeRef node, YGGutter gutter, float gapLength); YG_EXPORT float YGNodeStyleGetGap(YGNodeConstRef node, YGGutter gutter); YG_EXPORT void YGNodeStyleSetWidth(YGNodeRef node, float width); diff --git a/yoga/algorithm/CalculateLayout.cpp b/yoga/algorithm/CalculateLayout.cpp index 19cf4a2359..62d8a24b76 100644 --- a/yoga/algorithm/CalculateLayout.cpp +++ b/yoga/algorithm/CalculateLayout.cpp @@ -929,7 +929,8 @@ static void justifyMainAxis( node->style().computeFlexEndPaddingAndBorder( mainAxis, direction, ownerWidth); - const float gap = node->style().computeGapForAxis(mainAxis); + const float gap = + node->style().computeGapForAxis(mainAxis, availableInnerMainDim); // If we are using "at most" rules in the main axis, make sure that // remainingFreeSpace is 0 when min main dimension is not given if (sizingModeMainDim == SizingMode::FitContent && @@ -1380,7 +1381,8 @@ static void calculateLayoutImpl( generationCount); if (childCount > 1) { - totalMainDim += node->style().computeGapForAxis(mainAxis) * + totalMainDim += + node->style().computeGapForAxis(mainAxis, availableInnerMainDim) * static_cast(childCount - 1); } @@ -1404,7 +1406,8 @@ static void calculateLayoutImpl( // Accumulated cross dimensions of all lines so far. float totalLineCrossDim = 0; - const float crossAxisGap = node->style().computeGapForAxis(crossAxis); + const float crossAxisGap = + node->style().computeGapForAxis(crossAxis, availableInnerCrossDim); // Max main dimension of all the lines. float maxLineMainDim = 0; diff --git a/yoga/algorithm/FlexLine.cpp b/yoga/algorithm/FlexLine.cpp index 1fe3e48692..50cd6f0abe 100644 --- a/yoga/algorithm/FlexLine.cpp +++ b/yoga/algorithm/FlexLine.cpp @@ -34,7 +34,8 @@ FlexLine calculateFlexLine( const FlexDirection mainAxis = resolveDirection( node->style().flexDirection(), node->resolveDirection(ownerDirection)); const bool isNodeFlexWrap = node->style().flexWrap() != Wrap::NoWrap; - const float gap = node->style().computeGapForAxis(mainAxis); + const float gap = + node->style().computeGapForAxis(mainAxis, availableInnerMainDim); // Add items to the current line until it's full or we run out of items. for (; endOfLineIndex < node->getChildren().size(); endOfLineIndex++) { diff --git a/yoga/style/Style.h b/yoga/style/Style.h index 113a8e1df1..ac769f1d76 100644 --- a/yoga/style/Style.h +++ b/yoga/style/Style.h @@ -428,11 +428,9 @@ class YG_EXPORT Style { computeInlineEndMargin(axis, Direction::LTR, widthSize); } - float computeGapForAxis(FlexDirection axis) const { + float computeGapForAxis(FlexDirection axis, float ownerSize) const { auto gap = isRow(axis) ? computeColumnGap() : computeRowGap(); - // TODO: Validate percentage gap, and expose ability to set percentage to - // public API - return maxOrDefined(gap.resolve(0.0f /*ownerSize*/).unwrap(), 0.0f); + return maxOrDefined(gap.resolve(ownerSize).unwrap(), 0.0f); } bool flexStartMarginIsAuto(FlexDirection axis, Direction direction) const { From c0239e338f517f907f518ff30b255268bef71c4a Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Wed, 17 Apr 2024 03:03:02 -0700 Subject: [PATCH 06/24] Fix JS build on Windows (#1648) Summary: Pull Request resolved: https://github.com/facebook/yoga/pull/1648 Node made a breaking change in a security release for 18/20 where `spawn()` no longer loads `.bat` files by default. https://github.com/nodejs/node/commit/69ffc6d50dbd9d7d0257f5b9b403026e1aa205ee. Execute command in shell. Reviewed By: javache Differential Revision: D56230965 fbshipit-source-id: 52e9bd8a76664bd07ea25b6355ac54fcb24cbb9a --- javascript/just.config.cjs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/javascript/just.config.cjs b/javascript/just.config.cjs index 8373808d04..9533c2acfe 100644 --- a/javascript/just.config.cjs +++ b/javascript/just.config.cjs @@ -168,9 +168,9 @@ function installEmsdkTask() { {stdio: 'inherit'}, ); - await spawn(emsdkBin, ['install', emsdkVersion], {stdio: 'inherit'}); + await spawnShell(emsdkBin, ['install', emsdkVersion], {stdio: 'inherit'}); - await spawn(emsdkBin, ['activate', emsdkVersion], { + await spawnShell(emsdkBin, ['activate', emsdkVersion], { stdio: logger.enableVerbose ? 'inherit' : 'ignore', }); }; @@ -216,7 +216,7 @@ function emcmakeGenerateTask() { ]; logger.info(['emcmake', ...args].join(' ')); - return spawn(emcmakeBin, args, { + return spawnShell(emcmakeBin, args, { stdio: logger.enableVerbose ? 'inherit' : 'ignore', }); }; @@ -234,7 +234,7 @@ function cmakeBuildTask(opts) { ]; logger.info(['cmake', ...args].join(' ')); - return spawn(cmake, args, {stdio: 'inherit'}); + return spawnShell(cmake, args, {stdio: 'inherit'}); }; } @@ -246,8 +246,13 @@ function clangFormatTask(opts) { ]; logger.info(['clang-format', ...args].join(' ')); - return spawn(node, [require.resolve('clang-format'), ...args], { + return spawnShell(node, [require.resolve('clang-format'), ...args], { stdio: 'inherit', }); }; } + +function spawnShell(cmd, args, opts) { + // https://github.com/nodejs/node/issues/52554 + return spawn(cmd, args, {...opts, shell: true}); +} From 932361cdbf5864a2e6929b68154b4ada2ac586d9 Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Wed, 17 Apr 2024 21:50:55 -0700 Subject: [PATCH 07/24] Fixup margin: auto and justification behavior for overflowed containers (#1646) Summary: Pull Request resolved: https://github.com/facebook/yoga/pull/1646 X-link: https://github.com/facebook/react-native/pull/44069 Fixes https://github.com/facebook/yoga/issues/978 1. Don't allow auto margin spaces to become a negative length 2. Replicate fallback alignment behavior specified by box-alignment spec that we are using for align-content. Reviewed By: joevilches Differential Revision: D56091577 fbshipit-source-id: 3c02f81f969bb947cdc5c80b15faaa0b0d39c0c2 --- gentest/fixtures/YGJustifyContentTest.html | 54 ++ gentest/fixtures/YGMarginTest.html | 5 + .../facebook/yoga/YGJustifyContentTest.java | 623 +++++++++++++++- .../tests/com/facebook/yoga/YGMarginTest.java | 59 +- .../generated/YGJustifyContentTest.test.ts | 668 +++++++++++++++++- .../tests/generated/YGMarginTest.test.ts | 64 +- tests/generated/YGJustifyContentTest.cpp | 632 ++++++++++++++++- tests/generated/YGMarginTest.cpp | 60 +- yoga/algorithm/Align.h | 43 ++ yoga/algorithm/CalculateLayout.cpp | 56 +- yoga/algorithm/FlexLine.cpp | 17 +- yoga/algorithm/FlexLine.h | 3 + 12 files changed, 2233 insertions(+), 51 deletions(-) diff --git a/gentest/fixtures/YGJustifyContentTest.html b/gentest/fixtures/YGJustifyContentTest.html index 9cb9d2a4b4..13e9987cfa 100644 --- a/gentest/fixtures/YGJustifyContentTest.html +++ b/gentest/fixtures/YGJustifyContentTest.html @@ -120,3 +120,57 @@
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
diff --git a/gentest/fixtures/YGMarginTest.html b/gentest/fixtures/YGMarginTest.html index d95a058d7b..01a13afe79 100644 --- a/gentest/fixtures/YGMarginTest.html +++ b/gentest/fixtures/YGMarginTest.html @@ -150,3 +150,8 @@
+ +
+
+
+
diff --git a/java/tests/com/facebook/yoga/YGJustifyContentTest.java b/java/tests/com/facebook/yoga/YGJustifyContentTest.java index 638433d9f0..9f141e2afe 100644 --- a/java/tests/com/facebook/yoga/YGJustifyContentTest.java +++ b/java/tests/com/facebook/yoga/YGJustifyContentTest.java @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> * generated by gentest/gentest-driver.ts from gentest/fixtures/YGJustifyContentTest.html */ @@ -1375,6 +1375,627 @@ public void test_justify_content_flex_end_row_reverse() { assertEquals(100f, root_child2.getLayoutHeight(), 0.0f); } + @Test + public void test_justify_content_overflow_row_flex_start() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setFlexDirection(YogaFlexDirection.ROW); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setWidth(102f); + root.setHeight(102f); + + final YogaNode root_child0 = createNode(config); + root_child0.setWidth(40f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child1 = createNode(config); + root_child1.setWidth(40f); + root.addChildAt(root_child1, 1); + + final YogaNode root_child2 = createNode(config); + root_child2.setWidth(40f); + root.addChildAt(root_child2, 2); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(102f, root.getLayoutWidth(), 0.0f); + assertEquals(102f, root.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(40f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(40f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(40f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(80f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(40f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child2.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(102f, root.getLayoutWidth(), 0.0f); + assertEquals(102f, root.getLayoutHeight(), 0.0f); + + assertEquals(62f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(40f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(22f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(40f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(-18f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(40f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child2.getLayoutHeight(), 0.0f); + } + + @Test + public void test_justify_content_overflow_row_flex_end() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setFlexDirection(YogaFlexDirection.ROW); + root.setJustifyContent(YogaJustify.FLEX_END); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setWidth(102f); + root.setHeight(102f); + + final YogaNode root_child0 = createNode(config); + root_child0.setWidth(40f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child1 = createNode(config); + root_child1.setWidth(40f); + root.addChildAt(root_child1, 1); + + final YogaNode root_child2 = createNode(config); + root_child2.setWidth(40f); + root.addChildAt(root_child2, 2); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(102f, root.getLayoutWidth(), 0.0f); + assertEquals(102f, root.getLayoutHeight(), 0.0f); + + assertEquals(-18f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(40f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(22f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(40f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(62f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(40f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child2.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(102f, root.getLayoutWidth(), 0.0f); + assertEquals(102f, root.getLayoutHeight(), 0.0f); + + assertEquals(80f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(40f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(40f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(40f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(40f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child2.getLayoutHeight(), 0.0f); + } + + @Test + public void test_justify_content_overflow_row_center() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setFlexDirection(YogaFlexDirection.ROW); + root.setJustifyContent(YogaJustify.CENTER); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setWidth(102f); + root.setHeight(102f); + + final YogaNode root_child0 = createNode(config); + root_child0.setWidth(40f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child1 = createNode(config); + root_child1.setWidth(40f); + root.addChildAt(root_child1, 1); + + final YogaNode root_child2 = createNode(config); + root_child2.setWidth(40f); + root.addChildAt(root_child2, 2); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(102f, root.getLayoutWidth(), 0.0f); + assertEquals(102f, root.getLayoutHeight(), 0.0f); + + assertEquals(-9f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(40f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(31f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(40f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(71f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(40f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child2.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(102f, root.getLayoutWidth(), 0.0f); + assertEquals(102f, root.getLayoutHeight(), 0.0f); + + assertEquals(71f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(40f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(31f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(40f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(-9f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(40f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child2.getLayoutHeight(), 0.0f); + } + + @Test + public void test_justify_content_overflow_row_space_between() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setFlexDirection(YogaFlexDirection.ROW); + root.setJustifyContent(YogaJustify.SPACE_BETWEEN); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setWidth(102f); + root.setHeight(102f); + + final YogaNode root_child0 = createNode(config); + root_child0.setWidth(40f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child1 = createNode(config); + root_child1.setWidth(40f); + root.addChildAt(root_child1, 1); + + final YogaNode root_child2 = createNode(config); + root_child2.setWidth(40f); + root.addChildAt(root_child2, 2); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(102f, root.getLayoutWidth(), 0.0f); + assertEquals(102f, root.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(40f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(40f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(40f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(80f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(40f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child2.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(102f, root.getLayoutWidth(), 0.0f); + assertEquals(102f, root.getLayoutHeight(), 0.0f); + + assertEquals(62f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(40f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(22f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(40f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(-18f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(40f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child2.getLayoutHeight(), 0.0f); + } + + @Test + public void test_justify_content_overflow_row_space_around() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setFlexDirection(YogaFlexDirection.ROW); + root.setJustifyContent(YogaJustify.SPACE_AROUND); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setWidth(102f); + root.setHeight(102f); + + final YogaNode root_child0 = createNode(config); + root_child0.setWidth(40f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child1 = createNode(config); + root_child1.setWidth(40f); + root.addChildAt(root_child1, 1); + + final YogaNode root_child2 = createNode(config); + root_child2.setWidth(40f); + root.addChildAt(root_child2, 2); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(102f, root.getLayoutWidth(), 0.0f); + assertEquals(102f, root.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(40f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(40f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(40f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(80f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(40f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child2.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(102f, root.getLayoutWidth(), 0.0f); + assertEquals(102f, root.getLayoutHeight(), 0.0f); + + assertEquals(62f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(40f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(22f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(40f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(-18f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(40f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child2.getLayoutHeight(), 0.0f); + } + + @Test + public void test_justify_content_overflow_row_space_evenly() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setFlexDirection(YogaFlexDirection.ROW); + root.setJustifyContent(YogaJustify.SPACE_EVENLY); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setWidth(102f); + root.setHeight(102f); + + final YogaNode root_child0 = createNode(config); + root_child0.setWidth(40f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child1 = createNode(config); + root_child1.setWidth(40f); + root.addChildAt(root_child1, 1); + + final YogaNode root_child2 = createNode(config); + root_child2.setWidth(40f); + root.addChildAt(root_child2, 2); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(102f, root.getLayoutWidth(), 0.0f); + assertEquals(102f, root.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(40f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(40f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(40f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(80f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(40f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child2.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(102f, root.getLayoutWidth(), 0.0f); + assertEquals(102f, root.getLayoutHeight(), 0.0f); + + assertEquals(62f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(40f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(22f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(40f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(-18f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(40f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child2.getLayoutHeight(), 0.0f); + } + + @Test + public void test_justify_content_overflow_row_reverse_space_around() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setFlexDirection(YogaFlexDirection.ROW_REVERSE); + root.setJustifyContent(YogaJustify.SPACE_AROUND); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setWidth(102f); + root.setHeight(102f); + + final YogaNode root_child0 = createNode(config); + root_child0.setWidth(40f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child1 = createNode(config); + root_child1.setWidth(40f); + root.addChildAt(root_child1, 1); + + final YogaNode root_child2 = createNode(config); + root_child2.setWidth(40f); + root.addChildAt(root_child2, 2); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(102f, root.getLayoutWidth(), 0.0f); + assertEquals(102f, root.getLayoutHeight(), 0.0f); + + assertEquals(62f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(40f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(22f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(40f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(-18f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(40f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child2.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(102f, root.getLayoutWidth(), 0.0f); + assertEquals(102f, root.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(40f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(40f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(40f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(80f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(40f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child2.getLayoutHeight(), 0.0f); + } + + @Test + public void test_justify_content_overflow_row_reverse_space_evenly() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setFlexDirection(YogaFlexDirection.ROW_REVERSE); + root.setJustifyContent(YogaJustify.SPACE_EVENLY); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setWidth(102f); + root.setHeight(102f); + + final YogaNode root_child0 = createNode(config); + root_child0.setWidth(40f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child1 = createNode(config); + root_child1.setWidth(40f); + root.addChildAt(root_child1, 1); + + final YogaNode root_child2 = createNode(config); + root_child2.setWidth(40f); + root.addChildAt(root_child2, 2); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(102f, root.getLayoutWidth(), 0.0f); + assertEquals(102f, root.getLayoutHeight(), 0.0f); + + assertEquals(62f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(40f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(22f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(40f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(-18f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(40f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child2.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(102f, root.getLayoutWidth(), 0.0f); + assertEquals(102f, root.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(40f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(40f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(40f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(80f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(40f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child2.getLayoutHeight(), 0.0f); + } + + @Test + public void test_justify_content_overflow_row_space_evenly_auto_margin() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setFlexDirection(YogaFlexDirection.ROW); + root.setJustifyContent(YogaJustify.SPACE_EVENLY); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setWidth(102f); + root.setHeight(102f); + + final YogaNode root_child0 = createNode(config); + root_child0.setMarginAuto(YogaEdge.RIGHT); + root_child0.setWidth(40f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child1 = createNode(config); + root_child1.setWidth(40f); + root.addChildAt(root_child1, 1); + + final YogaNode root_child2 = createNode(config); + root_child2.setWidth(40f); + root.addChildAt(root_child2, 2); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(102f, root.getLayoutWidth(), 0.0f); + assertEquals(102f, root.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(40f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(40f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(40f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(80f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(40f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child2.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(102f, root.getLayoutWidth(), 0.0f); + assertEquals(102f, root.getLayoutHeight(), 0.0f); + + assertEquals(62f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(40f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(22f, root_child1.getLayoutX(), 0.0f); + assertEquals(0f, root_child1.getLayoutY(), 0.0f); + assertEquals(40f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child1.getLayoutHeight(), 0.0f); + + assertEquals(-18f, root_child2.getLayoutX(), 0.0f); + assertEquals(0f, root_child2.getLayoutY(), 0.0f); + assertEquals(40f, root_child2.getLayoutWidth(), 0.0f); + assertEquals(102f, root_child2.getLayoutHeight(), 0.0f); + } + private YogaNode createNode(YogaConfig config) { return mNodeFactory.create(config); } diff --git a/java/tests/com/facebook/yoga/YGMarginTest.java b/java/tests/com/facebook/yoga/YGMarginTest.java index 20b0cb71c1..5b065185a2 100644 --- a/java/tests/com/facebook/yoga/YGMarginTest.java +++ b/java/tests/com/facebook/yoga/YGMarginTest.java @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> * generated by gentest/gentest-driver.ts from gentest/fixtures/YGMarginTest.html */ @@ -1732,6 +1732,63 @@ public void test_margin_auto_left_stretching_child() { assertEquals(50f, root_child1.getLayoutHeight(), 0.0f); } + @Test + public void test_margin_auto_overflowing_container() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setAlignItems(YogaAlign.CENTER); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setWidth(200f); + root.setHeight(200f); + + final YogaNode root_child0 = createNode(config); + root_child0.setMarginAuto(YogaEdge.BOTTOM); + root_child0.setWidth(50f); + root_child0.setHeight(150f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child1 = createNode(config); + root_child1.setWidth(50f); + root_child1.setHeight(150f); + root.addChildAt(root_child1, 1); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(200f, root.getLayoutWidth(), 0.0f); + assertEquals(200f, root.getLayoutHeight(), 0.0f); + + assertEquals(75f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(50f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(150f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(75f, root_child1.getLayoutX(), 0.0f); + assertEquals(150f, root_child1.getLayoutY(), 0.0f); + assertEquals(50f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(150f, root_child1.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(200f, root.getLayoutWidth(), 0.0f); + assertEquals(200f, root.getLayoutHeight(), 0.0f); + + assertEquals(75f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(50f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(150f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(75f, root_child1.getLayoutX(), 0.0f); + assertEquals(150f, root_child1.getLayoutY(), 0.0f); + assertEquals(50f, root_child1.getLayoutWidth(), 0.0f); + assertEquals(150f, root_child1.getLayoutHeight(), 0.0f); + } + private YogaNode createNode(YogaConfig config) { return mNodeFactory.create(config); } diff --git a/javascript/tests/generated/YGJustifyContentTest.test.ts b/javascript/tests/generated/YGJustifyContentTest.test.ts index adf8dde330..3a376f6312 100644 --- a/javascript/tests/generated/YGJustifyContentTest.test.ts +++ b/javascript/tests/generated/YGJustifyContentTest.test.ts @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<1027a837f1935ffdea54dc3c7676c35c>> + * @generated SignedSource<> * generated by gentest/gentest-driver.ts from gentest/fixtures/YGJustifyContentTest.html */ @@ -1480,3 +1480,669 @@ test('justify_content_flex_end_row_reverse', () => { config.free(); } }); +test('justify_content_overflow_row_flex_start', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setFlexDirection(FlexDirection.Row); + root.setPositionType(PositionType.Absolute); + root.setWidth(102); + root.setHeight(102); + + const root_child0 = Yoga.Node.create(config); + root_child0.setWidth(40); + root.insertChild(root_child0, 0); + + const root_child1 = Yoga.Node.create(config); + root_child1.setWidth(40); + root.insertChild(root_child1, 1); + + const root_child2 = Yoga.Node.create(config); + root_child2.setWidth(40); + root.insertChild(root_child2, 2); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(102); + expect(root.getComputedHeight()).toBe(102); + + expect(root_child0.getComputedLeft()).toBe(0); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(40); + expect(root_child0.getComputedHeight()).toBe(102); + + expect(root_child1.getComputedLeft()).toBe(40); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(40); + expect(root_child1.getComputedHeight()).toBe(102); + + expect(root_child2.getComputedLeft()).toBe(80); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(40); + expect(root_child2.getComputedHeight()).toBe(102); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(102); + expect(root.getComputedHeight()).toBe(102); + + expect(root_child0.getComputedLeft()).toBe(62); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(40); + expect(root_child0.getComputedHeight()).toBe(102); + + expect(root_child1.getComputedLeft()).toBe(22); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(40); + expect(root_child1.getComputedHeight()).toBe(102); + + expect(root_child2.getComputedLeft()).toBe(-18); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(40); + expect(root_child2.getComputedHeight()).toBe(102); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); +test('justify_content_overflow_row_flex_end', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setFlexDirection(FlexDirection.Row); + root.setJustifyContent(Justify.FlexEnd); + root.setPositionType(PositionType.Absolute); + root.setWidth(102); + root.setHeight(102); + + const root_child0 = Yoga.Node.create(config); + root_child0.setWidth(40); + root.insertChild(root_child0, 0); + + const root_child1 = Yoga.Node.create(config); + root_child1.setWidth(40); + root.insertChild(root_child1, 1); + + const root_child2 = Yoga.Node.create(config); + root_child2.setWidth(40); + root.insertChild(root_child2, 2); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(102); + expect(root.getComputedHeight()).toBe(102); + + expect(root_child0.getComputedLeft()).toBe(-18); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(40); + expect(root_child0.getComputedHeight()).toBe(102); + + expect(root_child1.getComputedLeft()).toBe(22); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(40); + expect(root_child1.getComputedHeight()).toBe(102); + + expect(root_child2.getComputedLeft()).toBe(62); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(40); + expect(root_child2.getComputedHeight()).toBe(102); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(102); + expect(root.getComputedHeight()).toBe(102); + + expect(root_child0.getComputedLeft()).toBe(80); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(40); + expect(root_child0.getComputedHeight()).toBe(102); + + expect(root_child1.getComputedLeft()).toBe(40); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(40); + expect(root_child1.getComputedHeight()).toBe(102); + + expect(root_child2.getComputedLeft()).toBe(0); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(40); + expect(root_child2.getComputedHeight()).toBe(102); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); +test('justify_content_overflow_row_center', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setFlexDirection(FlexDirection.Row); + root.setJustifyContent(Justify.Center); + root.setPositionType(PositionType.Absolute); + root.setWidth(102); + root.setHeight(102); + + const root_child0 = Yoga.Node.create(config); + root_child0.setWidth(40); + root.insertChild(root_child0, 0); + + const root_child1 = Yoga.Node.create(config); + root_child1.setWidth(40); + root.insertChild(root_child1, 1); + + const root_child2 = Yoga.Node.create(config); + root_child2.setWidth(40); + root.insertChild(root_child2, 2); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(102); + expect(root.getComputedHeight()).toBe(102); + + expect(root_child0.getComputedLeft()).toBe(-9); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(40); + expect(root_child0.getComputedHeight()).toBe(102); + + expect(root_child1.getComputedLeft()).toBe(31); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(40); + expect(root_child1.getComputedHeight()).toBe(102); + + expect(root_child2.getComputedLeft()).toBe(71); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(40); + expect(root_child2.getComputedHeight()).toBe(102); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(102); + expect(root.getComputedHeight()).toBe(102); + + expect(root_child0.getComputedLeft()).toBe(71); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(40); + expect(root_child0.getComputedHeight()).toBe(102); + + expect(root_child1.getComputedLeft()).toBe(31); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(40); + expect(root_child1.getComputedHeight()).toBe(102); + + expect(root_child2.getComputedLeft()).toBe(-9); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(40); + expect(root_child2.getComputedHeight()).toBe(102); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); +test('justify_content_overflow_row_space_between', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setFlexDirection(FlexDirection.Row); + root.setJustifyContent(Justify.SpaceBetween); + root.setPositionType(PositionType.Absolute); + root.setWidth(102); + root.setHeight(102); + + const root_child0 = Yoga.Node.create(config); + root_child0.setWidth(40); + root.insertChild(root_child0, 0); + + const root_child1 = Yoga.Node.create(config); + root_child1.setWidth(40); + root.insertChild(root_child1, 1); + + const root_child2 = Yoga.Node.create(config); + root_child2.setWidth(40); + root.insertChild(root_child2, 2); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(102); + expect(root.getComputedHeight()).toBe(102); + + expect(root_child0.getComputedLeft()).toBe(0); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(40); + expect(root_child0.getComputedHeight()).toBe(102); + + expect(root_child1.getComputedLeft()).toBe(40); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(40); + expect(root_child1.getComputedHeight()).toBe(102); + + expect(root_child2.getComputedLeft()).toBe(80); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(40); + expect(root_child2.getComputedHeight()).toBe(102); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(102); + expect(root.getComputedHeight()).toBe(102); + + expect(root_child0.getComputedLeft()).toBe(62); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(40); + expect(root_child0.getComputedHeight()).toBe(102); + + expect(root_child1.getComputedLeft()).toBe(22); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(40); + expect(root_child1.getComputedHeight()).toBe(102); + + expect(root_child2.getComputedLeft()).toBe(-18); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(40); + expect(root_child2.getComputedHeight()).toBe(102); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); +test('justify_content_overflow_row_space_around', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setFlexDirection(FlexDirection.Row); + root.setJustifyContent(Justify.SpaceAround); + root.setPositionType(PositionType.Absolute); + root.setWidth(102); + root.setHeight(102); + + const root_child0 = Yoga.Node.create(config); + root_child0.setWidth(40); + root.insertChild(root_child0, 0); + + const root_child1 = Yoga.Node.create(config); + root_child1.setWidth(40); + root.insertChild(root_child1, 1); + + const root_child2 = Yoga.Node.create(config); + root_child2.setWidth(40); + root.insertChild(root_child2, 2); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(102); + expect(root.getComputedHeight()).toBe(102); + + expect(root_child0.getComputedLeft()).toBe(0); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(40); + expect(root_child0.getComputedHeight()).toBe(102); + + expect(root_child1.getComputedLeft()).toBe(40); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(40); + expect(root_child1.getComputedHeight()).toBe(102); + + expect(root_child2.getComputedLeft()).toBe(80); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(40); + expect(root_child2.getComputedHeight()).toBe(102); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(102); + expect(root.getComputedHeight()).toBe(102); + + expect(root_child0.getComputedLeft()).toBe(62); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(40); + expect(root_child0.getComputedHeight()).toBe(102); + + expect(root_child1.getComputedLeft()).toBe(22); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(40); + expect(root_child1.getComputedHeight()).toBe(102); + + expect(root_child2.getComputedLeft()).toBe(-18); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(40); + expect(root_child2.getComputedHeight()).toBe(102); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); +test('justify_content_overflow_row_space_evenly', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setFlexDirection(FlexDirection.Row); + root.setJustifyContent(Justify.SpaceEvenly); + root.setPositionType(PositionType.Absolute); + root.setWidth(102); + root.setHeight(102); + + const root_child0 = Yoga.Node.create(config); + root_child0.setWidth(40); + root.insertChild(root_child0, 0); + + const root_child1 = Yoga.Node.create(config); + root_child1.setWidth(40); + root.insertChild(root_child1, 1); + + const root_child2 = Yoga.Node.create(config); + root_child2.setWidth(40); + root.insertChild(root_child2, 2); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(102); + expect(root.getComputedHeight()).toBe(102); + + expect(root_child0.getComputedLeft()).toBe(0); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(40); + expect(root_child0.getComputedHeight()).toBe(102); + + expect(root_child1.getComputedLeft()).toBe(40); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(40); + expect(root_child1.getComputedHeight()).toBe(102); + + expect(root_child2.getComputedLeft()).toBe(80); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(40); + expect(root_child2.getComputedHeight()).toBe(102); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(102); + expect(root.getComputedHeight()).toBe(102); + + expect(root_child0.getComputedLeft()).toBe(62); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(40); + expect(root_child0.getComputedHeight()).toBe(102); + + expect(root_child1.getComputedLeft()).toBe(22); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(40); + expect(root_child1.getComputedHeight()).toBe(102); + + expect(root_child2.getComputedLeft()).toBe(-18); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(40); + expect(root_child2.getComputedHeight()).toBe(102); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); +test('justify_content_overflow_row_reverse_space_around', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setFlexDirection(FlexDirection.RowReverse); + root.setJustifyContent(Justify.SpaceAround); + root.setPositionType(PositionType.Absolute); + root.setWidth(102); + root.setHeight(102); + + const root_child0 = Yoga.Node.create(config); + root_child0.setWidth(40); + root.insertChild(root_child0, 0); + + const root_child1 = Yoga.Node.create(config); + root_child1.setWidth(40); + root.insertChild(root_child1, 1); + + const root_child2 = Yoga.Node.create(config); + root_child2.setWidth(40); + root.insertChild(root_child2, 2); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(102); + expect(root.getComputedHeight()).toBe(102); + + expect(root_child0.getComputedLeft()).toBe(62); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(40); + expect(root_child0.getComputedHeight()).toBe(102); + + expect(root_child1.getComputedLeft()).toBe(22); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(40); + expect(root_child1.getComputedHeight()).toBe(102); + + expect(root_child2.getComputedLeft()).toBe(-18); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(40); + expect(root_child2.getComputedHeight()).toBe(102); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(102); + expect(root.getComputedHeight()).toBe(102); + + expect(root_child0.getComputedLeft()).toBe(0); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(40); + expect(root_child0.getComputedHeight()).toBe(102); + + expect(root_child1.getComputedLeft()).toBe(40); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(40); + expect(root_child1.getComputedHeight()).toBe(102); + + expect(root_child2.getComputedLeft()).toBe(80); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(40); + expect(root_child2.getComputedHeight()).toBe(102); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); +test('justify_content_overflow_row_reverse_space_evenly', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setFlexDirection(FlexDirection.RowReverse); + root.setJustifyContent(Justify.SpaceEvenly); + root.setPositionType(PositionType.Absolute); + root.setWidth(102); + root.setHeight(102); + + const root_child0 = Yoga.Node.create(config); + root_child0.setWidth(40); + root.insertChild(root_child0, 0); + + const root_child1 = Yoga.Node.create(config); + root_child1.setWidth(40); + root.insertChild(root_child1, 1); + + const root_child2 = Yoga.Node.create(config); + root_child2.setWidth(40); + root.insertChild(root_child2, 2); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(102); + expect(root.getComputedHeight()).toBe(102); + + expect(root_child0.getComputedLeft()).toBe(62); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(40); + expect(root_child0.getComputedHeight()).toBe(102); + + expect(root_child1.getComputedLeft()).toBe(22); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(40); + expect(root_child1.getComputedHeight()).toBe(102); + + expect(root_child2.getComputedLeft()).toBe(-18); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(40); + expect(root_child2.getComputedHeight()).toBe(102); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(102); + expect(root.getComputedHeight()).toBe(102); + + expect(root_child0.getComputedLeft()).toBe(0); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(40); + expect(root_child0.getComputedHeight()).toBe(102); + + expect(root_child1.getComputedLeft()).toBe(40); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(40); + expect(root_child1.getComputedHeight()).toBe(102); + + expect(root_child2.getComputedLeft()).toBe(80); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(40); + expect(root_child2.getComputedHeight()).toBe(102); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); +test('justify_content_overflow_row_space_evenly_auto_margin', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setFlexDirection(FlexDirection.Row); + root.setJustifyContent(Justify.SpaceEvenly); + root.setPositionType(PositionType.Absolute); + root.setWidth(102); + root.setHeight(102); + + const root_child0 = Yoga.Node.create(config); + root_child0.setMargin(Edge.Right, 'auto'); + root_child0.setWidth(40); + root.insertChild(root_child0, 0); + + const root_child1 = Yoga.Node.create(config); + root_child1.setWidth(40); + root.insertChild(root_child1, 1); + + const root_child2 = Yoga.Node.create(config); + root_child2.setWidth(40); + root.insertChild(root_child2, 2); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(102); + expect(root.getComputedHeight()).toBe(102); + + expect(root_child0.getComputedLeft()).toBe(0); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(40); + expect(root_child0.getComputedHeight()).toBe(102); + + expect(root_child1.getComputedLeft()).toBe(40); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(40); + expect(root_child1.getComputedHeight()).toBe(102); + + expect(root_child2.getComputedLeft()).toBe(80); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(40); + expect(root_child2.getComputedHeight()).toBe(102); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(102); + expect(root.getComputedHeight()).toBe(102); + + expect(root_child0.getComputedLeft()).toBe(62); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(40); + expect(root_child0.getComputedHeight()).toBe(102); + + expect(root_child1.getComputedLeft()).toBe(22); + expect(root_child1.getComputedTop()).toBe(0); + expect(root_child1.getComputedWidth()).toBe(40); + expect(root_child1.getComputedHeight()).toBe(102); + + expect(root_child2.getComputedLeft()).toBe(-18); + expect(root_child2.getComputedTop()).toBe(0); + expect(root_child2.getComputedWidth()).toBe(40); + expect(root_child2.getComputedHeight()).toBe(102); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); diff --git a/javascript/tests/generated/YGMarginTest.test.ts b/javascript/tests/generated/YGMarginTest.test.ts index 3bc2f03e0a..41582fd5f4 100644 --- a/javascript/tests/generated/YGMarginTest.test.ts +++ b/javascript/tests/generated/YGMarginTest.test.ts @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<9da31d1df716c208b1ca30837c23f803>> + * @generated SignedSource<<71cadc40efa1ab29b1f7613c79c27d9e>> * generated by gentest/gentest-driver.ts from gentest/fixtures/YGMarginTest.html */ @@ -1897,3 +1897,65 @@ test('margin_auto_left_stretching_child', () => { config.free(); } }); +test('margin_auto_overflowing_container', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setAlignItems(Align.Center); + root.setPositionType(PositionType.Absolute); + root.setWidth(200); + root.setHeight(200); + + const root_child0 = Yoga.Node.create(config); + root_child0.setMargin(Edge.Bottom, 'auto'); + root_child0.setWidth(50); + root_child0.setHeight(150); + root.insertChild(root_child0, 0); + + const root_child1 = Yoga.Node.create(config); + root_child1.setWidth(50); + root_child1.setHeight(150); + root.insertChild(root_child1, 1); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(200); + expect(root.getComputedHeight()).toBe(200); + + expect(root_child0.getComputedLeft()).toBe(75); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(50); + expect(root_child0.getComputedHeight()).toBe(150); + + expect(root_child1.getComputedLeft()).toBe(75); + expect(root_child1.getComputedTop()).toBe(150); + expect(root_child1.getComputedWidth()).toBe(50); + expect(root_child1.getComputedHeight()).toBe(150); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(200); + expect(root.getComputedHeight()).toBe(200); + + expect(root_child0.getComputedLeft()).toBe(75); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(50); + expect(root_child0.getComputedHeight()).toBe(150); + + expect(root_child1.getComputedLeft()).toBe(75); + expect(root_child1.getComputedTop()).toBe(150); + expect(root_child1.getComputedWidth()).toBe(50); + expect(root_child1.getComputedHeight()).toBe(150); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); diff --git a/tests/generated/YGJustifyContentTest.cpp b/tests/generated/YGJustifyContentTest.cpp index db93eb8027..a02adfc545 100644 --- a/tests/generated/YGJustifyContentTest.cpp +++ b/tests/generated/YGJustifyContentTest.cpp @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. * * clang-format off - * @generated SignedSource<<6fd9f96e80468c69192ce2a29444b734>> + * @generated SignedSource<<144009ebd2ef6685a545b47d7f6ad8cb>> * generated by gentest/gentest-driver.ts from gentest/fixtures/YGJustifyContentTest.html */ @@ -1381,3 +1381,633 @@ TEST(YogaTest, justify_content_flex_end_row_reverse) { YGConfigFree(config); } + +TEST(YogaTest, justify_content_overflow_row_flex_start) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetWidth(root, 102); + YGNodeStyleSetHeight(root, 102); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child0, 40); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child1 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child1, 40); + YGNodeInsertChild(root, root_child1, 1); + + const YGNodeRef root_child2 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child2, 40); + YGNodeInsertChild(root, root_child2, 2); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(80, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child2)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(62, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(22, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(-18, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child2)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} + +TEST(YogaTest, justify_content_overflow_row_flex_end) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow); + YGNodeStyleSetJustifyContent(root, YGJustifyFlexEnd); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetWidth(root, 102); + YGNodeStyleSetHeight(root, 102); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child0, 40); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child1 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child1, 40); + YGNodeInsertChild(root, root_child1, 1); + + const YGNodeRef root_child2 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child2, 40); + YGNodeInsertChild(root, root_child2, 2); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(-18, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(22, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(62, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child2)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(80, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child2)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} + +TEST(YogaTest, justify_content_overflow_row_center) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow); + YGNodeStyleSetJustifyContent(root, YGJustifyCenter); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetWidth(root, 102); + YGNodeStyleSetHeight(root, 102); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child0, 40); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child1 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child1, 40); + YGNodeInsertChild(root, root_child1, 1); + + const YGNodeRef root_child2 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child2, 40); + YGNodeInsertChild(root, root_child2, 2); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(-9, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(31, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(71, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child2)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(71, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(31, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(-9, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child2)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} + +TEST(YogaTest, justify_content_overflow_row_space_between) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow); + YGNodeStyleSetJustifyContent(root, YGJustifySpaceBetween); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetWidth(root, 102); + YGNodeStyleSetHeight(root, 102); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child0, 40); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child1 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child1, 40); + YGNodeInsertChild(root, root_child1, 1); + + const YGNodeRef root_child2 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child2, 40); + YGNodeInsertChild(root, root_child2, 2); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(80, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child2)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(62, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(22, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(-18, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child2)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} + +TEST(YogaTest, justify_content_overflow_row_space_around) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow); + YGNodeStyleSetJustifyContent(root, YGJustifySpaceAround); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetWidth(root, 102); + YGNodeStyleSetHeight(root, 102); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child0, 40); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child1 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child1, 40); + YGNodeInsertChild(root, root_child1, 1); + + const YGNodeRef root_child2 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child2, 40); + YGNodeInsertChild(root, root_child2, 2); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(80, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child2)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(62, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(22, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(-18, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child2)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} + +TEST(YogaTest, justify_content_overflow_row_space_evenly) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow); + YGNodeStyleSetJustifyContent(root, YGJustifySpaceEvenly); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetWidth(root, 102); + YGNodeStyleSetHeight(root, 102); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child0, 40); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child1 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child1, 40); + YGNodeInsertChild(root, root_child1, 1); + + const YGNodeRef root_child2 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child2, 40); + YGNodeInsertChild(root, root_child2, 2); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(80, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child2)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(62, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(22, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(-18, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child2)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} + +TEST(YogaTest, justify_content_overflow_row_reverse_space_around) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexDirection(root, YGFlexDirectionRowReverse); + YGNodeStyleSetJustifyContent(root, YGJustifySpaceAround); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetWidth(root, 102); + YGNodeStyleSetHeight(root, 102); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child0, 40); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child1 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child1, 40); + YGNodeInsertChild(root, root_child1, 1); + + const YGNodeRef root_child2 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child2, 40); + YGNodeInsertChild(root, root_child2, 2); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(62, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(22, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(-18, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child2)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(80, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child2)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} + +TEST(YogaTest, justify_content_overflow_row_reverse_space_evenly) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexDirection(root, YGFlexDirectionRowReverse); + YGNodeStyleSetJustifyContent(root, YGJustifySpaceEvenly); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetWidth(root, 102); + YGNodeStyleSetHeight(root, 102); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child0, 40); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child1 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child1, 40); + YGNodeInsertChild(root, root_child1, 1); + + const YGNodeRef root_child2 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child2, 40); + YGNodeInsertChild(root, root_child2, 2); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(62, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(22, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(-18, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child2)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(80, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child2)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} + +TEST(YogaTest, justify_content_overflow_row_space_evenly_auto_margin) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow); + YGNodeStyleSetJustifyContent(root, YGJustifySpaceEvenly); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetWidth(root, 102); + YGNodeStyleSetHeight(root, 102); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetMarginAuto(root_child0, YGEdgeRight); + YGNodeStyleSetWidth(root_child0, 40); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child1 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child1, 40); + YGNodeInsertChild(root, root_child1, 1); + + const YGNodeRef root_child2 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child2, 40); + YGNodeInsertChild(root, root_child2, 2); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(80, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child2)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(62, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(22, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child1)); + + ASSERT_FLOAT_EQ(-18, YGNodeLayoutGetLeft(root_child2)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2)); + ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child2)); + ASSERT_FLOAT_EQ(102, YGNodeLayoutGetHeight(root_child2)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} diff --git a/tests/generated/YGMarginTest.cpp b/tests/generated/YGMarginTest.cpp index e0f05793ca..2900aec76c 100644 --- a/tests/generated/YGMarginTest.cpp +++ b/tests/generated/YGMarginTest.cpp @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. * * clang-format off - * @generated SignedSource<<52e260344bf94a7d6afb0066b8b9e1b9>> + * @generated SignedSource<<0d39738ffc01ee67f7f2cc6fed49adf8>> * generated by gentest/gentest-driver.ts from gentest/fixtures/YGMarginTest.html */ @@ -1750,3 +1750,61 @@ TEST(YogaTest, margin_auto_left_stretching_child) { YGConfigFree(config); } + +TEST(YogaTest, margin_auto_overflowing_container) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetAlignItems(root, YGAlignCenter); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetWidth(root, 200); + YGNodeStyleSetHeight(root, 200); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetMarginAuto(root_child0, YGEdgeBottom); + YGNodeStyleSetWidth(root_child0, 50); + YGNodeStyleSetHeight(root_child0, 150); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child1 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root_child1, 50); + YGNodeStyleSetHeight(root_child1, 150); + YGNodeInsertChild(root, root_child1, 1); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(75, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(150, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(75, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(150, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(150, YGNodeLayoutGetHeight(root_child1)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(75, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(150, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(75, YGNodeLayoutGetLeft(root_child1)); + ASSERT_FLOAT_EQ(150, YGNodeLayoutGetTop(root_child1)); + ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child1)); + ASSERT_FLOAT_EQ(150, YGNodeLayoutGetHeight(root_child1)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} diff --git a/yoga/algorithm/Align.h b/yoga/algorithm/Align.h index e9ab6df3b7..ac4dfcde91 100644 --- a/yoga/algorithm/Align.h +++ b/yoga/algorithm/Align.h @@ -26,4 +26,47 @@ inline Align resolveChildAlignment( return align; } +/** + * Fallback alignment to use on overflow + * https://www.w3.org/TR/css-align-3/#distribution-values + */ +constexpr Align fallbackAlignment(Align align) { + switch (align) { + // Fallback to flex-start + case Align::SpaceBetween: + case Align::Stretch: + return Align::FlexStart; + + // Fallback to safe center. TODO: This should be aligned to Start + // instead of FlexStart (for row-reverse containers) + case Align::SpaceAround: + case Align::SpaceEvenly: + return Align::FlexStart; + default: + return align; + } +} + +/** + * Fallback alignment to use on overflow + * https://www.w3.org/TR/css-align-3/#distribution-values + */ +constexpr Justify fallbackAlignment(Justify align) { + switch (align) { + // Fallback to flex-start + case Justify::SpaceBetween: + // TODO: Support `justify-content: stretch` + // case Justify::Stretch: + return Justify::FlexStart; + + // Fallback to safe center. TODO: This should be aligned to Start + // instead of FlexStart (for row-reverse containers) + case Justify::SpaceAround: + case Justify::SpaceEvenly: + return Justify::FlexStart; + default: + return align; + } +} + } // namespace facebook::yoga diff --git a/yoga/algorithm/CalculateLayout.cpp b/yoga/algorithm/CalculateLayout.cpp index 62d8a24b76..0d34129ba0 100644 --- a/yoga/algorithm/CalculateLayout.cpp +++ b/yoga/algorithm/CalculateLayout.cpp @@ -959,27 +959,16 @@ static void justifyMainAxis( } } - int numberOfAutoMarginsOnCurrentLine = 0; - for (size_t i = startOfLineIndex; i < flexLine.endOfLineIndex; i++) { - auto child = node->getChild(i); - if (child->style().positionType() != PositionType::Absolute) { - if (child->style().flexStartMarginIsAuto(mainAxis, direction)) { - numberOfAutoMarginsOnCurrentLine++; - } - if (child->style().flexEndMarginIsAuto(mainAxis, direction)) { - numberOfAutoMarginsOnCurrentLine++; - } - } - } - // In order to position the elements in the main axis, we have two controls. // The space between the beginning and the first element and the space between // each two elements. float leadingMainDim = 0; float betweenMainDim = gap; - const Justify justifyContent = node->style().justifyContent(); + const Justify justifyContent = flexLine.layout.remainingFreeSpace >= 0 + ? node->style().justifyContent() + : fallbackAlignment(node->style().justifyContent()); - if (numberOfAutoMarginsOnCurrentLine == 0) { + if (flexLine.numberOfAutoMargins == 0) { switch (justifyContent) { case Justify::Center: leadingMainDim = flexLine.layout.remainingFreeSpace / 2; @@ -989,8 +978,7 @@ static void justifyMainAxis( break; case Justify::SpaceBetween: if (flexLine.itemsInFlow.size() > 1) { - betweenMainDim += - yoga::maxOrDefined(flexLine.layout.remainingFreeSpace, 0.0f) / + betweenMainDim += flexLine.layout.remainingFreeSpace / static_cast(flexLine.itemsInFlow.size() - 1); } break; @@ -1043,9 +1031,10 @@ static void justifyMainAxis( // We need to do that only for relative elements. Absolute elements do not // take part in that phase. if (childStyle.positionType() != PositionType::Absolute) { - if (child->style().flexStartMarginIsAuto(mainAxis, direction)) { + if (child->style().flexStartMarginIsAuto(mainAxis, direction) && + flexLine.layout.remainingFreeSpace > 0.0f) { flexLine.layout.mainDim += flexLine.layout.remainingFreeSpace / - static_cast(numberOfAutoMarginsOnCurrentLine); + static_cast(flexLine.numberOfAutoMargins); } if (performLayout) { @@ -1059,9 +1048,10 @@ static void justifyMainAxis( flexLine.layout.mainDim += betweenMainDim; } - if (child->style().flexEndMarginIsAuto(mainAxis, direction)) { + if (child->style().flexEndMarginIsAuto(mainAxis, direction) && + flexLine.layout.remainingFreeSpace > 0.0f) { flexLine.layout.mainDim += flexLine.layout.remainingFreeSpace / - static_cast(numberOfAutoMarginsOnCurrentLine); + static_cast(flexLine.numberOfAutoMargins); } bool canSkipFlex = !performLayout && sizingModeCrossDim == SizingMode::StretchFit; @@ -1749,27 +1739,11 @@ static void calculateLayoutImpl( const float remainingAlignContentDim = innerCrossDim - totalLineCrossDim; - // Apply fallback alignments on overflow - // https://www.w3.org/TR/css-align-3/#distribution-values - const auto appliedAlignContent = - remainingAlignContentDim >= 0 ? node->style().alignContent() : [&]() { - switch (node->style().alignContent()) { - // Fallback to flex-start - case Align::SpaceBetween: - case Align::Stretch: - return Align::FlexStart; - - // Fallback to safe center. TODO: This should be aligned to Start - // instead of FlexStart (for row-reverse containers) - case Align::SpaceAround: - case Align::SpaceEvenly: - return Align::FlexStart; - default: - return node->style().alignContent(); - } - }(); + const auto alignContent = remainingAlignContentDim >= 0 + ? node->style().alignContent() + : fallbackAlignment(node->style().alignContent()); - switch (appliedAlignContent) { + switch (alignContent) { case Align::FlexEnd: currentLead += remainingAlignContentDim; break; diff --git a/yoga/algorithm/FlexLine.cpp b/yoga/algorithm/FlexLine.cpp index 50cd6f0abe..d3a954caaf 100644 --- a/yoga/algorithm/FlexLine.cpp +++ b/yoga/algorithm/FlexLine.cpp @@ -27,6 +27,7 @@ FlexLine calculateFlexLine( float sizeConsumed = 0.0f; float totalFlexGrowFactors = 0.0f; float totalFlexShrinkScaledFactors = 0.0f; + size_t numberOfAutoMargins = 0; size_t endOfLineIndex = startOfLineIndex; size_t firstElementInLineIndex = startOfLineIndex; @@ -49,6 +50,13 @@ FlexLine calculateFlexLine( continue; } + if (child->style().flexStartMarginIsAuto(mainAxis, ownerDirection)) { + numberOfAutoMargins++; + } + if (child->style().flexEndMarginIsAuto(mainAxis, ownerDirection)) { + numberOfAutoMargins++; + } + const bool isFirstElementInLine = (endOfLineIndex - firstElementInLineIndex) == 0; @@ -102,10 +110,11 @@ FlexLine calculateFlexLine( } return FlexLine{ - std::move(itemsInFlow), - sizeConsumed, - endOfLineIndex, - FlexLineRunningLayout{ + .itemsInFlow = std::move(itemsInFlow), + .sizeConsumed = sizeConsumed, + .endOfLineIndex = endOfLineIndex, + .numberOfAutoMargins = numberOfAutoMargins, + .layout = FlexLineRunningLayout{ totalFlexGrowFactors, totalFlexShrinkScaledFactors, }}; diff --git a/yoga/algorithm/FlexLine.h b/yoga/algorithm/FlexLine.h index 0f888be507..3287cd6cf4 100644 --- a/yoga/algorithm/FlexLine.h +++ b/yoga/algorithm/FlexLine.h @@ -52,6 +52,9 @@ struct FlexLine { // The index of the first item beyond the current line. const size_t endOfLineIndex{0}; + // Number of edges along the line flow with an auto margin. + const size_t numberOfAutoMargins{0}; + // Layout information about the line computed in steps after line-breaking FlexLineRunningLayout layout{}; }; From dc23284cf77e96f6a2108b5c9a2f4afaaa07a255 Mon Sep 17 00:00:00 2001 From: Joe Vilches Date: Tue, 23 Apr 2024 21:02:36 -0700 Subject: [PATCH 08/24] Add some tests for padding and border for absolute positioning (#1650) Summary: Pull Request resolved: https://github.com/facebook/yoga/pull/1650 See https://github.com/facebook/yoga/issues/1436#issuecomment-2070877918 Reviewed By: NickGerleman Differential Revision: D56478788 fbshipit-source-id: 94a552ed55eb4127eddc6c2018706661fff64093 --- gentest/fixtures/YGAbsolutePositionTest.html | 16 ++ .../facebook/yoga/YGAbsolutePositionTest.java | 158 +++++++++++++++- .../generated/YGAbsolutePositionTest.test.ts | 168 +++++++++++++++++- tests/generated/YGAbsolutePositionTest.cpp | 160 ++++++++++++++++- 4 files changed, 499 insertions(+), 3 deletions(-) diff --git a/gentest/fixtures/YGAbsolutePositionTest.html b/gentest/fixtures/YGAbsolutePositionTest.html index fb05160794..673d257b8a 100644 --- a/gentest/fixtures/YGAbsolutePositionTest.html +++ b/gentest/fixtures/YGAbsolutePositionTest.html @@ -132,6 +132,22 @@
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
> + * @generated SignedSource<<3ccb0b2604c647cde1c76fc2629a3113>> * generated by gentest/gentest-driver.ts from gentest/fixtures/YGAbsolutePositionTest.html */ @@ -1357,6 +1357,162 @@ public void test_absolute_layout_padding_bottom() { assertEquals(50f, root_child0.getLayoutHeight(), 0.0f); } + @Test + public void test_absolute_layout_padding() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setPositionType(YogaPositionType.ABSOLUTE); + + final YogaNode root_child0 = createNode(config); + root_child0.setMargin(YogaEdge.LEFT, 10f); + root_child0.setMargin(YogaEdge.TOP, 10f); + root_child0.setMargin(YogaEdge.RIGHT, 10f); + root_child0.setMargin(YogaEdge.BOTTOM, 10f); + root_child0.setWidth(200f); + root_child0.setHeight(200f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child0_child0 = createNode(config); + root_child0_child0.setPositionType(YogaPositionType.STATIC); + root_child0_child0.setPadding(YogaEdge.LEFT, 50); + root_child0_child0.setPadding(YogaEdge.TOP, 50); + root_child0_child0.setPadding(YogaEdge.RIGHT, 50); + root_child0_child0.setPadding(YogaEdge.BOTTOM, 50); + root_child0_child0.setWidth(200f); + root_child0_child0.setHeight(200f); + root_child0.addChildAt(root_child0_child0, 0); + + final YogaNode root_child0_child0_child0 = createNode(config); + root_child0_child0_child0.setPositionType(YogaPositionType.ABSOLUTE); + root_child0_child0_child0.setWidth(50f); + root_child0_child0_child0.setHeight(50f); + root_child0_child0.addChildAt(root_child0_child0_child0, 0); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(220f, root.getLayoutWidth(), 0.0f); + assertEquals(220f, root.getLayoutHeight(), 0.0f); + + assertEquals(10f, root_child0.getLayoutX(), 0.0f); + assertEquals(10f, root_child0.getLayoutY(), 0.0f); + assertEquals(200f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(200f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child0_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0_child0.getLayoutY(), 0.0f); + assertEquals(200f, root_child0_child0.getLayoutWidth(), 0.0f); + assertEquals(200f, root_child0_child0.getLayoutHeight(), 0.0f); + + assertEquals(50f, root_child0_child0_child0.getLayoutX(), 0.0f); + assertEquals(50f, root_child0_child0_child0.getLayoutY(), 0.0f); + assertEquals(50f, root_child0_child0_child0.getLayoutWidth(), 0.0f); + assertEquals(50f, root_child0_child0_child0.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(220f, root.getLayoutWidth(), 0.0f); + assertEquals(220f, root.getLayoutHeight(), 0.0f); + + assertEquals(10f, root_child0.getLayoutX(), 0.0f); + assertEquals(10f, root_child0.getLayoutY(), 0.0f); + assertEquals(200f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(200f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child0_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0_child0.getLayoutY(), 0.0f); + assertEquals(200f, root_child0_child0.getLayoutWidth(), 0.0f); + assertEquals(200f, root_child0_child0.getLayoutHeight(), 0.0f); + + assertEquals(100f, root_child0_child0_child0.getLayoutX(), 0.0f); + assertEquals(50f, root_child0_child0_child0.getLayoutY(), 0.0f); + assertEquals(50f, root_child0_child0_child0.getLayoutWidth(), 0.0f); + assertEquals(50f, root_child0_child0_child0.getLayoutHeight(), 0.0f); + } + + @Test + public void test_absolute_layout_border() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setPositionType(YogaPositionType.ABSOLUTE); + + final YogaNode root_child0 = createNode(config); + root_child0.setMargin(YogaEdge.LEFT, 10f); + root_child0.setMargin(YogaEdge.TOP, 10f); + root_child0.setMargin(YogaEdge.RIGHT, 10f); + root_child0.setMargin(YogaEdge.BOTTOM, 10f); + root_child0.setWidth(200f); + root_child0.setHeight(200f); + root.addChildAt(root_child0, 0); + + final YogaNode root_child0_child0 = createNode(config); + root_child0_child0.setPositionType(YogaPositionType.STATIC); + root_child0_child0.setBorder(YogaEdge.LEFT, 10f); + root_child0_child0.setBorder(YogaEdge.TOP, 10f); + root_child0_child0.setBorder(YogaEdge.RIGHT, 10f); + root_child0_child0.setBorder(YogaEdge.BOTTOM, 10f); + root_child0_child0.setWidth(200f); + root_child0_child0.setHeight(200f); + root_child0.addChildAt(root_child0_child0, 0); + + final YogaNode root_child0_child0_child0 = createNode(config); + root_child0_child0_child0.setPositionType(YogaPositionType.ABSOLUTE); + root_child0_child0_child0.setWidth(50f); + root_child0_child0_child0.setHeight(50f); + root_child0_child0.addChildAt(root_child0_child0_child0, 0); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(220f, root.getLayoutWidth(), 0.0f); + assertEquals(220f, root.getLayoutHeight(), 0.0f); + + assertEquals(10f, root_child0.getLayoutX(), 0.0f); + assertEquals(10f, root_child0.getLayoutY(), 0.0f); + assertEquals(200f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(200f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child0_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0_child0.getLayoutY(), 0.0f); + assertEquals(200f, root_child0_child0.getLayoutWidth(), 0.0f); + assertEquals(200f, root_child0_child0.getLayoutHeight(), 0.0f); + + assertEquals(10f, root_child0_child0_child0.getLayoutX(), 0.0f); + assertEquals(10f, root_child0_child0_child0.getLayoutY(), 0.0f); + assertEquals(50f, root_child0_child0_child0.getLayoutWidth(), 0.0f); + assertEquals(50f, root_child0_child0_child0.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(220f, root.getLayoutWidth(), 0.0f); + assertEquals(220f, root.getLayoutHeight(), 0.0f); + + assertEquals(10f, root_child0.getLayoutX(), 0.0f); + assertEquals(10f, root_child0.getLayoutY(), 0.0f); + assertEquals(200f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(200f, root_child0.getLayoutHeight(), 0.0f); + + assertEquals(0f, root_child0_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0_child0.getLayoutY(), 0.0f); + assertEquals(200f, root_child0_child0.getLayoutWidth(), 0.0f); + assertEquals(200f, root_child0_child0.getLayoutHeight(), 0.0f); + + assertEquals(140f, root_child0_child0_child0.getLayoutX(), 0.0f); + assertEquals(10f, root_child0_child0_child0.getLayoutY(), 0.0f); + assertEquals(50f, root_child0_child0_child0.getLayoutWidth(), 0.0f); + assertEquals(50f, root_child0_child0_child0.getLayoutHeight(), 0.0f); + } + @Test public void test_absolute_layout_column_reverse_margin_border() { YogaConfig config = YogaConfigFactory.create(); diff --git a/javascript/tests/generated/YGAbsolutePositionTest.test.ts b/javascript/tests/generated/YGAbsolutePositionTest.test.ts index 5b686632ac..1af20d765c 100644 --- a/javascript/tests/generated/YGAbsolutePositionTest.test.ts +++ b/javascript/tests/generated/YGAbsolutePositionTest.test.ts @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<777a238fc942436d2c803822110bcd07>> + * @generated SignedSource<<9c27293180ef7ffd5b683046588f9dd7>> * generated by gentest/gentest-driver.ts from gentest/fixtures/YGAbsolutePositionTest.html */ @@ -1497,6 +1497,172 @@ test('absolute_layout_padding_bottom', () => { config.free(); } }); +test('absolute_layout_padding', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setPositionType(PositionType.Absolute); + + const root_child0 = Yoga.Node.create(config); + root_child0.setMargin(Edge.Left, 10); + root_child0.setMargin(Edge.Top, 10); + root_child0.setMargin(Edge.Right, 10); + root_child0.setMargin(Edge.Bottom, 10); + root_child0.setWidth(200); + root_child0.setHeight(200); + root.insertChild(root_child0, 0); + + const root_child0_child0 = Yoga.Node.create(config); + root_child0_child0.setPositionType(PositionType.Static); + root_child0_child0.setPadding(Edge.Left, 50); + root_child0_child0.setPadding(Edge.Top, 50); + root_child0_child0.setPadding(Edge.Right, 50); + root_child0_child0.setPadding(Edge.Bottom, 50); + root_child0_child0.setWidth(200); + root_child0_child0.setHeight(200); + root_child0.insertChild(root_child0_child0, 0); + + const root_child0_child0_child0 = Yoga.Node.create(config); + root_child0_child0_child0.setPositionType(PositionType.Absolute); + root_child0_child0_child0.setWidth(50); + root_child0_child0_child0.setHeight(50); + root_child0_child0.insertChild(root_child0_child0_child0, 0); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(220); + expect(root.getComputedHeight()).toBe(220); + + expect(root_child0.getComputedLeft()).toBe(10); + expect(root_child0.getComputedTop()).toBe(10); + expect(root_child0.getComputedWidth()).toBe(200); + expect(root_child0.getComputedHeight()).toBe(200); + + expect(root_child0_child0.getComputedLeft()).toBe(0); + expect(root_child0_child0.getComputedTop()).toBe(0); + expect(root_child0_child0.getComputedWidth()).toBe(200); + expect(root_child0_child0.getComputedHeight()).toBe(200); + + expect(root_child0_child0_child0.getComputedLeft()).toBe(50); + expect(root_child0_child0_child0.getComputedTop()).toBe(50); + expect(root_child0_child0_child0.getComputedWidth()).toBe(50); + expect(root_child0_child0_child0.getComputedHeight()).toBe(50); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(220); + expect(root.getComputedHeight()).toBe(220); + + expect(root_child0.getComputedLeft()).toBe(10); + expect(root_child0.getComputedTop()).toBe(10); + expect(root_child0.getComputedWidth()).toBe(200); + expect(root_child0.getComputedHeight()).toBe(200); + + expect(root_child0_child0.getComputedLeft()).toBe(0); + expect(root_child0_child0.getComputedTop()).toBe(0); + expect(root_child0_child0.getComputedWidth()).toBe(200); + expect(root_child0_child0.getComputedHeight()).toBe(200); + + expect(root_child0_child0_child0.getComputedLeft()).toBe(100); + expect(root_child0_child0_child0.getComputedTop()).toBe(50); + expect(root_child0_child0_child0.getComputedWidth()).toBe(50); + expect(root_child0_child0_child0.getComputedHeight()).toBe(50); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); +test('absolute_layout_border', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setPositionType(PositionType.Absolute); + + const root_child0 = Yoga.Node.create(config); + root_child0.setMargin(Edge.Left, 10); + root_child0.setMargin(Edge.Top, 10); + root_child0.setMargin(Edge.Right, 10); + root_child0.setMargin(Edge.Bottom, 10); + root_child0.setWidth(200); + root_child0.setHeight(200); + root.insertChild(root_child0, 0); + + const root_child0_child0 = Yoga.Node.create(config); + root_child0_child0.setPositionType(PositionType.Static); + root_child0_child0.setBorder(Edge.Left, 10); + root_child0_child0.setBorder(Edge.Top, 10); + root_child0_child0.setBorder(Edge.Right, 10); + root_child0_child0.setBorder(Edge.Bottom, 10); + root_child0_child0.setWidth(200); + root_child0_child0.setHeight(200); + root_child0.insertChild(root_child0_child0, 0); + + const root_child0_child0_child0 = Yoga.Node.create(config); + root_child0_child0_child0.setPositionType(PositionType.Absolute); + root_child0_child0_child0.setWidth(50); + root_child0_child0_child0.setHeight(50); + root_child0_child0.insertChild(root_child0_child0_child0, 0); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(220); + expect(root.getComputedHeight()).toBe(220); + + expect(root_child0.getComputedLeft()).toBe(10); + expect(root_child0.getComputedTop()).toBe(10); + expect(root_child0.getComputedWidth()).toBe(200); + expect(root_child0.getComputedHeight()).toBe(200); + + expect(root_child0_child0.getComputedLeft()).toBe(0); + expect(root_child0_child0.getComputedTop()).toBe(0); + expect(root_child0_child0.getComputedWidth()).toBe(200); + expect(root_child0_child0.getComputedHeight()).toBe(200); + + expect(root_child0_child0_child0.getComputedLeft()).toBe(10); + expect(root_child0_child0_child0.getComputedTop()).toBe(10); + expect(root_child0_child0_child0.getComputedWidth()).toBe(50); + expect(root_child0_child0_child0.getComputedHeight()).toBe(50); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(220); + expect(root.getComputedHeight()).toBe(220); + + expect(root_child0.getComputedLeft()).toBe(10); + expect(root_child0.getComputedTop()).toBe(10); + expect(root_child0.getComputedWidth()).toBe(200); + expect(root_child0.getComputedHeight()).toBe(200); + + expect(root_child0_child0.getComputedLeft()).toBe(0); + expect(root_child0_child0.getComputedTop()).toBe(0); + expect(root_child0_child0.getComputedWidth()).toBe(200); + expect(root_child0_child0.getComputedHeight()).toBe(200); + + expect(root_child0_child0_child0.getComputedLeft()).toBe(140); + expect(root_child0_child0_child0.getComputedTop()).toBe(10); + expect(root_child0_child0_child0.getComputedWidth()).toBe(50); + expect(root_child0_child0_child0.getComputedHeight()).toBe(50); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); test('absolute_layout_column_reverse_margin_border', () => { const config = Yoga.Config.create(); let root; diff --git a/tests/generated/YGAbsolutePositionTest.cpp b/tests/generated/YGAbsolutePositionTest.cpp index 740dc26660..cccea82205 100644 --- a/tests/generated/YGAbsolutePositionTest.cpp +++ b/tests/generated/YGAbsolutePositionTest.cpp @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. * * clang-format off - * @generated SignedSource<<43fe6d73966bf8e4694c57420a0fb9d9>> + * @generated SignedSource<<82fd46be79c6a75de5216cce4ad10095>> * generated by gentest/gentest-driver.ts from gentest/fixtures/YGAbsolutePositionTest.html */ @@ -1371,6 +1371,164 @@ TEST(YogaTest, absolute_layout_padding_bottom) { YGConfigFree(config); } +TEST(YogaTest, absolute_layout_padding) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetMargin(root_child0, YGEdgeLeft, 10); + YGNodeStyleSetMargin(root_child0, YGEdgeTop, 10); + YGNodeStyleSetMargin(root_child0, YGEdgeRight, 10); + YGNodeStyleSetMargin(root_child0, YGEdgeBottom, 10); + YGNodeStyleSetWidth(root_child0, 200); + YGNodeStyleSetHeight(root_child0, 200); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetPositionType(root_child0_child0, YGPositionTypeStatic); + YGNodeStyleSetPadding(root_child0_child0, YGEdgeLeft, 50); + YGNodeStyleSetPadding(root_child0_child0, YGEdgeTop, 50); + YGNodeStyleSetPadding(root_child0_child0, YGEdgeRight, 50); + YGNodeStyleSetPadding(root_child0_child0, YGEdgeBottom, 50); + YGNodeStyleSetWidth(root_child0_child0, 200); + YGNodeStyleSetHeight(root_child0_child0, 200); + YGNodeInsertChild(root_child0, root_child0_child0, 0); + + const YGNodeRef root_child0_child0_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetPositionType(root_child0_child0_child0, YGPositionTypeAbsolute); + YGNodeStyleSetWidth(root_child0_child0_child0, 50); + YGNodeStyleSetHeight(root_child0_child0_child0, 50); + YGNodeInsertChild(root_child0_child0, root_child0_child0_child0, 0); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(220, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(220, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child0_child0)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root_child0_child0)); + + ASSERT_FLOAT_EQ(50, YGNodeLayoutGetLeft(root_child0_child0_child0)); + ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child0_child0_child0)); + ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0_child0_child0)); + ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0_child0_child0)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(220, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(220, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child0_child0)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root_child0_child0)); + + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetLeft(root_child0_child0_child0)); + ASSERT_FLOAT_EQ(50, YGNodeLayoutGetTop(root_child0_child0_child0)); + ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0_child0_child0)); + ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0_child0_child0)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} + +TEST(YogaTest, absolute_layout_border) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetMargin(root_child0, YGEdgeLeft, 10); + YGNodeStyleSetMargin(root_child0, YGEdgeTop, 10); + YGNodeStyleSetMargin(root_child0, YGEdgeRight, 10); + YGNodeStyleSetMargin(root_child0, YGEdgeBottom, 10); + YGNodeStyleSetWidth(root_child0, 200); + YGNodeStyleSetHeight(root_child0, 200); + YGNodeInsertChild(root, root_child0, 0); + + const YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetPositionType(root_child0_child0, YGPositionTypeStatic); + YGNodeStyleSetBorder(root_child0_child0, YGEdgeLeft, 10); + YGNodeStyleSetBorder(root_child0_child0, YGEdgeTop, 10); + YGNodeStyleSetBorder(root_child0_child0, YGEdgeRight, 10); + YGNodeStyleSetBorder(root_child0_child0, YGEdgeBottom, 10); + YGNodeStyleSetWidth(root_child0_child0, 200); + YGNodeStyleSetHeight(root_child0_child0, 200); + YGNodeInsertChild(root_child0, root_child0_child0, 0); + + const YGNodeRef root_child0_child0_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetPositionType(root_child0_child0_child0, YGPositionTypeAbsolute); + YGNodeStyleSetWidth(root_child0_child0_child0, 50); + YGNodeStyleSetHeight(root_child0_child0_child0, 50); + YGNodeInsertChild(root_child0_child0, root_child0_child0_child0, 0); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(220, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(220, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child0_child0)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root_child0_child0)); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child0_child0_child0)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child0_child0_child0)); + ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0_child0_child0)); + ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0_child0_child0)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(220, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(220, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root_child0)); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child0_child0)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root_child0_child0)); + + ASSERT_FLOAT_EQ(140, YGNodeLayoutGetLeft(root_child0_child0_child0)); + ASSERT_FLOAT_EQ(10, YGNodeLayoutGetTop(root_child0_child0_child0)); + ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0_child0_child0)); + ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0_child0_child0)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} + TEST(YogaTest, absolute_layout_column_reverse_margin_border) { const YGConfigRef config = YGConfigNew(); From eb1ca8ec7a5803ae3bad842c6c938c3d65a34648 Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Mon, 13 May 2024 17:12:49 -0700 Subject: [PATCH 09/24] Sanitize measure function results Summary: X-link: https://github.com/facebook/react-native/pull/44557 We've started seeing assertion failures in Yoga where a `NaN` value makes its way to an `availableHeight` constraint when measuring Litho tree. Because it's only happening on Litho, I have some suspicion this might be originating from a Litho-specific measure function. This adds sanitization in Yoga to measure function results, where we will log an error, and set size to zero, if either dimension ends up being negative of `NaN`. This doesn't really help track down where the error was happening, but Yoga doesn't have great context to show this to begin with. If we see this is issue, next steps would be Litho internal intrumentation to find culprit. Changelog: [Internal] Reviewed By: joevilches Differential Revision: D57285584 fbshipit-source-id: 935fcdd28c05bbac0d73e1c7654ae11a74898537 --- yoga/node/Node.cpp | 26 ++++++++++++++++++++++---- yoga/node/Node.h | 4 ++-- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/yoga/node/Node.cpp b/yoga/node/Node.cpp index adb63663be..d0a5567a6b 100644 --- a/yoga/node/Node.cpp +++ b/yoga/node/Node.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include @@ -49,12 +50,29 @@ Node::Node(Node&& node) noexcept } YGSize Node::measure( - float width, + float availableWidth, MeasureMode widthMode, - float height, + float availableHeight, MeasureMode heightMode) { - return measureFunc_( - this, width, unscopedEnum(widthMode), height, unscopedEnum(heightMode)); + const auto size = measureFunc_( + this, + availableWidth, + unscopedEnum(widthMode), + availableHeight, + unscopedEnum(heightMode)); + + if (yoga::isUndefined(size.height) || size.height < 0 || + yoga::isUndefined(size.width) || size.width < 0) { + yoga::log( + this, + LogLevel::Error, + "Measure function returned an invalid dimension to Yoga: [width=%f, height=%f]", + size.width, + size.height); + return {.width = 0.0f, .height = 0.0f}; + } + + return size; } float Node::baseline(float width, float height) const { diff --git a/yoga/node/Node.h b/yoga/node/Node.h index 8f5ee591cc..cd029b40d4 100644 --- a/yoga/node/Node.h +++ b/yoga/node/Node.h @@ -66,9 +66,9 @@ class YG_EXPORT Node : public ::YGNode { } YGSize measure( - float width, + float availableWidth, MeasureMode widthMode, - float height, + float availableHeight, MeasureMode heightMode); bool hasBaselineFunc() const noexcept { From 24f0c56cce35f33678d9d5cb7897d4699cc56079 Mon Sep 17 00:00:00 2001 From: Gilad Bar Date: Tue, 14 May 2024 07:13:21 -0700 Subject: [PATCH 10/24] Revert D57285584: Sanitize measure function results Differential Revision: D57285584 Original commit changeset: 935fcdd28c05 Original Phabricator Diff: D57285584 fbshipit-source-id: 3c5d7ccefd608885af4d6f08c0d1cd00553f1f34 --- yoga/node/Node.cpp | 26 ++++---------------------- yoga/node/Node.h | 4 ++-- 2 files changed, 6 insertions(+), 24 deletions(-) diff --git a/yoga/node/Node.cpp b/yoga/node/Node.cpp index d0a5567a6b..adb63663be 100644 --- a/yoga/node/Node.cpp +++ b/yoga/node/Node.cpp @@ -10,7 +10,6 @@ #include #include -#include #include #include @@ -50,29 +49,12 @@ Node::Node(Node&& node) noexcept } YGSize Node::measure( - float availableWidth, + float width, MeasureMode widthMode, - float availableHeight, + float height, MeasureMode heightMode) { - const auto size = measureFunc_( - this, - availableWidth, - unscopedEnum(widthMode), - availableHeight, - unscopedEnum(heightMode)); - - if (yoga::isUndefined(size.height) || size.height < 0 || - yoga::isUndefined(size.width) || size.width < 0) { - yoga::log( - this, - LogLevel::Error, - "Measure function returned an invalid dimension to Yoga: [width=%f, height=%f]", - size.width, - size.height); - return {.width = 0.0f, .height = 0.0f}; - } - - return size; + return measureFunc_( + this, width, unscopedEnum(widthMode), height, unscopedEnum(heightMode)); } float Node::baseline(float width, float height) const { diff --git a/yoga/node/Node.h b/yoga/node/Node.h index cd029b40d4..8f5ee591cc 100644 --- a/yoga/node/Node.h +++ b/yoga/node/Node.h @@ -66,9 +66,9 @@ class YG_EXPORT Node : public ::YGNode { } YGSize measure( - float availableWidth, + float width, MeasureMode widthMode, - float availableHeight, + float height, MeasureMode heightMode); bool hasBaselineFunc() const noexcept { From fb53cb7443edd286c7d26c0760d5d8967c2809ca Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Fri, 17 May 2024 19:12:13 -0700 Subject: [PATCH 11/24] Reland: Sanitize measure function results Summary: D57285584 was reverted because we have service code with a faulty measure function, and adding logging to Yoga when invalid measurements were received was enough to spike error rate to elevated levels and block release. This is a reland of the below change, with a couple modifications: 1. We log warnings instead of errors, which from what I heard, shouldn't block release, but should still make signal 2. We only zero the dimension which was NaN, to preserve exact behavior ## Original We've started seeing assertion failures in Yoga where a `NaN` value makes its way to an `availableHeight` constraint when measuring Litho tree. Because it's only happening on Litho, I have some suspicion this might be originating from a Litho-specific measure function. This adds sanitization in Yoga to measure function results, where we will log an error, and set size to zero, if either dimension ends up being negative of `NaN`. This doesn't really help track down where the error was happening, but Yoga doesn't have great context to show this to begin with. If we see this is issue, next steps would be Litho internal intrumentation to find culprit. Changelog: [Internal] Reviewed By: sbuggay Differential Revision: D57473295 fbshipit-source-id: 979f1b9a51f5550a8d3ca534276ec191a3cb7b9e --- yoga/node/Node.cpp | 28 ++++++++++++++++++++++++---- yoga/node/Node.h | 4 ++-- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/yoga/node/Node.cpp b/yoga/node/Node.cpp index adb63663be..31ad09f8c9 100644 --- a/yoga/node/Node.cpp +++ b/yoga/node/Node.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include @@ -49,12 +50,31 @@ Node::Node(Node&& node) noexcept } YGSize Node::measure( - float width, + float availableWidth, MeasureMode widthMode, - float height, + float availableHeight, MeasureMode heightMode) { - return measureFunc_( - this, width, unscopedEnum(widthMode), height, unscopedEnum(heightMode)); + const auto size = measureFunc_( + this, + availableWidth, + unscopedEnum(widthMode), + availableHeight, + unscopedEnum(heightMode)); + + if (yoga::isUndefined(size.height) || size.height < 0 || + yoga::isUndefined(size.width) || size.width < 0) { + yoga::log( + this, + LogLevel::Warn, + "Measure function returned an invalid dimension to Yoga: [width=%f, height=%f]", + size.width, + size.height); + return { + .width = maxOrDefined(0.0f, size.width), + .height = maxOrDefined(0.0f, size.height)}; + } + + return size; } float Node::baseline(float width, float height) const { diff --git a/yoga/node/Node.h b/yoga/node/Node.h index 8f5ee591cc..cd029b40d4 100644 --- a/yoga/node/Node.h +++ b/yoga/node/Node.h @@ -66,9 +66,9 @@ class YG_EXPORT Node : public ::YGNode { } YGSize measure( - float width, + float availableWidth, MeasureMode widthMode, - float height, + float availableHeight, MeasureMode heightMode); bool hasBaselineFunc() const noexcept { From 72b7e5b5cfbbd9e78023bf8f79959928ddb031c2 Mon Sep 17 00:00:00 2001 From: Joe Vilches Date: Mon, 10 Jun 2024 18:25:19 -0700 Subject: [PATCH 12/24] Fix issue where % width would be wrong if physical and relative padding defined on parent (#1662) Summary: X-link: https://github.com/facebook/react-native/pull/44791 Pull Request resolved: https://github.com/facebook/yoga/pull/1662 This should fix https://github.com/facebook/yoga/issues/1657. Rather insidious bug but we had code like ``` // The total padding/border for a given axis does not depend on the direction // so hardcoding LTR here to avoid piping direction to this function return node->style().computeInlineStartPaddingAndBorder( axis, Direction::LTR, widthSize) + node->style().computeInlineEndPaddingAndBorder( axis, Direction::LTR, widthSize); ``` That comment is NOT true if someone sets both the physical edge and relative edge. So like paddingLeft and paddingEnd for RTL. This diff simply pipes the direction to that spot to use instead of hardcoding LTR. Every file changed is just to pipe `direction`. Changelog: [Internal] Reviewed By: NickGerleman Differential Revision: D58169843 fbshipit-source-id: 5b4854dddc019285076bd06955557edf73ef7ec5 --- gentest/fixtures/YGPaddingTest.html | 11 ++- .../com/facebook/yoga/YGPaddingTest.java | 44 ++++++++++- .../tests/generated/YGPaddingTest.test.ts | 49 +++++++++++- tests/generated/YGPaddingTest.cpp | 45 ++++++++++- yoga/algorithm/AbsoluteLayout.cpp | 2 + yoga/algorithm/BoundAxis.h | 10 +-- yoga/algorithm/CalculateLayout.cpp | 76 +++++++++++++++---- 7 files changed, 212 insertions(+), 25 deletions(-) diff --git a/gentest/fixtures/YGPaddingTest.html b/gentest/fixtures/YGPaddingTest.html index f1616fe408..ef5b553992 100644 --- a/gentest/fixtures/YGPaddingTest.html +++ b/gentest/fixtures/YGPaddingTest.html @@ -13,10 +13,17 @@
-
+
-
+
+ +
+
+
diff --git a/java/tests/com/facebook/yoga/YGPaddingTest.java b/java/tests/com/facebook/yoga/YGPaddingTest.java index 4b989989c8..636208583c 100644 --- a/java/tests/com/facebook/yoga/YGPaddingTest.java +++ b/java/tests/com/facebook/yoga/YGPaddingTest.java @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<176b6a98b0b08ef3f3fd20289e8fd089>> + * @generated SignedSource<> * generated by gentest/gentest-driver.ts from gentest/fixtures/YGPaddingTest.html */ @@ -273,6 +273,48 @@ public void test_child_with_padding_align_end() { assertEquals(100f, root_child0.getLayoutHeight(), 0.0f); } + @Test + public void test_physical_and_relative_edge_defined() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setPadding(YogaEdge.LEFT, 20); + root.setPadding(YogaEdge.END, 50); + root.setWidth(200f); + root.setHeight(200f); + + final YogaNode root_child0 = createNode(config); + root_child0.setWidthPercent(100f); + root_child0.setHeight(50f); + root.addChildAt(root_child0, 0); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(200f, root.getLayoutWidth(), 0.0f); + assertEquals(200f, root.getLayoutHeight(), 0.0f); + + assertEquals(20f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(130f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(50f, root_child0.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(200f, root.getLayoutWidth(), 0.0f); + assertEquals(200f, root.getLayoutHeight(), 0.0f); + + assertEquals(50f, root_child0.getLayoutX(), 0.0f); + assertEquals(0f, root_child0.getLayoutY(), 0.0f); + assertEquals(150f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(50f, root_child0.getLayoutHeight(), 0.0f); + } + private YogaNode createNode(YogaConfig config) { return mNodeFactory.create(config); } diff --git a/javascript/tests/generated/YGPaddingTest.test.ts b/javascript/tests/generated/YGPaddingTest.test.ts index d208adfff5..89b2e34933 100644 --- a/javascript/tests/generated/YGPaddingTest.test.ts +++ b/javascript/tests/generated/YGPaddingTest.test.ts @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<688d750852e836fc6403042d89d5ab51>> * generated by gentest/gentest-driver.ts from gentest/fixtures/YGPaddingTest.html */ @@ -303,3 +303,50 @@ test('child_with_padding_align_end', () => { config.free(); } }); +test('physical_and_relative_edge_defined', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setPositionType(PositionType.Absolute); + root.setPadding(Edge.Left, 20); + root.setPadding(Edge.End, 50); + root.setWidth(200); + root.setHeight(200); + + const root_child0 = Yoga.Node.create(config); + root_child0.setWidth("100%"); + root_child0.setHeight(50); + root.insertChild(root_child0, 0); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(200); + expect(root.getComputedHeight()).toBe(200); + + expect(root_child0.getComputedLeft()).toBe(20); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(130); + expect(root_child0.getComputedHeight()).toBe(50); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(200); + expect(root.getComputedHeight()).toBe(200); + + expect(root_child0.getComputedLeft()).toBe(50); + expect(root_child0.getComputedTop()).toBe(0); + expect(root_child0.getComputedWidth()).toBe(150); + expect(root_child0.getComputedHeight()).toBe(50); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); diff --git a/tests/generated/YGPaddingTest.cpp b/tests/generated/YGPaddingTest.cpp index 10b10e2e58..6d734f4f5a 100644 --- a/tests/generated/YGPaddingTest.cpp +++ b/tests/generated/YGPaddingTest.cpp @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. * * clang-format off - * @generated SignedSource<<32fe835176961bebfe905dfd47874f5c>> + * @generated SignedSource<> * generated by gentest/gentest-driver.ts from gentest/fixtures/YGPaddingTest.html */ @@ -264,3 +264,46 @@ TEST(YogaTest, child_with_padding_align_end) { YGConfigFree(config); } + +TEST(YogaTest, physical_and_relative_edge_defined) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetPadding(root, YGEdgeLeft, 20); + YGNodeStyleSetPadding(root, YGEdgeEnd, 50); + YGNodeStyleSetWidth(root, 200); + YGNodeStyleSetHeight(root, 200); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetWidthPercent(root_child0, 100); + YGNodeStyleSetHeight(root_child0, 50); + YGNodeInsertChild(root, root_child0, 0); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(20, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(130, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(50, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(150, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} diff --git a/yoga/algorithm/AbsoluteLayout.cpp b/yoga/algorithm/AbsoluteLayout.cpp index 32a13c9d43..81dd9128ad 100644 --- a/yoga/algorithm/AbsoluteLayout.cpp +++ b/yoga/algorithm/AbsoluteLayout.cpp @@ -342,6 +342,7 @@ void layoutAbsoluteChild( childWidth = boundAxis( child, FlexDirection::Row, + direction, childWidth, containingBlockWidth, containingBlockWidth); @@ -373,6 +374,7 @@ void layoutAbsoluteChild( childHeight = boundAxis( child, FlexDirection::Column, + direction, childHeight, containingBlockHeight, containingBlockWidth); diff --git a/yoga/algorithm/BoundAxis.h b/yoga/algorithm/BoundAxis.h index 482a73742d..dee062a00b 100644 --- a/yoga/algorithm/BoundAxis.h +++ b/yoga/algorithm/BoundAxis.h @@ -19,13 +19,12 @@ namespace facebook::yoga { inline float paddingAndBorderForAxis( const yoga::Node* const node, const FlexDirection axis, + const Direction direction, const float widthSize) { - // The total padding/border for a given axis does not depend on the direction - // so hardcoding LTR here to avoid piping direction to this function return node->style().computeInlineStartPaddingAndBorder( - axis, Direction::LTR, widthSize) + + axis, direction, widthSize) + node->style().computeInlineEndPaddingAndBorder( - axis, Direction::LTR, widthSize); + axis, direction, widthSize); } inline FloatOptional boundAxisWithinMinAndMax( @@ -60,13 +59,14 @@ inline FloatOptional boundAxisWithinMinAndMax( inline float boundAxis( const yoga::Node* const node, const FlexDirection axis, + const Direction direction, const float value, const float axisSize, const float widthSize) { return yoga::maxOrDefined( boundAxisWithinMinAndMax(node, axis, FloatOptional{value}, axisSize) .unwrap(), - paddingAndBorderForAxis(node, axis, widthSize)); + paddingAndBorderForAxis(node, axis, direction, widthSize)); } } // namespace facebook::yoga diff --git a/yoga/algorithm/CalculateLayout.cpp b/yoga/algorithm/CalculateLayout.cpp index 0d34129ba0..b54eeeeca3 100644 --- a/yoga/algorithm/CalculateLayout.cpp +++ b/yoga/algorithm/CalculateLayout.cpp @@ -97,23 +97,25 @@ static void computeFlexBasisForChild( (child->getConfig()->isExperimentalFeatureEnabled( ExperimentalFeature::WebFlexBasis) && child->getLayout().computedFlexBasisGeneration != generationCount)) { - const FloatOptional paddingAndBorder = - FloatOptional(paddingAndBorderForAxis(child, mainAxis, ownerWidth)); + const FloatOptional paddingAndBorder = FloatOptional( + paddingAndBorderForAxis(child, mainAxis, direction, ownerWidth)); child->setLayoutComputedFlexBasis( yoga::maxOrDefined(resolvedFlexBasis, paddingAndBorder)); } } else if (isMainAxisRow && isRowStyleDimDefined) { // The width is definite, so use that as the flex basis. - const FloatOptional paddingAndBorder = FloatOptional( - paddingAndBorderForAxis(child, FlexDirection::Row, ownerWidth)); + const FloatOptional paddingAndBorder = + FloatOptional(paddingAndBorderForAxis( + child, FlexDirection::Row, direction, ownerWidth)); child->setLayoutComputedFlexBasis(yoga::maxOrDefined( child->getResolvedDimension(Dimension::Width).resolve(ownerWidth), paddingAndBorder)); } else if (!isMainAxisRow && isColumnStyleDimDefined) { // The height is definite, so use that as the flex basis. - const FloatOptional paddingAndBorder = FloatOptional( - paddingAndBorderForAxis(child, FlexDirection::Column, ownerWidth)); + const FloatOptional paddingAndBorder = + FloatOptional(paddingAndBorderForAxis( + child, FlexDirection::Column, direction, ownerWidth)); child->setLayoutComputedFlexBasis(yoga::maxOrDefined( child->getResolvedDimension(Dimension::Height).resolve(ownerHeight), paddingAndBorder)); @@ -244,13 +246,14 @@ static void computeFlexBasisForChild( child->setLayoutComputedFlexBasis(FloatOptional(yoga::maxOrDefined( child->getLayout().measuredDimension(dimension(mainAxis)), - paddingAndBorderForAxis(child, mainAxis, ownerWidth)))); + paddingAndBorderForAxis(child, mainAxis, direction, ownerWidth)))); } child->setLayoutComputedFlexBasisGeneration(generationCount); } static void measureNodeWithMeasureFunc( yoga::Node* const node, + const Direction direction, float availableWidth, float availableHeight, const SizingMode widthSizingMode, @@ -292,12 +295,18 @@ static void measureNodeWithMeasureFunc( // Don't bother sizing the text if both dimensions are already defined. node->setLayoutMeasuredDimension( boundAxis( - node, FlexDirection::Row, availableWidth, ownerWidth, ownerWidth), + node, + FlexDirection::Row, + direction, + availableWidth, + ownerWidth, + ownerWidth), Dimension::Width); node->setLayoutMeasuredDimension( boundAxis( node, FlexDirection::Column, + direction, availableHeight, ownerHeight, ownerWidth), @@ -330,6 +339,7 @@ static void measureNodeWithMeasureFunc( boundAxis( node, FlexDirection::Row, + direction, (widthSizingMode == SizingMode::MaxContent || widthSizingMode == SizingMode::FitContent) ? measuredSize.width + paddingAndBorderAxisRow @@ -342,6 +352,7 @@ static void measureNodeWithMeasureFunc( boundAxis( node, FlexDirection::Column, + direction, (heightSizingMode == SizingMode::MaxContent || heightSizingMode == SizingMode::FitContent) ? measuredSize.height + paddingAndBorderAxisColumn @@ -356,6 +367,7 @@ static void measureNodeWithMeasureFunc( // or the minimum size as indicated by the padding and border sizes. static void measureNodeWithoutChildren( yoga::Node* const node, + const Direction direction, const float availableWidth, const float availableHeight, const SizingMode widthSizingMode, @@ -372,7 +384,8 @@ static void measureNodeWithoutChildren( layout.border(PhysicalEdge::Left) + layout.border(PhysicalEdge::Right); } node->setLayoutMeasuredDimension( - boundAxis(node, FlexDirection::Row, width, ownerWidth, ownerWidth), + boundAxis( + node, FlexDirection::Row, direction, width, ownerWidth, ownerWidth), Dimension::Width); float height = availableHeight; @@ -383,12 +396,19 @@ static void measureNodeWithoutChildren( layout.border(PhysicalEdge::Top) + layout.border(PhysicalEdge::Bottom); } node->setLayoutMeasuredDimension( - boundAxis(node, FlexDirection::Column, height, ownerHeight, ownerWidth), + boundAxis( + node, + FlexDirection::Column, + direction, + height, + ownerHeight, + ownerWidth), Dimension::Height); } static bool measureNodeWithFixedSize( yoga::Node* const node, + const Direction direction, const float availableWidth, const float availableHeight, const SizingMode widthSizingMode, @@ -405,6 +425,7 @@ static bool measureNodeWithFixedSize( boundAxis( node, FlexDirection::Row, + direction, yoga::isUndefined(availableWidth) || (widthSizingMode == SizingMode::FitContent && availableWidth < 0.0f) @@ -418,6 +439,7 @@ static bool measureNodeWithFixedSize( boundAxis( node, FlexDirection::Column, + direction, yoga::isUndefined(availableHeight) || (heightSizingMode == SizingMode::FitContent && availableHeight < 0.0f) @@ -619,6 +641,7 @@ static float distributeFreeSpaceSecondPass( updatedMainSize = boundAxis( currentLineChild, mainAxis, + direction, childSize, availableInnerMainDim, availableInnerWidth); @@ -633,6 +656,7 @@ static float distributeFreeSpaceSecondPass( updatedMainSize = boundAxis( currentLineChild, mainAxis, + direction, childFlexBasis + flexLine.layout.remainingFreeSpace / flexLine.layout.totalFlexGrowFactors * flexGrowFactor, @@ -756,6 +780,7 @@ static float distributeFreeSpaceSecondPass( // is removed from the remaingfreespace. static void distributeFreeSpaceFirstPass( FlexLine& flexLine, + const Direction direction, const FlexDirection mainAxis, const float mainAxisownerSize, const float availableInnerMainDim, @@ -788,6 +813,7 @@ static void distributeFreeSpaceFirstPass( boundMainSize = boundAxis( currentLineChild, mainAxis, + direction, baseMainSize, availableInnerMainDim, availableInnerWidth); @@ -816,6 +842,7 @@ static void distributeFreeSpaceFirstPass( boundMainSize = boundAxis( currentLineChild, mainAxis, + direction, baseMainSize, availableInnerMainDim, availableInnerWidth); @@ -878,6 +905,7 @@ static void resolveFlexibleLength( // First pass: detect the flex items whose min/max constraints trigger distributeFreeSpaceFirstPass( flexLine, + direction, mainAxis, mainAxisownerSize, availableInnerMainDim, @@ -1261,6 +1289,7 @@ static void calculateLayoutImpl( if (node->hasMeasureFunc()) { measureNodeWithMeasureFunc( node, + direction, availableWidth - marginAxisRow, availableHeight - marginAxisColumn, widthSizingMode, @@ -1276,6 +1305,7 @@ static void calculateLayoutImpl( if (childCount == 0) { measureNodeWithoutChildren( node, + direction, availableWidth - marginAxisRow, availableHeight - marginAxisColumn, widthSizingMode, @@ -1290,6 +1320,7 @@ static void calculateLayoutImpl( if (!performLayout && measureNodeWithFixedSize( node, + direction, availableWidth - marginAxisRow, availableHeight - marginAxisColumn, widthSizingMode, @@ -1316,9 +1347,9 @@ static void calculateLayoutImpl( const float crossAxisownerSize = isMainAxisRow ? ownerHeight : ownerWidth; const float paddingAndBorderAxisMain = - paddingAndBorderForAxis(node, mainAxis, ownerWidth); + paddingAndBorderForAxis(node, mainAxis, direction, ownerWidth); const float paddingAndBorderAxisCross = - paddingAndBorderForAxis(node, crossAxis, ownerWidth); + paddingAndBorderForAxis(node, crossAxis, direction, ownerWidth); const float leadingPaddingAndBorderCross = node->style().computeFlexStartPaddingAndBorder( crossAxis, direction, ownerWidth); @@ -1539,6 +1570,7 @@ static void calculateLayoutImpl( boundAxis( node, crossAxis, + direction, flexLine.layout.crossDim + paddingAndBorderAxisCross, crossAxisownerSize, ownerWidth) - @@ -1559,6 +1591,7 @@ static void calculateLayoutImpl( boundAxis( node, crossAxis, + direction, flexLine.layout.crossDim + paddingAndBorderAxisCross, crossAxisownerSize, ownerWidth) - @@ -1733,8 +1766,13 @@ static void calculateLayoutImpl( .unwrap() : totalLineCrossDim + paddingAndBorderAxisCross; - const float innerCrossDim = - boundAxis(node, crossAxis, unclampedCrossDim, ownerHeight, ownerWidth) - + const float innerCrossDim = boundAxis( + node, + crossAxis, + direction, + unclampedCrossDim, + ownerHeight, + ownerWidth) - paddingAndBorderAxisCross; const float remainingAlignContentDim = innerCrossDim - totalLineCrossDim; @@ -1935,6 +1973,7 @@ static void calculateLayoutImpl( boundAxis( node, FlexDirection::Row, + direction, availableWidth - marginAxisRow, ownerWidth, ownerWidth), @@ -1944,6 +1983,7 @@ static void calculateLayoutImpl( boundAxis( node, FlexDirection::Column, + direction, availableHeight - marginAxisColumn, ownerHeight, ownerWidth), @@ -1958,7 +1998,12 @@ static void calculateLayoutImpl( // doesn't go below the padding and border amount. node->setLayoutMeasuredDimension( boundAxis( - node, mainAxis, maxLineMainDim, mainAxisownerSize, ownerWidth), + node, + mainAxis, + direction, + maxLineMainDim, + mainAxisownerSize, + ownerWidth), dimension(mainAxis)); } else if ( @@ -1987,6 +2032,7 @@ static void calculateLayoutImpl( boundAxis( node, crossAxis, + direction, totalLineCrossDim + paddingAndBorderAxisCross, crossAxisownerSize, ownerWidth), From 289b62732bb39931c47136e8c54ca8528a1da73e Mon Sep 17 00:00:00 2001 From: Joe Vilches Date: Mon, 10 Jun 2024 18:25:19 -0700 Subject: [PATCH 13/24] Fix issue with alternating flex direction and percent postions (#1663) Summary: X-link: https://github.com/facebook/react-native/pull/44792 Pull Request resolved: https://github.com/facebook/yoga/pull/1663 Fixing https://github.com/facebook/yoga/issues/1658. We had a problem where if a child had a different flex direction than its parent, and it also set a position as a percent, it would look at the wrong axis to evaluate the percent. What was happening was we were passing in the container's mainAxis size and crossAxis size to use to evaluate the position size if it was a percent. However, we matched these sizes with the main/cross axis of the child - which is wrong if the flex direction is different. I changed it so that the function just takes in ownerWidth and ownerHeight then calls isRow to determine which one to use for the main/cross axis position. This reduces the ambiguity quite a bit imo. Changelog: [Internal] Reviewed By: NickGerleman Differential Revision: D58172416 fbshipit-source-id: eafd8069e03493fc56c41a76879d1ad9b7e9236d --- gentest/fixtures/YGFlexDirectionTest.html | 5 ++ .../facebook/yoga/YGFlexDirectionTest.java | 45 ++++++++++++++++- .../generated/YGFlexDirectionTest.test.ts | 50 ++++++++++++++++++- tests/generated/YGFlexDirectionTest.cpp | 46 ++++++++++++++++- yoga/algorithm/CalculateLayout.cpp | 9 +--- yoga/node/Node.cpp | 17 ++++--- yoga/node/Node.h | 6 +-- 7 files changed, 156 insertions(+), 22 deletions(-) diff --git a/gentest/fixtures/YGFlexDirectionTest.html b/gentest/fixtures/YGFlexDirectionTest.html index 70f7c06706..14e7e3ef1d 100644 --- a/gentest/fixtures/YGFlexDirectionTest.html +++ b/gentest/fixtures/YGFlexDirectionTest.html @@ -400,3 +400,8 @@
+ +
+
+
+
diff --git a/java/tests/com/facebook/yoga/YGFlexDirectionTest.java b/java/tests/com/facebook/yoga/YGFlexDirectionTest.java index 2e8561ee25..c711e9ab9f 100644 --- a/java/tests/com/facebook/yoga/YGFlexDirectionTest.java +++ b/java/tests/com/facebook/yoga/YGFlexDirectionTest.java @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<4007f83eb3e84f3ee3fcf46d6d7be3bc>> + * @generated SignedSource<<5bb2b698f40c9c95737a77fff84f7700>> * generated by gentest/gentest-driver.ts from gentest/fixtures/YGFlexDirectionTest.html */ @@ -4242,6 +4242,49 @@ public void test_flex_direction_row_reverse_inner_padding_end() { assertEquals(100f, root_child0_child2.getLayoutHeight(), 0.0f); } + @Test + public void test_flex_direction_alternating_with_percent() { + YogaConfig config = YogaConfigFactory.create(); + + final YogaNode root = createNode(config); + root.setPositionType(YogaPositionType.ABSOLUTE); + root.setWidth(200f); + root.setHeight(300f); + + final YogaNode root_child0 = createNode(config); + root_child0.setFlexDirection(YogaFlexDirection.ROW); + root_child0.setPositionPercent(YogaEdge.LEFT, 10f); + root_child0.setPositionPercent(YogaEdge.TOP, 10f); + root_child0.setWidthPercent(50f); + root_child0.setHeightPercent(50f); + root.addChildAt(root_child0, 0); + root.setDirection(YogaDirection.LTR); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(200f, root.getLayoutWidth(), 0.0f); + assertEquals(300f, root.getLayoutHeight(), 0.0f); + + assertEquals(20f, root_child0.getLayoutX(), 0.0f); + assertEquals(30f, root_child0.getLayoutY(), 0.0f); + assertEquals(100f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(150f, root_child0.getLayoutHeight(), 0.0f); + + root.setDirection(YogaDirection.RTL); + root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); + + assertEquals(0f, root.getLayoutX(), 0.0f); + assertEquals(0f, root.getLayoutY(), 0.0f); + assertEquals(200f, root.getLayoutWidth(), 0.0f); + assertEquals(300f, root.getLayoutHeight(), 0.0f); + + assertEquals(120f, root_child0.getLayoutX(), 0.0f); + assertEquals(30f, root_child0.getLayoutY(), 0.0f); + assertEquals(100f, root_child0.getLayoutWidth(), 0.0f); + assertEquals(150f, root_child0.getLayoutHeight(), 0.0f); + } + private YogaNode createNode(YogaConfig config) { return mNodeFactory.create(config); } diff --git a/javascript/tests/generated/YGFlexDirectionTest.test.ts b/javascript/tests/generated/YGFlexDirectionTest.test.ts index 0595543358..51b90d8892 100644 --- a/javascript/tests/generated/YGFlexDirectionTest.test.ts +++ b/javascript/tests/generated/YGFlexDirectionTest.test.ts @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<61e2e5c148d45c0bbb6bc886991bf3b9>> + * @generated SignedSource<<5aa80de7d8424e35b5b1b205ff44f4cc>> * generated by gentest/gentest-driver.ts from gentest/fixtures/YGFlexDirectionTest.html */ @@ -4510,3 +4510,51 @@ test('flex_direction_row_reverse_inner_padding_end', () => { config.free(); } }); +test('flex_direction_alternating_with_percent', () => { + const config = Yoga.Config.create(); + let root; + + try { + root = Yoga.Node.create(config); + root.setPositionType(PositionType.Absolute); + root.setWidth(200); + root.setHeight(300); + + const root_child0 = Yoga.Node.create(config); + root_child0.setFlexDirection(FlexDirection.Row); + root_child0.setPosition(Edge.Left, "10%"); + root_child0.setPosition(Edge.Top, "10%"); + root_child0.setWidth("50%"); + root_child0.setHeight("50%"); + root.insertChild(root_child0, 0); + root.calculateLayout(undefined, undefined, Direction.LTR); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(200); + expect(root.getComputedHeight()).toBe(300); + + expect(root_child0.getComputedLeft()).toBe(20); + expect(root_child0.getComputedTop()).toBe(30); + expect(root_child0.getComputedWidth()).toBe(100); + expect(root_child0.getComputedHeight()).toBe(150); + + root.calculateLayout(undefined, undefined, Direction.RTL); + + expect(root.getComputedLeft()).toBe(0); + expect(root.getComputedTop()).toBe(0); + expect(root.getComputedWidth()).toBe(200); + expect(root.getComputedHeight()).toBe(300); + + expect(root_child0.getComputedLeft()).toBe(120); + expect(root_child0.getComputedTop()).toBe(30); + expect(root_child0.getComputedWidth()).toBe(100); + expect(root_child0.getComputedHeight()).toBe(150); + } finally { + if (typeof root !== 'undefined') { + root.freeRecursive(); + } + + config.free(); + } +}); diff --git a/tests/generated/YGFlexDirectionTest.cpp b/tests/generated/YGFlexDirectionTest.cpp index e64ef9091c..05ff7abc24 100644 --- a/tests/generated/YGFlexDirectionTest.cpp +++ b/tests/generated/YGFlexDirectionTest.cpp @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. * * clang-format off - * @generated SignedSource<<4a6a69c4e9bfda6dc73198791f553e13>> + * @generated SignedSource<<552f1533812daf0793244bbc8c465e17>> * generated by gentest/gentest-driver.ts from gentest/fixtures/YGFlexDirectionTest.html */ @@ -4283,3 +4283,47 @@ TEST(YogaTest, flex_direction_row_reverse_inner_padding_end) { YGConfigFree(config); } + +TEST(YogaTest, flex_direction_alternating_with_percent) { + const YGConfigRef config = YGConfigNew(); + + const YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); + YGNodeStyleSetWidth(root, 200); + YGNodeStyleSetHeight(root, 300); + + const YGNodeRef root_child0 = YGNodeNewWithConfig(config); + YGNodeStyleSetFlexDirection(root_child0, YGFlexDirectionRow); + YGNodeStyleSetPositionPercent(root_child0, YGEdgeLeft, 10); + YGNodeStyleSetPositionPercent(root_child0, YGEdgeTop, 10); + YGNodeStyleSetWidthPercent(root_child0, 50); + YGNodeStyleSetHeightPercent(root_child0, 50); + YGNodeInsertChild(root, root_child0, 0); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(20, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(30, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(150, YGNodeLayoutGetHeight(root_child0)); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL); + + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); + ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root)); + ASSERT_FLOAT_EQ(300, YGNodeLayoutGetHeight(root)); + + ASSERT_FLOAT_EQ(120, YGNodeLayoutGetLeft(root_child0)); + ASSERT_FLOAT_EQ(30, YGNodeLayoutGetTop(root_child0)); + ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0)); + ASSERT_FLOAT_EQ(150, YGNodeLayoutGetHeight(root_child0)); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} diff --git a/yoga/algorithm/CalculateLayout.cpp b/yoga/algorithm/CalculateLayout.cpp index b54eeeeca3..58394a4563 100644 --- a/yoga/algorithm/CalculateLayout.cpp +++ b/yoga/algorithm/CalculateLayout.cpp @@ -545,12 +545,8 @@ static float computeFlexBasisForChildren( if (performLayout) { // Set the initial position (relative to the owner). const Direction childDirection = child->resolveDirection(direction); - const float mainDim = - isRow(mainAxis) ? availableInnerWidth : availableInnerHeight; - const float crossDim = - isRow(mainAxis) ? availableInnerHeight : availableInnerWidth; child->setPosition( - childDirection, mainDim, crossDim, availableInnerWidth); + childDirection, availableInnerWidth, availableInnerHeight); } if (child->style().positionType() == PositionType::Absolute) { @@ -2388,8 +2384,7 @@ void calculateLayout( markerData, 0, // tree root gCurrentGenerationCount.load(std::memory_order_relaxed))) { - node->setPosition( - node->getLayout().direction(), ownerWidth, ownerHeight, ownerWidth); + node->setPosition(node->getLayout().direction(), ownerWidth, ownerHeight); roundLayoutResultsToPixelGrid(node, 0.0f, 0.0f); } diff --git a/yoga/node/Node.cpp b/yoga/node/Node.cpp index 31ad09f8c9..abda52f5cf 100644 --- a/yoga/node/Node.cpp +++ b/yoga/node/Node.cpp @@ -230,9 +230,8 @@ float Node::relativePosition( void Node::setPosition( const Direction direction, - const float mainSize, - const float crossSize, - const float ownerWidth) { + const float ownerWidth, + const float ownerHeight) { /* Root nodes should be always layouted as LTR, so we don't return negative * values. */ const Direction directionRespectingRoot = @@ -244,10 +243,14 @@ void Node::setPosition( // In the case of position static these are just 0. See: // https://www.w3.org/TR/css-position-3/#valdef-position-static - const float relativePositionMain = - relativePosition(mainAxis, directionRespectingRoot, mainSize); - const float relativePositionCross = - relativePosition(crossAxis, directionRespectingRoot, crossSize); + const float relativePositionMain = relativePosition( + mainAxis, + directionRespectingRoot, + isRow(mainAxis) ? ownerWidth : ownerHeight); + const float relativePositionCross = relativePosition( + crossAxis, + directionRespectingRoot, + isRow(mainAxis) ? ownerHeight : ownerWidth); const auto mainAxisLeadingEdge = inlineStartEdge(mainAxis, direction); const auto mainAxisTrailingEdge = inlineEndEdge(mainAxis, direction); diff --git a/yoga/node/Node.h b/yoga/node/Node.h index cd029b40d4..06175b8ee0 100644 --- a/yoga/node/Node.h +++ b/yoga/node/Node.h @@ -229,11 +229,7 @@ class YG_EXPORT Node : public ::YGNode { void setLayoutBorder(float border, PhysicalEdge edge); void setLayoutPadding(float padding, PhysicalEdge edge); void setLayoutPosition(float position, PhysicalEdge edge); - void setPosition( - Direction direction, - float mainSize, - float crossSize, - float ownerWidth); + void setPosition(Direction direction, float ownerWidth, float ownerHeight); // Other methods Style::Length resolveFlexBasisPtr() const; From baf670e261892ad4e72c5c02b6ff671537b661a7 Mon Sep 17 00:00:00 2001 From: Richard Howell Date: Thu, 13 Jun 2024 14:18:45 -0700 Subject: [PATCH 14/24] make yogaApple modular Summary: X-link: https://github.com/facebook/react-native/pull/44938 Yoga is transitively included in Swift targets and needs to be modular. Changelog: [Internal] Reviewed By: NickGerleman Differential Revision: D58469454 fbshipit-source-id: 72bc6b5d3e5ee0710d9334a626e4e7297ce26b09 --- yoga/YGMacros.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/yoga/YGMacros.h b/yoga/YGMacros.h index 6d1becce77..a2b6d60efc 100644 --- a/yoga/YGMacros.h +++ b/yoga/YGMacros.h @@ -35,6 +35,12 @@ #define YG_EXPORT #endif +#ifdef __OBJC__ +#if __has_include() +#import +#endif +#endif + #ifdef NS_ENUM // Cannot use NSInteger as NSInteger has a different size than int (which is the // default type of a enum). Therefor when linking the Yoga C library into obj-c From 1f7faf4c61c32da337f0838893e488b2466659c6 Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Mon, 24 Jun 2024 07:38:05 -0700 Subject: [PATCH 15/24] Make documentation embeds less ugly (#1670) Summary: Pull Request resolved: https://github.com/facebook/yoga/pull/1670 Embeds to Yoga's documentation reuse a tiny rasterized favicon, blown up, and full of jpeg artifacts. {F1714492025} This bothered me enough to make the previews look better. This change adds a quickly whipped up opengraph sized image, replaces the favicon with one derived from logo SVG, and fixes a missing description on the homepage. {F1714566402} Reviewed By: yungsters Differential Revision: D58923501 fbshipit-source-id: 249a23034f50667e32970121a90eccc380e566a3 --- website/docusaurus.config.js | 16 +++++++++++++++- website/src/pages/index.tsx | 2 +- website/static/img/favicon.png | Bin 6013 -> 0 bytes website/static/img/favicon.svg | 17 +++++++++++++++++ website/static/img/opengraph.png | Bin 0 -> 895594 bytes 5 files changed, 33 insertions(+), 2 deletions(-) delete mode 100644 website/static/img/favicon.png create mode 100644 website/static/img/favicon.svg create mode 100644 website/static/img/opengraph.png diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 33ce850b84..2e2a8b1e22 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -14,7 +14,7 @@ export default { title: 'Yoga', tagline: 'Build flexible layouts on any platform with a highly optimized open source layout engine designed with speed, size, and ease of use in mind.', - favicon: 'img/favicon.png', + favicon: 'img/favicon.svg', url: 'https:/yogalayout.dev', baseUrl: '/', @@ -95,5 +95,19 @@ export default { defaultMode: 'dark', respectPrefersColorScheme: true, }, + metadata: [ + { + property: 'og:image', + content: 'https://yogalayout.dev/img/opengraph.png', + }, + { + property: 'og:image:width', + content: '1200', + }, + { + property: 'og:image:height', + content: '630', + }, + ], }), }; diff --git a/website/src/pages/index.tsx b/website/src/pages/index.tsx index 6f6833f617..3cc1de0dec 100644 --- a/website/src/pages/index.tsx +++ b/website/src/pages/index.tsx @@ -76,7 +76,7 @@ function PlaygroundSection() { export default function Home(): JSX.Element { return ( - + diff --git a/website/static/img/favicon.png b/website/static/img/favicon.png deleted file mode 100644 index 178f2730c7ccff962873951edd162dcce2eec927..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6013 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 + + + + + + + + + + + + diff --git a/website/static/img/opengraph.png b/website/static/img/opengraph.png new file mode 100644 index 0000000000000000000000000000000000000000..cc6876f2fcb3a4eea582cb27d711d2ea8c8cf90a GIT binary patch literal 895594 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 &F=*HC5tg{7(IOdKqRD(}- zU0=O#A491Mg>n9+D0ve*!EbxHQ74kANM`O-BF;6z%x9SGS0uUqM`Q}qR+SBvwRVe` zt$1G@w7F!Ys&oC%2xiC?h$^Pwwy&06>w(f5&}Pp6>id5A4G-Cvb1q;^s_tw8kQPcd zl}(J_THBWi_r_b9msAqGnNi4wd|x(Ozc{HglKmj2hA}4?XigHm!o`;>N(V z6)Ly!po@@UWi>Q+IpVDU{CU@26mbCIpn}CPTwzRcBFJ*{Wm(s`R?=PH_e+=QV6J)y zw2{Rov;Ay7)mcevMpY~~GmrPB>c!LdbPGWg`uS|03tW}Xc>=2&a)o$E!(B0*8U3E~ zti>&OEu#~da8XrVzS-h=>DO!@AIR@y6}li;Ypduvp_iA=FZ)DLFuTN^nZ8zbRzAy_ zY-filS~!C4uD$$3u+y8lBsa^h?2HUr+zpo%7r_;KuSMZ$3S-bv&BKeCVPX(OzVkaQ zQ@tTlsJbnuxvwghJ5Tb@=hMldDBS#wgX)vXi91�hpON=a4{?w0m4reN`&#J%^)O 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