| // Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import '../native_testing.dart'; |
| |
| abstract class NativeInterface { |
| int get size; |
| String get name; |
| String? get optName; |
| int method1(); |
| String method2(); |
| String? optMethod(); |
| } |
| |
| abstract class JSInterface { |
| String get name; |
| String? get optName; |
| } |
| |
| class BBB implements NativeInterface { |
| int get size => 300; |
| String get name => 'Brenda'; |
| String? get optName => name; |
| int method1() => 400; |
| String method2() => 'brilliant!'; |
| String? optMethod() => method2(); |
| } |
| |
| void setup() { |
| JS('', r""" |
| (function(){ |
| function AAA(s,n,m1,m2) { |
| this.size = s; |
| this.name = n; |
| this.optName = n; |
| this._m1 = m1; |
| this._m2 = m2; |
| } |
| AAA.prototype.method1 = function(){return this._m1}; |
| AAA.prototype.method2 = function(){return this._m2}; |
| AAA.prototype.optMethod = function(){return this._m2}; |
| |
| self.makeA = function() { |
| return new AAA(100, 'Albert', 200, 'amazing!'); |
| }; |
| self.makeAX = function() { |
| return new AAA(void 0, void 0, void 0, void 0); |
| }; |
| |
| self.nativeConstructor(AAA); |
| |
| function CCC(n) { |
| this.name = n; |
| this.optName = n; |
| } |
| |
| self.makeC = function() { |
| return new CCC('Carol'); |
| }; |
| self.makeCX = function() { |
| return new CCC(void 0); |
| }; |
| |
| self.nativeConstructor(CCC); |
| })()"""); |
| applyTestExtensions(['AAA', 'CCC']); |
| } |
| |
| // The 'NativeInterface' version of the code is passed both native and Dart |
| // objects, so there will be an interceptor dispatch to the method. This tests |
| // that the null-check exists in the forwarding method. |
| |
| @pragma('dart2js:noInline') |
| String describeNativeInterface(NativeInterface o) { |
| return '${o.name} ${o.method2()} ${o.size} ${o.method1()}'; |
| } |
| |
| @pragma('dart2js:noInline') |
| String describeOptNativeInterface(NativeInterface o) { |
| return '${o.optName} ${o.optMethod()}'; |
| } |
| |
| @pragma('dart2js:noInline') |
| String describeJSInterface(JSInterface o) { |
| return '${o.name}'; |
| } |
| |
| @pragma('dart2js:noInline') |
| String describeOptJSInterface(JSInterface o) { |
| return '${o.optName}'; |
| } |
| |
| const expectedA = 'Albert amazing! 100 200'; |
| const expectedB = 'Brenda brilliant! 300 400'; |
| const expectedOptA = 'Albert amazing!'; |
| const expectedOptB = 'Brenda brilliant!'; |
| const expectedOptX = 'null null'; |
| |
| const expectedC = 'Carol'; |
| const expectedOptC = 'Carol'; |
| const expectedOptCX = 'null'; |