ClassTests.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using Jint.Runtime;
  2. namespace Jint.Tests.Runtime;
  3. public class ClassTests
  4. {
  5. [Fact]
  6. public void IsBlockScoped()
  7. {
  8. const string Script = @"
  9. class C {}
  10. var c1 = C;
  11. {
  12. class C {}
  13. var c2 = C;
  14. }
  15. return C === c1;";
  16. var engine = new Engine();
  17. Assert.True(engine.Evaluate(Script).AsBoolean());
  18. }
  19. [Fact]
  20. public void CanDestructureNestedMembers()
  21. {
  22. const string Script = @"
  23. class Board {
  24. constructor () {
  25. this.grid = {width: 10, height: 10}
  26. }
  27. get width () {
  28. const {grid} = this
  29. return grid.width
  30. }
  31. get doubleWidth () {
  32. const {width} = this
  33. return width * 2
  34. }
  35. }";
  36. var engine = new Engine();
  37. engine.Execute(Script);
  38. engine.Evaluate("var board = new Board()");
  39. Assert.Equal(10, engine.Evaluate("board.width"));
  40. Assert.Equal(20, engine.Evaluate("board.doubleWidth "));
  41. }
  42. [Fact]
  43. public void PrivateMemberAccessOutsideOfClass()
  44. {
  45. var ex = Assert.Throws<JavaScriptException>(() => new Engine().Evaluate
  46. (
  47. """
  48. class A { }
  49. new A().#nonexistent = 1;
  50. """
  51. ));
  52. Assert.Equal("Private field '#nonexistent' must be declared in an enclosing class (<anonymous>:2:9)", ex.Message);
  53. }
  54. [Fact]
  55. public void PrivateMemberAccessAgainstUnknownMemberInConstructor()
  56. {
  57. var ex = Assert.Throws<JavaScriptException>(() => new Engine().Evaluate
  58. (
  59. """
  60. class A { constructor() { #nonexistent = 2; } }
  61. new A();
  62. """
  63. ));
  64. Assert.Equal("Unexpected identifier '#nonexistent' (<anonymous>:1:27)", ex.Message);
  65. }
  66. }