Test toString expectations for interop objects

Now that ddc, dart2js, and dart2wasm are consistent on toString outputs
for JS objects, we should test to make sure this behavior doesn't
regress.

Change-Id: I2b1b4819e5a2425ae813dc944a4dea7b2147d5bc
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/322365
Commit-Queue: Sigmund Cherem <sigmund@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
Auto-Submit: Srujan Gaddam <srujzs@google.com>
This commit is contained in:
Srujan Gaddam 2023-08-23 20:49:24 +00:00 committed by Commit Queue
parent 9e761d5a10
commit 293cbd1dc9
3 changed files with 20 additions and 14 deletions

View file

@ -20,11 +20,13 @@ class JavaScriptClass {
}
void main() {
final toStringValue = 'external toString';
// Install a class that is accessible through interop.
eval('''
self.JavaScriptClass = class JavaScriptClass {
constructor() {}
get instanceGetter() { return 42; }
toString() { return '$toStringValue'; }
}
''');
var instanceOfClass = JavaScriptClass();
@ -34,8 +36,8 @@ self.JavaScriptClass = class JavaScriptClass {
testRuntimeType(instanceOfClass);
testNoSuchMethod(instanceOfClass);
testNoSuchMethodTearoff(instanceOfClass);
testToString(instanceOfClass);
testToStringTearoff(instanceOfClass);
testToString(instanceOfClass, toStringValue);
testToStringTearoff(instanceOfClass, toStringValue);
testEquals(instanceOfClass, other);
var emptyObject = eval('Object.create({})');
@ -43,8 +45,8 @@ self.JavaScriptClass = class JavaScriptClass {
testRuntimeType(emptyObject);
testNoSuchMethod(emptyObject);
testNoSuchMethodTearoff(emptyObject);
testToString(emptyObject);
testToStringTearoff(emptyObject);
testToString(emptyObject, '[object Object]');
testToStringTearoff(emptyObject, '[object Object]');
testEquals(emptyObject, other);
var objectWithNoProto = eval('Object.create(null)');
@ -69,7 +71,7 @@ self.JavaScriptClass = class JavaScriptClass {
testRuntimeType(jsNull);
testNoSuchMethod(jsNull);
testNoSuchMethodTearoff(jsNull);
testToString(jsNull);
testToStringTearoff(jsNull);
testToString(jsNull, 'null');
testToStringTearoff(jsNull, 'null');
testEquals(jsNull, other);
}

View file

@ -38,20 +38,22 @@ void testNoSuchMethodTearoff(x) {
Expect.contains('testMethod', noSuchMethodResult.toString());
}
void testToString(x) {
void testToString(x, String expected) {
var toStringResult = confuse(x.toString());
Expect.type<String>(toStringResult);
Expect.isTrue(toStringResult.isNotEmpty);
Expect.equals(toStringResult, expected);
Expect.equals(x.toString(), toStringResult);
}
void testToStringTearoff(x) {
void testToStringTearoff(x, String expected) {
var toStringTearoff = confuse(x.toString);
Expect.type<String Function()>(toStringTearoff);
Expect.equals(x.toString, toStringTearoff);
var toStringResult = toStringTearoff();
Expect.type<String>(toStringResult);
Expect.isTrue(toStringResult.isNotEmpty);
Expect.equals(toStringResult, expected);
Expect.equals(x.toString(), toStringResult);
}

View file

@ -24,11 +24,13 @@ extension on JavaScriptClass {
}
void main() {
final toStringValue = 'external toString';
// Install a class that is accessible through interop.
eval('''
self.JavaScriptClass = class JavaScriptClass {
constructor() {}
get instanceGetter() { return 42; }
toString() { return '$toStringValue'; }
}
''');
var instanceOfClass = JavaScriptClass();
@ -38,8 +40,8 @@ self.JavaScriptClass = class JavaScriptClass {
testRuntimeType(instanceOfClass);
testNoSuchMethod(instanceOfClass);
testNoSuchMethodTearoff(instanceOfClass);
testToString(instanceOfClass);
testToStringTearoff(instanceOfClass);
testToString(instanceOfClass, toStringValue);
testToStringTearoff(instanceOfClass, toStringValue);
testEquals(instanceOfClass, other);
var emptyObject = eval('Object.create({})');
@ -47,8 +49,8 @@ self.JavaScriptClass = class JavaScriptClass {
testRuntimeType(emptyObject);
testNoSuchMethod(emptyObject);
testNoSuchMethodTearoff(emptyObject);
testToString(emptyObject);
testToStringTearoff(emptyObject);
testToString(emptyObject, '[object Object]');
testToStringTearoff(emptyObject, '[object Object]');
testEquals(emptyObject, other);
var objectWithNoProto = eval('Object.create(null)');
@ -73,7 +75,7 @@ self.JavaScriptClass = class JavaScriptClass {
testRuntimeType(jsNull);
testNoSuchMethod(jsNull);
testNoSuchMethodTearoff(jsNull);
testToString(jsNull);
testToStringTearoff(jsNull);
testToString(jsNull, 'null');
testToStringTearoff(jsNull, 'null');
testEquals(jsNull, other);
}