diff --git a/.github/actions/setup-js/action.yml b/.github/actions/setup-js/action.yml
index a248ff66..34193486 100644
--- a/.github/actions/setup-js/action.yml
+++ b/.github/actions/setup-js/action.yml
@@ -6,7 +6,7 @@ runs:
- name: Setup Node environment
uses: actions/setup-node@v3
with:
- node-version: 18.x
+ node-version: 20.x
cache: yarn
cache-dependency-path: yarn.lock
env:
diff --git a/gentest/fixtures/YGIntrinsicSizeTest.html b/gentest/fixtures/YGIntrinsicSizeTest.html
new file mode 100644
index 00000000..962b2417
--- /dev/null
+++ b/gentest/fixtures/YGIntrinsicSizeTest.html
@@ -0,0 +1,221 @@
+
+
+ LoremipsumdolorsitametconsecteturadipiscingelitSedeleifasdfettortoracauctorFuscerhoncusipsumtemporerosaliquamconsequatPraesentsoda
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eleifasd et tortor ac auctor. Integer at
+ volutpat
+ libero, sed elementum dui interdum id. Aliquam consectetur massa vel neque aliquet, quis consequat risus
+ fringilla. Fusce rhoncus ipsum tempor eros aliquam, vel tempus metus ullamcorper. Nam at nulla sed tellus
+ vestibulum fringilla vel sit amet ligula. Proin velit lectus, euismod sit amet quam vel ultricies dolor,
+ vitae
+ finibus lorem ipsum. Pellentesque molestie at mi sit amet dictum. Donec vehicula lacinia felis sit amet
+ consectetur. Praesent sodales enim sapien, sed varius ipsum pellentesque vel. Aenean eu mi eu justo
+ tincidunt
+ finibus vel sit amet ipsum. Sed bibasdum purus vel ipsum sagittis, quis fermentum dolor lobortis. Etiam
+ vulputate eleifasd lectus vel varius.
+ Phasellus imperdiet lectus sit amet ipsum egestas, ut bibasdum ipsum malesuada. Vestibulum ante ipsum primis
+ in
+ faucibus orci luctus et ultrices posuere cubilia Curae; Sed mollis eros sit amet elit porttitor, vel
+ venenatis
+ turpis venenatis. Nulla tempus tortor at eros efficitur, sit amet dapibus ipsum malesuada. Ut at mauris sed
+ nunc
+ malesuada convallis. Duis id sem vel magna varius eleifasd vel at est. Donec eget orci a ipsum tempor
+ lobortis.
+ Sed at consectetur ipsum.
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eleifasd et tortor ac auctor. Integer at
+ volutpat
+ libero, sed elementum dui interdum id. Aliquam consectetur massa vel neque aliquet, quis consequat risus
+ fringilla. Fusce rhoncus ipsum tempor eros aliquam, vel tempus metus ullamcorper. Nam at nulla sed tellus
+ vestibulum fringilla vel sit amet ligula. Proin velit lectus, euismod sit amet quam vel ultricies dolor,
+ vitae
+ finibus
+ loremipsumloremipsumloremipsumloremipsumloremipsumloremipsumloremipsumloremipsumloremipsumloremipsumloremipsumloremipsumloremipsumlorem
+ Pellentesque molestie at mi sit amet dictum. Donec vehicula lacinia felis sit amet
+ consectetur. Praesent sodales enim sapien, sed varius ipsum pellentesque vel. Aenean eu mi eu justo
+ tincidunt
+ finibus vel sit amet ipsum. Sed bibasdum purus vel ipsum sagittis, quis fermentum dolor lobortis. Etiam
+ vulputate eleifasd lectus vel varius.
+ Phasellus imperdiet lectus sit amet ipsum egestas, ut bibasdum ipsum malesuada. Vestibulum ante ipsum primis
+ in
+ faucibus orci luctus et ultrices posuere cubilia Curae; Sed mollis eros sit amet elit porttitor, vel
+ venenatis
+ turpis venenatis. Nulla tempus tortor at eros efficitur, sit amet dapibus ipsum malesuada. Ut at mauris sed
+ nunc
+ malesuada convallis. Duis id sem vel magna varius eleifasd vel at est. Donec eget orci a ipsum tempor
+ lobortis.
+ Sed at consectetur ipsum.
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eleifasd et tortor ac auctor. Integer at
+ volutpat
+ libero, sed elementum dui interdum id. Aliquam consectetur massa vel neque aliquet, quis consequat risus
+ fringilla. Fusce rhoncus ipsum tempor eros aliquam, vel tempus metus ullamcorper. Nam at nulla sed tellus
+ vestibulum fringilla vel sit amet ligula. Proin velit lectus, euismod sit amet quam vel ultricies dolor,
+ vitae
+ finibus lorem ipsum. Pellentesque molestie at mi sit amet dictum. Donec vehicula lacinia felis sit amet
+ consectetur. Praesent sodales enim sapien, sed varius ipsum pellentesque vel. Aenean eu mi eu justo
+ tincidunt
+ finibus vel sit amet ipsum. Sed bibasdum purus vel ipsum sagittis, quis fermentum dolor lobortis. Etiam
+ vulputate eleifasd lectus vel varius.
+ Phasellus imperdiet lectus sit amet ipsum egestas, ut bibasdum ipsum malesuada. Vestibulum ante ipsum primis
+ in
+ faucibus orci luctus et ultrices posuere cubilia Curae; Sed mollis eros sit amet elit porttitor, vel
+ venenatis
+ turpis venenatis. Nulla tempus tortor at eros efficitur, sit amet dapibus ipsum malesuada. Ut at mauris sed
+ nunc
+ malesuada convallis. Duis id sem vel magna varius eleifasd vel at est. Donec eget orci a ipsum tempor
+ lobortis.
+ Sed at consectetur ipsum.
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eleifasd et tortor ac auctor. Integer at
+ volutpat
+ libero, sed elementum dui interdum id. Aliquam consectetur massa vel neque aliquet, quis consequat risus
+ fringilla. Fusce rhoncus ipsum tempor eros aliquam, vel tempus metus ullamcorper. Nam at nulla sed tellus
+ vestibulum fringilla vel sit amet ligula. Proin velit lectus, euismod sit amet quam vel ultricies dolor,
+ vitae
+ finibus lorem ipsum. Pellentesque molestie at mi sit amet dictum. Donec vehicula lacinia felis sit amet
+ consectetur. Praesent sodales enim sapien, sed varius ipsum pellentesque vel. Aenean eu mi eu justo
+ tincidunt
+ finibus vel sit amet ipsum. Sed bibasdum purus vel ipsum sagittis, quis fermentum dolor lobortis. Etiam
+ vulputate eleifasd lectus vel varius.
+ Phasellus imperdiet lectus sit amet ipsum egestas, ut bibasdum ipsum malesuada. Vestibulum ante ipsum primis
+ in
+ faucibus orci luctus et ultrices posuere cubilia Curae; Sed mollis eros sit amet elit porttitor, vel
+ venenatis
+ turpis venenatis. Nulla tempus tortor at eros efficitur, sit amet dapibus ipsum malesuada. Ut at mauris sed
+ nunc
+ malesuada convallis. Duis id sem vel magna varius eleifasd vel at est. Donec eget orci a ipsum tempor
+ lobortis.
+ Sed at consectetur ipsum.
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eleifasd et tortor ac auctor. Integer at
+ volutpat
+ libero, sed elementum dui interdum id. Aliquam consectetur massa vel neque aliquet, quis consequat risus
+ fringilla. Fusce rhoncus ipsum tempor eros aliquam, vel tempus metus ullamcorper. Nam at nulla sed tellus
+ vestibulum fringilla vel sit amet ligula. Proin velit lectus, euismod sit amet quam vel ultricies dolor,
+ vitae
+ finibus lorem ipsum. Pellentesque molestie at mi sit amet dictum. Donec vehicula lacinia felis sit amet
+ consectetur. Praesent sodales enim sapien, sed varius ipsum pellentesque vel. Aenean eu mi eu justo
+ tincidunt
+ finibus vel sit amet ipsum. Sed bibasdum purus vel ipsum sagittis, quis fermentum dolor lobortis. Etiam
+ vulputate eleifasd lectus vel varius.
+ Phasellus imperdiet lectus sit amet ipsum egestas, ut bibasdum ipsum malesuada. Vestibulum ante ipsum primis
+ in
+ faucibus orci luctus et ultrices posuere cubilia Curae; Sed mollis eros sit amet elit porttitor, vel
+ venenatis
+ turpis venenatis. Nulla tempus tortor at eros efficitur, sit amet dapibus ipsum malesuada. Ut at mauris sed
+ nunc
+ malesuada convallis. Duis id sem vel magna varius eleifasd vel at est. Donec eget orci a ipsum tempor
+ lobortis.
+ Sed at consectetur ipsum.
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eleifasd et tortor ac auctor. Integer at
+ volutpat
+ libero, sed elementum dui interdum id. Aliquam consectetur massa vel neque aliquet, quis consequat risus
+ fringilla. Fusce rhoncus ipsum tempor eros aliquam, vel tempus metus ullamcorper. Nam at nulla sed tellus
+ vestibulum fringilla vel sit amet ligula. Proin velit lectus, euismod sit amet quam vel ultricies dolor,
+ vitae
+ finibus lorem ipsum. Pellentesque molestie at mi sit amet dictum. Donec vehicula lacinia felis sit amet
+ consectetur. Praesent sodales enim sapien, sed varius ipsum pellentesque vel. Aenean eu mi eu justo
+ tincidunt
+ finibus vel sit amet ipsum. Sed bibasdum purus vel ipsum sagittis, quis fermentum dolor lobortis. Etiam
+ vulputate eleifasd lectus vel varius.
+ Phasellus imperdiet lectus sit amet ipsum egestas, ut bibasdum ipsum malesuada. Vestibulum ante ipsum primis
+ in
+ faucibus orci luctus et ultrices posuere cubilia Curae; Sed mollis eros sit amet elit porttitor, vel
+ venenatis
+ turpis venenatis. Nulla tempus tortor at eros efficitur, sit amet dapibus ipsum malesuada. Ut at mauris sed
+ nunc
+ malesuada convallis. Duis id sem vel magna varius eleifasd vel at est. Donec eget orci a ipsum tempor
+ lobortis.
+ Sed at consectetur ipsum.
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eleifasd et tortor ac auctor. Integer at
+ volutpat
+ libero, sed elementum dui interdum id. Aliquam consectetur massa vel neque aliquet, quis consequat risus
+ fringilla. Fusce rhoncus ipsum tempor eros aliquam, vel tempus metus ullamcorper. Nam at nulla sed tellus
+ vestibulum fringilla vel sit amet ligula. Proin velit lectus, euismod sit amet quam vel ultricies dolor,
+ vitae
+ finibus lorem ipsum. Pellentesque molestie at mi sit amet dictum. Donec vehicula lacinia felis sit amet
+ consectetur. Praesent sodales enim sapien, sed varius ipsum pellentesque vel. Aenean eu mi eu justo
+ tincidunt
+ finibus vel sit amet ipsum. Sed bibasdum purus vel ipsum sagittis, quis fermentum dolor lobortis. Etiam
+ vulputate eleifasd lectus vel varius.
+ Phasellus imperdiet lectus sit amet ipsum egestas, ut bibasdum ipsum malesuada. Vestibulum ante ipsum primis
+ in
+ faucibus orci luctus et ultrices posuere cubilia Curae; Sed mollis eros sit amet elit porttitor, vel
+ venenatis
+ turpis venenatis. Nulla tempus tortor at eros efficitur, sit amet dapibus ipsum malesuada. Ut at mauris sed
+ nunc
+ malesuada convallis. Duis id sem vel magna varius eleifasd vel at est. Donec eget orci a ipsum tempor
+ lobortis.
+ Sed at consectetur ipsum.
+
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eleifasd et tortor ac auctor. Integer at
+ volutpat
+ libero, sed elementum dui interdum id. Aliquam consectetur massa vel neque aliquet, quis consequat risus
+ fringilla. Fusce rhoncus ipsum tempor eros aliquam, vel tempus metus ullamcorper. Nam at nulla sed tellus
+ vestibulum fringilla vel sit amet ligula. Proin velit lectus, euismod sit amet quam vel ultricies dolor,
+ vitae
+ finibus lorem ipsum. Pellentesque molestie at mi sit amet dictum. Donec vehicula lacinia felis sit amet
+ consectetur. Praesent sodales enim sapien, sed varius ipsum pellentesque vel. Aenean eu mi eu justo
+ tincidunt
+ finibus vel sit amet ipsum. Sed bibasdum purus vel ipsum sagittis, quis fermentum dolor lobortis. Etiam
+ vulputate eleifasd lectus vel varius.
+ Phasellus imperdiet lectus sit amet ipsum egestas, ut bibasdum ipsum malesuada. Vestibulum ante ipsum primis
+ in
+ faucibus orci luctus et ultrices posuere cubilia Curae; Sed mollis eros sit amet elit porttitor, vel
+ venenatis
+ turpis venenatis. Nulla tempus tortor at eros efficitur, sit amet dapibus ipsum malesuada. Ut at mauris sed
+ nunc
+ malesuada convallis. Duis id sem vel magna varius eleifasd vel at est. Donec eget orci a ipsum tempor
+ lobortis.
+ Sed at consectetur ipsum.
+
+
diff --git a/gentest/fonts/Ahem.ttf b/gentest/fonts/Ahem.ttf
new file mode 100644
index 00000000..ac81cb03
Binary files /dev/null and b/gentest/fonts/Ahem.ttf differ
diff --git a/gentest/gentest-cpp.js b/gentest/gentest-cpp.js
index 02e5c070..271cb060 100644
--- a/gentest/gentest-cpp.js
+++ b/gentest/gentest-cpp.js
@@ -30,7 +30,12 @@ CPPEmitter.prototype = Object.create(Emitter.prototype, {
emitPrologue: {
value: function () {
- this.push(['#include ', '#include ', '']);
+ this.push([
+ '#include ',
+ '#include ',
+ '#include "../util/TestUtil.h"',
+ '',
+ ]);
},
},
@@ -503,4 +508,13 @@ CPPEmitter.prototype = Object.create(Emitter.prototype, {
);
},
},
+
+ YGNodeSetMeasureFunc: {
+ value: function (nodeName, innerText) {
+ this.push(`YGNodeSetContext(${nodeName}, (void*)"${innerText}");`);
+ this.push(
+ `YGNodeSetMeasureFunc(${nodeName}, &facebook::yoga::test::IntrinsicSizeMeasure);`,
+ );
+ },
+ },
});
diff --git a/gentest/gentest-driver.ts b/gentest/gentest-driver.ts
index 0dc5dc01..d31c783c 100644
--- a/gentest/gentest-driver.ts
+++ b/gentest/gentest-driver.ts
@@ -106,7 +106,7 @@ for (const fileName of fixtures) {
);
await fs.writeFile(
- `${yogaDir}/java/tests/com/facebook/yoga/${fileNameNoExtension}.java`,
+ `${yogaDir}/java/tests/generated/com/facebook/yoga/${fileNameNoExtension}.java`,
addSignatureToSourceCode(
JSON.parse(logs[1].message.replace(/^[^"]*/, '')).replace(
'YogaTest',
diff --git a/gentest/gentest-java.js b/gentest/gentest-java.js
index 6f131a1a..584a22e3 100644
--- a/gentest/gentest-java.js
+++ b/gentest/gentest-java.js
@@ -55,6 +55,7 @@ JavaEmitter.prototype = Object.create(Emitter.prototype, {
'import org.junit.Test;',
'import org.junit.runner.RunWith;',
'import org.junit.runners.Parameterized;',
+ 'import com.facebook.yoga.utils.TestUtils;',
'',
'@RunWith(Parameterized.class)',
'public class YogaTest {',
@@ -465,4 +466,13 @@ JavaEmitter.prototype = Object.create(Emitter.prototype, {
);
},
},
+
+ YGNodeSetMeasureFunc: {
+ value: function (nodeName, innerText) {
+ this.push(`${nodeName}.setData("${innerText}");`);
+ this.push(
+ `${nodeName}.setMeasureFunction(new TestUtils.intrinsicMeasureFunction());`,
+ );
+ },
+ },
});
diff --git a/gentest/gentest-javascript.js b/gentest/gentest-javascript.js
index ca095268..418443da 100644
--- a/gentest/gentest-javascript.js
+++ b/gentest/gentest-javascript.js
@@ -23,6 +23,9 @@ JavascriptEmitter.prototype = Object.create(Emitter.prototype, {
emitPrologue: {
value: function () {
+ this.push(
+ "import { instrinsicSizeMeasureFunc } from '../tools/utils.ts'",
+ );
this.push("import Yoga from 'yoga-layout';");
this.push('import {');
this.pushIndent();
@@ -398,4 +401,12 @@ JavascriptEmitter.prototype = Object.create(Emitter.prototype, {
);
},
},
+
+ YGNodeSetMeasureFunc: {
+ value: function (nodeName, innerText) {
+ this.push(
+ `${nodeName}.setMeasureFunc(instrinsicSizeMeasureFunc.bind("${innerText}"));`,
+ );
+ },
+ },
});
diff --git a/gentest/gentest-validate.ts b/gentest/gentest-validate.ts
index 9f69f1c8..777c68ad 100644
--- a/gentest/gentest-validate.ts
+++ b/gentest/gentest-validate.ts
@@ -11,30 +11,37 @@ import * as fs from 'node:fs/promises';
import {dirname} from 'path';
import {fileURLToPath} from 'url';
import signedsource from 'signedsource';
+import {glob} from 'glob';
-const yogaDir = dirname(dirname(fileURLToPath(import.meta.url)));
-const cppTestDir = `${yogaDir}/tests/generated`;
-const jsTestDir = `${yogaDir}/javascript/tests/generated`;
-const javaTestDir = `${yogaDir}/java/tests/com/facebook/yoga`;
-const testDirs = [cppTestDir, jsTestDir, javaTestDir];
+const yogaRootDir = dirname(dirname(fileURLToPath(import.meta.url)));
-for (const testDir of testDirs) {
- const tests = await fs.readdir(testDir);
+const signedSourcePattern = new RegExp(
+ `${'@'}generated (?:SignedSource<<([a-f0-9]{32})>>)`,
+);
- for (const test of tests) {
- const testData = await fs.readFile(`${testDir}/${test}`, 'utf8');
- try {
- const validSignature = signedsource.verifySignature(testData);
- if (!validSignature) {
- console.error(`Invalid signature for ${test}`);
- process.exitCode = 1;
- }
- } catch (e) {
- // Java test dir does not separate generated tests from non-generated ones
- if (testDir != javaTestDir) {
- console.error(`${test}: ${e}`);
- process.exitCode = 1;
- }
+const filesToValidate = await glob(
+ [
+ 'tests/generated/**/*.{h,cpp}',
+ 'javascript/tests/generated/**/*.test.ts',
+ 'java/tests/generated/com/facebook/yoga/**/*.java',
+ ],
+ {
+ cwd: yogaRootDir,
+ },
+);
+
+console.log(`Found ${filesToValidate.length} files to validate`);
+
+for (const file of filesToValidate) {
+ const content = await fs.readFile(`${yogaRootDir}/${file}`, 'utf8');
+ if (signedSourcePattern.test(content)) {
+ console.log(`Checking ${file}`);
+ const validSignature = signedsource.verifySignature(content);
+ if (!validSignature) {
+ console.error(`Invalid signature "${file}"`);
+ process.exitCode = 1;
}
+ } else {
+ console.log(`Skipped ${file}`);
}
}
diff --git a/gentest/gentest.js b/gentest/gentest.js
index 8223a0ef..39408b6a 100755
--- a/gentest/gentest.js
+++ b/gentest/gentest.js
@@ -528,6 +528,10 @@ function setupTestTree(
e.YGNodeInsertChild(parentName, nodeName, index);
}
+ if (node.innerText && node.children.length === 0) {
+ e.YGNodeSetMeasureFunc(nodeName, node.innerText);
+ }
+
for (let i = 0; i < node.children.length; i++) {
e.push('');
const childName = nodeName + '_child' + i;
@@ -723,6 +727,7 @@ function calculateTree(root, parentOffsetLeft, parentOffsetTop) {
? child.dataset.experiments.split(' ')
: [],
disabled: child.dataset.disabled === 'true',
+ innerText: child.innerText,
};
const size = getRoundedSize(child);
diff --git a/gentest/package.json b/gentest/package.json
index 7f6e7b05..4211fb0f 100644
--- a/gentest/package.json
+++ b/gentest/package.json
@@ -3,8 +3,8 @@
"version": "0.0.0",
"private": true,
"scripts": {
- "gentest": "node --loader=babel-register-esm ./gentest-driver.ts",
- "gentest-validate": "node --loader=babel-register-esm ./gentest-validate.ts"
+ "gentest": "node --disable-warning=ExperimentalWarning --loader=babel-register-esm ./gentest-driver.ts",
+ "gentest-validate": "node --disable-warning=ExperimentalWarning --loader=babel-register-esm ./gentest-validate.ts"
},
"type": "module",
"dependencies": {
@@ -19,6 +19,7 @@
"@types/minimist": "^1.2.5",
"@types/node": "^20.10.3",
"@types/selenium-webdriver": "^4.1.21",
- "babel-register-esm": "^1.2.5"
+ "babel-register-esm": "^1.2.5",
+ "glob": "^10.4.2"
}
}
diff --git a/gentest/test-template.html b/gentest/test-template.html
index cab620be..079eb4df 100644
--- a/gentest/test-template.html
+++ b/gentest/test-template.html
@@ -1,70 +1,78 @@
-
-
- %s
-
-
-
-
-
-
+ body>* {
+ position: absolute;
+ }
-
-
+ #ltr-container>* {
+ position: absolute;
+ direction: ltr;
+ }
- %s
+ #rtl-container>* {
+ position: absolute;
+ direction: rtl;
+ }
-
-
-
+
+
- %s
+
+
+ %s
-
+
+
+
+
+ %s
+
+
+
-
-