From 0d5ea161fb467e23899864c54717d7988e67d82c Mon Sep 17 00:00:00 2001 From: Prafyl <86287866+Prafyl@users.noreply.github.com> Date: Sat, 10 Oct 2026 00:28:51 +0545 Subject: [PATCH] Add test for reading negative Long64_t values tree_int64_test.root has a Long64_t branch with values around the 2^32 and 2^53 boundaries and INT64_MIN/MAX, written by tree_int64_test.cxx with ROOT 6.40. tree_int64_test.js reads them back and exits with an error on any mismatch. Covers the ntoi8 fix from #422. --- .github/workflows/jsroot-ci.yml | 3 +++ demo/node/tree_int64_test.cxx | 20 ++++++++++++++ demo/node/tree_int64_test.js | 46 ++++++++++++++++++++++++++++++++ demo/node/tree_int64_test.root | Bin 0 -> 5530 bytes 4 files changed, 69 insertions(+) create mode 100644 demo/node/tree_int64_test.cxx create mode 100644 demo/node/tree_int64_test.js create mode 100644 demo/node/tree_int64_test.root diff --git a/.github/workflows/jsroot-ci.yml b/.github/workflows/jsroot-ci.yml index b229f0375..82eb99245 100644 --- a/.github/workflows/jsroot-ci.yml +++ b/.github/workflows/jsroot-ci.yml @@ -67,6 +67,7 @@ jobs: node demo/node/file_proxy.js buffer ./hsimple.root node demo/node/rntuple_buffer_test.js node demo/node/rntuple_test.js demo/node/rntuple_test.root + node demo/node/tree_int64_test.js demo/node/tree_int64_test.root node demo/node/rntuple_test32.js demo/node/rntuple_test32.root demo/node/rntuple_test32.json tests_ubuntu: @@ -185,6 +186,7 @@ jobs: node demo/node/file_proxy.js buffer ./hsimple.root node demo/node/rntuple_buffer_test.js node demo/node/rntuple_test.js demo/node/rntuple_test.root + node demo/node/tree_int64_test.js demo/node/tree_int64_test.root node demo/node/rntuple_test32.js demo/node/rntuple_test32.root demo/node/rntuple_test32.json @@ -238,5 +240,6 @@ jobs: node demo/node/file_proxy.js buffer ./hsimple.root node demo/node/rntuple_buffer_test.js node demo/node/rntuple_test.js demo/node/rntuple_test.root + node demo/node/tree_int64_test.js demo/node/tree_int64_test.root node demo/node/rntuple_test32.js demo/node/rntuple_test32.root demo/node/rntuple_test32.json diff --git a/demo/node/tree_int64_test.cxx b/demo/node/tree_int64_test.cxx new file mode 100644 index 000000000..a42dba445 --- /dev/null +++ b/demo/node/tree_int64_test.cxx @@ -0,0 +1,20 @@ +// macro to create tree_int64_test.root used by tree_int64_test.js +// root -l -b -q tree_int64_test.cxx + +#include +#include + +void tree_int64_test() +{ + TFile f("tree_int64_test.root", "RECREATE"); + TTree t("t", "Long64_t values"); + Long64_t v; + t.Branch("v", &v, "v/L"); + for (Long64_t x : {0LL, 1LL, -1LL, -2LL, -2147483648LL, -4294967296LL, -4294967297LL, -5000000000LL, + -9007199254740991LL, -9007199254740992LL, (Long64_t) 0x8000000000000000ULL, + 4294967296LL, 9007199254740991LL, 0x7FFFFFFFFFFFFFFFLL}) { + v = x; + t.Fill(); + } + t.Write(); +} diff --git a/demo/node/tree_int64_test.js b/demo/node/tree_int64_test.js new file mode 100644 index 000000000..bbde113f6 --- /dev/null +++ b/demo/node/tree_int64_test.js @@ -0,0 +1,46 @@ +import { version, openFile } from 'jsroot'; +import { TSelector, treeProcess } from 'jsroot/tree'; + +// check reading of Long64_t branch, file created with tree_int64_test.cxx + +console.log(`JSROOT version ${version}`); + +const expected = [0n, 1n, -1n, -2n, -2147483648n, -4294967296n, -4294967297n, -5000000000n, + -9007199254740991n, -9007199254740992n, -9223372036854775808n, + 4294967296n, 9007199254740991n, 9223372036854775807n]; + +let filename = './tree_int64_test.root', + any_error = false; + +if (process?.argv && process.argv[2]) + filename = process.argv[2]; + +const file = await openFile(filename), + tree = await file.readObject('t'), + values = [], + selector = new TSelector(); + +selector.addBranch('v'); +selector.Process = function() { values.push(this.tgtobj.v); }; + +await treeProcess(tree, selector); + +if (values.length !== expected.length) { + any_error = true; + console.error(`FAILURE: expected ${expected.length} entries but got ${values.length}`); +} + +expected.forEach((exp, i) => { + const val = values[i]; + if (val === undefined || BigInt(val) !== exp) { + any_error = true; + console.error(`FAILURE: entry ${i} expected ${exp} but got ${val}`); + } else + console.log(`OK: entry ${i} = ${val}`); +}); + +if (any_error) { + console.error('\nFAILURE when reading Long64_t values'); + process.exit(1); +} else + console.log('\nTest OK'); diff --git a/demo/node/tree_int64_test.root b/demo/node/tree_int64_test.root new file mode 100644 index 0000000000000000000000000000000000000000..518292f05708ceeba66ba90fe7a543ee43598bc2 GIT binary patch literal 5530 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 ds-*vM5&nO!f8Hv_dirm;FibQ#UV>?W{{Z}P6AS