TDataView.uts 9.1 KB
Newer Older
M
mahaifeng 已提交
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
import {
  describe,
  test,
  expect,
  Result
} from './tests.uts'

export class TDataView {
  test() {
    // this.setDv();
    // this.setInt8();
    // this.setFloat32();
    // this.setFloat64();
    // this.setInt16();
    // this.setInt32();
    // this.setUint16();
    // this.setUint32();
    // this.setUint8();
    // this.testMix();
  }
  setConstructor() {
    let buffer = new ArrayBuffer(16);
    let dataview = new DataView(buffer);
    dataview.setInt8(1, 12);
    dataview.setFloat32(1, 34);
    expect(dataview.getInt8(1)).toEqual(66);
    expect(this.numberEquals(34, dataview.getFloat32(1))).toEqual(true);

    buffer = new ArrayBuffer(16);
    let view = new DataView(buffer, 1, 4);
    view.setInt16(1, 42); // 42
    expect(view.getInt16(1)).toEqual(42);
  }

  setInt8() {
    // Create an ArrayBuffer with a size in bytes
    let buffer = new ArrayBuffer(16);
    let view = new DataView(buffer);
    view.setInt8(1, 127); // Max signed 8-bit integer
    expect(view.getInt8(1)).toEqual(127);
41
  }
M
mahaifeng 已提交
42 43

  setFloat32() {
44
    console.log('setFloat32', 'start')
M
mahaifeng 已提交
45 46 47
    // Create an ArrayBuffer with a size in bytes
    let buffer = new ArrayBuffer(16);
    let view = new DataView(buffer);
48
    view.setFloat32(1, Math.PI.toFloat());
M
mahaifeng 已提交
49
    expect(this.numberEquals(3.1415927, view.getFloat32(1).toFloat())).toEqual(true);
50
  }
M
mahaifeng 已提交
51 52 53 54 55 56 57

  setFloat64() {
    // Create an ArrayBuffer with a size in bytes
    let buffer = new ArrayBuffer(16);
    let view = new DataView(buffer);
    view.setFloat64(1, Math.PI);
    expect(this.numberEquals(3.141592653589793, view.getFloat64(1))).toEqual(true);
58
  }
M
mahaifeng 已提交
59 60 61 62 63 64 65

  setInt16() {
    // Create an ArrayBuffer with a size in bytes
    let buffer = new ArrayBuffer(16);
    let view = new DataView(buffer);
    view.setInt16(1, 32767); // Max signed 16-bit integer
    expect(view.getInt16(1)).toEqual(32767);
66
  }
M
mahaifeng 已提交
67 68 69 70 71 72 73

  setInt32() {
    // Create an ArrayBuffer with a size in bytes
    let buffer = new ArrayBuffer(16);
    let view = new DataView(buffer);
    view.setInt32(1, 2147483647); // Max signed 32-bit integer
    expect(this.numberEquals(2147483647, view.getInt32(1))).toEqual(true);
74
  }
M
mahaifeng 已提交
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89

  setUint16() {
    // Create an ArrayBuffer with a size in bytes
    let buffer = new ArrayBuffer(16);
    let view = new DataView(buffer);
    view.setUint16(1, 65535); // Max unsigned 16-bit integer
    expect(this.numberEquals(65535, view.getUint16(1))).toEqual(true);
  }

  setUint32() {
    // Create an ArrayBuffer with a size in bytes
    let buffer = new ArrayBuffer(16);
    let view = new DataView(buffer);
    view.setUint32(1, 4294967295); // Max unsigned 32-bit integer
    expect(this.numberEquals(4294967295, view.getUint32(1))).toEqual(true);
90
  }
M
mahaifeng 已提交
91 92 93 94 95 96 97 98 99

  setUint8() {
    // Create an ArrayBuffer with a size in bytes
    let buffer = new ArrayBuffer(16);
    let view = new DataView(buffer);
    view.setUint8(1, 255); // Max unsigned 8-bit integer
    expect(this.numberEquals(255, view.getUint8(1))).toEqual(true);
  }

100
  numberEquals(a: Number, b: Number): Boolean {
M
mahaifeng 已提交
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
    return a == b
  }


  doTestDataViewBigEndian() {
    this.doIterations(false, true);
  }

  doTestDataViewLittleEndian() {
    this.doIterations(true, true);
  }

  doTestTypedArrayBigEndian() {
    this.doIterations(false, false);
  }

  doTestTypedArrayLittleEndian() {
    this.doIterations(true, false);
  }

  doTestDataViewFloats() {
    this.doFloatIterations(true);
  }

  doTestTypedArrayFloats() {
    this.doFloatIterations(false);
  }

129
  doIterations(littleEndian: boolean, dataView: boolean) {
M
mahaifeng 已提交
130 131 132 133 134 135 136 137 138 139 140
    var buffer = this.makeBuffer(1000, littleEndian);
    var iterations = 10;
    if (dataView) {
      for (var i = 0; i < iterations; i++)
        this.doOneIterationDV(buffer, littleEndian);
    } else {
      for (var i = 0; i < iterations; i++)
        this.doOneIterationJS(buffer, littleEndian);
    }
  }

141 142
  makeBuffer(size: Int, littleEndian: boolean): ArrayBuffer {
    var buffer = new ArrayBuffer(size * 14);
M
mahaifeng 已提交
143
    var view = new DataView(buffer);
144
    for (var i = 0; i < size; ++i) {
M
mahaifeng 已提交
145 146 147 148 149 150 151 152 153 154
      view.setInt8(i * 14, i);
      view.setUint8(i * 14 + 1, i);
      view.setInt16(i * 14 + 2, i * i, littleEndian);
      view.setUint16(i * 14 + 4, i * i, littleEndian);
      view.setInt32(i * 14 + 6, i * i * i, littleEndian);
      view.setUint32(i * 14 + 10, i * i * i, littleEndian);
    }
    return buffer;
  }

155
  doOneIterationDV(buffer: ArrayBuffer, littleEndian: boolean) {
M
mahaifeng 已提交
156 157 158 159 160 161 162 163 164 165 166 167 168
    var xor = 0;
    var view = new DataView(buffer);
    for (var i = 0; i < view.byteLength; i += 14) {
      xor ^= view.getInt8(i);
      xor ^= view.getUint8(i + 1);
      xor ^= view.getInt16(i + 2, littleEndian);
      xor ^= view.getUint16(i + 4, littleEndian);
      xor ^= view.getInt32(i + 6, littleEndian);
      xor ^= view.getUint32(i + 10, littleEndian);
    }
    expect(xor).toEqual(0);
  }

169
  doOneIterationJS(buffer: ArrayBuffer, littleEndian: boolean) {
M
mahaifeng 已提交
170 171 172 173 174 175 176 177 178 179 180 181 182
    var xor = 0;
    if (littleEndian) {
      var reader = new LittleEndian(buffer);
      for (var i = 0; i < buffer.byteLength; i += 14) {
        xor ^= reader.getInt8(i);
        xor ^= reader.getUint8(i + 1);
        xor ^= reader.getInt16(i + 2);
        xor ^= reader.getUint16(i + 4);
        xor ^= reader.getInt32(i + 6);
        xor ^= reader.getUint32(i + 10);
      }
      expect(xor).toEqual(0);
    } else {
183
      var reader = new BigEndian(buffer);
M
mahaifeng 已提交
184
      for (var i = 0; i < buffer.byteLength; i += 14) {
185 186 187 188 189 190
        xor ^= reader.getInt8(i);
        xor ^= reader.getUint8(i + 1);
        xor ^= reader.getInt16(i + 2);
        xor ^= reader.getUint16(i + 4);
        xor ^= reader.getInt32(i + 6);
        xor ^= reader.getUint32(i + 10);
M
mahaifeng 已提交
191 192 193 194 195
      }
    }

  }

196
  doFloatIterations(dataView: boolean) {
197
    var buffer = makeFloatBuffer(1000);
M
mahaifeng 已提交
198 199 200 201 202 203 204 205 206 207
    var iterations = 10;
    if (dataView) {
      for (var i = 0; i < iterations; i++)
        this.doOneFloatIterationDV(buffer);
    } else {
      for (var i = 0; i < iterations; i++)
        this.doOneFloatIterationJS(buffer);
    }
  }

208 209
  makeFloatBuffer(size: Int): ArrayBuffer {
    var buffer = new ArrayBuffer(size * 16);
M
mahaifeng 已提交
210
    var view = new DataView(buffer);
211
    for (var i = 0; i < size; i++) {
M
mahaifeng 已提交
212 213 214 215 216 217 218
      view.setFloat64(i * 16, Math.log10(i + 1));
      view.setFloat32(i * 16 + 8, Math.sqrt(i));
      view.setFloat32(i * 16 + 12, Math.cos(i));
    }
    return buffer;
  }

219
  doOneFloatIterationDV(buffer: ArrayBuffer) {
M
mahaifeng 已提交
220 221 222 223 224 225 226
    var sum = 0;
    var view = new DataView(buffer);
    for (var i = 0; i < view.byteLength; i += 16) {
      sum += view.getFloat64(i);
      sum += view.getFloat32(i + 8);
      sum += view.getFloat32(i + 12);
    }
227
     expect(sum).toEqual(23634.413356150446);
M
mahaifeng 已提交
228 229
  }

230
  doOneFloatIterationJS(buffer: ArrayBuffer) {
M
mahaifeng 已提交
231 232 233 234 235 236 237 238 239 240 241
    var sum = 0;
    var float32array = new Float32Array(buffer);
    var float64array = new Float64Array(buffer);
    for (var i = 0; i < buffer.byteLength; i += 16) {
      sum += float64array[i / 8];
      sum += float32array[i / 4 + 2];
      sum += float32array[i / 4 + 3];
    }
  }
}
class BigEndian {
242 243
  private uint8View_: Uint8Array;
  private int8View_: Int8Array;
M
mahaifeng 已提交
244

245
  constructor(buffer: ArrayBuffer, ) {
M
mahaifeng 已提交
246 247 248 249 250
    const offset = 0;
    this.uint8View_ = new Uint8Array(buffer, offset);
    this.int8View_ = new Int8Array(buffer, offset);
  }

251
  getInt8(byteOffset: number): number {
M
mahaifeng 已提交
252 253 254
    return this.int8View_[byteOffset];
  }

255
  getUint8(byteOffset: number): number {
M
mahaifeng 已提交
256 257 258
    return this.uint8View_[byteOffset];
  }

259
  getInt16(byteOffset: number): number {
M
mahaifeng 已提交
260 261 262
    return this.uint8View_[byteOffset + 1] | (this.int8View_[byteOffset] << 8);
  }

263
  getUint16(byteOffset: number): number {
M
mahaifeng 已提交
264 265 266
    return this.uint8View_[byteOffset + 1] | (this.uint8View_[byteOffset] << 8);
  }

267
  getInt32(byteOffset: number): number {
M
mahaifeng 已提交
268 269 270 271 272 273 274 275
    return (
      this.uint8View_[byteOffset + 3] |
      (this.uint8View_[byteOffset + 2] << 8) |
      (this.uint8View_[byteOffset + 1] << 16) |
      (this.int8View_[byteOffset] << 24)
    );
  }

276
  getUint32(byteOffset: number): number {
M
mahaifeng 已提交
277 278 279 280 281 282 283 284 285 286
    return (
      this.uint8View_[byteOffset + 3] +
      (this.uint8View_[byteOffset + 2] << 8) +
      (this.uint8View_[byteOffset + 1] << 16) +
      this.uint8View_[byteOffset] * (1 << 24)
    );
  }
}

class LittleEndian {
287 288
  private uint8View_: Uint8Array;
  private int8View_: Int8Array;
M
mahaifeng 已提交
289

290
  constructor(buffer: ArrayBuffer) {
M
mahaifeng 已提交
291 292 293 294 295
    const offset = 0;
    this.uint8View_ = new Uint8Array(buffer, offset);
    this.int8View_ = new Int8Array(buffer, offset);
  }

296
  getInt8(byteOffset: number): number {
M
mahaifeng 已提交
297 298 299
    return this.int8View_[byteOffset];
  }

300
  getUint8(byteOffset: number): number {
M
mahaifeng 已提交
301 302 303
    return this.uint8View_[byteOffset];
  }

304
  getInt16(byteOffset: number): number {
M
mahaifeng 已提交
305 306 307
    return this.uint8View_[byteOffset] | (this.int8View_[byteOffset + 1] << 8);
  }

308
  getUint16(byteOffset: number): number {
M
mahaifeng 已提交
309 310 311
    return this.uint8View_[byteOffset] | (this.uint8View_[byteOffset + 1] << 8);
  }

312
  getInt32(byteOffset: number): number {
M
mahaifeng 已提交
313 314 315 316 317 318 319 320
    return (
      this.uint8View_[byteOffset] |
      (this.uint8View_[byteOffset + 1] << 8) |
      (this.uint8View_[byteOffset + 2] << 16) |
      (this.int8View_[byteOffset + 3] << 24)
    );
  }

321
  getUint32(byteOffset: number): number {
M
mahaifeng 已提交
322 323 324 325 326 327 328 329
    return (
      this.uint8View_[byteOffset] +
      (this.uint8View_[byteOffset + 1] << 8) +
      (this.uint8View_[byteOffset + 2] << 16) +
      this.uint8View_[byteOffset + 3] * (1 << 24)
    );
  }
}