// 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.

import 'package:matcher/src/util.dart';
import 'package:test/test.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('null byte', '\x00', r'\x00');
    _testEscaping('ASCII control character', '\x11', r'\x11');
    _testEscaping('delete', '\x7F', r'\x7F');
    _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\\A null byte\x00A control char\x1D'
        'A delete\x7F',
        r'A new line\nA charriage return\rA form feed\fA backspace\b'
        r'A tab\tA vertical tab\vA slash\\A null byte\x00A control char\x1D'
        r'A delete\x7F');
  });

  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.');
  });
}
