OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 // We temporarily test both the new math library and the old Math | 5 // We temporarily test both the new math library and the old Math |
6 // class. This can easily be simplified once we get rid of the Math | 6 // class. This can easily be simplified once we get rid of the Math |
7 // class entirely. | 7 // class entirely. |
8 library math_parse_double_test; | 8 library math_parse_double_test; |
9 import "package:expect/expect.dart"; | 9 import "package:expect/expect.dart"; |
10 | 10 |
11 void parseDoubleThrowsFormatException(str) { | 11 void parseDoubleThrowsFormatException(str) { |
12 Expect.throws(() => double.parse(str), (e) => e is FormatException); | 12 Expect.throws(() => double.parse(str), (e) => e is FormatException); |
13 } | 13 } |
14 | 14 |
15 void main() { | 15 void main() { |
16 Expect.equals(499.0, double.parse("499")); | 16 Expect.equals(499.0, double.parse("499")); |
17 Expect.equals(499.0, double.parse("499.0")); | 17 Expect.equals(499.0, double.parse("499.0")); |
18 Expect.equals(499.0, double.parse("499.0")); | 18 Expect.equals(499.0, double.parse("499.0")); |
19 Expect.equals(499.0, double.parse("+499")); | 19 Expect.equals(499.0, double.parse("+499")); |
20 Expect.equals(-499.0, double.parse("-499")); | 20 Expect.equals(-499.0, double.parse("-499")); |
21 Expect.equals(499.0, double.parse(" 499 ")); | 21 Expect.equals(499.0, double.parse(" 499 ")); |
22 Expect.equals(499.0, double.parse(" +499 ")); | 22 Expect.equals(499.0, double.parse(" +499 ")); |
23 Expect.equals(-499.0, double.parse(" -499 ")); | 23 Expect.equals(-499.0, double.parse(" -499 ")); |
24 Expect.equals(498.0, double.parse("\xA0 498 \xA0")); | |
25 Expect.equals(497.0, double.parse("\xA0 +497 \xA0")); | |
26 Expect.equals(-496.0, double.parse("\xA0 -496 \xA0")); | |
27 Expect.equals(495.0, double.parse("\u205F 495 \u205F")); | |
28 Expect.equals(494.0, double.parse("\u180E +494 \u205F")); | |
29 Expect.equals(-493.0, double.parse("\u1680 -493 \u2006")); | |
24 Expect.equals(0.0, double.parse("0")); | 30 Expect.equals(0.0, double.parse("0")); |
25 Expect.equals(0.0, double.parse("+0")); | 31 Expect.equals(0.0, double.parse("+0")); |
26 Expect.equals(-0.0, double.parse("-0")); | 32 Expect.equals(-0.0, double.parse("-0")); |
27 Expect.equals(true, double.parse("-0").isNegative); | 33 Expect.equals(true, double.parse("-0").isNegative); |
28 Expect.equals(0.0, double.parse(" 0 ")); | 34 Expect.equals(0.0, double.parse(" 0 ")); |
29 Expect.equals(0.0, double.parse(" +0 ")); | 35 Expect.equals(0.0, double.parse(" +0 ")); |
30 Expect.equals(-0.0, double.parse(" -0 ")); | 36 Expect.equals(-0.0, double.parse(" -0 ")); |
31 Expect.equals(true, double.parse(" -0 ").isNegative); | 37 Expect.equals(true, double.parse(" -0 ").isNegative); |
32 Expect.equals(1.0 * 0x1234567890, double.parse("0x1234567890")); | 38 Expect.equals(0.0, double.parse("\xA0 0 \xA0")); |
33 Expect.equals(1.0 * -0x1234567890, double.parse("-0x1234567890")); | 39 Expect.equals(0.0, double.parse("\xA0 +0 \xA0")); |
34 Expect.equals(1.0 * 0x1234567890, double.parse(" 0x1234567890 ")); | 40 Expect.equals(-0.0, double.parse("\xA0 -0 \xA0")); |
35 Expect.equals(1.0 * -0x1234567890, double.parse(" -0x1234567890 ")); | 41 Expect.equals(true, double.parse("\xA0 -0 \xA0").isNegative); |
36 Expect.equals(256.0, double.parse("0x100")); | |
37 Expect.equals(-256.0, double.parse("-0x100")); | |
38 Expect.equals(256.0, double.parse(" 0x100 ")); | |
39 Expect.equals(-256.0, double.parse(" -0x100 ")); | |
40 Expect.equals(1.0 * 0xabcdef, double.parse("0xabcdef")); | |
41 Expect.equals(1.0 * 0xABCDEF, double.parse("0xABCDEF")); | |
42 Expect.equals(1.0 * 0xabcdef, double.parse("0xabCDEf")); | |
43 Expect.equals(1.0 * -0xabcdef, double.parse("-0xabcdef")); | |
44 Expect.equals(1.0 * -0xABCDEF, double.parse("-0xABCDEF")); | |
45 Expect.equals(1.0 * 0xabcdef, double.parse(" 0xabcdef ")); | |
46 Expect.equals(1.0 * 0xABCDEF, double.parse(" 0xABCDEF ")); | |
47 Expect.equals(1.0 * -0xabcdef, double.parse(" -0xabcdef ")); | |
48 Expect.equals(1.0 * -0xABCDEF, double.parse(" -0xABCDEF ")); | |
49 Expect.equals(1.0 * 0xabcdef, double.parse("0x00000abcdef")); | |
50 Expect.equals(1.0 * 0xABCDEF, double.parse("0x00000ABCDEF")); | |
51 Expect.equals(1.0 * -0xabcdef, double.parse("-0x00000abcdef")); | |
52 Expect.equals(1.0 * -0xABCDEF, double.parse("-0x00000ABCDEF")); | |
53 Expect.equals(1.0 * 0xabcdef, double.parse(" 0x00000abcdef ")); | |
54 Expect.equals(1.0 * 0xABCDEF, double.parse(" 0x00000ABCDEF ")); | |
55 Expect.equals(1.0 * -0xabcdef, double.parse(" -0x00000abcdef ")); | |
56 Expect.equals(1.0 * -0xABCDEF, double.parse(" -0x00000ABCDEF ")); | |
57 Expect.equals(10.0, double.parse("010")); | 42 Expect.equals(10.0, double.parse("010")); |
58 Expect.equals(-10.0, double.parse("-010")); | 43 Expect.equals(-10.0, double.parse("-010")); |
59 Expect.equals(10.0, double.parse(" 010 ")); | 44 Expect.equals(10.0, double.parse(" 010 ")); |
60 Expect.equals(-10.0, double.parse(" -010 ")); | 45 Expect.equals(-10.0, double.parse(" -010 ")); |
46 Expect.equals(10.0, double.parse(" \xA0 010 \xA0 ")); | |
47 Expect.equals(-10.0, double.parse(" \xA0 -010 \xA0 ")); | |
61 Expect.equals(0.1, double.parse("0.1")); | 48 Expect.equals(0.1, double.parse("0.1")); |
62 Expect.equals(0.1, double.parse(" 0.1 ")); | 49 Expect.equals(0.1, double.parse(" 0.1 ")); |
63 Expect.equals(0.1, double.parse(" +0.1 ")); | 50 Expect.equals(0.1, double.parse(" +0.1 ")); |
64 Expect.equals(-0.1, double.parse(" -0.1 ")); | 51 Expect.equals(-0.1, double.parse(" -0.1 ")); |
52 Expect.equals(0.1, double.parse("\xA0 0.1 \xA0")); | |
53 Expect.equals(0.1, double.parse("\xA0 +0.1 \xA0")); | |
54 Expect.equals(-0.1, double.parse("\xA0 -0.1 \xA0")); | |
65 Expect.equals(0.1, double.parse(".1")); | 55 Expect.equals(0.1, double.parse(".1")); |
66 Expect.equals(0.1, double.parse(" .1 ")); | 56 Expect.equals(0.1, double.parse(" .1 ")); |
67 Expect.equals(0.1, double.parse(" +.1 ")); | 57 Expect.equals(0.1, double.parse(" +.1 ")); |
68 Expect.equals(-0.1, double.parse(" -.1 ")); | 58 Expect.equals(-0.1, double.parse(" -.1 ")); |
59 Expect.equals(0.1, double.parse("\xA0 .1 \xA0")); | |
60 Expect.equals(0.1, double.parse("\xA0 +.1 \xA0")); | |
61 Expect.equals(-0.1, double.parse("\xA0 -.1 \xA0")); | |
69 Expect.equals(1.5, double.parse("1.5")); | 62 Expect.equals(1.5, double.parse("1.5")); |
70 Expect.equals(1234567.89, double.parse("1234567.89")); | 63 Expect.equals(1234567.89, double.parse("1234567.89")); |
71 Expect.equals(1234567.89, double.parse(" 1234567.89 ")); | 64 Expect.equals(1234567.89, double.parse(" 1234567.89 ")); |
72 Expect.equals(1234567.89, double.parse(" +1234567.89 ")); | 65 Expect.equals(1234567.89, double.parse(" +1234567.89 ")); |
73 Expect.equals(-1234567.89, double.parse(" -1234567.89 ")); | 66 Expect.equals(-1234567.89, double.parse(" -1234567.89 ")); |
67 Expect.equals(1234567.89, double.parse(" \xA01234567.89 \xA0")); | |
68 Expect.equals(1234567.89, double.parse("\xA0 +1234567.89 \xA0")); | |
69 Expect.equals(-1234567.89, double.parse("\xA0 -1234567.89 \xA0")); | |
74 Expect.equals(1234567e89, double.parse("1234567e89")); | 70 Expect.equals(1234567e89, double.parse("1234567e89")); |
75 Expect.equals(1234567e89, double.parse(" 1234567e89 ")); | 71 Expect.equals(1234567e89, double.parse(" 1234567e89 ")); |
76 Expect.equals(1234567e89, double.parse(" +1234567e89 ")); | 72 Expect.equals(1234567e89, double.parse(" +1234567e89 ")); |
77 Expect.equals(-1234567e89, double.parse(" -1234567e89 ")); | 73 Expect.equals(-1234567e89, double.parse(" -1234567e89 ")); |
74 Expect.equals(1234567e89, double.parse("\xA0 1234567e89 \xA0")); | |
75 Expect.equals(1234567e89, double.parse("\xA0 +1234567e89 \xA0")); | |
76 Expect.equals(-1234567e89, double.parse(" \xA0 -1234567e89 \xA0")); | |
78 Expect.equals(1234567.89e2, double.parse("1234567.89e2")); | 77 Expect.equals(1234567.89e2, double.parse("1234567.89e2")); |
79 Expect.equals(1234567.89e2, double.parse(" 1234567.89e2 ")); | 78 Expect.equals(1234567.89e2, double.parse(" 1234567.89e2 ")); |
80 Expect.equals(1234567.89e2, double.parse(" +1234567.89e2 ")); | 79 Expect.equals(1234567.89e2, double.parse(" +1234567.89e2 ")); |
81 Expect.equals(-1234567.89e2, double.parse(" -1234567.89e2 ")); | 80 Expect.equals(-1234567.89e2, double.parse(" -1234567.89e2 ")); |
81 Expect.equals(1234567.89e2, double.parse("\xA0 1234567.89e2 \xA0")); | |
82 Expect.equals(1234567.89e2, double.parse("\xA0 +1234567.89e2\xA0 ")); | |
83 Expect.equals(-1234567.89e2, double.parse("\xA0 -1234567.89e2 \xA0")); | |
82 Expect.equals(1234567.89e2, double.parse("1234567.89E2")); | 84 Expect.equals(1234567.89e2, double.parse("1234567.89E2")); |
83 Expect.equals(1234567.89e2, double.parse(" 1234567.89E2 ")); | 85 Expect.equals(1234567.89e2, double.parse(" 1234567.89E2 ")); |
84 Expect.equals(1234567.89e2, double.parse(" +1234567.89E2 ")); | 86 Expect.equals(1234567.89e2, double.parse(" +1234567.89E2 ")); |
85 Expect.equals(-1234567.89e2, double.parse(" -1234567.89E2 ")); | 87 Expect.equals(-1234567.89e2, double.parse(" -1234567.89E2 ")); |
88 Expect.equals(1234567.89e2, double.parse(" \xA0 1234567.89E2 \xA0")); | |
89 Expect.equals(1234567.89e2, double.parse("\xA0 +1234567.89E2\xA0 ")); | |
90 Expect.equals(-1234567.89e2, double.parse("\xA0 -1234567.89E2\xA0 ")); | |
86 Expect.equals(1234567.89e-2, double.parse("1234567.89e-2")); | 91 Expect.equals(1234567.89e-2, double.parse("1234567.89e-2")); |
87 Expect.equals(1234567.89e-2, double.parse(" 1234567.89e-2 ")); | 92 Expect.equals(1234567.89e-2, double.parse(" 1234567.89e-2 ")); |
88 Expect.equals(1234567.89e-2, double.parse(" +1234567.89e-2 ")); | 93 Expect.equals(1234567.89e-2, double.parse(" +1234567.89e-2 ")); |
89 Expect.equals(-1234567.89e-2, double.parse(" -1234567.89e-2 ")); | 94 Expect.equals(-1234567.89e-2, double.parse(" -1234567.89e-2 ")); |
90 // TODO(floitsch): add tests for NaN and Infinity. | 95 Expect.equals(1234567.89e-2, double.parse(" \xA0 1234567.89e-2 \xA0")); |
96 Expect.equals(1234567.89e-2, double.parse("\xA0 +1234567.89e-2 \xA0")); | |
97 Expect.equals(-1234567.89e-2, double.parse("\xA0 -1234567.89e-2 \xA0")); | |
98 Expect.equals(5, double.parse("5.")); | |
99 Expect.equals(-5, double.parse("-5.")); | |
100 Expect.equals(5, double.parse(" 5.")); | |
101 Expect.equals(-5, double.parse(" -5.")); | |
102 Expect.equals(5, double.parse(" 5. ")); | |
103 Expect.equals(-5, double.parse(" -5. ")); | |
104 Expect.equals(5, double.parse("5. ")); | |
105 Expect.equals(-5, double.parse("-5. ")); | |
106 Expect.equals(-5, double.parse("-5.")); | |
107 Expect.equals(5, double.parse("\xA0 5.")); | |
108 Expect.equals(-5, double.parse("\xA0-5.")); | |
109 Expect.equals(5, double.parse("\xA05.\xA0")); | |
110 Expect.equals(-5, double.parse("\xA0-5.\xA0")); | |
111 Expect.equals(5, double.parse("5.\xA0")); | |
112 Expect.equals(-5, double.parse("-5.\xA0")); | |
113 Expect.equals(double.INFINITY, double.parse("Infinity")); | |
114 Expect.equals(double.INFINITY, double.parse("+Infinity")); | |
115 Expect.equals(double.NEGATIVE_INFINITY, double.parse("-Infinity")); | |
116 Expect.isTrue(double.parse("NaN").isNaN); | |
117 Expect.isTrue(double.parse("-NaN").isNaN); | |
118 Expect.isTrue(double.parse("+NaN").isNaN); | |
119 Expect.equals(double.INFINITY, double.parse("Infinity ")); | |
120 Expect.equals(double.INFINITY, double.parse("+Infinity ")); | |
121 Expect.equals(double.NEGATIVE_INFINITY, double.parse("-Infinity ")); | |
122 Expect.isTrue(double.parse("NaN ").isNaN); | |
123 Expect.isTrue(double.parse("-NaN ").isNaN); | |
124 Expect.isTrue(double.parse("+NaN ").isNaN); | |
125 Expect.equals(double.INFINITY, double.parse(" Infinity ")); | |
126 Expect.equals(double.INFINITY, double.parse(" +Infinity ")); | |
127 Expect.equals(double.NEGATIVE_INFINITY, double.parse(" -Infinity ")); | |
128 Expect.isTrue(double.parse(" NaN ").isNaN); | |
129 Expect.isTrue(double.parse(" -NaN ").isNaN); | |
130 Expect.isTrue(double.parse(" +NaN ").isNaN); | |
131 Expect.equals(double.INFINITY, double.parse(" Infinity")); | |
132 Expect.equals(double.INFINITY, double.parse(" +Infinity")); | |
Lasse Reichstein Nielsen
2013/05/22 08:47:26
Make a parameterized test that takes a string and
floitsch
2013/05/23 02:30:03
Done.
| |
133 Expect.equals(double.NEGATIVE_INFINITY, double.parse(" -Infinity")); | |
134 Expect.isTrue(double.parse(" NaN").isNaN); | |
135 Expect.isTrue(double.parse(" -NaN").isNaN); | |
136 Expect.isTrue(double.parse(" +NaN").isNaN); | |
137 Expect.equals(double.INFINITY, double.parse("Infinity\xA0")); | |
138 Expect.equals(double.INFINITY, double.parse("+Infinity\xA0")); | |
139 Expect.equals(double.NEGATIVE_INFINITY, double.parse("-Infinity\xA0")); | |
140 Expect.isTrue(double.parse("NaN\xA0").isNaN); | |
141 Expect.isTrue(double.parse("-NaN\xA0").isNaN); | |
142 Expect.isTrue(double.parse("+NaN\xA0").isNaN); | |
143 Expect.equals(double.INFINITY, double.parse(" \xA0Infinity\xA0")); | |
144 Expect.equals(double.INFINITY, double.parse(" \xA0+Infinity\xA0")); | |
145 Expect.equals(double.NEGATIVE_INFINITY, double.parse(" \xA0-Infinity\xA0")); | |
146 Expect.isTrue(double.parse(" \xA0NaN\xA0").isNaN); | |
147 Expect.isTrue(double.parse(" \xA0-NaN\xA0").isNaN); | |
148 Expect.isTrue(double.parse(" \xA0+NaN\xA0").isNaN); | |
149 Expect.equals(double.INFINITY, double.parse(" \xA0Infinity")); | |
150 Expect.equals(double.INFINITY, double.parse(" \xA0+Infinity")); | |
151 Expect.equals(double.NEGATIVE_INFINITY, double.parse(" \xA0-Infinity")); | |
152 Expect.isTrue(double.parse(" \xA0NaN").isNaN); | |
153 Expect.isTrue(double.parse(" \xA0-NaN").isNaN); | |
154 Expect.isTrue(double.parse(" \xA0+NaN").isNaN); | |
155 Expect.equals(123456700.0, double.parse("1234567.e2")); | |
156 Expect.equals(123456700.0, double.parse(" 1234567.e2 ")); | |
157 Expect.equals(123456700.0, double.parse(" +1234567.e2 ")); | |
158 Expect.equals(-123456700.0, double.parse(" -1234567.e2 ")); | |
159 Expect.equals(123456700.0, double.parse("\xA0 1234567.e2\xA0")); | |
160 Expect.equals(123456700.0, double.parse("\xA0 +1234567.e2 \xA0")); | |
161 Expect.equals(-123456700.0, double.parse(" \xA0-1234567.e2 \xA0 ")); | |
162 | |
Lasse Reichstein Nielsen
2013/05/22 08:47:26
More edge case tests (positive and negative):
5e-3
floitsch
2013/05/23 02:30:03
Done.
| |
91 parseDoubleThrowsFormatException("1b"); | 163 parseDoubleThrowsFormatException("1b"); |
92 parseDoubleThrowsFormatException(" 1b "); | 164 parseDoubleThrowsFormatException(" 1b "); |
93 parseDoubleThrowsFormatException(" 1 b "); | 165 parseDoubleThrowsFormatException(" 1 b "); |
94 parseDoubleThrowsFormatException(" e3 "); | 166 parseDoubleThrowsFormatException(" e3 "); |
95 parseDoubleThrowsFormatException(" .e3 "); | 167 parseDoubleThrowsFormatException(" .e3 "); |
96 parseDoubleThrowsFormatException("00x12"); | 168 parseDoubleThrowsFormatException("00x12"); |
97 parseDoubleThrowsFormatException(" 00x12 "); | 169 parseDoubleThrowsFormatException(" 00x12 "); |
98 parseDoubleThrowsFormatException("-1b"); | 170 parseDoubleThrowsFormatException("-1b"); |
99 parseDoubleThrowsFormatException(" -1b "); | 171 parseDoubleThrowsFormatException(" -1b "); |
100 parseDoubleThrowsFormatException(" -1 b "); | 172 parseDoubleThrowsFormatException(" -1 b "); |
101 parseDoubleThrowsFormatException("-00x12"); | 173 parseDoubleThrowsFormatException("-00x12"); |
102 parseDoubleThrowsFormatException(" -00x12 "); | 174 parseDoubleThrowsFormatException(" -00x12 "); |
103 parseDoubleThrowsFormatException(" -00x12 "); | 175 parseDoubleThrowsFormatException(" -00x12 "); |
104 parseDoubleThrowsFormatException("0x0x12"); | 176 parseDoubleThrowsFormatException("0x0x12"); |
105 parseDoubleThrowsFormatException("+ 1.5"); | 177 parseDoubleThrowsFormatException("+ 1.5"); |
106 parseDoubleThrowsFormatException("- 1.5"); | 178 parseDoubleThrowsFormatException("- 1.5"); |
107 parseDoubleThrowsFormatException(""); | 179 parseDoubleThrowsFormatException(""); |
108 parseDoubleThrowsFormatException(" "); | 180 parseDoubleThrowsFormatException(" "); |
109 parseDoubleThrowsFormatException("5."); | |
110 parseDoubleThrowsFormatException(" 5. "); | |
111 parseDoubleThrowsFormatException(" +5. "); | |
112 parseDoubleThrowsFormatException(" -5. "); | |
113 parseDoubleThrowsFormatException("1234567.e2"); | |
114 parseDoubleThrowsFormatException(" 1234567.e2 "); | |
115 parseDoubleThrowsFormatException(" +1234567.e2 "); | |
116 parseDoubleThrowsFormatException(" -1234567.e2 "); | |
117 parseDoubleThrowsFormatException("+0x1234567890"); | 181 parseDoubleThrowsFormatException("+0x1234567890"); |
118 parseDoubleThrowsFormatException(" +0x1234567890 "); | 182 parseDoubleThrowsFormatException(" +0x1234567890 "); |
119 parseDoubleThrowsFormatException(" +0x100 "); | 183 parseDoubleThrowsFormatException(" +0x100 "); |
120 parseDoubleThrowsFormatException("+0x100"); | 184 parseDoubleThrowsFormatException("+0x100"); |
185 parseDoubleThrowsFormatException("0x1234567890"); | |
186 parseDoubleThrowsFormatException("-0x1234567890"); | |
187 parseDoubleThrowsFormatException(" 0x1234567890 "); | |
188 parseDoubleThrowsFormatException(" -0x1234567890 "); | |
189 parseDoubleThrowsFormatException("0x100"); | |
190 parseDoubleThrowsFormatException("-0x100"); | |
191 parseDoubleThrowsFormatException(" 0x100 "); | |
192 parseDoubleThrowsFormatException(" -0x100 "); | |
193 parseDoubleThrowsFormatException("0xabcdef"); | |
194 parseDoubleThrowsFormatException("0xABCDEF"); | |
195 parseDoubleThrowsFormatException("0xabCDEf"); | |
196 parseDoubleThrowsFormatException("-0xabcdef"); | |
197 parseDoubleThrowsFormatException("-0xABCDEF"); | |
198 parseDoubleThrowsFormatException(" 0xabcdef "); | |
199 parseDoubleThrowsFormatException(" 0xABCDEF "); | |
200 parseDoubleThrowsFormatException(" -0xabcdef "); | |
201 parseDoubleThrowsFormatException(" -0xABCDEF "); | |
202 parseDoubleThrowsFormatException("0x00000abcdef"); | |
203 parseDoubleThrowsFormatException("0x00000ABCDEF"); | |
204 parseDoubleThrowsFormatException("-0x00000abcdef"); | |
205 parseDoubleThrowsFormatException("-0x00000ABCDEF"); | |
206 parseDoubleThrowsFormatException(" 0x00000abcdef "); | |
207 parseDoubleThrowsFormatException(" 0x00000ABCDEF "); | |
208 parseDoubleThrowsFormatException(" -0x00000abcdef "); | |
209 parseDoubleThrowsFormatException(" -0x00000ABCDEF "); | |
210 parseDoubleThrowsFormatException(" -INFINITY "); | |
211 parseDoubleThrowsFormatException(" NAN "); | |
212 parseDoubleThrowsFormatException(" inf "); | |
213 parseDoubleThrowsFormatException(" nan "); | |
121 } | 214 } |
OLD | NEW |