diff --git a/Jint.Tests/Runtime/BigIntTests.cs b/Jint.Tests/Runtime/BigIntTests.cs index 83631fa644..c3ef814d8f 100644 --- a/Jint.Tests/Runtime/BigIntTests.cs +++ b/Jint.Tests/Runtime/BigIntTests.cs @@ -1,3 +1,4 @@ +using System.Numerics; using Jint.Native; namespace Jint.Tests.Runtime; @@ -28,4 +29,42 @@ public void BasicOperations(string statement, string expected) Assert.True(outputValues[0].IsBigInt(), "The type of the value is expected to stay BigInt"); Assert.Equal(expected, outputValues[0].ToString()); } + + [Theory] + [InlineData("let right = 123n;")] + [InlineData("let right = BigInt(123);")] + [InlineData("let right = BigInt('123');")] + public void ObjectIsReturnsTrueForSameBigInts(string statement) + { + // Arrange + var engine = new Engine(); + engine.SetValue("left", new JsBigInt(new BigInteger(123))); + engine.Evaluate(statement); + + // Act + var result = engine.Evaluate("Object.is(left, right);"); + + // Assert + Assert.True(result.AsBoolean()); + } + + [Theory] + [InlineData("let right = false;")] + [InlineData("let right = 'test';")] + [InlineData("let right = 123;")] + [InlineData("let right = 321n;")] + [InlineData("let right = BigInt('321');")] + public void ObjectIsReturnsFalseDifferentComparisonsWithBigInt(string statement) + { + // Arrange + var engine = new Engine(); + engine.SetValue("left", new JsBigInt(new BigInteger(123))); + engine.Evaluate(statement); + + // Act + var result = engine.Evaluate("Object.is(left, right);"); + + // Assert + Assert.False(result.AsBoolean()); + } } diff --git a/Jint/Native/JsValue.cs b/Jint/Native/JsValue.cs index e9f7aa7d74..fedf9c3421 100644 --- a/Jint/Native/JsValue.cs +++ b/Jint/Native/JsValue.cs @@ -537,6 +537,8 @@ internal static bool SameValue(JsValue x, JsValue y) return x == y; case Types.Object: return x is ObjectWrapper xo && y is ObjectWrapper yo && ReferenceEquals(xo.Target, yo.Target); + case Types.BigInt: + return (x is JsBigInt xBigInt && y is JsBigInt yBigInt && xBigInt.Equals(yBigInt)); default: return false; }