Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -114,41 +114,46 @@ void main() async {
);

group('Provider controllers', () {
test('can mutate private properties from mixins', () async {
final container = ProviderContainer();
addTearDown(container.dispose);
test(
'can mutate private properties from mixins',
() async {
final container = ProviderContainer();
addTearDown(container.dispose);

final sub = container.listen(
instanceProvider(
const InstancePath.fromProviderId('0').pathForChild(
const PathToProperty.objectProperty(
name: '_privateMixinProperty',
ownerUri: 'package:provider_app/mixin.dart',
ownerName: 'Mixin',
final sub = container.listen(
instanceProvider(
const InstancePath.fromProviderId('0').pathForChild(
const PathToProperty.objectProperty(
name: '_privateMixinProperty',
ownerUri: 'package:provider_app/mixin.dart',
ownerName: 'Mixin',
),
),
),
).future,
(prev, next) {},
);
).future,
(prev, next) {},
);

var instance = await sub.read();
var instance = await sub.read();

expect(
instance,
isA<NumInstance>().having((e) => e.displayString, 'displayString', '0'),
);
expect(
instance,
isA<NumInstance>()
.having((e) => e.displayString, 'displayString', '0'),
);

await instance.setter!('42');
await instance.setter!('42');

// read the instance again since it should have changed
instance = await sub.read();
// read the instance again since it should have changed
instance = await sub.read();

expect(
instance,
isA<NumInstance>()
.having((e) => e.displayString, 'displayString', '42'),
);
});
expect(
instance,
isA<NumInstance>()
.having((e) => e.displayString, 'displayString', '42'),
);
},
timeout: const Timeout.factor(8),
);

test(
'sortedProviderNodesProvider',
Expand Down
186 changes: 100 additions & 86 deletions packages/devtools_app/test/shared/eval_integration_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,99 +26,113 @@ void main() {
});

group('EvalOnDartLibrary', () {
test('getHashCode', () async {
await env.setupEnvironment();
final eval = EvalOnDartLibrary('dart:core', serviceManager.service!);

final instance = await eval.safeEval('42', isAlive: isAlive);

await expectLater(
eval.getHashCode(instance, isAlive: isAlive),
completion(anyOf(isPositive, 0)),
);
});

group('asyncEval', () {
test('supports expresions that do not start with the await keyword',
() async {
test(
'getHashCode',
() async {
await env.setupEnvironment();
final eval = EvalOnDartLibrary('dart:core', serviceManager.service!);

final eval = EvalOnDartLibrary(
'dart:core',
serviceManager.service!,
);
final instance = await eval.safeEval('42', isAlive: isAlive);

final instance = (await eval.asyncEval('42', isAlive: isAlive))!;
expect(instance.valueAsString, '42');

final instance2 =
(await eval.asyncEval('Future.value(42)', isAlive: isAlive))!;
expect(instance2.classRef!.name, '_Future');
});

test('returns the result of the future completion', () async {
await env.setupEnvironment();
final mainIsolate = serviceManager.isolateManager.mainIsolate;
expect(mainIsolate, isNotNull);

final eval = EvalOnDartLibrary(
'dart:core',
serviceManager.service!,
isolate: mainIsolate,
await expectLater(
eval.getHashCode(instance, isAlive: isAlive),
completion(anyOf(isPositive, 0)),
);
},
timeout: const Timeout.factor(8),
);

final instance = (await eval.asyncEval(
// The delay asserts that there is no issue with garbage collection
'await Future<int>.delayed(const Duration(milliseconds: 500), () => 42)',
isAlive: isAlive,
))!;

expect(instance.valueAsString, '42');
});

test('throws FutureFailedException when the future is rejected',
() async {
await env.setupEnvironment();

final eval = EvalOnDartLibrary(
'dart:core',
serviceManager.service!,
);

final instance = await eval
.asyncEval(
'await Future.error(StateError("foo"), StackTrace.current)',
isAlive: isAlive,
)
.then<FutureFailedException>(
(_) => throw FallThroughError(),
onError: (err) => err,
);

expect(
instance.expression,
'await Future.error(StateError("foo"), StackTrace.current)',
);
group('asyncEval', () {
test(
'supports expresions that do not start with the await keyword',
() async {
await env.setupEnvironment();

final eval = EvalOnDartLibrary(
'dart:core',
serviceManager.service!,
);

final instance = (await eval.asyncEval('42', isAlive: isAlive))!;
expect(instance.valueAsString, '42');

final instance2 =
(await eval.asyncEval('Future.value(42)', isAlive: isAlive))!;
expect(instance2.classRef!.name, '_Future');
},
timeout: const Timeout.factor(8),
);

final stack = await eval.safeEval(
'stack.toString()',
isAlive: isAlive,
scope: {
'stack': instance.stacktraceRef.id!,
},
);
expect(
stack.valueAsString,
startsWith('#0 Eval.<anonymous closure> ()'),
);
test(
'returns the result of the future completion',
() async {
await env.setupEnvironment();
final mainIsolate = serviceManager.isolateManager.mainIsolate;
expect(mainIsolate, isNotNull);

final eval = EvalOnDartLibrary(
'dart:core',
serviceManager.service!,
isolate: mainIsolate,
);

final instance = (await eval.asyncEval(
// The delay asserts that there is no issue with garbage collection
'await Future<int>.delayed(const Duration(milliseconds: 500), () => 42)',
isAlive: isAlive,
))!;

expect(instance.valueAsString, '42');
},
timeout: const Timeout.factor(8),
);

final error = await eval.safeEval(
'error.message',
isAlive: isAlive,
scope: {'error': instance.errorRef.id!},
);
expect(error.valueAsString, 'foo');
});
test(
'throws FutureFailedException when the future is rejected',
() async {
await env.setupEnvironment();

final eval = EvalOnDartLibrary(
'dart:core',
serviceManager.service!,
);

final instance = await eval
.asyncEval(
'await Future.error(StateError("foo"), StackTrace.current)',
isAlive: isAlive,
)
.then<FutureFailedException>(
(_) => throw FallThroughError(),
onError: (err) => err,
);

expect(
instance.expression,
'await Future.error(StateError("foo"), StackTrace.current)',
);

final stack = await eval.safeEval(
'stack.toString()',
isAlive: isAlive,
scope: {
'stack': instance.stacktraceRef.id!,
},
);
expect(
stack.valueAsString,
startsWith('#0 Eval.<anonymous closure> ()'),
);

final error = await eval.safeEval(
'error.message',
isAlive: isAlive,
scope: {'error': instance.errorRef.id!},
);
expect(error.valueAsString, 'foo');
},
timeout: const Timeout.factor(8),
);
});
});
}