InteropTests.NewtonsoftJson.cs 3.8 KB

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