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 49
    view.setFloat32(1,3);
     console.log('setFloat32',view.getFloat32(1))
M
mahaifeng 已提交
50
    expect(this.numberEquals(3, view.getFloat32(1))).toEqual(true);
51
  }
M
mahaifeng 已提交
52 53 54 55 56 57 58

  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);
59
  }
M
mahaifeng 已提交
60 61 62 63 64 65 66

  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);
67
  }
M
mahaifeng 已提交
68 69 70 71 72 73 74

  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);
75
  }
M
mahaifeng 已提交
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

  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);
91
  }
M
mahaifeng 已提交
92 93 94 95 96 97 98 99 100

  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);
  }

101
  numberEquals(a: number, b: number): Boolean {
M
mahaifeng 已提交
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
    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);
  }

130
  doIterations(littleEndian: boolean, dataView: boolean) {
M
mahaifeng 已提交
131 132 133 134 135 136 137 138 139 140 141
    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);
    }
  }

142
  makeBuffer(size: number, littleEndian: boolean): ArrayBuffer {
143
    var buffer = new ArrayBuffer(1000 * 14);
M
mahaifeng 已提交
144
    var view = new DataView(buffer);
145
    for (var i = 0; i < 1000; ++i) {
M
mahaifeng 已提交
146 147 148 149 150 151 152 153 154 155
      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;
  }

156
  doOneIterationDV(buffer: ArrayBuffer, littleEndian: boolean) {
M
mahaifeng 已提交
157 158 159 160 161 162 163 164 165 166 167 168 169
    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);
  }

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

  }

197
  doFloatIterations(dataView: boolean) {
198
    var buffer = this.makeFloatBuffer();
M
mahaifeng 已提交
199 200 201 202 203 204 205 206 207 208
    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);
    }
  }

209
  makeFloatBuffer(): ArrayBuffer {
210
    var buffer = new ArrayBuffer(1000 * 16);
M
mahaifeng 已提交
211
    var view = new DataView(buffer);
212
    for (var i = 0; i < 1000; i++) {
M
mahaifeng 已提交
213 214 215 216 217 218 219
      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;
  }

220
  doOneFloatIterationDV(buffer: ArrayBuffer) {
M
mahaifeng 已提交
221 222 223 224 225 226 227
    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);
    }
228
     expect(sum).toEqual(23634.413356150446);
M
mahaifeng 已提交
229 230
  }

231
  doOneFloatIterationJS(buffer: ArrayBuffer) {
M
mahaifeng 已提交
232 233 234 235 236 237 238 239 240 241 242
    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 {
243 244
  private uint8View_: Uint8Array;
  private int8View_: Int8Array;
M
mahaifeng 已提交
245

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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