anchor.diff:  
   /// Validates that [actualAssets] matches the expected [outputs].
   ///
  -/// The keys in [outputs] should be serialized AssetIds in the form
  +/// The keys in [outputs] should be serialized [AssetId]s in the form
   /// `'package|path'`. The values should match the expected content for the
   /// written asset and may be a String (for `writeAsString`), a `List<int>` (for
   /// `writeAsBytes`) or a [Matcher] for a String or bytes.
  
positive.code: ///
  /// The test environment supplies in-memory build [sourceAssets] to the builders
  /// under test. [outputs] may be optionally provided to verify that the builders
  /// produce the expected output. If outputs is omitted the only validation this
  /// method provides is that the build did not `throw`.
  ///
  /// [generateFor] or the [isInput] call back can specify which assets should be
  /// given as inputs to the builder. These can be omitted if every asset in
  /// [sourceAssets] should be considered an input. [isInput] precedent over
  /// [generateFor] if both are provided.
  ///
  /// The keys in [sourceAssets] and [outputs] are paths to file assets and the
  /// values are file contents. The paths must use the following format:
  
negative.code: ///
  /// If a [reader] is provided, then any asset not in [sourceAssets] will be
  /// read from the provided reader. This allows you to more easily provide
  /// sources of entire packages to the test, instead of mocking them out, for
  /// example, this exposes all assets available to the test itself:
  ///
  ///
  /// ```dart
  /// testBuilder(yourBuilder, {}/* test assets here */,
  ///     reader: await PackageAssetReader.currentIsolate());
  /// ```
  ///
  /// Callers may optionally provide a [writer] to stub different behavior or do
  /// more complex validation than what is possible with [outputs].
  