builtin_map_test.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package goja
  2. import (
  3. "hash/maphash"
  4. "testing"
  5. )
  6. func TestMapEvilIterator(t *testing.T) {
  7. const SCRIPT = `
  8. 'use strict';
  9. var o = {};
  10. function Iter(value) {
  11. this.value = value;
  12. this.idx = 0;
  13. }
  14. Iter.prototype.next = function() {
  15. var idx = this.idx;
  16. if (idx === 0) {
  17. this.idx++;
  18. return this.value;
  19. }
  20. return {done: true};
  21. }
  22. o[Symbol.iterator] = function() {
  23. return new Iter({});
  24. }
  25. assert.throws(TypeError, function() {
  26. new Map(o);
  27. });
  28. o[Symbol.iterator] = function() {
  29. return new Iter({value: []});
  30. }
  31. function t(prefix) {
  32. var m = new Map(o);
  33. assert.sameValue(1, m.size, prefix+": m.size");
  34. assert.sameValue(true, m.has(undefined), prefix+": m.has(undefined)");
  35. assert.sameValue(undefined, m.get(undefined), prefix+": m.get(undefined)");
  36. }
  37. t("standard adder");
  38. var count = 0;
  39. var origSet = Map.prototype.set;
  40. Map.prototype.set = function() {
  41. count++;
  42. origSet.apply(this, arguments);
  43. }
  44. t("custom adder");
  45. assert.sameValue(1, count, "count");
  46. undefined;
  47. `
  48. testScript1(TESTLIB+SCRIPT, _undefined, t)
  49. }
  50. func BenchmarkMapDelete(b *testing.B) {
  51. var key1 Value = asciiString("a")
  52. var key2 Value = asciiString("b")
  53. one := intToValue(1)
  54. two := intToValue(2)
  55. for i := 0; i < b.N; i++ {
  56. m := newOrderedMap(&maphash.Hash{})
  57. m.set(key1, one)
  58. m.set(key2, two)
  59. if !m.remove(key1) {
  60. b.Fatal("remove() returned false")
  61. }
  62. }
  63. }
  64. func BenchmarkMapDeleteJS(b *testing.B) {
  65. prg, err := Compile("test.js", `
  66. var m = new Map([['a',1], ['b', 2]]);
  67. var result = m.delete('a');
  68. if (!result || m.size !== 1) {
  69. throw new Error("Fail!");
  70. }
  71. `,
  72. false)
  73. if err != nil {
  74. b.Fatal(err)
  75. }
  76. b.ResetTimer()
  77. for i := 0; i < b.N; i++ {
  78. vm := New()
  79. _, err := vm.RunProgram(prg)
  80. if err != nil {
  81. b.Fatal(err)
  82. }
  83. }
  84. }