InteropTests.Dynamic.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. using System.Dynamic;
  2. namespace Jint.Tests.Runtime
  3. {
  4. public partial class InteropTests
  5. {
  6. [Fact]
  7. public void CanAccessExpandoObject()
  8. {
  9. var engine = new Engine();
  10. dynamic expando = new ExpandoObject();
  11. expando.Name = "test";
  12. engine.SetValue("expando", expando);
  13. Assert.Equal("test", engine.Evaluate("expando.Name").ToString());
  14. }
  15. [Fact]
  16. public void CanAccessMemberNamedItemThroughExpando()
  17. {
  18. var parent = (IDictionary<string, object>) new ExpandoObject();
  19. var child = (IDictionary<string, object>) new ExpandoObject();
  20. var values = (IDictionary<string, object>) new ExpandoObject();
  21. parent["child"] = child;
  22. child["item"] = values;
  23. values["title"] = "abc";
  24. _engine.SetValue("parent", parent);
  25. Assert.Equal("abc", _engine.Evaluate("parent.child.item.title"));
  26. }
  27. [Fact]
  28. public void ShouldForOfOnExpandoObject()
  29. {
  30. dynamic o = new ExpandoObject();
  31. o.a = 1;
  32. o.b = 2;
  33. _engine.SetValue("dynamic", o);
  34. var result = _engine.Evaluate("var l = ''; for (var x of dynamic) l += x; return l;").AsString();
  35. Assert.Equal("a,1b,2", result);
  36. }
  37. [Fact]
  38. public void ShouldConvertObjectInstanceToExpando()
  39. {
  40. _engine.Evaluate("var o = {a: 1, b: 'foo'}");
  41. var result = _engine.GetValue("o");
  42. dynamic value = result.ToObject();
  43. Assert.Equal(1, value.a);
  44. Assert.Equal("foo", value.b);
  45. var dic = (IDictionary<string, object>) result.ToObject();
  46. Assert.Equal(1d, dic["a"]);
  47. Assert.Equal("foo", dic["b"]);
  48. }
  49. [Fact]
  50. public void CanAccessDynamicObject()
  51. {
  52. var test = new DynamicClass();
  53. var engine = new Engine();
  54. engine.SetValue("test", test);
  55. Assert.Equal("a", engine.Evaluate("test.a").AsString());
  56. Assert.Equal("b", engine.Evaluate("test.b").AsString());
  57. engine.Evaluate("test.a = 5; test.b = 10; test.Name = 'Jint'");
  58. Assert.Equal(5, engine.Evaluate("test.a").AsNumber());
  59. Assert.Equal(10, engine.Evaluate("test.b").AsNumber());
  60. Assert.Equal("Jint", engine.Evaluate("test.Name").AsString());
  61. Assert.True(engine.Evaluate("test.ContainsKey('a')").AsBoolean());
  62. Assert.True(engine.Evaluate("test.ContainsKey('b')").AsBoolean());
  63. Assert.False(engine.Evaluate("test.ContainsKey('c')").AsBoolean());
  64. }
  65. private class DynamicClass : DynamicObject
  66. {
  67. private readonly Dictionary<string, object> _properties = new Dictionary<string, object>();
  68. public override bool TryGetMember(GetMemberBinder binder, out object result)
  69. {
  70. result = binder.Name;
  71. if (_properties.TryGetValue(binder.Name, out var value))
  72. {
  73. result = value;
  74. }
  75. return true;
  76. }
  77. public override bool TrySetMember(SetMemberBinder binder, object value)
  78. {
  79. _properties[binder.Name] = value;
  80. return true;
  81. }
  82. public string Name { get; set; }
  83. public bool ContainsKey(string key)
  84. {
  85. return _properties.ContainsKey(key);
  86. }
  87. }
  88. }
  89. }