// Copyright (c) 2015, 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.

library matcher.escape_test;

import 'package:matcher/src/util.dart';
import 'package:unittest/unittest.dart';

void main() {
  group('escaping should work with', () {
    _testEscaping('no escaped chars', 'Hello, world!', 'Hello, world!');
    _testEscaping('newline', '\n', r'\n');
    _testEscaping('carriage return', '\r', r'\r');
    _testEscaping('form feed', '\f', r'\f');
    _testEscaping('backspace', '\b', r'\b');
    _testEscaping('tab', '\t', r'\t');
    _testEscaping('vertical tab', '\v', r'\v');
    _testEscaping('escape combos', r'\n', r'\\n');
    _testEscaping('All characters',
        'A new line\nA charriage return\rA form feed\fA backspace\b'
        'A tab\tA vertical tab\vA slash\\',
        r'A new line\nA charriage return\rA form feed\fA backspace\b'
        r'A tab\tA vertical tab\vA slash\\');
  });

  group('unequal strings remain unequal when escaped', () {
    _testUnequalStrings('with a newline', '\n', r'\n');
    _testUnequalStrings('with slash literals', '\\', r'\\');
  });
}

/// Creates a [test] with name [name] that verifies [source] escapes to value
/// [target].
void _testEscaping(String name, String source, String target) {
  test(name, () {
    var escaped = escape(source);
    expect(escaped == target, isTrue,
        reason: "Expected escaped value: $target\n"
        "  Actual escaped value: $escaped");
  });
}

/// Creates a [test] with name [name] that ensures two different [String] values
/// [s1] and [s2] remain unequal when escaped.
void _testUnequalStrings(String name, String s1, String s2) {
  test(name, () {
    // Explicitly not using the equals matcher
    expect(s1 != s2, isTrue, reason: 'The source values should be unequal');

    var escapedS1 = escape(s1);
    var escapedS2 = escape(s2);

    // Explicitly not using the equals matcher
    expect(escapedS1 != escapedS2, isTrue,
        reason: 'Unequal strings, when escaped, should remain unequal.');
  });
}
