From df1e5e7d44030deefde2e7feab17b69d9e541a60 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Bargull?= <andre.bargull@gmail.com>
Date: Fri, 8 Dec 2017 13:23:24 -0800
Subject: [PATCH] Add more completion value tests for try-statements

---
 .../statements/try/cptn-catch-empty-break.js   | 18 ++++++++++++++++++
 .../try/cptn-catch-empty-continue.js           | 18 ++++++++++++++++++
 .../try/cptn-catch-finally-empty-break.js      | 18 ++++++++++++++++++
 .../try/cptn-catch-finally-empty-continue.js   | 18 ++++++++++++++++++
 .../statements/try/cptn-finally-empty-break.js | 18 ++++++++++++++++++
 .../try/cptn-finally-empty-continue.js         | 18 ++++++++++++++++++
 6 files changed, 108 insertions(+)
 create mode 100644 test/language/statements/try/cptn-catch-empty-break.js
 create mode 100644 test/language/statements/try/cptn-catch-empty-continue.js
 create mode 100644 test/language/statements/try/cptn-catch-finally-empty-break.js
 create mode 100644 test/language/statements/try/cptn-catch-finally-empty-continue.js
 create mode 100644 test/language/statements/try/cptn-finally-empty-break.js
 create mode 100644 test/language/statements/try/cptn-finally-empty-continue.js

diff --git a/test/language/statements/try/cptn-catch-empty-break.js b/test/language/statements/try/cptn-catch-empty-break.js
new file mode 100644
index 0000000000..d862d39713
--- /dev/null
+++ b/test/language/statements/try/cptn-catch-empty-break.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-try-statement-runtime-semantics-evaluation
+description: Abrupt completion from catch block calls UpdatEmpty()
+info: |
+  13.15.8 Runtime Semantics: Evaluation
+  TryStatement : try Block Catch
+    ...
+    2. If B.[[Type]] is throw, let C be CatchClauseEvaluation of Catch with parameter B.[[Value]].
+    ...
+    4. Return Completion(UpdateEmpty(C, undefined)).
+---*/
+
+// Ensure the completion value from the first iteration ('bad completion') is not returned.
+var completion = eval("for (var i = 0; i < 2; ++i) { if (i) { try { throw null; } catch (e) { break; } } 'bad completion'; }");
+assert.sameValue(completion, undefined);
diff --git a/test/language/statements/try/cptn-catch-empty-continue.js b/test/language/statements/try/cptn-catch-empty-continue.js
new file mode 100644
index 0000000000..d358695257
--- /dev/null
+++ b/test/language/statements/try/cptn-catch-empty-continue.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-try-statement-runtime-semantics-evaluation
+description: Abrupt completion from catch block calls UpdatEmpty()
+info: |
+  13.15.8 Runtime Semantics: Evaluation
+  TryStatement : try Block Catch
+    ...
+    2. If B.[[Type]] is throw, let C be CatchClauseEvaluation of Catch with parameter B.[[Value]].
+    ...
+    4. Return Completion(UpdateEmpty(C, undefined)).
+---*/
+
+// Ensure the completion value from the first iteration ('bad completion') is not returned.
+var completion = eval("for (var i = 0; i < 2; ++i) { if (i) { try { throw null; } catch (e) { continue; } } 'bad completion'; }");
+assert.sameValue(completion, undefined);
diff --git a/test/language/statements/try/cptn-catch-finally-empty-break.js b/test/language/statements/try/cptn-catch-finally-empty-break.js
new file mode 100644
index 0000000000..b34ba2e934
--- /dev/null
+++ b/test/language/statements/try/cptn-catch-finally-empty-break.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-try-statement-runtime-semantics-evaluation
+description: Abrupt completion from finally block calls UpdatEmpty()
+info: |
+  13.15.8 Runtime Semantics: Evaluation
+   TryStatement : try Block Catch Finally
+    ...
+    4. Let F be the result of evaluating Finally.
+    ...
+    6. Return Completion(UpdateEmpty(F, undefined)).
+---*/
+
+// Ensure the completion value from the first iteration ('bad completion') is not returned.
+var completion = eval("for (var i = 0; i < 2; ++i) { if (i) { try { throw null; } catch (e) {} finally { break; } } 'bad completion'; }");
+assert.sameValue(completion, undefined);
diff --git a/test/language/statements/try/cptn-catch-finally-empty-continue.js b/test/language/statements/try/cptn-catch-finally-empty-continue.js
new file mode 100644
index 0000000000..da6641b982
--- /dev/null
+++ b/test/language/statements/try/cptn-catch-finally-empty-continue.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-try-statement-runtime-semantics-evaluation
+description: Abrupt completion from finally block calls UpdatEmpty()
+info: |
+  13.15.8 Runtime Semantics: Evaluation
+   TryStatement : try Block Catch Finally
+    ...
+    4. Let F be the result of evaluating Finally.
+    ...
+    6. Return Completion(UpdateEmpty(F, undefined)).
+---*/
+
+// Ensure the completion value from the first iteration ('bad completion') is not returned.
+var completion = eval("for (var i = 0; i < 2; ++i) { if (i) { try { throw null; } catch (e) {} finally { continue; } } 'bad completion'; }");
+assert.sameValue(completion, undefined);
diff --git a/test/language/statements/try/cptn-finally-empty-break.js b/test/language/statements/try/cptn-finally-empty-break.js
new file mode 100644
index 0000000000..c32de4ef03
--- /dev/null
+++ b/test/language/statements/try/cptn-finally-empty-break.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-try-statement-runtime-semantics-evaluation
+description: Abrupt completion from finally block calls UpdatEmpty()
+info: |
+  13.15.8 Runtime Semantics: Evaluation
+  TryStatement : try Block Finally
+    ...
+    2. Let F be the result of evaluating Finally.
+    ...
+    4. Return Completion(UpdateEmpty(F, undefined)).
+---*/
+
+// Ensure the completion value from the first iteration ('bad completion') is not returned.
+var completion = eval("for (var i = 0; i < 2; ++i) { if (i) { try {} finally { break; } } 'bad completion'; }");
+assert.sameValue(completion, undefined);
diff --git a/test/language/statements/try/cptn-finally-empty-continue.js b/test/language/statements/try/cptn-finally-empty-continue.js
new file mode 100644
index 0000000000..c11f33833d
--- /dev/null
+++ b/test/language/statements/try/cptn-finally-empty-continue.js
@@ -0,0 +1,18 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-try-statement-runtime-semantics-evaluation
+description: Abrupt completion from finally block calls UpdatEmpty()
+info: |
+  13.15.8 Runtime Semantics: Evaluation
+  TryStatement : try Block Finally
+    ...
+    2. Let F be the result of evaluating Finally.
+    ...
+    4. Return Completion(UpdateEmpty(F, undefined)).
+---*/
+
+// Ensure the completion value from the first iteration ('bad completion') is not returned.
+var completion = eval("for (var i = 0; i < 2; ++i) { if (i) { try {} finally { continue; } } 'bad completion'; }");
+assert.sameValue(completion, undefined);
-- 
GitLab