// Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-atomics.store
description: Test Atomics.store on arrays that allow atomic operations.
includes: [testAtomics.js, testTypedArray.js]
features: [SharedArrayBuffer, ArrayBuffer, DataView, Atomics, arrow-function, let, TypedArray, for-of]
---*/

var sab = new SharedArrayBuffer(1024);
var ab = new ArrayBuffer(16);

var int_views = [Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array];

testWithTypedArrayConstructors(function(View) {
    // Make it interesting - use non-zero byteOffsets and non-zero indexes.

    var view = new View(sab, 32, 20);
    var control = new View(ab, 0, 2);

    for ( let val of [10,
                      -5,
                      12345,
                      123456789,
                      Math.PI,
                      "33",
                      { valueOf: () => 33 },
                      undefined] )
    {
        assert.sameValue(Atomics.store(view, 3, val), ToInteger(val),
                         "Atomics.store returns its third argument (" + val + ") converted to Integer, not the input value nor the value that was stored");

        control[0] = val;
        assert.sameValue(view[3], control[0]);
    }

    // In-bounds boundary cases for indexing
    testWithAtomicsInBoundsIndices(function(IdxGen) {
        let Idx = IdxGen(view);
        view.fill(0);
        Atomics.store(view, Idx, 37);
        assert.sameValue(Atomics.load(view, Idx), 37);
    });
}, int_views);

function ToInteger(v) {
    v = +v;
    if (isNaN(v))
        return 0;
    if (v == 0 || !isFinite(v))
        return v;
    if (v < 0)
        return -Math.floor(Math.abs(v));
    return Math.floor(v);
}
