BackwardsGraph needs to consider back edges as the backward's root successor
[WebKit-https.git] / JSTests / es6 / destructuring_assignment_computed_properties.js
1 function test() {
2     var steps = [];
3     var backingStore = {};
4
5     function storeProperty(name, value) {
6         steps.push(`store: ${name} = ${value}`);
7         backingStore[name] = value;
8     }
9
10     function computeName(name) {
11         steps.push(`compute: ${name}`);
12         return name;
13     }
14
15     function loadValue(name, value) {
16         steps.push(`load: ${name} > ${value}`);
17         return value;
18     }
19
20     var out = {
21         get a() { return backingStore.a; },
22         set a(v) { storeProperty("a", v); },
23         get b() { return backingStore.b; },
24         set b(v) { storeProperty("b", v); },
25         get c() { return backingStore.c; },
26         set c(v) { storeProperty("c", v); },
27         get d() { return backingStore.d; },
28         set d(v) { storeProperty("d", v); }
29     };
30     ({
31         [computeName("propA")]: out.a,
32         [computeName("propB")]: out.b,
33         [computeName("propC")]: [...out["c"]],
34         [computeName("propD")]: out.d = "default"
35     } = {
36         get propA() { return loadValue("propA", "hello"); },
37         get propB() { return loadValue("propB", "world"); },
38         get propC() { return loadValue("propC", [1, 2, 3]); },
39         get propD() { return loadValue("propD"); }
40     });
41
42     var expectedSteps = [
43         "compute: propA",
44         "load: propA > hello",
45         "store: a = hello",
46
47         "compute: propB",
48         "load: propB > world",
49         "store: b = world",
50
51         "compute: propC",
52         "load: propC > 1,2,3",
53         "store: c = 1,2,3",
54
55         "compute: propD",
56         "load: propD > undefined",
57         "store: d = default"
58     ];
59
60     if (expectedSteps.length !== steps.length)
61         return false;
62     for (var i = 0; i < expectedSteps.length; ++i)
63         if (expectedSteps[i] !== steps[i])
64             return false;
65     if (`${backingStore.a} ${backingStore.b} ${backingStore.c.join(":")}` !== "hello world 1:2:3")
66         return false;
67
68     return true;
69 }
70
71 if (!test())
72     throw new Error("Test failed");