// Copyright (c) 2013, 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:expect/expect.dart";

// Characters with Whitespace property (Unicode 6.3).
// 0009..000D    ; White_Space # Cc       <control-0009>..<control-000D>
// 0020          ; White_Space # Zs       SPACE
// 0085          ; White_Space # Cc       <control-0085>
// 00A0          ; White_Space # Zs       NO-BREAK SPACE
// 1680          ; White_Space # Zs       OGHAM SPACE MARK
// 2000..200A    ; White_Space # Zs       EN QUAD..HAIR SPACE
// 2028          ; White_Space # Zl       LINE SEPARATOR
// 2029          ; White_Space # Zp       PARAGRAPH SEPARATOR
// 202F          ; White_Space # Zs       NARROW NO-BREAK SPACE
// 205F          ; White_Space # Zs       MEDIUM MATHEMATICAL SPACE
// 3000          ; White_Space # Zs       IDEOGRAPHIC SPACE
// And BOM:
// FEFF          ; Byte order mark.
const WHITESPACE = const [
  0x09,
  0x0A,
  0x0B,
  0x0C,
  0x0D,
  0x20,
  0x85,
  0xA0,
  0x1680,
  0x2000,
  0x2001,
  0x2002,
  0x2003,
  0x2004,
  0x2005,
  0x2006,
  0x2007,
  0x2008,
  0x2009,
  0x200A,
  0x2028,
  0x2029,
  0x202F,
  0x205F,
  0x3000,
  0xFEFF,
];

main() {
  // Test the whitespace in different positions.
  test(ws) {
    // trimLeft
    Expect.equals("", ws.trimLeft(), "K1");
    Expect.equals("", (ws + ws).trimLeft(), "L2");
    Expect.equals("a" + ws, ("a" + ws).trimLeft(), "L3");
    Expect.equals("a", (ws + "a").trimLeft(), "L4");
    Expect.equals("a" + ws + ws, (ws + ws + "a" + ws + ws).trimLeft(), "L5");
    Expect.equals("a" + ws + "a", (ws + ws + "a" + ws + "a").trimLeft(), "L6");
    var untrimmable = "a" + ws + "a";
    Expect.identical(untrimmable, untrimmable.trimLeft(), "L7");
    // trimRight
    Expect.equals("", ws.trimRight(), "R1");
    Expect.equals("", (ws + ws).trimRight(), "R2");
    Expect.equals("a", ("a" + ws).trimRight(), "R3");
    Expect.equals(ws + "a", (ws + "a").trimRight(), "R4");
    Expect.equals(ws + ws + "a", (ws + ws + "a" + ws + ws).trimRight(), "R5");
    Expect.equals("a" + ws + "a", ("a" + ws + "a" + ws + ws).trimRight(), "R6");
    Expect.identical(untrimmable, untrimmable.trimRight(), "R7");
  }

  // Test each whitespace at different locations.
  for (var ws in WHITESPACE) {
    var c = new String.fromCharCode(ws);
    test(c);
  }
  // Test all whitespaces at once at different locations.
  test(new String.fromCharCodes(WHITESPACE));

  // Empty strings.
  Expect.identical("", "".trimLeft());
  Expect.identical("", "".trimRight());

  // Test all BMP chars and one surrogate pair.
  for (int i = 0, j = 0; i <= 0x10000; i++) {
    if (j < WHITESPACE.length && i == WHITESPACE[j]) {
      j++;
      continue;
    }
    // See below for these exceptions.
    if (i == 0x180E) continue;
    if (i == 0x200B) continue;

    var s = new String.fromCharCode(i);
    Expect.identical(s, s.trimLeft());
    Expect.identical(s, s.trimRight());
  }

  // U+200b is not treated as whitespace, though historically, some JS engines
  // did.
  var s200B = new String.fromCharCode(0x200B);
  Expect.identical(s200B, s200B.trimLeft());
  Expect.identical(s200B, s200B.trimRight());

  // U+180E ceased to be whitespace in Unicode version 6.3.0
  // string_trimlr_test/unicode63 fails on implementations using earlier versions.
  var s180E = new String.fromCharCode(0x180E);
  Expect.identical(s180E, s180E.trimLeft()); //    //# unicode63: ok
  Expect.identical(s180E, s180E.trimRight()); //   //# unicode63: ok
}
