builtin_typedarrays_test.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. package goja
  2. import (
  3. "testing"
  4. )
  5. /*
  6. func TestArrayBufferNew(t *testing.T) {
  7. const SCRIPT = `
  8. var b = new ArrayBuffer(16);
  9. b.byteLength;
  10. `
  11. testScript(SCRIPT, intToValue(16), t)
  12. }
  13. */
  14. func TestArrayBufferSetUint32(t *testing.T) {
  15. vm := New()
  16. b := vm._newArrayBuffer(vm.global.ArrayBufferPrototype, nil)
  17. b.data = make([]byte, 4)
  18. b.setUint32(0, 0xCAFEBABE, bigEndian)
  19. i := b.getUint32(0, bigEndian)
  20. if i != 0xCAFEBABE {
  21. t.Fatal(i)
  22. }
  23. i = b.getUint32(0, littleEndian)
  24. if i != 0xBEBAFECA {
  25. t.Fatal(i)
  26. }
  27. b.setUint32(0, 0xBEBAFECA, littleEndian)
  28. i = b.getUint32(0, bigEndian)
  29. if i != 0xCAFEBABE {
  30. t.Fatal(i)
  31. }
  32. }
  33. func TestArrayBufferSetInt32(t *testing.T) {
  34. vm := New()
  35. b := vm._newArrayBuffer(vm.global.ArrayBufferPrototype, nil)
  36. b.data = make([]byte, 4)
  37. b.setInt32(0, -42, littleEndian)
  38. if v := b.getInt32(0, littleEndian); v != -42 {
  39. t.Fatal(v)
  40. }
  41. b.setInt32(0, -42, bigEndian)
  42. if v := b.getInt32(0, bigEndian); v != -42 {
  43. t.Fatal(v)
  44. }
  45. }
  46. func TestNewUint8Array(t *testing.T) {
  47. const SCRIPT = `
  48. var a = new Uint8Array(1);
  49. a[0] = 42;
  50. a.byteLength === 1 && a.length === 1 && a[0] === 42;
  51. `
  52. testScript(SCRIPT, valueTrue, t)
  53. }
  54. func TestNewUint16Array(t *testing.T) {
  55. const SCRIPT = `
  56. var a = new Uint16Array(1);
  57. a[0] = 42;
  58. a.byteLength === 2 && a.length === 1 && a[0] === 42;
  59. `
  60. testScript(SCRIPT, valueTrue, t)
  61. }
  62. func TestTypedArraysSpeciesConstructor(t *testing.T) {
  63. const SCRIPT = `
  64. 'use strict';
  65. function MyArray() {
  66. var NewTarget = this.__proto__.constructor;
  67. return Reflect.construct(Uint16Array, arguments, NewTarget);
  68. }
  69. MyArray.prototype = Object.create(Uint16Array.prototype, {
  70. constructor: {
  71. value: MyArray,
  72. writable: true,
  73. configurable: true
  74. }
  75. });
  76. var a = new MyArray(1);
  77. Object.defineProperty(MyArray, Symbol.species, {value: Uint8Array, configurable: true});
  78. a[0] = 32767;
  79. var b = a.filter(function() {
  80. return true;
  81. });
  82. if (a[0] !== 32767) {
  83. throw new Error("a[0]=" + a[0]);
  84. }
  85. if (!(b instanceof Uint8Array)) {
  86. throw new Error("b instanceof Uint8Array");
  87. }
  88. if (b[0] != 255) {
  89. throw new Error("b[0]=" + b[0]);
  90. }
  91. `
  92. testScript(SCRIPT, _undefined, t)
  93. }
  94. func TestTypedArrayFromArrayBuffer(t *testing.T) {
  95. const SCRIPT = `
  96. var buf = new ArrayBuffer(2);
  97. var a16 = new Uint16Array(buf);
  98. if (!(a16 instanceof Uint16Array)) {
  99. throw new Error("a16 is not an instance");
  100. }
  101. if (a16.buffer !== buf) {
  102. throw new Error("a16.buffer !== buf");
  103. }
  104. if (a16.length !== 1) {
  105. throw new Error("a16.length=" + a16.length);
  106. }
  107. var a8 = new Uint8Array(buf);
  108. a8.fill(0xAA);
  109. if (a16[0] !== 0xAAAA) {
  110. throw new Error("a16[0]=" + a16[0]);
  111. }
  112. `
  113. testScript(SCRIPT, _undefined, t)
  114. }
  115. func TestTypedArraySetOverlapDifSize(t *testing.T) {
  116. const SCRIPT = `
  117. var buf = new ArrayBuffer(4);
  118. var src = new Uint8Array(buf, 1, 2);
  119. src[0] = 1;
  120. src[1] = 2;
  121. var dst = new Uint16Array(buf);
  122. dst.set(src);
  123. if (dst[0] !== 1 || dst[1] !== 2) {
  124. throw new Error("dst: " + dst.join(","));
  125. }
  126. `
  127. testScript(SCRIPT, _undefined, t)
  128. }
  129. func TestTypedArraySetOverlapDifSize2(t *testing.T) {
  130. const SCRIPT = `
  131. var buf = new ArrayBuffer(4);
  132. var src = new Uint8Array(buf, 0, 2);
  133. src[0] = 1;
  134. src[1] = 2;
  135. var dst = new Uint16Array(buf);
  136. dst.set(src);
  137. if (dst[0] !== 1 || dst[1] !== 2) {
  138. throw new Error("dst: " + dst.join(","));
  139. }
  140. `
  141. testScript(SCRIPT, _undefined, t)
  142. }
  143. func TestTypedArraySetOverlapDifSize3(t *testing.T) {
  144. const SCRIPT = `
  145. var buf = new ArrayBuffer(8);
  146. var src = new Uint8Array(buf, 2, 4);
  147. src[0] = 1;
  148. src[1] = 2;
  149. src[2] = 3;
  150. src[3] = 4;
  151. var dst = new Uint16Array(buf);
  152. dst.set(src);
  153. if (dst[0] !== 1 || dst[1] !== 2 || dst[2] !== 3 || dst[3] !== 4) {
  154. throw new Error("dst: " + dst.join(","));
  155. }
  156. `
  157. testScript(SCRIPT, _undefined, t)
  158. }
  159. func TestTypedArraySetOverlapDifSize4(t *testing.T) {
  160. const SCRIPT = `
  161. var buf = new ArrayBuffer(10);
  162. var dst = new Uint8Array(buf, 2, 5);
  163. var src = new Uint16Array(buf);
  164. src[0] = 1;
  165. src[1] = 2;
  166. src[2] = 3;
  167. src[3] = 4;
  168. src[4] = 5;
  169. dst.set(src);
  170. if (dst[0] !== 1 || dst[1] !== 2 || dst[2] !== 3 || dst[3] !== 4 || dst[4] !== 5) {
  171. throw new Error("dst: " + dst.join(","));
  172. }
  173. `
  174. testScript(SCRIPT, _undefined, t)
  175. }
  176. func TestTypedArraySetNoOverlapDifSizeForward(t *testing.T) {
  177. const SCRIPT = `
  178. var buf = new ArrayBuffer(10);
  179. var dst = new Uint8Array(buf, 7, 2);
  180. var src = new Uint16Array(buf, 0, 2);
  181. src[0] = 1;
  182. src[1] = 2;
  183. dst.set(src);
  184. if (dst[0] !== 1 || dst[1] !== 2 || src[0] !== 1 || src[1] !== 2) {
  185. throw new Error("dst: " + dst.join(","));
  186. }
  187. `
  188. testScript(SCRIPT, _undefined, t)
  189. }
  190. func TestTypedArraySetNoOverlapDifSizeBackward(t *testing.T) {
  191. const SCRIPT = `
  192. var buf = new ArrayBuffer(10);
  193. var dst = new Uint8Array(buf, 0, 2);
  194. var src = new Uint16Array(buf, 6, 2);
  195. src[0] = 1;
  196. src[1] = 2;
  197. dst.set(src);
  198. if (dst[0] !== 1 || dst[1] !== 2 || src[0] !== 1 || src[1] !== 2) {
  199. throw new Error("dst: " + dst.join(","));
  200. }
  201. `
  202. testScript(SCRIPT, _undefined, t)
  203. }
  204. func TestTypedArraySetNoOverlapDifSizeDifBuffers(t *testing.T) {
  205. const SCRIPT = `
  206. var dstBuf = new ArrayBuffer(1024);
  207. var dst = new Uint8Array(dstBuf, 0, 2);
  208. var src = new Uint16Array(2);
  209. src[0] = 1;
  210. src[1] = 2;
  211. dst.set(src);
  212. if (dst[0] !== 1 || dst[1] !== 2 || src[0] !== 1 || src[1] !== 2) {
  213. throw new Error("dst: " + dst.join(","));
  214. }
  215. `
  216. testScript(SCRIPT, _undefined, t)
  217. }
  218. func TestTypedArraySliceSameType(t *testing.T) {
  219. const SCRIPT = `
  220. var src = Uint8Array.of(1,2,3,4);
  221. var dst = src.slice(1, 3);
  222. if (dst.length !== 2 || dst[0] !== 2 || dst[1] !== 3) {
  223. throw new Error("dst: " + dst.join(","));
  224. }
  225. `
  226. testScript(SCRIPT, _undefined, t)
  227. }
  228. func TestTypedArraySliceDifType(t *testing.T) {
  229. const SCRIPT = `
  230. var src = Uint8Array.of(1,2,3,4);
  231. Object.defineProperty(Uint8Array, Symbol.species, {value: Uint16Array, configurable: true});
  232. var dst = src.slice(1, 3);
  233. if (!(dst instanceof Uint16Array)) {
  234. throw new Error("wrong dst type: " + dst);
  235. }
  236. if (dst.length !== 2 || dst[0] !== 2 || dst[1] !== 3) {
  237. throw new Error("dst: " + dst.join(","));
  238. }
  239. `
  240. testScript(SCRIPT, _undefined, t)
  241. }
  242. func TestTypedArraySortComparatorReturnValueFloats(t *testing.T) {
  243. const SCRIPT = `
  244. var a = Float64Array.of(
  245. 5.97,
  246. 9.91,
  247. 4.13,
  248. 9.28,
  249. 3.29
  250. );
  251. a.sort( function(a, b) { return a - b; } );
  252. for (var i = 1; i < a.length; i++) {
  253. if (a[i] < a[i-1]) {
  254. throw new Error("Array is not sorted: " + a);
  255. }
  256. }
  257. `
  258. testScript(SCRIPT, _undefined, t)
  259. }
  260. func TestTypedArraySortComparatorReturnValueNegZero(t *testing.T) {
  261. const SCRIPT = `
  262. var a = new Uint8Array([2, 1]);
  263. a.sort( function(a, b) { return a > b ? 0 : -0; } );
  264. for (var i = 1; i < a.length; i++) {
  265. if (a[i] < a[i-1]) {
  266. throw new Error("Array is not sorted: " + a);
  267. }
  268. }
  269. `
  270. testScript(SCRIPT, _undefined, t)
  271. }
  272. func TestInt32ArrayNegativeIndex(t *testing.T) {
  273. const SCRIPT = `
  274. new Int32Array()[-1] === undefined;
  275. `
  276. testScript(SCRIPT, valueTrue, t)
  277. }
  278. func TestTypedArrayDeleteUnconfigurable(t *testing.T) {
  279. const SCRIPT = `
  280. try {
  281. (function() {
  282. 'use strict';
  283. delete Uint8Array.prototype.BYTES_PER_ELEMENT;
  284. })();
  285. } catch(e) {
  286. if (!(e instanceof TypeError)) {
  287. throw e;
  288. }
  289. if (!e.message.startsWith("Cannot delete property")) {
  290. throw e;
  291. }
  292. }
  293. `
  294. testScript(SCRIPT, _undefined, t)
  295. }