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