123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- package goja
- import (
- "fmt"
- "strings"
- "testing"
- )
- func TestSetEvilIterator(t *testing.T) {
- const SCRIPT = `
- var o = {};
- o[Symbol.iterator] = function() {
- return {
- next: function() {
- if (!this.flag) {
- this.flag = true;
- return {};
- }
- return {done: true};
- }
- }
- }
- new Set(o);
- undefined;
- `
- testScript(SCRIPT, _undefined, t)
- }
- func ExampleRuntime_ExportTo_setToMap() {
- vm := New()
- s, err := vm.RunString(`
- new Set([1, 2, 3])
- `)
- if err != nil {
- panic(err)
- }
- m := make(map[int]struct{})
- err = vm.ExportTo(s, &m)
- if err != nil {
- panic(err)
- }
- fmt.Println(m)
- // Output: map[1:{} 2:{} 3:{}]
- }
- func ExampleRuntime_ExportTo_setToSlice() {
- vm := New()
- s, err := vm.RunString(`
- new Set([1, 2, 3])
- `)
- if err != nil {
- panic(err)
- }
- var a []int
- err = vm.ExportTo(s, &a)
- if err != nil {
- panic(err)
- }
- fmt.Println(a)
- // Output: [1 2 3]
- }
- func TestSetExportToSliceCircular(t *testing.T) {
- vm := New()
- s, err := vm.RunString(`
- let s = new Set();
- s.add(s);
- s;
- `)
- if err != nil {
- t.Fatal(err)
- }
- var a []Value
- err = vm.ExportTo(s, &a)
- if err != nil {
- t.Fatal(err)
- }
- if len(a) != 1 {
- t.Fatalf("len: %d", len(a))
- }
- if a[0] != s {
- t.Fatalf("a: %v", a)
- }
- }
- func TestSetExportToArrayMismatchedLengths(t *testing.T) {
- vm := New()
- s, err := vm.RunString(`
- new Set([1, 2])
- `)
- if err != nil {
- panic(err)
- }
- var s1 [3]int
- err = vm.ExportTo(s, &s1)
- if err == nil {
- t.Fatal("expected error")
- }
- if msg := err.Error(); !strings.Contains(msg, "lengths mismatch") {
- t.Fatalf("unexpected error: %v", err)
- }
- }
- func TestSetExportToNilMap(t *testing.T) {
- vm := New()
- var m map[int]interface{}
- res, err := vm.RunString("new Set([1])")
- if err != nil {
- t.Fatal(err)
- }
- err = vm.ExportTo(res, &m)
- if err != nil {
- t.Fatal(err)
- }
- if len(m) != 1 {
- t.Fatal(m)
- }
- if _, exists := m[1]; !exists {
- t.Fatal(m)
- }
- }
- func TestSetExportToNonNilMap(t *testing.T) {
- vm := New()
- m := map[int]interface{}{
- 2: true,
- }
- res, err := vm.RunString("new Set([1])")
- if err != nil {
- t.Fatal(err)
- }
- err = vm.ExportTo(res, &m)
- if err != nil {
- t.Fatal(err)
- }
- if len(m) != 1 {
- t.Fatal(m)
- }
- if _, exists := m[1]; !exists {
- t.Fatal(m)
- }
- }
- func TestSetGetAdderGetIteratorOrder(t *testing.T) {
- const SCRIPT = `
- let getterCalled = 0;
- class S extends Set {
- get add() {
- getterCalled++;
- return null;
- }
- }
- let getIteratorCalled = 0;
- let iterable = {};
- iterable[Symbol.iterator] = () => {
- getIteratorCalled++
- return {
- next: 1
- };
- }
- let thrown = false;
- try {
- new S(iterable);
- } catch (e) {
- if (e instanceof TypeError) {
- thrown = true;
- } else {
- throw e;
- }
- }
- thrown && getterCalled === 1 && getIteratorCalled === 0;
- `
- testScript(SCRIPT, valueTrue, t)
- }
|