@@ -184,12 +184,14 @@ class ExpressionEvaluationTestDriver {
184
184
var sound = ${setup .soundNullSafety };
185
185
var sdk = dart_library.import('dart_sdk');
186
186
187
- if (!sound) {
187
+ if (sound) {
188
+ sdk.dart.nativeNonNullAsserts(true);
189
+ } else {
188
190
sdk.dart.weakNullSafetyWarnings(false);
189
191
sdk.dart.weakNullSafetyErrors(false);
192
+ sdk.dart.nonNullAsserts(true);
190
193
}
191
- sdk.dart.nonNullAsserts(true);
192
- sdk.dart.nativeNonNullAsserts(true);
194
+
193
195
sdk._debugger.registerDevtoolsFormatter();
194
196
dart_library.start('$appName ', '$uuid ', '$moduleName ', '$mainLibraryName ',
195
197
false);
@@ -235,12 +237,14 @@ class ExpressionEvaluationTestDriver {
235
237
function(sdk, app) {
236
238
'use strict';
237
239
238
- if (!sound) {
239
- sdk.dart.weakNullSafetyWarnings(false);
240
- sdk.dart.weakNullSafetyErrors(false);
240
+ if (sound) {
241
+ sdk.dart.nativeNonNullAsserts(true);
242
+ } else {
243
+ sdk.dart.weakNullSafetyWarnings(false);
244
+ sdk.dart.weakNullSafetyErrors(false);
245
+ sdk.dart.nonNullAsserts(true);
241
246
}
242
- sdk.dart.nonNullAsserts(true);
243
- sdk.dart.nativeNonNullAsserts(true);
247
+
244
248
sdk._debugger.registerDevtoolsFormatter();
245
249
app.$mainLibraryName .main([]);
246
250
});
@@ -479,14 +483,36 @@ class ExpressionEvaluationTestDriver {
479
483
/// only primitive values, lists or maps, etc.
480
484
///
481
485
/// TODO(annagrin): Add recursive check for nested objects.
482
- Future <void > checkRuntime ({
486
+ Future <void > checkRuntimeInFrame ({
483
487
required String breakpointId,
484
488
required String expression,
485
- required dynamic expectedResult,
489
+ dynamic expectedError,
490
+ dynamic expectedResult,
486
491
}) async {
492
+ assert (expectedError == null || expectedResult == null ,
493
+ 'Cannot expect both an error and result.' );
494
+
487
495
return await _onBreakpoint (breakpointId, onPause: (event) async {
488
- var actual = await _evaluateJsExpression (event, expression);
489
- expect (actual.json, expectedResult);
496
+ var evalResult = await _evaluateJsExpression (event, expression);
497
+
498
+ var error = evalResult.json['error' ];
499
+ if (error != null ) {
500
+ expect (
501
+ expectedError,
502
+ isNotNull,
503
+ reason: 'Unexpected expression evaluation failure:\n $error ' ,
504
+ );
505
+ expect (error, _matches (expectedError! ));
506
+ } else {
507
+ expect (
508
+ expectedResult,
509
+ isNotNull,
510
+ reason:
511
+ 'Unexpected expression evaluation success:\n ${evalResult .json }' ,
512
+ );
513
+ var actual = evalResult.value;
514
+ expect (actual, _matches (equals (expectedResult! )));
515
+ }
490
516
});
491
517
}
492
518
@@ -577,24 +603,23 @@ class ExpressionEvaluationTestDriver {
577
603
var frame = event.getCallFrames ().first;
578
604
579
605
var jsExpression = '''
580
- (function () {
581
- try {
582
- var sdk = ${setup .loadModule }('dart_sdk');
583
- var dart = sdk.dart;
584
- var interceptors = sdk._interceptors;
585
- return $expression ;
586
- } catch (error) {
587
- return "Runtime API call failed: " + error.name +
588
- ": " + error.message + ": " + error.stack;
589
- }
590
- })()
606
+ (function () {
607
+ var sdk = ${setup .loadModule }('dart_sdk');
608
+ var dart = sdk.dart;
609
+ var interceptors = sdk._interceptors;
610
+ return $expression ;
611
+ })()
591
612
''' ;
592
613
593
- return await debugger.evaluateOnCallFrame (
594
- frame.callFrameId,
595
- jsExpression,
596
- returnByValue: returnByValue,
597
- );
614
+ try {
615
+ return await debugger.evaluateOnCallFrame (
616
+ frame.callFrameId,
617
+ jsExpression,
618
+ returnByValue: returnByValue,
619
+ );
620
+ } on wip.ExceptionDetails catch (e) {
621
+ return _createRuntimeError (e);
622
+ }
598
623
}
599
624
600
625
Future <TestCompilationResult > _compileDartExpressionInFrame (
@@ -705,15 +730,20 @@ class ExpressionEvaluationTestDriver {
705
730
if (obj.subtype == 'null' ) {
706
731
return 'null' ;
707
732
}
708
- var properties =
709
- await connection.runtime.getProperties (obj, ownProperties: true );
710
- var filteredProps = < String , String ? > {};
711
- for (var prop in properties) {
712
- if (prop.value != null && prop.name != '__proto__' ) {
713
- filteredProps[prop.name] = await stringifyRemoteObject (prop.value! );
733
+ try {
734
+ var properties =
735
+ await connection.runtime.getProperties (obj, ownProperties: true );
736
+ var filteredProps = < String , String ? > {};
737
+ for (var prop in properties) {
738
+ if (prop.value != null && prop.name != '__proto__' ) {
739
+ filteredProps[prop.name] =
740
+ await stringifyRemoteObject (prop.value! );
741
+ }
714
742
}
743
+ str = '${obj .description } $filteredProps ' ;
744
+ } catch (e, s) {
745
+ throw StateError ('Failed to stringify remote object $obj : $e :$s ' );
715
746
}
716
- str = '${obj .description } $filteredProps ' ;
717
747
break ;
718
748
default :
719
749
str = '${obj .value }' ;
@@ -734,8 +764,8 @@ class ExpressionEvaluationTestDriver {
734
764
.getProperties (scope.object, ownProperties: true );
735
765
for (var prop in response) {
736
766
var propKey = prop.name;
737
- var propValue = '${prop .value ! .value }' ;
738
- if (prop.value! .type == 'string' ) {
767
+ var propValue = '${prop .value ? .value }' ;
768
+ if (prop.value? .type == 'string' ) {
739
769
propValue = "'$propValue '" ;
740
770
} else if (propValue == 'null' ) {
741
771
propValue = propKey;
0 commit comments