blob: 8e970c6392e3bd1b16449e9e1a17bf96943bcfa9 [file] [log] [blame]
// Copyright (c) 2017, 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 'dart:async';
import 'package:stack_trace/stack_trace.dart';
import 'package:test_api/hooks.dart';
import 'expect.dart';
import 'future_matchers.dart';
import 'util/placeholder.dart';
import 'util/pretty_print.dart';
/// Returns a function that causes the test to fail if it's called.
///
/// This can safely be passed in place of any callback that takes ten or fewer
/// positional parameters. For example:
///
/// ```dart
/// // Asserts that the stream never emits an event.
/// stream.listen(neverCalled);
/// ```
///
/// This also ensures that the test doesn't complete until a call to
/// [pumpEventQueue] finishes, so that the callback has a chance to be called.
Null Function([
Object?,
Object?,
Object?,
Object?,
Object?,
Object?,
Object?,
Object?,
Object?,
Object?,
])
get neverCalled {
// Make sure the test stays alive long enough to call the function if it's
// going to.
expect(pumpEventQueue(), completes);
var zone = Zone.current;
return ([
a1 = placeholder,
a2 = placeholder,
a3 = placeholder,
a4 = placeholder,
a5 = placeholder,
a6 = placeholder,
a7 = placeholder,
a8 = placeholder,
a9 = placeholder,
a10 = placeholder,
]) {
var arguments =
[
a1,
a2,
a3,
a4,
a5,
a6,
a7,
a8,
a9,
a10,
].where((argument) => argument != placeholder).toList();
var argsText =
arguments.isEmpty
? ' no arguments.'
: ':\n${bullet(arguments.map(prettyPrint))}';
zone.handleUncaughtError(
TestFailure(
'Callback should never have been called, but it was called with'
'$argsText',
),
zone.run(Chain.current),
);
return null;
};
}