Skip to content

Commit

Permalink
Merge pull request #19 from koculu/18-support-for-hasownproperty
Browse files Browse the repository at this point in the history
Add object key query alternatives.
  • Loading branch information
koculu committed Oct 10, 2023
2 parents d0b7051 + acf8a0b commit ced6abb
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 10 deletions.
17 changes: 16 additions & 1 deletion src/Topaz.Test/BasicObjectTests.cs
Expand Up @@ -55,12 +55,27 @@ public void TestObject1(bool useThreadSafeJsObjects)
Assert.AreEqual(6, values.Count);
Assert.AreEqual(js, deserialized);
}

Assert.AreEqual(1, js.a1);
Assert.AreEqual(2, js.a2);
Assert.AreEqual(3, js.a3);
Assert.AreEqual(4, js[new DateTime()]);
Assert.AreEqual(5, js[null]);
Assert.IsNull(model.p1);
}

[TestCase]
public void TestInQuery()
{
var engine = new TopazEngine();
engine.ExecuteScript("let obj = { a: { b: '123' }}");
Assert.That(engine.ExecuteExpression("'b' in obj.a"), Is.True);
Assert.That(engine.ExecuteExpression("obj.a.Contains('b')"), Is.True);
Assert.That(engine.ExecuteExpression("obj.a.hasOwn('b')"), Is.True);
Assert.That(engine.ExecuteExpression("obj.a.hasOwnProperty('b')"), Is.True);
Assert.That(engine.ExecuteExpression("'c' in obj.a"), Is.False);
Assert.That(engine.ExecuteExpression("obj.a.Contains('c')"), Is.False);
Assert.That(engine.ExecuteExpression("obj.a.hasOwn('c')"), Is.False);
Assert.That(engine.ExecuteExpression("obj.a.hasOwnProperty('c')"), Is.False);
}
}
10 changes: 10 additions & 0 deletions src/Topaz.Test/DelegateArgumentConversionTests.cs
Expand Up @@ -111,4 +111,14 @@ public void TestActionConstruction()
Assert.AreEqual(37, model.c);
Assert.AreEqual(81, model.d);
}

[Test]
public void TestLambdaFunction()
{
var engine = new TopazEngine();
bool isCalled = false;
engine.SetValue("print", (string text) => { isCalled = true; });
engine.ExecuteExpression("print('text')");
Assert.IsTrue(isCalled);
}
}
11 changes: 11 additions & 0 deletions src/Topaz/API/object/concurrent/ConcurrentJsObject.cs
Expand Up @@ -140,4 +140,15 @@ protected virtual bool IsPrototypePropertyInternal(string memberName)
{
return false;
}

#pragma warning disable IDE1006 // Naming Styles
public virtual string toString()
{
return "[object Object]";
}

public bool hasOwnProperty(object key) => Contains(key);

public bool hasOwn(object key) => Contains(key);
#pragma warning restore IDE1006 // Naming Styles
}
15 changes: 12 additions & 3 deletions src/Topaz/API/object/normal/JsObject.cs
Expand Up @@ -12,7 +12,8 @@ public partial class JsObject : IJsObject, IDictionary

readonly DictionarySlim<string, object> dictionary = new();

public object this[object key] {
public object this[object key]
{
get
{
if (key == null)
Expand Down Expand Up @@ -45,8 +46,10 @@ public ICollection Keys
}
}

public ICollection Values {
get {
public ICollection Values
{
get
{
var list = new List<object>(dictionary.Count);
foreach (var entry in dictionary)
{
Expand Down Expand Up @@ -158,8 +161,14 @@ protected virtual bool IsPrototypePropertyInternal(string memberName)
return false;
}

#pragma warning disable IDE1006 // Naming Styles
public virtual string toString()
{
return "[object Object]";
}

public bool hasOwnProperty(object key) => Contains(key);

public bool hasOwn(object key) => Contains(key);
#pragma warning restore IDE1006 // Naming Styles
}
15 changes: 9 additions & 6 deletions src/Topaz/AstHandlers/Expressions/BinaryExpressionHandler.cs
@@ -1,5 +1,6 @@
using Esprima.Ast;
using System;
using System.Collections;
using System.Threading;
using Tenray.Topaz.Core;
using Tenray.Topaz.ErrorHandling;
Expand Down Expand Up @@ -221,6 +222,13 @@ private static object ExecuteBinaryOperatorString(BinaryOperator binaryOperator,
ScriptExecutor scriptExecutor, BinaryOperator @operator,
object left, object right)
{
if (@operator == BinaryOperator.In)
{
if (right is IDictionary dic)
return dic.Contains(left);
Exceptions.ThrowCannotUseInOperatorToSearchForIn(left, right);
}

// Try to avoid slow dynamic operator execution by type casting
if (left is double d1)
{
Expand Down Expand Up @@ -314,12 +322,7 @@ private static object ExecuteBinaryOperatorString(BinaryOperator binaryOperator,
BinaryOperator.RightShift => allowNumeric ? Convert.ToInt32(left ?? 0) >> Convert.ToInt32(right ?? 0) : 0,
BinaryOperator.UnsignedRightShift => allowNumeric ? Convert.ToInt32(left ?? 0) >> Convert.ToInt32(right ?? 0) : 0,
BinaryOperator.InstanceOf => left?.GetType().FullName == right?.ToString(),
BinaryOperator.In =>
JavascriptTypeUtility.HasObjectMethod(right, "ContainsKey") ?
right.ContainsKey(left) :
JavascriptTypeUtility.HasObjectMethod(right, "Contains") ?
right.Contains(left) :
Exceptions.ThrowCannotUseInOperatorToSearchForIn(left, right),
BinaryOperator.In => Exceptions.ThrowCannotUseInOperatorToSearchForIn(left, right),
BinaryOperator.LogicalAnd =>
JavascriptTypeUtility.AndLogicalOperator(left, right),
BinaryOperator.LogicalOr =>
Expand Down

0 comments on commit ced6abb

Please sign in to comment.