@@ -10,24 +10,25 @@ function assert(actual, expected, message) {
10
10
&& actual . toString ( ) === expected . toString ( ) )
11
11
return ;
12
12
13
+ var msg = message ? " (" + message + ")" : "" ;
13
14
throw Error ( "assertion failed: got |" + actual + "|" +
14
- ", expected |" + expected + "|" +
15
- ( message ? " (" + message + ")" : "" ) ) ;
15
+ ", expected |" + expected + "|" + msg ) ;
16
16
}
17
17
18
- function assert_throws ( expected_error , func )
18
+ function assert_throws ( expected_error , func , message )
19
19
{
20
20
var err = false ;
21
+ var msg = message ? " (" + message + ")" : "" ;
21
22
try {
22
23
func ( ) ;
23
24
} catch ( e ) {
24
25
err = true ;
25
26
if ( ! ( e instanceof expected_error ) ) {
26
- throw Error ( "unexpected exception type" ) ;
27
+ throw Error ( `expected ${ expected_error . name } , got ${ e . name } ${ msg } ` ) ;
27
28
}
28
29
}
29
30
if ( ! err ) {
30
- throw Error ( " expected exception" ) ;
31
+ throw Error ( ` expected ${ expected_error . name } ${ msg } ` ) ;
31
32
}
32
33
}
33
34
@@ -421,7 +422,9 @@ function test_argument_scope()
421
422
var c = "global" ;
422
423
423
424
f = function ( a = eval ( "var arguments" ) ) { } ;
424
- assert_throws ( SyntaxError , f ) ;
425
+ // for some reason v8 does not throw an exception here
426
+ if ( typeof require === 'undefined' )
427
+ assert_throws ( SyntaxError , f ) ;
425
428
426
429
f = function ( a = eval ( "1" ) , b = arguments [ 0 ] ) { return b ; } ;
427
430
assert ( f ( 12 ) , 12 ) ;
@@ -536,6 +539,60 @@ function test_function_expr_name()
536
539
assert_throws ( TypeError , f ) ;
537
540
}
538
541
542
+ function test_expr ( expr , err ) {
543
+ if ( err )
544
+ assert_throws ( err , ( ) => eval ( expr ) , `for ${ expr } ` ) ;
545
+ else
546
+ assert ( 1 , eval ( expr ) , `for ${ expr } ` ) ;
547
+ }
548
+
549
+ function test_name ( name , err )
550
+ {
551
+ test_expr ( `(function() { return typeof ${ name } ? 1 : 1; })()` ) ;
552
+ test_expr ( `(function() { var ${ name } ; ${ name } = 1; return ${ name } ; })()` ) ;
553
+ test_expr ( `(function() { let ${ name } ; ${ name } = 1; return ${ name } ; })()` , name == 'let' ? SyntaxError : undefined ) ;
554
+ test_expr ( `(function() { const ${ name } = 1; return ${ name } ; })()` , name == 'let' ? SyntaxError : undefined ) ;
555
+ test_expr ( `(function(${ name } ) { ${ name } = 1; return ${ name } ; })()` ) ;
556
+ test_expr ( `(function({${ name } }) { ${ name } = 1; return ${ name } ; })({})` ) ;
557
+ test_expr ( `(function ${ name } () { return ${ name } ? 1 : 0; })()` ) ;
558
+ test_expr ( `"use strict"; (function() { return typeof ${ name } ? 1 : 1; })()` , err ) ;
559
+ test_expr ( `"use strict"; (function() { if (0) ${ name } = 1; return 1; })()` , err ) ;
560
+ test_expr ( `"use strict"; (function() { var x; if (0) x = ${ name } ; return 1; })()` , err ) ;
561
+ test_expr ( `"use strict"; (function() { var ${ name } ; return 1; })()` , err ) ;
562
+ test_expr ( `"use strict"; (function() { let ${ name } ; return 1; })()` , err ) ;
563
+ test_expr ( `"use strict"; (function() { const ${ name } = 1; return 1; })()` , err ) ;
564
+ test_expr ( `"use strict"; (function() { var ${ name } ; ${ name } = 1; return 1; })()` , err ) ;
565
+ test_expr ( `"use strict"; (function() { var ${ name } ; ${ name } = 1; return ${ name } ; })()` , err ) ;
566
+ test_expr ( `"use strict"; (function(${ name } ) { return 1; })()` , err ) ;
567
+ test_expr ( `"use strict"; (function({${ name } }) { return 1; })({})` , err ) ;
568
+ test_expr ( `"use strict"; (function ${ name } () { return 1; })()` , err ) ;
569
+ test_expr ( `(function() { "use strict"; return typeof ${ name } ? 1 : 1; })()` , err ) ;
570
+ test_expr ( `(function() { "use strict"; if (0) ${ name } = 1; return 1; })()` , err ) ;
571
+ test_expr ( `(function() { "use strict"; var x; if (0) x = ${ name } ; return 1; })()` , err ) ;
572
+ test_expr ( `(function() { "use strict"; var ${ name } ; return 1; })()` , err ) ;
573
+ test_expr ( `(function() { "use strict"; let ${ name } ; return 1; })()` , err ) ;
574
+ test_expr ( `(function() { "use strict"; const ${ name } = 1; return 1; })()` , err ) ;
575
+ test_expr ( `(function() { "use strict"; var ${ name } ; ${ name } = 1; return 1; })()` , err ) ;
576
+ test_expr ( `(function() { "use strict"; var ${ name } ; ${ name } = 1; return ${ name } ; })()` , err ) ;
577
+ test_expr ( `(function(${ name } ) { "use strict"; return 1; })()` , err ) ;
578
+ test_expr ( `(function({${ name } }) { "use strict"; return 1; })({})` , SyntaxError ) ;
579
+ test_expr ( `(function ${ name } () { "use strict"; return 1; })()` , err ) ;
580
+ }
581
+
582
+ function test_reserved_names ( )
583
+ {
584
+ test_name ( 'await' ) ;
585
+ test_name ( 'yield' , SyntaxError ) ;
586
+ test_name ( 'implements' , SyntaxError ) ;
587
+ test_name ( 'interface' , SyntaxError ) ;
588
+ test_name ( 'let' , SyntaxError ) ;
589
+ test_name ( 'package' , SyntaxError ) ;
590
+ test_name ( 'private' , SyntaxError ) ;
591
+ test_name ( 'protected' , SyntaxError ) ;
592
+ test_name ( 'public' , SyntaxError ) ;
593
+ test_name ( 'static' , SyntaxError ) ;
594
+ }
595
+
539
596
test_op1 ( ) ;
540
597
test_cvt ( ) ;
541
598
test_eq ( ) ;
@@ -555,3 +612,4 @@ test_spread();
555
612
test_function_length ( ) ;
556
613
test_argument_scope ( ) ;
557
614
test_function_expr_name ( ) ;
615
+ test_reserved_names ( ) ;
0 commit comments