From 5d6899522ad913003f83e1127f84f5d068112460 Mon Sep 17 00:00:00 2001
From: Amal Hussein <6717823+nomadtechie@users.noreply.github.com>
Date: Mon, 19 Mar 2018 20:06:53 -0400
Subject: [PATCH] additional test coverage for atomics.wait  (#1497)

---
 test/built-ins/Atomics/wait/bad-range.js      | 25 -------
 test/built-ins/Atomics/wait/did-timeout.js    |  1 +
 .../Atomics/wait/false-for-timeout.js         |  2 +-
 .../Atomics/wait/negative-index-throws.js     |  1 +
 .../wait/non-int32-typedarray-throws.js       | 54 +++++++++++++++
 test/built-ins/Atomics/wait/non-views.js      | 14 ----
 ...rows.js => nonshared-bufferdata-throws.js} |  0
 .../Atomics/wait/nonshared-int-views.js       | 25 -------
 ...e-throws.js => not-a-typedarray-throws.js} |  0
 .../Atomics/wait/out-of-range-index-throws.js | 28 ++++++++
 .../poisoned-object-for-timeout-throws.js     | 17 +++--
 .../Atomics/wait/shared-nonint-views.js       | 22 ------
 ...l-throws.js => symbol-for-index-throws.js} |  1 +
 ...throws.js => symbol-for-timeout-throws.js} | 23 ++++---
 test/built-ins/Atomics/wait/timeout-nan.js    | 62 -----------------
 .../Atomics/wait/timeout-null-or-false.js     | 68 -------------------
 .../{timeout-true.js => true-for-timeout.js}  |  5 +-
 ...-undefined.js => undefined-for-timeout.js} |  0
 .../wait/undefined-index-defaults-to-zero.js  |  3 +-
 .../wait/wait-index-value-not-equal.js        | 52 ++++++++++++++
 20 files changed, 164 insertions(+), 239 deletions(-)
 delete mode 100644 test/built-ins/Atomics/wait/bad-range.js
 create mode 100644 test/built-ins/Atomics/wait/non-int32-typedarray-throws.js
 delete mode 100644 test/built-ins/Atomics/wait/non-views.js
 rename test/built-ins/Atomics/wait/{datablock-bufferdata-throws.js => nonshared-bufferdata-throws.js} (100%)
 delete mode 100644 test/built-ins/Atomics/wait/nonshared-int-views.js
 rename test/built-ins/Atomics/wait/{missing-typedarrayname-throws.js => not-a-typedarray-throws.js} (100%)
 create mode 100644 test/built-ins/Atomics/wait/out-of-range-index-throws.js
 delete mode 100644 test/built-ins/Atomics/wait/shared-nonint-views.js
 rename test/built-ins/Atomics/wait/{index-symbol-throws.js => symbol-for-index-throws.js} (99%)
 rename test/built-ins/Atomics/wait/{timeout-symbol-throws.js => symbol-for-timeout-throws.js} (68%)
 delete mode 100644 test/built-ins/Atomics/wait/timeout-nan.js
 delete mode 100644 test/built-ins/Atomics/wait/timeout-null-or-false.js
 rename test/built-ins/Atomics/wait/{timeout-true.js => true-for-timeout.js} (81%)
 rename test/built-ins/Atomics/wait/{timeout-undefined.js => undefined-for-timeout.js} (100%)
 create mode 100644 test/built-ins/Atomics/wait/wait-index-value-not-equal.js

diff --git a/test/built-ins/Atomics/wait/bad-range.js b/test/built-ins/Atomics/wait/bad-range.js
deleted file mode 100644
index 680caf7bac..0000000000
--- a/test/built-ins/Atomics/wait/bad-range.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: sec-atomics.wait
-description: >
-  Test range checking of Atomics.wait on arrays that allow atomic operations
-includes: [testAtomics.js, testTypedArray.js]
-features: [SharedArrayBuffer, ArrayBuffer, DataView, Atomics, TypedArray, arrow-function, let, for-of]
----*/
-
-var sab = new SharedArrayBuffer(8);
-var views = [Int32Array];
-
-if (typeof BigInt !== "undefined") {
-  views.push(BigInt64Array);
-}
-
-testWithTypedArrayConstructors(function(View) {
-  let view = new View(sab);
-  testWithAtomicsOutOfBoundsIndices(function(IdxGen) {
-    let Idx = IdxGen(view);
-    assert.throws(RangeError, () => Atomics.wait(view, Idx, 10, 0)); // Even with zero timeout
-  });
-}, views);
diff --git a/test/built-ins/Atomics/wait/did-timeout.js b/test/built-ins/Atomics/wait/did-timeout.js
index 3635d6728b..337a45bbc9 100644
--- a/test/built-ins/Atomics/wait/did-timeout.js
+++ b/test/built-ins/Atomics/wait/did-timeout.js
@@ -27,6 +27,7 @@ $262.agent.broadcast(ia.buffer);
 assert.sameValue(getReport(), "timed-out");
 assert.sameValue((getReport() | 0) >= 500 - $ATOMICS_MAX_TIME_EPSILON, true);
 
+
 function getReport() {
   var r;
   while ((r = $262.agent.getReport()) == null)
diff --git a/test/built-ins/Atomics/wait/false-for-timeout.js b/test/built-ins/Atomics/wait/false-for-timeout.js
index 77d7d59810..593fd9da15 100644
--- a/test/built-ins/Atomics/wait/false-for-timeout.js
+++ b/test/built-ins/Atomics/wait/false-for-timeout.js
@@ -12,7 +12,7 @@ info: |
     ...
     Null  Return +0.
     Boolean	If argument is true, return 1. If argument is false, return +0.
-features: [ Atomics ]
+features: [ Atomics, SharedArrayBuffer, TypedArray ]
 includes: [ atomicsHelper.js ]
 ---*/
 
diff --git a/test/built-ins/Atomics/wait/negative-index-throws.js b/test/built-ins/Atomics/wait/negative-index-throws.js
index d46d1addba..2d08dc40c1 100644
--- a/test/built-ins/Atomics/wait/negative-index-throws.js
+++ b/test/built-ins/Atomics/wait/negative-index-throws.js
@@ -1,5 +1,6 @@
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
+
 /*---
 esid: sec-atomics.wait
 description: >
diff --git a/test/built-ins/Atomics/wait/non-int32-typedarray-throws.js b/test/built-ins/Atomics/wait/non-int32-typedarray-throws.js
new file mode 100644
index 0000000000..12c1203ccd
--- /dev/null
+++ b/test/built-ins/Atomics/wait/non-int32-typedarray-throws.js
@@ -0,0 +1,54 @@
+// Copyright (C) 2018 Amal Hussein. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-atomics.wait
+description:
+  Throws a TypeError if typedArray arg is not an Int32Array
+info: |
+  Atomics.wait( typedArray, index, value, timeout )
+
+  1.Let buffer be ? ValidateSharedIntegerTypedArray(typedArray, true).
+    ...
+      5.If onlyInt32 is true, then
+        If typeName is not "Int32Array", throw a TypeError exception.
+features: [ Atomics, TypedArray ]
+---*/
+
+var poisoned = {
+  valueOf: function() {
+    throw new Test262Error("should not evaluate this code");
+  }
+};
+
+assert.throws(TypeError, function() {
+  Atomics.wait(new Float64Array(), poisoned, poisoned, poisoned);
+}, 'Float64Array');
+
+assert.throws(TypeError, function() {
+  Atomics.wait(new Float32Array(), poisoned, poisoned, poisoned);
+}, 'Float32Array');
+
+assert.throws(TypeError, function() {
+  Atomics.wait(new Int16Array(), poisoned, poisoned, poisoned);
+}, 'Int16Array');
+
+assert.throws(TypeError, function() {
+  Atomics.wait(new Int8Array(), poisoned, poisoned, poisoned);
+}, 'Int8Array');
+
+assert.throws(TypeError, function() {
+  Atomics.wait(new Uint32Array(),  poisoned, poisoned, poisoned);
+}, 'Uint32Array');
+
+assert.throws(TypeError, function() {
+  Atomics.wait(new Uint16Array(), poisoned, poisoned, poisoned);
+}, 'Uint16Array');
+
+assert.throws(TypeError, function() {
+  Atomics.wait(new Uint8Array(), poisoned, poisoned, poisoned);
+}, 'Uint8Array');
+
+assert.throws(TypeError, function() {
+  Atomics.wait(new Uint8ClampedArray(), poisoned, poisoned, poisoned);
+}, 'Uint8ClampedArray');
diff --git a/test/built-ins/Atomics/wait/non-views.js b/test/built-ins/Atomics/wait/non-views.js
deleted file mode 100644
index 4da77da33f..0000000000
--- a/test/built-ins/Atomics/wait/non-views.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: sec-atomics.wait
-description: >
-  Test Atomics.wait on view values other than TypedArrays
-includes: [testAtomics.js]
-features: [SharedArrayBuffer, ArrayBuffer, DataView, Atomics, arrow-function, let, for-of]
----*/
-
-testWithAtomicsNonViewValues(function(view) {
-  assert.throws(TypeError, (() => Atomics.wait(view, 0, 0, 0))); // Even with zero timeout
-});
diff --git a/test/built-ins/Atomics/wait/datablock-bufferdata-throws.js b/test/built-ins/Atomics/wait/nonshared-bufferdata-throws.js
similarity index 100%
rename from test/built-ins/Atomics/wait/datablock-bufferdata-throws.js
rename to test/built-ins/Atomics/wait/nonshared-bufferdata-throws.js
diff --git a/test/built-ins/Atomics/wait/nonshared-int-views.js b/test/built-ins/Atomics/wait/nonshared-int-views.js
deleted file mode 100644
index add2f7b3ad..0000000000
--- a/test/built-ins/Atomics/wait/nonshared-int-views.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: sec-atomics.wait
-description: >
-  Test Atomics.wait on non-shared integer TypedArrays
-includes: [testTypedArray.js]
-features: [Atomics, TypedArray]
----*/
-
-var ab = new ArrayBuffer(16);
-
-var int_views = [Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array];
-
-if (typeof BigInt !== "undefined") {
-  int_views.push(BigInt64Array);
-  int_views.push(BigUint64Array);
-}
-
-testWithTypedArrayConstructors(function(View) {
-  var view = new View(ab);
-
-  assert.throws(TypeError, (() => Atomics.wait(view, 0, 0, 0))); // Should fail even if waiting 0ms
-}, int_views);
diff --git a/test/built-ins/Atomics/wait/missing-typedarrayname-throws.js b/test/built-ins/Atomics/wait/not-a-typedarray-throws.js
similarity index 100%
rename from test/built-ins/Atomics/wait/missing-typedarrayname-throws.js
rename to test/built-ins/Atomics/wait/not-a-typedarray-throws.js
diff --git a/test/built-ins/Atomics/wait/out-of-range-index-throws.js b/test/built-ins/Atomics/wait/out-of-range-index-throws.js
new file mode 100644
index 0000000000..d14262605f
--- /dev/null
+++ b/test/built-ins/Atomics/wait/out-of-range-index-throws.js
@@ -0,0 +1,28 @@
+// Copyright (C) 2018 Amal Hussein. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-atomics.wait
+description: >
+  Throws a RangeError if value of index arg is out of range
+info: |
+  Atomics.wait( typedArray, index, value, timeout )
+
+  2.Let i be ? ValidateAtomicAccess(typedArray, index).
+    ...
+    2.Let accessIndex be ? ToIndex(requestIndex).
+    ...
+    5. If accessIndex ≥ length, throw a RangeError exception.
+features: [ Atomics, SharedArrayBuffer, TypedArray ]
+---*/
+
+var int32Array = new Int32Array(new SharedArrayBuffer(4));
+var poisoned = {
+  valueOf: function() {
+    throw new Test262Error("should not evaluate this code");
+  }
+};
+
+assert.throws(RangeError, () => Atomics.wait(int32Array, Infinity, poisoned, poisoned));
+assert.throws(RangeError, () => Atomics.wait(int32Array, 2, poisoned, poisoned));
+assert.throws(RangeError, () => Atomics.wait(int32Array, 200, poisoned, poisoned));
diff --git a/test/built-ins/Atomics/wait/poisoned-object-for-timeout-throws.js b/test/built-ins/Atomics/wait/poisoned-object-for-timeout-throws.js
index e5305151b9..0ca369b12a 100644
--- a/test/built-ins/Atomics/wait/poisoned-object-for-timeout-throws.js
+++ b/test/built-ins/Atomics/wait/poisoned-object-for-timeout-throws.js
@@ -20,9 +20,6 @@ info: |
 features: [ Atomics ]
 ---*/
 
-var sab = new SharedArrayBuffer(4);
-var int32Array = new Int32Array(sab);
-
 function getReport() {
   var r;
   while ((r = $262.agent.getReport()) == null) {
@@ -34,28 +31,30 @@ function getReport() {
 $262.agent.start(
   `
 $262.agent.receiveBroadcast(function (sab) {
+ 
+  var int32Array = new Int32Array(sab);  
   var poisoned = {
     valueOf: false,
     toString: false
   };
-
   var err;
   
   try {
     Atomics.wait(int32Array, 0, 0, poisoned);
   } catch(e) {
-    err = e.constructor;
+    err = e.name;
   }
-
+  
   $262.agent.report(err);
   $262.agent.leaving();
 })
 `);
 
-var int32Array = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));
+var sab = new SharedArrayBuffer(4);
+var int32Array = new Int32Array(sab);
 
 $262.agent.broadcast(int32Array.buffer);
 
-$262.agent.sleep(150);
+assert.sameValue(getReport(), 'TypeError');
 
-assert.sameValue(getReport(), TypeError);
+assert.sameValue(Atomics.wake(int32Array, 0), 0);
diff --git a/test/built-ins/Atomics/wait/shared-nonint-views.js b/test/built-ins/Atomics/wait/shared-nonint-views.js
deleted file mode 100644
index 63cf092f38..0000000000
--- a/test/built-ins/Atomics/wait/shared-nonint-views.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: sec-atomics.wait
-description: >
-  Test Atomics.wait on shared non-integer TypedArrays
-includes: [testTypedArray.js]
-features: [Atomics, TypedArray]
----*/
-
-var sab = new SharedArrayBuffer(1024);
-
-var other_views = [Int8Array, Uint8Array, Int16Array, Uint16Array, Uint32Array,
-                   Uint8ClampedArray, Float32Array, Float64Array];
-
-testWithTypedArrayConstructors(function(View) {
-  var view = new View(sab);
-
-  // Even with timout zero this should fail
-  assert.throws(TypeError, (() => Atomics.wait(view, 0, 0, 0)));
-}, other_views);
diff --git a/test/built-ins/Atomics/wait/index-symbol-throws.js b/test/built-ins/Atomics/wait/symbol-for-index-throws.js
similarity index 99%
rename from test/built-ins/Atomics/wait/index-symbol-throws.js
rename to test/built-ins/Atomics/wait/symbol-for-index-throws.js
index e391fcc4c3..e9b1ae7569 100644
--- a/test/built-ins/Atomics/wait/index-symbol-throws.js
+++ b/test/built-ins/Atomics/wait/symbol-for-index-throws.js
@@ -1,5 +1,6 @@
 // Copyright (C) 2018 Amal Hussein. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
+
 /*---
 esid: sec-atomics.wait
 description: >
diff --git a/test/built-ins/Atomics/wait/timeout-symbol-throws.js b/test/built-ins/Atomics/wait/symbol-for-timeout-throws.js
similarity index 68%
rename from test/built-ins/Atomics/wait/timeout-symbol-throws.js
rename to test/built-ins/Atomics/wait/symbol-for-timeout-throws.js
index d8b2eadaeb..dd003bf5e7 100644
--- a/test/built-ins/Atomics/wait/timeout-symbol-throws.js
+++ b/test/built-ins/Atomics/wait/symbol-for-timeout-throws.js
@@ -9,12 +9,11 @@ info: |
   Atomics.wait( typedArray, index, value, timeout )
 
   4.Let q be ? ToNumber(timeout).
-features: [Atomics, Symbol]
+    ...
+      Symbol Throw a TypeError exception.
+features: [Atomics, SharedArrayBuffer, TypedArray, Symbol]
 ---*/
 
-var sab = new SharedArrayBuffer(4);
-var int32Array = new Int32Array(sab);
-
 function getReport() {
   var r;
   while ((r = $262.agent.getReport()) == null) {
@@ -25,23 +24,25 @@ function getReport() {
 
 $262.agent.start(
   `
-$262.agent.receiveBroadcast(function (sab) {
+$262.agent.receiveBroadcast(function (sab) {  
+
+  var int32Array = new Int32Array(sab);
   var err;
-  var s = Symbol();
   
   try {
-    Atomics.wait(int32Array, 0, 0, s);
+    Atomics.wait(int32Array, 0, 0, Symbol('foo'));
   } catch(e) {
-    err = e.constructor;
+    err = e.name;
   }
-
+  
   $262.agent.report(err);
   $262.agent.leaving();
 })
 `);
 
-var int32Array = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));
+var sab = new SharedArrayBuffer(4);
+var int32Array = new Int32Array(sab);
 
 $262.agent.broadcast(int32Array.buffer);
 
-assert.sameValue(getReport(), TypeError);
+assert.sameValue(getReport(), 'TypeError');
diff --git a/test/built-ins/Atomics/wait/timeout-nan.js b/test/built-ins/Atomics/wait/timeout-nan.js
deleted file mode 100644
index e2e781482d..0000000000
--- a/test/built-ins/Atomics/wait/timeout-nan.js
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (C) 2018 Amal Hussein.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: sec-atomics.wait
-description: >
-  NaN timeout arg should result in an infinite timeout
-info: |
-  Atomics.wait( typedArray, index, value, timeout )
-
-  4.Let q be ? ToNumber(timeout).
-    ...
-    Undefined	Return NaN.
-  5.If q is NaN, let t be +∞, else let t be max(q, 0)
-features: [ Atomics, SharedArrayBuffer, TypedArray ]
----*/
-
-var NUMAGENT = 2; // Total number of agents started
-var WAKEUP = 0; // Index all agents are waiting on
-var WAKECOUNT = 2; // Total number of agents to wake up
-
-function getReport() {
-  var r;
-  while ((r = $262.agent.getReport()) == null)
-    $262.agent.sleep(100);
-  return r;
-}
-
-$262.agent.start(
-`
-$262.agent.receiveBroadcast(function (sab) {
-  var int32Array = new Int32Array(sab);
-  $262.agent.report("A " + Atomics.wait(int32Array, 0, 0, NaN));  // NaN => +Infinity
-  $262.agent.leaving();
-})
-`);
-
-$262.agent.start(
-  `
-$262.agent.receiveBroadcast(function (sab) {
-  var int32Array = new Int32Array(sab);
-  $262.agent.report("B " + Atomics.wait(int32Array, 0, 0));  // undefined => NaN => +Infinity
-  $262.agent.leaving();
-})
-`);
-
-var int32Array = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));
-
-$262.agent.broadcast(int32Array.buffer);
-
-$262.agent.sleep(500); // Ample time
-
-assert.sameValue(Atomics.wake(int32Array, WAKEUP, WAKECOUNT), WAKECOUNT);
-
-var sortedReports = [];
-for (var i = 0; i < NUMAGENT; i++) {
-  sortedReports.push(getReport());
-}
-sortedReports.sort();
-
-assert.sameValue(sortedReports[0], "A ok");
-assert.sameValue(sortedReports[1], "B ok");
diff --git a/test/built-ins/Atomics/wait/timeout-null-or-false.js b/test/built-ins/Atomics/wait/timeout-null-or-false.js
deleted file mode 100644
index 57004b8438..0000000000
--- a/test/built-ins/Atomics/wait/timeout-null-or-false.js
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (C) 2018 Amal Hussein.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: sec-atomics.wait
-description: >
-  Null or false timeout arg should result in an +0 timeout
-info: |
-  Atomics.wait( typedArray, index, value, timeout )
-
-  4.Let q be ? ToNumber(timeout).
-    ...
-    Null  Return +0.
-    Boolean	If argument is true, return 1. If argument is false, return +0.
-features: [Atomics]
-includes: [atomicsHelper.js]
----*/
-
-var NUMREPORTS = 4; // Expected reports output from running agents
-
-function getReport() {
-  var r;
-  while ((r = $262.agent.getReport()) == null)
-    $262.agent.sleep(100);
-  return r;
-}
-
-$262.agent.start(
-  `
-$262.agent.receiveBroadcast(function (sab) {
-  var int32Array = new Int32Array(sab);
-  var start = Date.now();
-  $262.agent.report("A " + Atomics.wait(int32Array, 0, 0, null));  // null => +0
-  $262.agent.report(Date.now() - start);
-  $262.agent.leaving();
-})
-`);
-
-$262.agent.start(
-  `
-$262.agent.receiveBroadcast(function (sab) {
-  var int32Array = new Int32Array(sab);
-  var start = Date.now();
-  $262.agent.report("B " + Atomics.wait(int32Array, 0, 0, false));  // false => +0
-  $262.agent.report(Date.now() - start);
-  $262.agent.leaving();
-})
-`);
-
-var int32Array = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));
-
-$262.agent.broadcast(int32Array.buffer);
-
-$262.agent.sleep(150);
-
-
-var sortedReports = [];
-for (var i = 0; i < NUMREPORTS; i++) {
-  sortedReports.push(getReport());
-}
-sortedReports.sort();
-
-assert.sameValue(sortedReports[2], 'A timed-out');
-assert.sameValue(sortedReports[3], 'B timed-out');
-assert(sortedReports[0] >= 0 && sortedReports[0] <= $ATOMICS_MAX_TIME_EPSILON, "timeout should be a min of 0ms and max of $ATOMICS_MAX_TIME_EPSILON");
-assert(sortedReports[1] >= 0 && sortedReports[1] <= $ATOMICS_MAX_TIME_EPSILON, "timeout should be a min of 0ms and max of $ATOMICS_MAX_TIME_EPSILON");
-
-assert.sameValue(Atomics.wake(int32Array, 0), 0);
diff --git a/test/built-ins/Atomics/wait/timeout-true.js b/test/built-ins/Atomics/wait/true-for-timeout.js
similarity index 81%
rename from test/built-ins/Atomics/wait/timeout-true.js
rename to test/built-ins/Atomics/wait/true-for-timeout.js
index 62391b5db2..8d91414d99 100644
--- a/test/built-ins/Atomics/wait/timeout-true.js
+++ b/test/built-ins/Atomics/wait/true-for-timeout.js
@@ -11,7 +11,7 @@ info: |
   4.Let q be ? ToNumber(timeout).
     ...
     Boolean	If argument is true, return 1. If argument is false, return +0.
-features: [ Atomics ]
+features: [ Atomics, SharedArrayBuffer, TypedArray ]
 includes: [atomicsHelper.js]
 ---*/
 
@@ -41,5 +41,8 @@ $262.agent.broadcast(int32Array.buffer);
 $262.agent.sleep(2);
 
 var r1 = getReport();
+var r2 = getReport();
 
 assert.sameValue(r1, "timed-out");
+assert(r2 >= 1, "timeout should be a min of 1ms");
+assert(r2 <= $ATOMICS_MAX_TIME_EPSILON + 1, "timeout should be a max of $ATOMICS_MAX_TIME_EPSILON + 1ms");
diff --git a/test/built-ins/Atomics/wait/timeout-undefined.js b/test/built-ins/Atomics/wait/undefined-for-timeout.js
similarity index 100%
rename from test/built-ins/Atomics/wait/timeout-undefined.js
rename to test/built-ins/Atomics/wait/undefined-for-timeout.js
diff --git a/test/built-ins/Atomics/wait/undefined-index-defaults-to-zero.js b/test/built-ins/Atomics/wait/undefined-index-defaults-to-zero.js
index c0eb33eb42..969adf747f 100644
--- a/test/built-ins/Atomics/wait/undefined-index-defaults-to-zero.js
+++ b/test/built-ins/Atomics/wait/undefined-index-defaults-to-zero.js
@@ -33,7 +33,8 @@ var sab = new SharedArrayBuffer(1024);
 var int32Array = new Int32Array(sab);
 
 $262.agent.broadcast(int32Array.buffer);
-$262.agent.sleep(5);
+
+$262.agent.sleep(150);
 
 assert.sameValue(Atomics.wake(int32Array, 0), 1); // wake at index 0
 assert.sameValue(Atomics.wake(int32Array, 0), 0); // wake again at index 0, and 0 agents should be woken
diff --git a/test/built-ins/Atomics/wait/wait-index-value-not-equal.js b/test/built-ins/Atomics/wait/wait-index-value-not-equal.js
new file mode 100644
index 0000000000..797f36aff5
--- /dev/null
+++ b/test/built-ins/Atomics/wait/wait-index-value-not-equal.js
@@ -0,0 +1,52 @@
+// Copyright (C) 2018 Amal Hussein.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-atomics.wait
+description: >
+  Returns "not-equal" when value of index is not equal
+info: |
+  Atomics.wait( typedArray, index, value, timeout )
+
+  14.If v is not equal to w, then
+    a.Perform LeaveCriticalSection(WL).
+    b. Return the String "not-equal".
+
+features: [ Atomics, SharedArrayBuffer, TypedArray ]
+---*/
+
+function getReport() {
+  var r;
+  while ((r = $262.agent.getReport()) == null) {
+    $262.agent.sleep(100);
+  }
+  return r;
+}
+
+$262.agent.start(
+  `
+$262.agent.receiveBroadcast(function (sab) {
+  var int32Array = new Int32Array(sab);
+    
+  $262.agent.report(Atomics.wait(int32Array, 0, 44, 100));
+  
+  $262.agent.report(Atomics.wait(int32Array, 0, 251.4, 1000));
+    
+  $262.agent.report(Atomics.wait(int32Array, 0, Infinity, 1000));
+
+  $262.agent.leaving();
+})
+`);
+
+var int32Array = new Int32Array(new SharedArrayBuffer(1024));
+
+$262.agent.broadcast(int32Array.buffer);
+
+$262.agent.sleep(200);
+
+
+assert.sameValue(getReport(), "not-equal");
+assert.sameValue(getReport(), "not-equal");
+assert.sameValue(getReport(), "not-equal");
+
+assert.sameValue(Atomics.wake(int32Array, 0), 0);
-- 
GitLab