| // 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. |
| |
| // @dart = 2.9 |
| |
| 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 |
| } |