ConstructorSignatureTests.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. using System.Globalization;
  2. using Jint.Runtime.Interop;
  3. namespace Jint.Tests.Runtime;
  4. public class ConstructorSignatureTests
  5. {
  6. [Fact]
  7. public void OptionalConstructorParametersShouldBeSupported()
  8. {
  9. var engine = new Engine();
  10. engine.SetValue("A", TypeReference.CreateTypeReference(engine, typeof(A)));
  11. // ParamArray tests
  12. Assert.Equal("3", engine.Evaluate("new A(1, 2).Result").AsString());
  13. Assert.Equal("3", engine.Evaluate("new A(1, 2, null).Result").AsString());
  14. Assert.Equal("3", engine.Evaluate("new A(1, 2, undefined).Result").AsString());
  15. Assert.Equal("5", engine.Evaluate("new A(1, 2, null, undefined).Result").AsString());
  16. Assert.Equal("9", engine.Evaluate("new A(1, 2, ...'packed').Result").AsString());
  17. Assert.Equal("3", engine.Evaluate("new A(1, 2, []).Result").AsString());
  18. Assert.Equal("7", engine.Evaluate("new A(1, 2, [...'abcd']).Result").AsString());
  19. // Optional parameter tests
  20. Assert.Equal("3", engine.Evaluate("new A(1, 2).Result").AsString());
  21. Assert.Equal("6", engine.Evaluate("new A(1).Result").AsString());
  22. Assert.Equal("7", engine.Evaluate("new A(2, undefined).Result").AsString());
  23. Assert.Equal("8", engine.Evaluate("new A(3, undefined).Result").AsString());
  24. Assert.Equal("ab", engine.Evaluate("new A('a').Result").AsString());
  25. Assert.Equal("ab", engine.Evaluate("new A('a', undefined).Result").AsString());
  26. Assert.Equal("ac", engine.Evaluate("new A('a', 'c').Result").AsString());
  27. Assert.Equal("adc", engine.Evaluate("new A('a', 'd', undefined).Result").AsString());
  28. Assert.Equal("ade", engine.Evaluate("new A('a', 'd', 'e').Result").AsString());
  29. }
  30. [Fact]
  31. public void CorrectOverloadShouldBeSelected()
  32. {
  33. var engine = new Engine();
  34. engine.SetValue("B", typeof(B));
  35. Assert.Equal("A-30", engine.Evaluate("new B('A', 30).Result"));
  36. }
  37. [Fact]
  38. public void CanConstructWithMixedFloatAndEnumConstructorParameters()
  39. {
  40. var engine = new Engine();
  41. engine.SetValue("Length", TypeReference.CreateTypeReference<Length>(engine));
  42. Assert.Equal(12.3, engine.Evaluate("new Length(12.3).Value").AsNumber(), precision: 2);
  43. Assert.Equal(12.3, engine.Evaluate("new Length(12.3, 0).Value").AsNumber(), precision: 2);
  44. Assert.Equal(0, engine.Evaluate("new Length(12.3, 0).UnitValue").AsInteger());
  45. Assert.Equal(LengthUnit.Pixel, (LengthUnit) engine.Evaluate("new Length(12.3, 42).UnitValue").AsInteger());
  46. }
  47. [Fact]
  48. public void ShouldBeAbleToIgnoreDefaultParameters()
  49. {
  50. var engine = new Engine();
  51. engine.SetValue("C", TypeReference.CreateTypeReference(engine, typeof(C)));
  52. // Should not throw an error
  53. engine.Evaluate("new C(1, 2)");
  54. engine.Evaluate("new C(1, 2, 'context')");
  55. }
  56. private class A
  57. {
  58. public A(int param1, int param2 = 5) => Result = (param1 + param2).ToString();
  59. public A(string param1, string param2 = "b") => Result = string.Concat(param1, param2);
  60. public A(string param1, string param2 = "b", string param3 = "c") => Result = string.Concat(param1, param2, param3);
  61. public A(int param1, int param2, params object[] param3) => Result = (param1 + param2 + param3?.Length).ToString();
  62. public string Result { get; }
  63. }
  64. private class B
  65. {
  66. public B(string param1, float param2, string param3)
  67. {
  68. Result = string.Join("-", param1, param2.ToString(CultureInfo.InvariantCulture), param3);
  69. }
  70. public B(string param1, float param2)
  71. {
  72. Result = string.Join("-", param1, param2.ToString(CultureInfo.InvariantCulture));
  73. }
  74. public string Result { get; }
  75. }
  76. private enum LengthUnit { Pixel = 42 }
  77. private class Length
  78. {
  79. public Length(float value)
  80. : this(value, LengthUnit.Pixel)
  81. {
  82. }
  83. public Length(float value, LengthUnit unit)
  84. {
  85. Value = value;
  86. UnitValue = unit;
  87. }
  88. public float Value { get; }
  89. public LengthUnit UnitValue { get; }
  90. }
  91. private class C
  92. {
  93. public C(int tileCoordsX, int tileCoordsY, string context = null)
  94. {
  95. }
  96. }
  97. }