InteropTests.NewtonsoftJson.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using Jint.Native;
  2. using Jint.Runtime;
  3. using Newtonsoft.Json.Linq;
  4. namespace Jint.Tests.PublicInterface
  5. {
  6. public partial class InteropTests
  7. {
  8. [Fact]
  9. public void AccessingJObjectShouldWork()
  10. {
  11. var o = new JObject
  12. {
  13. new JProperty("name", "test-name")
  14. };
  15. _engine.SetValue("o", o);
  16. Assert.True(_engine.Evaluate("return o.name == 'test-name'").AsBoolean());
  17. }
  18. [Fact]
  19. public void AccessingJArrayViaIntegerIndexShouldWork()
  20. {
  21. var o = new JArray("item1", "item2");
  22. _engine.SetValue("o", o);
  23. Assert.True(_engine.Evaluate("return o[0] == 'item1'").AsBoolean());
  24. Assert.True(_engine.Evaluate("return o[1] == 'item2'").AsBoolean());
  25. }
  26. [Fact]
  27. public void DictionaryLikeShouldCheckIndexerAndFallBackToProperty()
  28. {
  29. const string json = @"{ ""Type"": ""Cat"" }";
  30. var jObjectWithTypeProperty = JObject.Parse(json);
  31. _engine.SetValue("o", jObjectWithTypeProperty);
  32. var typeResult = _engine.Evaluate("o.Type");
  33. // JToken requires conversion
  34. Assert.Equal("Cat", TypeConverter.ToString(typeResult));
  35. // weak equality does conversions from native types
  36. Assert.True(_engine.Evaluate("o.Type == 'Cat'").AsBoolean());
  37. }
  38. [Fact]
  39. public void ShouldBeAbleToIndexJObjectWithStrings()
  40. {
  41. var engine = new Engine();
  42. const string json = @"
  43. {
  44. 'Properties': {
  45. 'expirationDate': {
  46. 'Value': '2021-10-09T00:00:00Z'
  47. }
  48. }
  49. }";
  50. var obj = JObject.Parse(json);
  51. engine.SetValue("o", obj);
  52. var value = engine.Evaluate("o.Properties.expirationDate.Value");
  53. var dateInstance = Assert.IsAssignableFrom<JsDate>(value);
  54. Assert.Equal(DateTime.Parse("2021-10-09T00:00:00Z").ToUniversalTime(), dateInstance.ToDateTime());
  55. }
  56. // https://github.com/OrchardCMS/OrchardCore/issues/10648
  57. [Fact]
  58. public void EngineShouldStringifyAnJObjectListWithValuesCorrectly()
  59. {
  60. var engine = new Engine();
  61. var queryResults = new List<dynamic>
  62. {
  63. new { Text = "Text1", Value = 1 },
  64. new { Text = "Text2", Value = 2 }
  65. };
  66. engine.SetValue("testSubject", queryResults.Select(x => JObject.FromObject(x)));
  67. var fromEngine = engine.Evaluate("return JSON.stringify(testSubject);");
  68. var result = fromEngine.ToString();
  69. // currently we do not materialize LINQ enumerables
  70. // Assert.Equal("[{\"Text\":\"Text1\",\"Value\":1},{\"Text\":\"Text2\",\"Value\":2}]", result);
  71. Assert.Equal("{\"Current\":null}", result);
  72. }
  73. [Fact]
  74. public void EngineShouldStringifyJObjectFromObjectListWithValuesCorrectly()
  75. {
  76. var engine = new Engine();
  77. var source = new dynamic[]
  78. {
  79. new { Text = "Text1", Value = 1 },
  80. new { Text = "Text2", Value = 2, Null = (object) null, Date = new DateTime(2015, 6, 25, 0, 0, 0, DateTimeKind.Utc) }
  81. };
  82. engine.SetValue("testSubject", source.Select(x => JObject.FromObject(x)).ToList());
  83. var fromEngine = engine.Evaluate("return JSON.stringify(testSubject);");
  84. var result = fromEngine.ToString();
  85. Assert.Equal("[{\"Text\":\"Text1\",\"Value\":1},{\"Text\":\"Text2\",\"Value\":2,\"Null\":null,\"Date\":\"2015-06-25T00:00:00.000Z\"}]", result);
  86. }
  87. [Fact]
  88. public void DecimalsShouldBeHandledFromJObjects()
  89. {
  90. var test = JObject.FromObject(new
  91. {
  92. DecimalValue = 123.456m
  93. });
  94. _engine.SetValue("test", test);
  95. var fromInterop = _engine.Evaluate("test.DecimalValue");
  96. var number = Assert.IsType<JsNumber>(fromInterop);
  97. Assert.Equal(123.456d, number.AsNumber());
  98. }
  99. [Fact]
  100. public void ShouldBeAbleToChangePropertyWithNameValue()
  101. {
  102. var engine = new Engine();
  103. var input = Newtonsoft.Json.JsonConvert.DeserializeObject(@"{ ""value"": ""ORIGINAL"" }");
  104. var result = engine
  105. .SetValue("input", input)
  106. .Evaluate("input.value = \"CHANGED\"; input.value")
  107. .AsString();
  108. Assert.Equal("CHANGED", result);
  109. }
  110. }
  111. }