InteropTests.Dynamic.cs 3.6 KB

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