summaryrefslogtreecommitdiffstats
path: root/js/src/tests/ecma_7/TypedObject/method_map.js
blob: e5bf9b3ee5ba78ca589864b52ecd02c56e9d2d78 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
var BUGNUMBER = 939715;
var summary = 'method instance.map';

/*
 * 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:

// map<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 mapOneDimArrayOfUint8() {
  var type = uint8.array(4);
  var i1 = type.build(i => i);
  var r1 = i1.map(j => j*200);
  var r2 = i1.map(1, j => j*200);
  assertTypedEqual(type, r1, new type([0, 200, 400 % 256, 600 % 256]));
  assertTypedEqual(type, r1, r2);
}

function mapOneDimArrayOfUint32() {
  var type = uint32.array(4);
  var i1 = type.build(i => i);
  var r1 = i1.map(j => j*200);
  var r2 = i1.map(1, j => j*200);
  assertTypedEqual(type, r1, new type([0, 200, 400, 600]));
  assertTypedEqual(type, r1, r2);
}

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

  var r1 = i1.map(2, x => x*2);
  var r2 = i1.map(1, a => a.map(1, x => x*2));
  var r3 = i1.map(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 mapTwoDimArrayOfUint32() {
  var type = uint32.array(4).array(4);
  var i1 = new type([[10, 11, 12, 13],
                     [20, 21, 22, 23],
                     [30, 31, 32, 33],
                     [40, 41, 42, 43]]);

  var r1 = i1.map(2, x => x*2);
  var r2 = i1.map(1, a => a.map(1, x => x*2));
  var r3 = i1.map(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);
}

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 mapOneDimArrayOfStructs() {
  var type = Grain.array(4);
  var i1 = type.build(wrapG);
  var r1 = i1.map(doubleG);
  var r2 = i1.map(1, doubleG);
  var r3 = i1.map(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 mapTwoDimArrayOfStructs() {
  var rowtype = Grain.array(2);
  var type = rowtype.array(2);
  var i1 = type.build(2, tenG);
  var r1 = i1.map(2, doubleG);
  var r2 = i1.map(1, (m) => m.map(1, doubleG));
  var r3 = i1.map(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 runTests() {
    print(BUGNUMBER + ": " + summary);

    mapOneDimArrayOfUint8();
    mapOneDimArrayOfUint32();

    mapTwoDimArrayOfUint8();
    mapTwoDimArrayOfUint32();

    mapOneDimArrayOfStructs();
    mapTwoDimArrayOfStructs();

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

runTests();