1// Copyright 2014 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Flags: --expose-debug-as debug --expose-gc
6
7function testMapMirror(mirror) {
8  // Create JSON representation.
9  var serializer = debug.MakeMirrorSerializer();
10  var json = JSON.stringify(serializer.serializeValue(mirror));
11
12  // Check the mirror hierachy.
13  assertTrue(mirror instanceof debug.Mirror);
14  assertTrue(mirror instanceof debug.ValueMirror);
15  assertTrue(mirror instanceof debug.ObjectMirror);
16  assertTrue(mirror instanceof debug.MapMirror);
17
18  assertTrue(mirror.isMap());
19
20  // Parse JSON representation and check.
21  var fromJSON = eval('(' + json + ')');
22  assertEquals('map', fromJSON.type);
23}
24
25function testSetMirror(mirror) {
26  // Create JSON representation.
27  var serializer = debug.MakeMirrorSerializer();
28  var json = JSON.stringify(serializer.serializeValue(mirror));
29
30  // Check the mirror hierachy.
31  assertTrue(mirror instanceof debug.Mirror);
32  assertTrue(mirror instanceof debug.ValueMirror);
33  assertTrue(mirror instanceof debug.ObjectMirror);
34  assertTrue(mirror instanceof debug.SetMirror);
35
36  assertTrue(mirror.isSet());
37
38  // Parse JSON representation and check.
39  var fromJSON = eval('(' + json + ')');
40  assertEquals('set', fromJSON.type);
41}
42
43var o1 = new Object();
44var o2 = new Object();
45var o3 = new Object();
46
47// Test the mirror object for Maps
48var map = new Map();
49map.set(o1, 11);
50map.set(o2, 22);
51map.delete(o1);
52var mapMirror = debug.MakeMirror(map);
53testMapMirror(mapMirror);
54var entries = mapMirror.entries();
55assertEquals(1, entries.length);
56assertSame(o2, entries[0].key);
57assertEquals(22, entries[0].value);
58map.set(o1, 33);
59map.set(o3, o2);
60map.delete(o2);
61map.set(undefined, 44);
62entries = mapMirror.entries();
63assertEquals(3, entries.length);
64assertSame(o1, entries[0].key);
65assertEquals(33, entries[0].value);
66assertSame(o3, entries[1].key);
67assertSame(o2, entries[1].value);
68assertEquals(undefined, entries[2].key);
69assertEquals(44, entries[2].value);
70
71// Test the mirror object for Sets
72var set = new Set();
73set.add(o1);
74set.add(o2);
75set.delete(o1);
76set.add(undefined);
77var setMirror = debug.MakeMirror(set);
78testSetMirror(setMirror);
79var values = setMirror.values();
80assertEquals(2, values.length);
81assertSame(o2, values[0]);
82assertEquals(undefined, values[1]);
83
84// Test the mirror object for WeakMaps
85var weakMap = new WeakMap();
86weakMap.set(o1, 11);
87weakMap.set(new Object(), 22);
88weakMap.set(o3, 33);
89weakMap.set(new Object(), 44);
90var weakMapMirror = debug.MakeMirror(weakMap);
91testMapMirror(weakMapMirror);
92weakMap.set(new Object(), 55);
93assertTrue(weakMapMirror.entries().length <= 5);
94gc();
95
96function testWeakMapEntries(weakMapMirror) {
97  var entries = weakMapMirror.entries();
98  assertEquals(2, entries.length);
99  var found = 0;
100  for (var i = 0; i < entries.length; i++) {
101    if (Object.is(entries[i].key, o1)) {
102      assertEquals(11, entries[i].value);
103      found++;
104    }
105    if (Object.is(entries[i].key, o3)) {
106      assertEquals(33, entries[i].value);
107      found++;
108    }
109  }
110  assertEquals(2, found);
111}
112
113testWeakMapEntries(weakMapMirror);
114
115// Test the mirror object for WeakSets
116var weakSet = new WeakSet();
117weakSet.add(o1);
118weakSet.add(new Object());
119weakSet.add(o2);
120weakSet.add(new Object());
121weakSet.add(new Object());
122weakSet.add(o3);
123weakSet.delete(o2);
124var weakSetMirror = debug.MakeMirror(weakSet);
125testSetMirror(weakSetMirror);
126assertTrue(weakSetMirror.values().length <= 5);
127gc();
128
129function testWeakSetValues(weakSetMirror) {
130  var values = weakSetMirror.values();
131  assertEquals(2, values.length);
132  var found = 0;
133  for (var i = 0; i < values.length; i++) {
134    if (Object.is(values[i], o1)) {
135      found++;
136    }
137    if (Object.is(values[i], o3)) {
138      found++;
139    }
140  }
141  assertEquals(2, found);
142}
143
144testWeakSetValues(weakSetMirror);
145