InteropExplicitTypeTests.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. using System.Reflection;
  2. namespace Jint.Tests.Runtime
  3. {
  4. public class InteropExplicitTypeTests
  5. {
  6. public interface I1
  7. {
  8. string Name { get; }
  9. }
  10. public class Super
  11. {
  12. public string Name { get; } = "Super";
  13. }
  14. public class CI1 : Super, I1
  15. {
  16. public new string Name { get; } = "CI1";
  17. string I1.Name { get; } = "CI1 as I1";
  18. }
  19. public class Indexer<T>
  20. {
  21. private readonly T t;
  22. public Indexer(T t)
  23. {
  24. this.t = t;
  25. }
  26. public T this[int index]
  27. {
  28. get { return t; }
  29. }
  30. }
  31. public class InterfaceHolder
  32. {
  33. public InterfaceHolder()
  34. {
  35. var ci1 = new CI1();
  36. this.ci1 = ci1;
  37. this.i1 = ci1;
  38. this.super = ci1;
  39. this.IndexerCI1 = new Indexer<CI1>(ci1);
  40. this.IndexerI1 = new Indexer<I1>(ci1);
  41. this.IndexerSuper = new Indexer<Super>(ci1);
  42. }
  43. public readonly CI1 ci1;
  44. public readonly I1 i1;
  45. public readonly Super super;
  46. public CI1 CI1 { get => ci1; }
  47. public I1 I1 { get => i1; }
  48. public Super Super { get => super; }
  49. public CI1 GetCI1() => ci1;
  50. public I1 GetI1() => i1;
  51. public Super GetSuper() => super;
  52. public Indexer<CI1> IndexerCI1 { get; }
  53. public Indexer<I1> IndexerI1 { get; }
  54. public Indexer<Super> IndexerSuper { get; }
  55. }
  56. private readonly Engine _engine;
  57. private readonly InterfaceHolder holder;
  58. public InteropExplicitTypeTests()
  59. {
  60. holder = new InterfaceHolder();
  61. _engine = new Engine(cfg => cfg.AllowClr(
  62. typeof(Console).GetTypeInfo().Assembly,
  63. typeof(File).GetTypeInfo().Assembly))
  64. .SetValue("log", new Action<object>(Console.WriteLine))
  65. .SetValue("assert", new Action<bool>(Assert.True))
  66. .SetValue("equal", new Action<object, object>(Assert.Equal))
  67. .SetValue("holder", holder)
  68. ;
  69. }
  70. [Fact]
  71. public void EqualTest()
  72. {
  73. Assert.Equal(_engine.Evaluate("holder.I1"), _engine.Evaluate("holder.i1"));
  74. Assert.NotEqual(_engine.Evaluate("holder.I1"), _engine.Evaluate("holder.ci1"));
  75. Assert.Equal(_engine.Evaluate("holder.Super"), _engine.Evaluate("holder.super"));
  76. Assert.NotEqual(_engine.Evaluate("holder.Super"), _engine.Evaluate("holder.ci1"));
  77. }
  78. [Fact]
  79. public void ExplicitInterfaceFromField()
  80. {
  81. Assert.Equal(holder.i1.Name, _engine.Evaluate("holder.i1.Name"));
  82. Assert.NotEqual(holder.i1.Name, _engine.Evaluate("holder.ci1.Name"));
  83. }
  84. [Fact]
  85. public void ExplicitInterfaceFromProperty()
  86. {
  87. Assert.Equal(holder.I1.Name, _engine.Evaluate("holder.I1.Name"));
  88. Assert.NotEqual(holder.I1.Name, _engine.Evaluate("holder.CI1.Name"));
  89. }
  90. [Fact]
  91. public void ExplicitInterfaceFromMethod()
  92. {
  93. Assert.Equal(holder.GetI1().Name, _engine.Evaluate("holder.GetI1().Name"));
  94. Assert.NotEqual(holder.GetI1().Name, _engine.Evaluate("holder.GetCI1().Name"));
  95. }
  96. [Fact]
  97. public void ExplicitInterfaceFromIndexer()
  98. {
  99. Assert.Equal(holder.IndexerI1[0].Name, _engine.Evaluate("holder.IndexerI1[0].Name"));
  100. }
  101. [Fact]
  102. public void SuperClassFromField()
  103. {
  104. Assert.Equal(holder.super.Name, _engine.Evaluate("holder.super.Name"));
  105. Assert.NotEqual(holder.super.Name, _engine.Evaluate("holder.ci1.Name"));
  106. }
  107. [Fact]
  108. public void SuperClassFromProperty()
  109. {
  110. Assert.Equal(holder.Super.Name, _engine.Evaluate("holder.Super.Name"));
  111. Assert.NotEqual(holder.Super.Name, _engine.Evaluate("holder.CI1.Name"));
  112. }
  113. [Fact]
  114. public void SuperClassFromMethod()
  115. {
  116. Assert.Equal(holder.GetSuper().Name, _engine.Evaluate("holder.GetSuper().Name"));
  117. Assert.NotEqual(holder.GetSuper().Name, _engine.Evaluate("holder.GetCI1().Name"));
  118. }
  119. [Fact]
  120. public void SuperClassFromIndexer()
  121. {
  122. Assert.Equal(holder.IndexerSuper[0].Name, _engine.Evaluate("holder.IndexerSuper[0].Name"));
  123. }
  124. public struct NullabeStruct: I1
  125. {
  126. public NullabeStruct()
  127. {
  128. }
  129. public string name = "NullabeStruct";
  130. public string Name { get => name; }
  131. string I1.Name { get => "NullabeStruct as I1"; }
  132. }
  133. public class NullableHolder
  134. {
  135. public I1? I1 { get; set; }
  136. public NullabeStruct? NullabeStruct { get; set; }
  137. }
  138. [Fact]
  139. public void TestNullable()
  140. {
  141. var nullableHolder = new NullableHolder();
  142. _engine.SetValue("nullableHolder", nullableHolder);
  143. _engine.SetValue("nullabeStruct", new NullabeStruct());
  144. Assert.Equal(_engine.Evaluate("nullableHolder.NullabeStruct"), Native.JsValue.Null);
  145. _engine.Evaluate("nullableHolder.NullabeStruct = nullabeStruct");
  146. Assert.Equal(_engine.Evaluate("nullableHolder.NullabeStruct.Name"), nullableHolder.NullabeStruct?.Name);
  147. }
  148. [Fact]
  149. public void TestUnwrapClr()
  150. {
  151. Assert.NotEqual(holder.CI1.Name, _engine.Evaluate("holder.I1.Name"));
  152. Assert.Equal(holder.CI1.Name, _engine.Evaluate("unwrapClr(holder.I1).Name"));
  153. }
  154. }
  155. }