This is an automated email from the ASF dual-hosted git repository.

wangweipeng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fory.git


The following commit(s) were added to refs/heads/main by this push:
     new f55826f1c feat(JavaScript): Add cross language test for JavaScript 
(#3161)
f55826f1c is described below

commit f55826f1cab9bb4c2fa8d37099a2bcbd9f20c4e3
Author: weipeng <[email protected]>
AuthorDate: Wed Jan 21 14:00:17 2026 +0800

    feat(JavaScript): Add cross language test for JavaScript (#3161)
    
    ## Why?
    
    
    
    ## What does this PR do?
    1. Add cross language test for JavaScript.
    2. Test cases in crossLanguage.test.ts are not completely implemented,
    The unimplemented parts will be merged in other PRS
    
    
    
    
    ## Related issues
    
    #3133
    
    
    
    ## Does this PR introduce any user-facing change?
    No, this PR don't change the APIs.
    
    
    
    - [ ] Does this PR introduce any public API change?
    - [ ] Does this PR introduce any binary protocol compatibility change?
    
    ## Benchmark
    This PR only for cross lanauage tests, do not affect performance.
---
 .github/workflows/ci.yml                           |  30 +++
 .../org/apache/fory/xlang/JavaScriptXlangTest.java | 283 +++++++++++++++++++++
 javascript/jest.config.js                          |   1 +
 javascript/packages/fory/index.ts                  |   2 +
 javascript/packages/fory/lib/classResolver.ts      |  48 ++++
 javascript/packages/fory/lib/gen/typedArray.ts     |   4 +
 javascript/packages/fory/lib/type.ts               |   4 +
 javascript/packages/fory/lib/typeInfo.ts           |  28 ++
 javascript/packages/fory/lib/writer/index.ts       |   5 +
 javascript/test/crossLanguage.test.ts              | 188 ++++++++++++++
 javascript/test/hps.test.ts                        |   2 +-
 11 files changed, 594 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 080954455..804ae71d1 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -426,6 +426,36 @@ jobs:
       - name: Run C++ IDL Tests
         run: ./integration_tests/idl_tests/run_cpp_tests.sh
 
+  javascript_xlang:
+    name: JavaScript Xlang Test
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v5
+      - name: Use Node.js 20.x
+        uses: actions/setup-node@v4
+        with:
+          node-version: 20.x
+      - name: Set up JDK 21
+        uses: actions/setup-java@v4
+        with:
+          java-version: 21
+          distribution: "temurin"
+      - name: Cache Maven local repository
+        uses: actions/cache@v4
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
+      - name: Run JavaScript Xlang Test
+        env:
+          FORY_JavaScript_JAVA_CI: "1"
+        run: |
+          cd java
+          mvn -T16 --no-transfer-progress clean install -DskipTests
+          cd fory-core
+          mvn -T16 --no-transfer-progress test 
-Dtest=org.apache.fory.xlang.JavaScriptXlangTest
+
   cpp_examples:
     name: C++ Examples
     runs-on: ubuntu-latest
diff --git 
a/java/fory-core/src/test/java/org/apache/fory/xlang/JavaScriptXlangTest.java 
b/java/fory-core/src/test/java/org/apache/fory/xlang/JavaScriptXlangTest.java
new file mode 100644
index 000000000..bddfaecf2
--- /dev/null
+++ 
b/java/fory-core/src/test/java/org/apache/fory/xlang/JavaScriptXlangTest.java
@@ -0,0 +1,283 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.fory.xlang;
+
+import com.google.common.collect.ImmutableMap;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.testng.SkipException;
+import org.testng.annotations.Test;
+
+/** Executes cross-language tests against the Rust implementation. */
+@Test
+public class JavaScriptXlangTest extends XlangTestBase {
+  private static final String NODE_EXECUTABLE = "npx";
+  private static final String NODE_MODULE = "crossLanguage.test.ts";
+
+  private static final List<String> RUST_BASE_COMMAND =
+      Arrays.asList(NODE_EXECUTABLE, "jest", NODE_MODULE, "-t", "caseName");
+
+  private static final int NODE_TESTCASE_INDEX = 4;
+
+  @Override
+  protected void ensurePeerReady() {
+    String enabled = System.getenv("FORY_JAVASCRIPT_JAVA_CI");
+    if (!"1".equals(enabled)) {
+      throw new SkipException("Skipping JavaScriptXlangTest: 
FORY_JAVASCRIPT_JAVA_CI not set to 1");
+    }
+    boolean nodeInstalled = true;
+    try {
+      Process process = new ProcessBuilder("node", "--version").start();
+      int exitCode = process.waitFor();
+      if (exitCode != 0) {
+        nodeInstalled = false;
+      }
+    } catch (IOException | InterruptedException e) {
+      nodeInstalled = false;
+      if (e instanceof InterruptedException) {
+        Thread.currentThread().interrupt();
+      }
+    }
+    if (!nodeInstalled) {
+      throw new SkipException("Skipping JavaScriptXlangTest: nodejs not 
installed");
+    }
+  }
+
+  @Override
+  protected CommandContext buildCommandContext(String caseName, Path dataFile) 
{
+    List<String> command = new ArrayList<>(RUST_BASE_COMMAND);
+    // jest use regexp to match the castName. And '$' at end to ignore 
matching error.
+    command.set(NODE_TESTCASE_INDEX, caseName + "$");
+    ImmutableMap<String, String> env = envBuilder(dataFile).build();
+    return new CommandContext(command, env, new File("../../javascript"));
+  }
+
+  // 
============================================================================
+  // Test methods - duplicated from XlangTestBase for Maven Surefire discovery
+  // 
============================================================================
+
+  @Test
+  public void testBuffer() throws java.io.IOException {
+    super.testBuffer();
+  }
+
+  @Test
+  public void testBufferVar() throws java.io.IOException {
+    super.testBufferVar();
+  }
+
+  @Test
+  public void testMurmurHash3() throws java.io.IOException {
+    super.testMurmurHash3();
+  }
+
+  @Test
+  public void testStringSerializer() throws Exception {
+    super.testStringSerializer();
+  }
+
+  @Test
+  public void testCrossLanguageSerializer() throws Exception {
+    super.testCrossLanguageSerializer();
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testSimpleStruct(boolean enableCodegen) throws 
java.io.IOException {
+    super.testSimpleStruct(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testSimpleNamedStruct(boolean enableCodegen) throws 
java.io.IOException {
+    super.testSimpleNamedStruct(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testList(boolean enableCodegen) throws java.io.IOException {
+    super.testList(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testMap(boolean enableCodegen) throws java.io.IOException {
+    super.testMap(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testInteger(boolean enableCodegen) throws java.io.IOException {
+    super.testInteger(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testItem(boolean enableCodegen) throws java.io.IOException {
+    super.testItem(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testColor(boolean enableCodegen) throws java.io.IOException {
+    super.testColor(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testStructWithList(boolean enableCodegen) throws 
java.io.IOException {
+    super.testStructWithList(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testStructWithMap(boolean enableCodegen) throws 
java.io.IOException {
+    super.testStructWithMap(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testSkipIdCustom(boolean enableCodegen) throws 
java.io.IOException {
+    super.testSkipIdCustom(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testSkipNameCustom(boolean enableCodegen) throws 
java.io.IOException {
+    super.testSkipNameCustom(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testConsistentNamed(boolean enableCodegen) throws 
java.io.IOException {
+    super.testConsistentNamed(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testStructVersionCheck(boolean enableCodegen) throws 
java.io.IOException {
+    super.testStructVersionCheck(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testPolymorphicList(boolean enableCodegen) throws 
java.io.IOException {
+    super.testPolymorphicList(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testPolymorphicMap(boolean enableCodegen) throws 
java.io.IOException {
+    super.testPolymorphicMap(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testOneStringFieldSchemaConsistent(boolean enableCodegen) throws 
java.io.IOException {
+    super.testOneStringFieldSchemaConsistent(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testOneStringFieldCompatible(boolean enableCodegen) throws 
java.io.IOException {
+    super.testOneStringFieldCompatible(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testTwoStringFieldCompatible(boolean enableCodegen) throws 
java.io.IOException {
+    super.testTwoStringFieldCompatible(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testSchemaEvolutionCompatible(boolean enableCodegen) throws 
java.io.IOException {
+    super.testSchemaEvolutionCompatible(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testOneEnumFieldSchemaConsistent(boolean enableCodegen) throws 
java.io.IOException {
+    super.testOneEnumFieldSchemaConsistent(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testOneEnumFieldCompatible(boolean enableCodegen) throws 
java.io.IOException {
+    super.testOneEnumFieldCompatible(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testTwoEnumFieldCompatible(boolean enableCodegen) throws 
java.io.IOException {
+    super.testTwoEnumFieldCompatible(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testEnumSchemaEvolutionCompatible(boolean enableCodegen) throws 
java.io.IOException {
+    super.testEnumSchemaEvolutionCompatible(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testNullableFieldSchemaConsistentNotNull(boolean enableCodegen)
+      throws java.io.IOException {
+    super.testNullableFieldSchemaConsistentNotNull(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testNullableFieldSchemaConsistentNull(boolean enableCodegen)
+      throws java.io.IOException {
+    super.testNullableFieldSchemaConsistentNull(enableCodegen);
+  }
+
+  @Override
+  @Test(dataProvider = "enableCodegen")
+  public void testNullableFieldCompatibleNotNull(boolean enableCodegen) throws 
java.io.IOException {
+    super.testNullableFieldCompatibleNotNull(enableCodegen);
+  }
+
+  @Override
+  @Test(dataProvider = "enableCodegen")
+  public void testNullableFieldCompatibleNull(boolean enableCodegen) throws 
java.io.IOException {
+    super.testNullableFieldCompatibleNull(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testUnionXlang(boolean enableCodegen) throws java.io.IOException 
{
+    super.testUnionXlang(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testRefSchemaConsistent(boolean enableCodegen) throws 
java.io.IOException {
+    super.testRefSchemaConsistent(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testRefCompatible(boolean enableCodegen) throws 
java.io.IOException {
+    super.testRefCompatible(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testCircularRefSchemaConsistent(boolean enableCodegen) throws 
java.io.IOException {
+    super.testCircularRefSchemaConsistent(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testCircularRefCompatible(boolean enableCodegen) throws 
java.io.IOException {
+    super.testCircularRefCompatible(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testUnsignedSchemaConsistent(boolean enableCodegen) throws 
java.io.IOException {
+    super.testUnsignedSchemaConsistent(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testUnsignedSchemaConsistentSimple(boolean enableCodegen) throws 
java.io.IOException {
+    super.testUnsignedSchemaConsistentSimple(enableCodegen);
+  }
+
+  @Test(dataProvider = "enableCodegen")
+  public void testUnsignedSchemaCompatible(boolean enableCodegen) throws 
java.io.IOException {
+    super.testUnsignedSchemaCompatible(enableCodegen);
+  }
+}
diff --git a/javascript/jest.config.js b/javascript/jest.config.js
index 360596925..2dbfe8a42 100644
--- a/javascript/jest.config.js
+++ b/javascript/jest.config.js
@@ -29,6 +29,7 @@ module.exports = {
     "!**/build/**",
     "!packages/fory/lib/murmurHash3.ts"
   ],
+  testPathIgnorePatterns : !process.env["DATA_FILE"] ? 
["test/crossLanguage.test.ts"] : [],
   transform: {
     '\\.ts$': ['ts-jest', {
       tsconfig: {
diff --git a/javascript/packages/fory/index.ts 
b/javascript/packages/fory/index.ts
index 3200c27ca..ad7f7fc92 100644
--- a/javascript/packages/fory/index.ts
+++ b/javascript/packages/fory/index.ts
@@ -26,6 +26,7 @@ import {
 import { Serializer, InternalSerializerType, Mode } from "./lib/type";
 import Fory from "./lib/fory";
 import { BinaryReader } from "./lib/reader";
+import { BinaryWriter } from "./lib/writer";
 
 export {
   Serializer,
@@ -35,6 +36,7 @@ export {
   StructTypeInfo,
   Type,
   Mode,
+  BinaryWriter,
   BinaryReader,
 };
 
diff --git a/javascript/packages/fory/lib/classResolver.ts 
b/javascript/packages/fory/lib/classResolver.ts
index c646d6442..806c12662 100644
--- a/javascript/packages/fory/lib/classResolver.ts
+++ b/javascript/packages/fory/lib/classResolver.ts
@@ -87,6 +87,14 @@ export default class ClassResolver {
     this.setSerializer = this.getSerializerById((TypeId.SET));
     this.arraySerializer = this.getSerializerById((TypeId.ARRAY));
     this.mapSerializer = this.getSerializerById((TypeId.MAP));
+    this.uint8ArraySerializer = this.getSerializerById(TypeId.UINT8_ARRAY);
+    this.uint16ArraySerializer = this.getSerializerById(TypeId.UINT16_ARRAY);
+    this.uint32ArraySerializer = this.getSerializerById(TypeId.UINT32_ARRAY);
+    this.uint64ArraySerializer = this.getSerializerById(TypeId.UINT64_ARRAY);
+    this.int8ArraySerializer = this.getSerializerById(TypeId.INT8_ARRAY);
+    this.int16ArraySerializer = this.getSerializerById(TypeId.INT16_ARRAY);
+    this.int32ArraySerializer = this.getSerializerById(TypeId.INT32_ARRAY);
+    this.int64ArraySerializer = this.getSerializerById(TypeId.INT64_ARRAY);
   }
 
   private numberSerializer: null | Serializer = null;
@@ -97,6 +105,14 @@ export default class ClassResolver {
   private setSerializer: null | Serializer = null;
   private arraySerializer: null | Serializer = null;
   private mapSerializer: null | Serializer = null;
+  private uint8ArraySerializer: null | Serializer = null;
+  private uint16ArraySerializer: null | Serializer = null;
+  private uint32ArraySerializer: null | Serializer = null;
+  private uint64ArraySerializer: null | Serializer = null;
+  private int8ArraySerializer: null | Serializer = null;
+  private int16ArraySerializer: null | Serializer = null;
+  private int32ArraySerializer: null | Serializer = null;
+  private int64ArraySerializer: null | Serializer = null;
 
   constructor(private fory: Fory) {
   }
@@ -178,6 +194,38 @@ export default class ClassResolver {
       return this.stringSerializer;
     }
 
+    if (v instanceof Uint8Array) {
+      return this.uint8ArraySerializer;
+    }
+
+    if (v instanceof Uint16Array) {
+      return this.uint16ArraySerializer;
+    }
+
+    if (v instanceof Uint32Array) {
+      return this.uint32ArraySerializer;
+    }
+
+    if (v instanceof BigUint64Array) {
+      return this.uint64ArraySerializer;
+    }
+
+    if (v instanceof Int8Array) {
+      return this.int8ArraySerializer;
+    }
+
+    if (v instanceof Int16Array) {
+      return this.int16ArraySerializer;
+    }
+
+    if (v instanceof Int32Array) {
+      return this.int32ArraySerializer;
+    }
+
+    if (v instanceof BigInt64Array) {
+      return this.int64ArraySerializer;
+    }
+
     if (Array.isArray(v)) {
       return this.arraySerializer;
     }
diff --git a/javascript/packages/fory/lib/gen/typedArray.ts 
b/javascript/packages/fory/lib/gen/typedArray.ts
index ed0db69f2..11ffa9d1e 100644
--- a/javascript/packages/fory/lib/gen/typedArray.ts
+++ b/javascript/packages/fory/lib/gen/typedArray.ts
@@ -77,6 +77,10 @@ CodegenRegistry.register(InternalSerializerType.INT8_ARRAY, 
build(Type.int8()));
 CodegenRegistry.register(InternalSerializerType.INT16_ARRAY, 
build(Type.int16()));
 CodegenRegistry.register(InternalSerializerType.INT32_ARRAY, 
build(Type.int32()));
 CodegenRegistry.register(InternalSerializerType.INT64_ARRAY, 
build(Type.int64()));
+CodegenRegistry.register(InternalSerializerType.UINT8_ARRAY, 
build(Type.uint8()));
+CodegenRegistry.register(InternalSerializerType.UINT16_ARRAY, 
build(Type.uint16()));
+CodegenRegistry.register(InternalSerializerType.UINT32_ARRAY, 
build(Type.uint32()));
+CodegenRegistry.register(InternalSerializerType.UINT64_ARRAY, 
build(Type.uint64()));
 CodegenRegistry.register(InternalSerializerType.FLOAT16_ARRAY, 
build(Type.float16()));
 CodegenRegistry.register(InternalSerializerType.FLOAT32_ARRAY, 
build(Type.float32()));
 CodegenRegistry.register(InternalSerializerType.FLOAT64_ARRAY, 
build(Type.float64()));
diff --git a/javascript/packages/fory/lib/type.ts 
b/javascript/packages/fory/lib/type.ts
index 185b83d98..ebbc3a779 100644
--- a/javascript/packages/fory/lib/type.ts
+++ b/javascript/packages/fory/lib/type.ts
@@ -167,6 +167,10 @@ export enum InternalSerializerType {
   INT16_ARRAY,
   INT32_ARRAY,
   INT64_ARRAY,
+  UINT8_ARRAY,
+  UINT16_ARRAY,
+  UINT32_ARRAY,
+  UINT64_ARRAY,
   FLOAT16_ARRAY,
   FLOAT32_ARRAY,
   FLOAT64_ARRAY,
diff --git a/javascript/packages/fory/lib/typeInfo.ts 
b/javascript/packages/fory/lib/typeInfo.ts
index 6a73d88e0..74d63fa85 100644
--- a/javascript/packages/fory/lib/typeInfo.ts
+++ b/javascript/packages/fory/lib/typeInfo.ts
@@ -707,6 +707,34 @@ export const Type = {
 
     );
   },
+  uint8Array() {
+    return TypeInfo.fromNonParam(
+      InternalSerializerType.UINT8_ARRAY as const,
+      (TypeId.INT8_ARRAY),
+
+    );
+  },
+  uint16Array() {
+    return TypeInfo.fromNonParam(
+      InternalSerializerType.UINT16_ARRAY as const,
+      (TypeId.INT16_ARRAY),
+
+    );
+  },
+  uint32Array() {
+    return TypeInfo.fromNonParam(
+      InternalSerializerType.UINT32_ARRAY as const,
+      (TypeId.UINT32_ARRAY),
+
+    );
+  },
+  uint64Array() {
+    return TypeInfo.fromNonParam(
+      InternalSerializerType.UINT64_ARRAY as const,
+      (TypeId.INT64_ARRAY),
+
+    );
+  },
   float16Array() {
     return TypeInfo.fromNonParam(
       InternalSerializerType.FLOAT16_ARRAY as const,
diff --git a/javascript/packages/fory/lib/writer/index.ts 
b/javascript/packages/fory/lib/writer/index.ts
index 295f57679..841f99399 100644
--- a/javascript/packages/fory/lib/writer/index.ts
+++ b/javascript/packages/fory/lib/writer/index.ts
@@ -80,6 +80,11 @@ export class BinaryWriter {
     this.reserved = 0;
   }
 
+  bool(bool: boolean) {
+    this.dataView.setUint8(this.cursor, bool ? 1 : 0);
+    this.cursor++;
+  }
+
   uint8(v: number) {
     this.dataView.setUint8(this.cursor, v);
     this.cursor++;
diff --git a/javascript/test/crossLanguage.test.ts 
b/javascript/test/crossLanguage.test.ts
new file mode 100644
index 000000000..8ad104d9a
--- /dev/null
+++ b/javascript/test/crossLanguage.test.ts
@@ -0,0 +1,188 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import Fory, {
+  TypeInfo,
+  InternalSerializerType,
+  BinaryWriter,
+} from "../packages/fory/index";
+import { describe, expect, test } from "@jest/globals";
+import * as fs from "node:fs";
+
+const Byte = {
+    MAX_VALUE: 127,
+    MIN_VALUE: -128,
+}
+
+const Short = {
+    MAX_VALUE: 32767,
+    MIN_VALUE: -32768,
+}
+
+const Integer = {
+    MAX_VALUE: 2147483647,
+    MIN_VALUE: -2147483648,
+}
+
+const Long = {
+    MAX_VALUE: BigInt("9223372036854775807"),
+    MIN_VALUE: BigInt("-9223372036854775808"),
+}
+
+describe("bool", () => {
+  const dataFile = process.env["DATA_FILE"];
+  if (!dataFile) {
+    return;
+  }
+  function writeToFile(buffer: Buffer) {
+    fs.writeFileSync(dataFile!, buffer);
+  }
+  const content = fs.readFileSync(dataFile);
+  
+  test("test_buffer", () => {
+    const buffer = new BinaryWriter();
+    buffer.reserve(32);
+    buffer.bool(true);
+    buffer.uint8(Byte.MAX_VALUE);
+    buffer.int16(Short.MAX_VALUE);
+    buffer.int32(Integer.MAX_VALUE);
+    buffer.int64(Long.MAX_VALUE);
+    buffer.float32(-1.1);
+    buffer.float64(-1.1);
+    buffer.varUInt32(100);
+    const bytes = ['a'.charCodeAt(0), 'b'.charCodeAt(0)];
+    buffer.int32(bytes.length);
+    buffer.buffer(new Uint8Array(bytes));
+    writeToFile(buffer.dump() as Buffer);
+  });
+  test("test_buffer_var", () => {
+    // todo
+  });
+  test("test_murmurhash3", () => {
+    // todo
+  });
+  test("test_string_serializer", () => {
+    // todo
+  });
+  test("test_cross_language_serializer", () => {
+    // todo
+  });
+  test("test_simple_struct", () => {
+    // todo
+  });
+  test("test_named_simple_struct", () => {
+    // todo
+  });
+  test("test_list", () => {
+    // todo
+  });
+  test("test_map", () => {
+    // todo
+  });
+  test("test_integer", () => {
+    // todo
+  });
+  test("test_item", () => {
+    // todo
+  });
+  test("test_color", () => {
+    // todo
+  });
+  test("test_struct_with_list", () => {
+    // todo
+  });
+  test("test_struct_with_map", () => {
+    // todo
+  });
+  test("test_skip_id_custom", () => {
+    // todo
+  });
+  test("test_skip_name_custom", () => {
+    // todo
+  });
+  test("test_consistent_named", () => {
+    // todo
+  });
+  test("test_struct_version_check", () => {
+    // todo
+  });
+  test("test_polymorphic_list", () => {
+    // todo
+  });
+  test("test_polymorphic_map", () => {
+    // todo
+  });
+  test("test_one_string_field_schema", () => {
+    // todo
+  });
+  test("test_one_string_field_compatible", () => {
+    // todo
+  });
+  test("test_two_string_field_compatible", () => {
+    // todo
+  });
+  test("test_schema_evolution_compatible", () => {
+    // todo
+  });
+  test("test_one_enum_field_schema", () => {
+    // todo
+  });
+  test("test_one_enum_field_compatible", () => {
+    // todo
+  });
+  test("test_two_enum_field_compatible", () => {
+    // todo
+  });
+  test("test_enum_schema_evolution_compatible", () => {
+    // todo
+  });
+  test("test_nullable_field_schema_consistent_not_null", () => {
+    // todo
+  });
+  test("test_nullable_field_schema_consistent_null", () => {
+    // todo
+  });
+  test("test_nullable_field_compatible_not_null", () => {
+    // todo
+  });
+  test("test_nullable_field_compatible_null", () => {
+    // todo
+  });
+  test("test_ref_schema_consistent", () => {
+    // todo
+  });
+  test("test_ref_compatible", () => {
+    // todo
+  });
+  test("test_circular_ref_schema_consistent", () => {
+    // todo
+  });
+  test("test_circular_ref_compatible", () => {
+    // todo
+  });
+  test("test_unsigned_schema_consistent_simple", () => {
+    // todo
+  });
+  test("test_unsigned_schema_consistent", () => {
+    // todo
+  });
+  test("test_unsigned_schema_compatible", () => {
+    // todo
+  });
+});
diff --git a/javascript/test/hps.test.ts b/javascript/test/hps.test.ts
index cb040cebf..e58faca12 100644
--- a/javascript/test/hps.test.ts
+++ b/javascript/test/hps.test.ts
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import { BinaryReader } from '@apache-fory/fory';
+import { BinaryReader } from '../packages/fory/index';
 import hps from '../packages/hps/index';
 import { describe, expect, test } from '@jest/globals';
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to