@@ -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