@@ -170,6 +170,58 @@ var tests = [
170
170
assert . areEqual ( 0 , parseFloat ( '0x1_fe' ) , "0 === parseFloat('0x1_fe')" ) ;
171
171
}
172
172
} ,
173
+ {
174
+ name : "Octal literal support" ,
175
+ body : function ( ) {
176
+ assert . areEqual ( 0o00 , 0o0_0 , "0o00 === 0o0_0" ) ;
177
+ assert . areEqual ( 0o11 , 0o1_1 , "0o11 === 0o1_1" ) ;
178
+ assert . areEqual ( 0o10 , 0o1_0 , "0o10 === 0o1_0" ) ;
179
+ assert . areEqual ( 0o01 , 0o0_1 , "0o01 === 0o0_1" ) ;
180
+ assert . areEqual ( 0o0001 , 0o000_1 , "0o0001 === 0o000_1" ) ;
181
+ assert . areEqual ( 0o0000 , 0o000_0 , "0o0000 === 0o000_0" ) ;
182
+ assert . areEqual ( 0o000011110000 , 0o0000_1111_0000 , "0o000011110000 === 0o0000_1111_0000" ) ;
183
+ assert . areEqual ( 0o000011110000 , 0o0_0_0_0_1_111_00_00 , "0o000011110000 === 0o0_0_0_0_1_111_00_00" ) ;
184
+ }
185
+ } ,
186
+ {
187
+ name : "Octal literal bad syntax" ,
188
+ body : function ( ) {
189
+ assert . throws ( ( ) => eval ( '0o_' ) , SyntaxError , "'_' cannot immediately follow 0o" ) ;
190
+ assert . throws ( ( ) => eval ( '0o__' ) , SyntaxError , "'_' cannot immediately follow 0o" ) ;
191
+ assert . throws ( ( ) => eval ( '0o_1' ) , SyntaxError , "Octal literal may not begin with numeric separator" ) ;
192
+ assert . throws ( ( ) => eval ( '0o_0' ) , SyntaxError , "Octal literal may not begin with numeric separator" ) ;
193
+ assert . throws ( ( ) => eval ( '0o__1' ) , SyntaxError , "Octal literal may not begin with numeric separator" ) ;
194
+ assert . throws ( ( ) => eval ( '0o__0' ) , SyntaxError , "Octal literal may not begin with numeric separator" ) ;
195
+ assert . throws ( ( ) => eval ( '0o1_' ) , SyntaxError , "Octal literal may not end with numeric separator" ) ;
196
+ assert . throws ( ( ) => eval ( '0o0_' ) , SyntaxError , "Octal literal may not end with numeric separator" ) ;
197
+ assert . throws ( ( ) => eval ( '0o1__' ) , SyntaxError , "Octal literal may not end with numeric separator" ) ;
198
+ assert . throws ( ( ) => eval ( '0o0__' ) , SyntaxError , "Octal literal may not end with numeric separator" ) ;
199
+ assert . throws ( ( ) => eval ( '0o1__1' ) , SyntaxError , "Multiple numeric separator characters may not follow each other" ) ;
200
+ assert . throws ( ( ) => eval ( '0o0__0' ) , SyntaxError , "Multiple numeric separator characters may not follow each other" ) ;
201
+ assert . throws ( ( ) => eval ( '0o000__1' ) , SyntaxError , "Multiple numeric separator characters may not follow each other" ) ;
202
+ assert . throws ( ( ) => eval ( '0o000_a' ) , SyntaxError , "After initial zeroes, a numeric separator followed by an invalid character" ) ;
203
+ }
204
+ } ,
205
+ {
206
+ name : "Strings parsed as number do not support numeric separators for octal literals" ,
207
+ body : function ( ) {
208
+ assert . areEqual ( NaN , Number ( '0o0_1' ) , "NaN === Number('0o0_1')" ) ;
209
+ assert . areEqual ( NaN , Number ( '0o1_0' ) , "NaN === Number('0o1_0')" ) ;
210
+ assert . areEqual ( NaN , Number ( '0o0_0' ) , "NaN === Number('0o0_0')" ) ;
211
+ assert . areEqual ( NaN , Number ( '0o1_1' ) , "NaN === Number('0o1_1')" ) ;
212
+
213
+ assert . areEqual ( 0 , parseInt ( '0b1_0' ) , "0 === parseInt('0b1_0')" ) ;
214
+
215
+ assert . areEqual ( 0 , parseFloat ( '0b1_0' ) , "0 === parseFloat('0b1_0')" ) ;
216
+ }
217
+ } ,
218
+ {
219
+ name : "Legacy octal numeric literals do not support numeric separators" ,
220
+ body : function ( ) {
221
+ assert . throws ( ( ) => eval ( '0_1' ) , SyntaxError , "'_' cannot immediately follow 0 in legacy octal numeric literal" ) ;
222
+ assert . throws ( ( ) => eval ( '07_7' ) , SyntaxError , "Legacy octal numeric literals do not support numeric separator" ) ;
223
+ }
224
+ } ,
173
225
] ;
174
226
175
227
testRunner . runTests ( tests , { verbose : WScript . Arguments [ 0 ] != "summary" } ) ;
0 commit comments