InteropTests.NewtonsoftJson.cs 4.2 KB

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