InteropTests.NewtonsoftJson.cs 5.0 KB

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