|
7 | 7 |
|
8 | 8 | #include "BridgingTest.h" |
9 | 9 |
|
| 10 | +#include <cstdint> |
| 11 | +#include <limits> |
| 12 | +#include <utility> |
| 13 | + |
10 | 14 | namespace facebook::react { |
11 | 15 |
|
12 | 16 | using namespace std::literals; |
@@ -793,4 +797,87 @@ TEST_F(BridgingTest, highResTimeStampTest) { |
793 | 797 | 1.000001, bridging::toJs(rt, HighResDuration::fromNanoseconds(1e6 + 1))); |
794 | 798 | } |
795 | 799 |
|
| 800 | +TEST_F(BridgingTest, bigintTest) { |
| 801 | + // Test BigInt construction from int64_t |
| 802 | + BigInt fromSigned(static_cast<int64_t>(42)); |
| 803 | + EXPECT_TRUE(fromSigned.isInt64()); |
| 804 | + EXPECT_FALSE(fromSigned.isUint64()); |
| 805 | + EXPECT_EQ(42, fromSigned.asInt64()); |
| 806 | + |
| 807 | + // Test BigInt construction from uint64_t |
| 808 | + BigInt fromUnsigned(static_cast<uint64_t>(42)); |
| 809 | + EXPECT_FALSE(fromUnsigned.isInt64()); |
| 810 | + EXPECT_TRUE(fromUnsigned.isUint64()); |
| 811 | + EXPECT_EQ(42ULL, fromUnsigned.asUint64()); |
| 812 | + |
| 813 | + // Test BigInt construction from jsi::BigInt with signed value |
| 814 | + auto jsiBigint = jsi::BigInt::fromInt64(rt, -123456789012345LL); |
| 815 | + BigInt fromJsi(rt, jsiBigint); |
| 816 | + EXPECT_TRUE(fromJsi.isInt64()); |
| 817 | + EXPECT_EQ(-123456789012345LL, fromJsi.asInt64()); |
| 818 | + |
| 819 | + // Test BigInt construction from jsi::BigInt with large unsigned value |
| 820 | + // (doesn't fit in int64_t, so should be stored as uint64_t) |
| 821 | + constexpr uint64_t uint64Max = std::numeric_limits<uint64_t>::max(); |
| 822 | + auto jsiUnsigned = jsi::BigInt::fromUint64(rt, uint64Max); |
| 823 | + BigInt fromJsiUnsigned(rt, jsiUnsigned); |
| 824 | + EXPECT_TRUE(fromJsiUnsigned.isUint64()); |
| 825 | + EXPECT_EQ(uint64Max, fromJsiUnsigned.asUint64()); |
| 826 | + |
| 827 | + // Test BigInt construction from jsi::BigInt with small positive value |
| 828 | + // (fits in both int64_t and uint64_t — should prefer int64_t) |
| 829 | + auto jsiSmall = jsi::BigInt::fromInt64(rt, 5); |
| 830 | + BigInt fromJsiSmall(rt, jsiSmall); |
| 831 | + EXPECT_TRUE(fromJsiSmall.isInt64()); |
| 832 | + EXPECT_EQ(5, fromJsiSmall.asInt64()); |
| 833 | + |
| 834 | + // Test toJSBigInt roundtrip for signed value |
| 835 | + BigInt signedVal(static_cast<int64_t>(-42)); |
| 836 | + auto jsResult = signedVal.toJSBigInt(rt); |
| 837 | + EXPECT_EQ(-42, jsResult.asInt64(rt)); |
| 838 | + |
| 839 | + // Test toJSBigInt roundtrip for unsigned value |
| 840 | + BigInt unsignedVal(uint64Max); |
| 841 | + auto jsUnsignedResult = unsignedVal.toJSBigInt(rt); |
| 842 | + EXPECT_EQ(uint64Max, jsUnsignedResult.asUint64(rt)); |
| 843 | + |
| 844 | + // Test Bridging<BigInt>::fromJs |
| 845 | + constexpr int64_t int64Max = std::numeric_limits<int64_t>::max(); |
| 846 | + auto jsBigint = jsi::BigInt::fromInt64(rt, int64Max); |
| 847 | + auto bridged = |
| 848 | + bridging::fromJs<BigInt>(rt, jsi::Value(rt, jsBigint), invoker); |
| 849 | + EXPECT_TRUE(bridged.isInt64()); |
| 850 | + EXPECT_EQ(int64Max, bridged.asInt64()); |
| 851 | + |
| 852 | + // Test Bridging<BigInt>::toJs |
| 853 | + BigInt toConvert(static_cast<int64_t>(123456789012345LL)); |
| 854 | + auto jsConverted = bridging::toJs(rt, toConvert); |
| 855 | + EXPECT_EQ(123456789012345LL, jsConverted.asInt64(rt)); |
| 856 | + |
| 857 | + // Test roundtrip at extreme values via bridging |
| 858 | + constexpr int64_t int64Min = std::numeric_limits<int64_t>::min(); |
| 859 | + |
| 860 | + auto roundtripMin = bridging::fromJs<BigInt>( |
| 861 | + rt, jsi::Value(rt, bridging::toJs(rt, BigInt(int64Min))), invoker); |
| 862 | + EXPECT_TRUE(roundtripMin.isInt64()); |
| 863 | + EXPECT_EQ(int64Min, roundtripMin.asInt64()); |
| 864 | + |
| 865 | + auto roundtripMax = bridging::fromJs<BigInt>( |
| 866 | + rt, jsi::Value(rt, bridging::toJs(rt, BigInt(int64Max))), invoker); |
| 867 | + EXPECT_TRUE(roundtripMax.isInt64()); |
| 868 | + EXPECT_EQ(int64Max, roundtripMax.asInt64()); |
| 869 | + |
| 870 | + auto roundtripUmax = bridging::fromJs<BigInt>( |
| 871 | + rt, jsi::Value(rt, bridging::toJs(rt, BigInt(uint64Max))), invoker); |
| 872 | + EXPECT_TRUE(roundtripUmax.isUint64()); |
| 873 | + EXPECT_EQ(uint64Max, roundtripUmax.asUint64()); |
| 874 | + |
| 875 | + // Test equality |
| 876 | + EXPECT_EQ(BigInt(static_cast<int64_t>(42)), BigInt(static_cast<int64_t>(42))); |
| 877 | + EXPECT_EQ(BigInt(uint64Max), BigInt(uint64Max)); |
| 878 | + // Same numeric value but different variant type are not equal |
| 879 | + EXPECT_NE( |
| 880 | + BigInt(static_cast<int64_t>(42)), BigInt(static_cast<uint64_t>(42))); |
| 881 | +} |
| 882 | + |
796 | 883 | } // namespace facebook::react |
0 commit comments