@@ -10,24 +10,25 @@ function assert(actual, expected, message) {
1010 && actual . toString ( ) === expected . toString ( ) )
1111 return ;
1212
13+ var msg = message ? " (" + message + ")" : "" ;
1314 throw Error ( "assertion failed: got |" + actual + "|" +
14- ", expected |" + expected + "|" +
15- ( message ? " (" + message + ")" : "" ) ) ;
15+ ", expected |" + expected + "|" + msg ) ;
1616}
1717
18- function assert_throws ( expected_error , func )
18+ function assert_throws ( expected_error , func , message )
1919{
2020 var err = false ;
21+ var msg = message ? " (" + message + ")" : "" ;
2122 try {
2223 func ( ) ;
2324 } catch ( e ) {
2425 err = true ;
2526 if ( ! ( e instanceof expected_error ) ) {
26- throw Error ( "unexpected exception type" ) ;
27+ throw Error ( `expected ${ expected_error . name } , got ${ e . name } ${ msg } ` ) ;
2728 }
2829 }
2930 if ( ! err ) {
30- throw Error ( " expected exception" ) ;
31+ throw Error ( ` expected ${ expected_error . name } ${ msg } ` ) ;
3132 }
3233}
3334
@@ -421,7 +422,9 @@ function test_argument_scope()
421422 var c = "global" ;
422423
423424 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 ) ;
425428
426429 f = function ( a = eval ( "1" ) , b = arguments [ 0 ] ) { return b ; } ;
427430 assert ( f ( 12 ) , 12 ) ;
@@ -536,6 +539,60 @@ function test_function_expr_name()
536539 assert_throws ( TypeError , f ) ;
537540}
538541
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+
539596test_op1 ( ) ;
540597test_cvt ( ) ;
541598test_eq ( ) ;
@@ -555,3 +612,4 @@ test_spread();
555612test_function_length ( ) ;
556613test_argument_scope ( ) ;
557614test_function_expr_name ( ) ;
615+ test_reserved_names ( ) ;
0 commit comments