expect function

void expect(
  1. dynamic actual,
  2. dynamic expected, {
  3. String reason = '',
  4. IsMatching? isMatching,
  5. num precision = 1e-12,
})

Compares actual with expected and throws a FailedTestException if the two objects do not match.

  • Custom objects may be compared using the callback isMatching. This is useful if the equality operator cannot be overriden.
  • Collections are matched entry by entry in a recursive fashion.
  • The argument precision is used to match nums approximately.

Implementation

void expect(
  dynamic actual,
  dynamic expected, {
  String reason = '',
  IsMatching? isMatching,
  num precision = 1e-12,
}) {
  if (match(
    actual,
    expected,
    isMatching: isMatching,
    precision: precision,
  )) {
    print('    passed${reason.isEmpty ? '' : ': $reason'}');
  } else {
    print('    failed${reason.isEmpty ? '' : ': $reason'}');

    var actualString = (actual is String)
        ? actual.indentedBlock(8, skipFirstLine: true)
        : actual.toString().indent(8, skipFirstLine: true);

    var expectedString = (expected is String)
        ? expected.indentedBlock(8, skipFirstLine: true)
        : expected.toString().indent(8, skipFirstLine: true);

    final difference =
        (actual is String && expected is String) ? actual - expected : '';

    // Add hashCode if printed objects are identical.
    if (actualString == expectedString) {
      actualString += ' (${actual.runtimeType}, '
          'hashCode: ${actual.hashCode})';
      expectedString += ' (${expected.runtimeType}, '
          'hashCode: ${expected.hashCode})';
    }

    print('      Actual:   $actualString');
    print('      Expected: $expectedString');
    if (difference.isNotEmpty) {
      print('      Difference: '
          '${difference.indentedBlock(8, skipFirstLine: true)}');
    }

    try {
      throw FailedTestException(
        message: 'Equality test failed.',
        expected: expected,
        actual: actual,
        path: Platform.script.path,
      );
    } catch (e, s) {
      stderr.write(e.toString());

      final lines = s.toString().split('\n');
      final indentString = '  ';
      stderr.writeln(lines
          .map<String>(
            (item) => indentString + item,
          )
          .join('\n'));
    }
  }
}