// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
var BUGNUMBER = 939715;
var summary = 'method type.from';

/*
 * Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/licenses/publicdomain/
 */

var ArrayType = TypedObject.ArrayType;
var StructType = TypedObject.StructType;
var uint8 = TypedObject.uint8;
var uint16 = TypedObject.uint16;
var uint32 = TypedObject.uint32;
var uint8Clamped = TypedObject.uint8Clamped;
var int8 = TypedObject.int8;
var int16 = TypedObject.int16;
var int32 = TypedObject.int32;
var float32 = TypedObject.float32;
var float64 = TypedObject.float64;

// Test name format:

// from<N>DimArrayOf<G1>sTo<G2>s where <N> is a positive integer (or its
// equivalent word in English) and <G1> and <G2> are both grain types
// (potentially an array themselves.)

function fromOneDimArrayOfUint8ToUint32s() {
  var intype = uint8.array(4);
  var type = uint32.array(4);
  var i1 = intype.build(i => i);
  var r1 = type.from(i1, j => j*2);
  var r2 = type.from(i1, 1, j => j*2);
  assertTypedEqual(type, r1, new type([0, 2, 4, 6]));
  assertTypedEqual(type, r1, r2);
}

function fromOneDimArrayOfUint32ToUint8s() {
  var intype = uint32.array(4);
  var type = uint8.array(4);
  var i1 = intype.build(i => i);
  var r1 = type.from(i1, j => j*200);
  var r2 = type.from(i1, 1, j => j*200);
  assertTypedEqual(type, r1, new type([0, 200, 400 % 256, 600 % 256]));
  assertTypedEqual(type, r1, r2);
}

function fromTwoDimArrayOfUint8ToUint32s() {
  var intype = uint8.array(4).array(4);
  var rowtype = uint32.array(4);
  var type = rowtype.array(4);
  var i1 = new type([[10, 11, 12, 13],
                     [20, 21, 22, 23],
                     [30, 31, 32, 33],
                     [40, 41, 42, 43]]);

  var r1 = type.from(i1, 2, x => x*2);
  var r2 = type.from(i1, 1, a => rowtype.from(a, 1, x => x*2));
  var r3 = type.from(i1, 1, (a, j, c, out) => { out[0] = a[0]*2;
                                                out[1] = a[1]*2;
                                                out[2] = a[2]*2;
                                                out[3] = a[3]*2; });
  assertTypedEqual(type, r1, new type([[20, 22, 24, 26],
                                       [40, 42, 44, 46],
                                       [60, 62, 64, 66],
                                       [80, 82, 84, 86]]));
  assertTypedEqual(type, r1, r2);
  assertTypedEqual(type, r1, r3);
}

function fromTwoDimArrayOfUint32ToUint8s() {
  var intype = uint32.array(4).array(4);
  var rowtype = uint8.array(4);
  var type = rowtype.array(4);
  var i1 = new type([[10, 11, 12, 13],
                     [20, 21, 22, 23],
                     [30, 31, 32, 33],
                     [40, 41, 42, 43]]);

  var r1 = type.from(i1, 2, x => x*2);
  var r2 = type.from(i1, 1, a => rowtype.from(a, 1, x => x*2));
  var r3 = type.from(i1, 1, (a, j, c, out) => { out[0] = a[0]*2;
                                                out[1] = a[1]*2;
                                                out[2] = a[2]*2;
                                                out[3] = a[3]*2; });
  assertTypedEqual(type, r1, new type([[20, 22, 24, 26],
                                       [40, 42, 44, 46],
                                       [60, 62, 64, 66],
                                       [80, 82, 84, 86]]));
  assertTypedEqual(type, r1, r2);
  assertTypedEqual(type, r1, r3);
}

function fromOneDimArrayOfArrayOfUint8ToUint32s() {
  var intype = uint8.array(4).array(4);
  var type = uint32.array(4);
  var i1 = new intype([[0xdd, 0xcc, 0xbb, 0xaa],
                       [0x09, 0x08, 0x07, 0x06],
                       [0x15, 0x14, 0x13, 0x12],
                       [0x23, 0x32, 0x41, 0x50]]);

  function combine(a,b,c,d) { return a << 24 | b << 16 | c << 8 | d; }

  var r1 = type.from(i1, x => combine(x[0], x[1], x[2], x[3]));
  assertTypedEqual(type, r1, new type([0xddccbbaa,
                                       0x09080706,
                                       0x15141312,
                                       0x23324150]));
}

function fromOneDimArrayOfUint32ToArrayOfUint8s() {
  var intype = uint32.array(4);
  var type = uint8.array(4).array(4);
  var i1 = new intype([0xddccbbaa,
                       0x09080706,
                       0x15141312,
                       0x23324150]);

  function divide(a) { return [a >> 24 & 0xFF, a >> 16 & 0xFF, a >> 8 & 0xFF, a & 0xFF]; }

  var r1 = type.from(i1, x => divide(x));
  var r2 = type.from(i1, 1, (x, i, c, out) => {
                          var [a,b,c,d] = divide(x);
                          out[0] = a; out[1] = b; out[2] = c; out[3] = d;
                        });
  assertTypedEqual(type, r1, new type([[0xdd, 0xcc, 0xbb, 0xaa],
                                       [0x09, 0x08, 0x07, 0x06],
                                       [0x15, 0x14, 0x13, 0x12],
                                       [0x23, 0x32, 0x41, 0x50]]));
  assertTypedEqual(type, r1, r2);
}

var Grain = new StructType({f: uint32});
function wrapG(v) { return new Grain({f: v}); }
function doubleG(g) { return new Grain({f: g.f * 2}); }
function tenG(x, y) { return new Grain({f: x * 10 + y}); }

function fromOneDimArrayOfStructsToStructs() {
  var type = Grain.array(4);
  var i1 = type.build(wrapG);
  var r1 = type.from(i1, doubleG);
  var r2 = type.from(i1, 1, doubleG);
  var r3 = type.from(i1, 1, (g, j, c, out) => { out.f = g.f * 2; });
  assertTypedEqual(type, r1, new type([{f:0}, {f:2},
                                       {f:4}, {f:6}]));
  assertTypedEqual(type, r1, r2);
  assertTypedEqual(type, r1, r3);
}

function fromTwoDimArrayOfStructsToStructs() {
  var rowtype = Grain.array(2);
  var type = rowtype.array(2);
  var i1 = type.build(2, tenG);
  var r1 = type.from(i1, 2, doubleG);
  var r2 = type.from(i1, 1, (m) => rowtype.from(m, 1, doubleG));
  var r3 = type.from(i1, 1,
    (m, j, c, out) => { out[0].f = m[0].f * 2; out[1].f = m[1].f * 2; });
  assertTypedEqual(type, r1, new type([[{f:00}, {f:02}],
                                       [{f:20}, {f:22}]]));
  assertTypedEqual(type, r1, r2);
  assertTypedEqual(type, r1, r3);
}

function fromOneDimArrayOfStructsToArrayOfStructs() {
  var Line = Grain.array(2);
  var Box = Line.array(2);
  var i1 = Line.build(wrapG);
  var r1 = Box.from(i1, (g) => Line.build((y) => tenG(g.f, y)));
  var r2 = Box.from(i1, (g) => Line.from(i1, (y) => tenG(g.f, y.f)));
  var r3 = Box.from(i1,
    (g, j, c, out) => { out[0] = tenG(g.f, 0); out[1] = tenG(g.f, 1); });
  assertTypedEqual(Box, r1, new Box([[{f:00}, {f:01}],
                                     [{f:10}, {f:11}]]));
  assertTypedEqual(Box, r1, r2);
  assertTypedEqual(Box, r1, r3);
}

function Array_build(n, f) {
  var a = new Array(n);
  for ( var i=0 ; i < n ; i++ )
    a[i] = f(i);
  return a;
}

function fromUntypedArrayToUint32s() {
  var type = uint32.array(4);
  var i1 = Array_build(4, i => i);
  var r1 = type.from(i1, j => j*2);
  var r2 = type.from(i1, 1, j => j*2);
  assertTypedEqual(type, r1, new type([0, 2, 4, 6]));
  assertTypedEqual(type, r1, r2);
}

function fromUntypedArrayToUint8s() {
  var type = uint8.array(4);
  var i1 = Array_build(4, i => i);
  var r1 = type.from(i1, j => j*200);
  var r2 = type.from(i1, 1, j => j*200);
  assertTypedEqual(type, r1, new type([0, 200, 400 % 256, 600 % 256]));
  assertTypedEqual(type, r1, r2);
}

function runTests() {
    print(BUGNUMBER + ": " + summary);

    fromOneDimArrayOfUint8ToUint32s();
    fromOneDimArrayOfUint32ToUint8s();

    fromTwoDimArrayOfUint8ToUint32s();
    fromTwoDimArrayOfUint32ToUint8s();

    fromOneDimArrayOfArrayOfUint8ToUint32s();
    fromOneDimArrayOfUint32ToArrayOfUint8s();

    fromOneDimArrayOfStructsToStructs();
    fromTwoDimArrayOfStructsToStructs();

    fromOneDimArrayOfStructsToArrayOfStructs();

    fromUntypedArrayToUint32s();
    fromUntypedArrayToUint8s();

    if (typeof reportCompare === "function")
        reportCompare(true, true);
    print("Tests complete");
}

runTests();
