Skip to content

Commit 507c154

Browse files
committed
test: lock down init cases of es classes
1 parent 5c6bc69 commit 507c154

1 file changed

Lines changed: 67 additions & 0 deletions

File tree

TestRunner/app/tests/Inheritance/ESClassTests.js

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,45 @@ describe(module.id, function () {
5656
expect(NSStringFromClass(object.class())).toBe('ESConstructorObject');
5757
});
5858

59+
it('ESClassSuperArgsSelectInitializer', function () {
60+
class ESCtorArgsObject extends TNSCInterface {
61+
constructor(name, x) {
62+
// Arguments passed to super(...) drive native initializer resolution;
63+
// arguments passed to `new` are only seen by the JS constructor.
64+
super(x);
65+
this.name = name;
66+
}
67+
}
68+
69+
var object = new ESCtorArgsObject('first', 7);
70+
expect(object instanceof ESCtorArgsObject).toBe(true);
71+
expect(object.name).toBe('first');
72+
expect(TNSGetOutput()).toBe('initWithPrimitive:7 called');
73+
TNSClearOutput();
74+
75+
class ESCtorTwoArgsObject extends TNSCInterface {
76+
constructor(a, b) {
77+
super(a, b);
78+
}
79+
}
80+
81+
var object2 = new ESCtorTwoArgsObject(5, 10);
82+
expect(object2 instanceof ESCtorTwoArgsObject).toBe(true);
83+
expect(TNSGetOutput()).toBe('initWithInt:andInt: 5 10 called');
84+
TNSClearOutput();
85+
86+
// super() with no arguments falls back to plain [[Class alloc] init]
87+
class ESCtorNoArgsObject extends TNSCInterface {
88+
constructor() {
89+
super();
90+
}
91+
}
92+
93+
var object3 = new ESCtorNoArgsObject();
94+
expect(object3 instanceof ESCtorNoArgsObject).toBe(true);
95+
expect(TNSGetOutput()).toBe('init called');
96+
});
97+
5998
it('ESClassInstanceMethodsAndSuper', function () {
6099
class ESMethodsObject extends TNSDerivedInterface {
61100
baseMethod() {
@@ -112,6 +151,34 @@ describe(module.id, function () {
112151
expect(NSStringFromClass(object.class())).toBe('ESAllocObject');
113152
});
114153

154+
it('ESClassAllocInitDoesNotRunJsConstructor', function () {
155+
var constructorRuns = 0;
156+
157+
class ESAllocNoCtorObject extends NSObject {
158+
field = 42;
159+
160+
constructor() {
161+
super();
162+
constructorRuns++;
163+
this.initializedFromJs = true;
164+
}
165+
}
166+
167+
// alloc().init() is purely native initialization: the JS constructor body and
168+
// class field initializers only run through `new`, never through alloc/init.
169+
var allocated = ESAllocNoCtorObject.alloc().init();
170+
expect(constructorRuns).toBe(0);
171+
expect(allocated.field).toBe(undefined);
172+
expect(allocated.initializedFromJs).toBe(undefined);
173+
expect(allocated instanceof ESAllocNoCtorObject).toBe(true);
174+
expect(NSStringFromClass(allocated.class())).toBe('ESAllocNoCtorObject');
175+
176+
var constructed = new ESAllocNoCtorObject();
177+
expect(constructorRuns).toBe(1);
178+
expect(constructed.field).toBe(42);
179+
expect(constructed.initializedFromJs).toBe(true);
180+
});
181+
115182
it('ESClassNewBeforeConstruction', function () {
116183
class ESNewObject extends NSObject {
117184
}

0 commit comments

Comments
 (0)