Chromium Code Reviews| Index: test/cctest/test-object-observe.cc |
| diff --git a/test/cctest/test-object-observe.cc b/test/cctest/test-object-observe.cc |
| index 7e0eb47493ac26c9180a3bb8958d595b4291932e..1172235dc5c50f8acf85db5ff93b14937239a2d9 100644 |
| --- a/test/cctest/test-object-observe.cc |
| +++ b/test/cctest/test-object-observe.cc |
| @@ -60,25 +60,106 @@ TEST(PerIsolateState) { |
| "var calls = 0;" |
| "var observer = function(records) { count = records.length; calls++ };" |
| "var obj = {};" |
| - "Object.observe(obj, observer);" |
| - "Object.notify(obj, {type: 'a'});"); |
| + "Object.observe(obj, observer);"); |
| Handle<Value> observer = CompileRun("observer"); |
| Handle<Value> obj = CompileRun("obj"); |
| + Handle<Value> notify_fun1 = CompileRun( |
| + "(function() { Object.notify(obj, {type: 'a'}); })"); |
| + Handle<Value> notify_fun2; |
| { |
| LocalContext context2; |
| context2->Global()->Set(String::New("obj"), obj); |
| - CompileRun("Object.notify(obj, {type: 'b'});"); |
| + notify_fun2 = CompileRun( |
| + "(function() { Object.notify(obj, {type: 'b'}); })"); |
| } |
| + Handle<Value> notify_fun3; |
| { |
| LocalContext context3; |
| context3->Global()->Set(String::New("obj"), obj); |
| - CompileRun("Object.notify(obj, {type: 'c'});"); |
| + notify_fun3 = CompileRun( |
| + "(function() { Object.notify(obj, {type: 'c'}); })"); |
| } |
| { |
| LocalContext context4; |
| context4->Global()->Set(String::New("observer"), observer); |
| - CompileRun("Object.deliverChangeRecords(observer)"); |
| + context4->Global()->Set(String::New("fun1"), notify_fun1); |
| + context4->Global()->Set(String::New("fun2"), notify_fun2); |
| + context4->Global()->Set(String::New("fun3"), notify_fun3); |
| + CompileRun("fun1(); fun2(); fun3(); Object.deliverChangeRecords(observer)"); |
| } |
| CHECK_EQ(1, CompileRun("calls")->Int32Value()); |
| CHECK_EQ(3, CompileRun("count")->Int32Value()); |
| } |
| + |
| +TEST(EndOfMicrotaskDelivery) { |
| + HarmonyIsolate isolate; |
| + HandleScope scope; |
| + LocalContext context; |
| + CompileRun( |
| + "var obj = {};" |
| + "var count = 0;" |
| + "var observer = function(records) { count = records.length };" |
| + "Object.observe(obj, observer);" |
| + "Object.notify(obj, {type: 'a'});"); |
| + CHECK_EQ(1, CompileRun("count")->Int32Value()); |
| +} |
| + |
| +TEST(DeliveryOrdering) { |
| + HarmonyIsolate isolate; |
| + HandleScope scope; |
| + LocalContext context; |
| + CompileRun( |
| + "var obj1 = {};" |
| + "var obj2 = {};" |
| + "var ordering = [];" |
| + "function observer2() { ordering.push(2); };" |
| + "function observer1() { ordering.push(1); };" |
| + "function observer3() { ordering.push(3); };" |
| + "Object.observe(obj1, observer1);" |
| + "Object.observe(obj1, observer2);" |
| + "Object.observe(obj1, observer3);" |
| + "Object.notify(obj1, {type: 'a'});"); |
| + CHECK_EQ(3, CompileRun("ordering.length")->Int32Value()); |
| + CHECK_EQ(1, CompileRun("ordering[0]")->Int32Value()); |
| + CHECK_EQ(2, CompileRun("ordering[1]")->Int32Value()); |
| + CHECK_EQ(3, CompileRun("ordering[2]")->Int32Value()); |
| + CompileRun( |
| + "ordering = [];" |
| + "Object.observe(obj2, observer3);" |
| + "Object.observe(obj2, observer2);" |
| + "Object.observe(obj2, observer1);" |
| + "Object.notify(obj2, {type: 'b'});"); |
| + CHECK_EQ(3, CompileRun("ordering.length")->Int32Value()); |
| + CHECK_EQ(1, CompileRun("ordering[0]")->Int32Value()); |
| + CHECK_EQ(2, CompileRun("ordering[1]")->Int32Value()); |
| + CHECK_EQ(3, CompileRun("ordering[2]")->Int32Value()); |
| +} |
| + |
| +TEST(DeliveryOrderingReentrant) { |
| + HarmonyIsolate isolate; |
| + HandleScope scope; |
| + LocalContext context; |
| + CompileRun( |
| + "var obj = {};" |
| + "var reentered = false;" |
| + "var ordering = [];" |
| + "function observer1() { ordering.push(1); };" |
| + "function observer2() {" |
| + " if (!reentered) {" |
| + " Object.notify(obj, {type: 'b'});" |
| + " reentered = true;" |
| + " }" |
| + " ordering.push(2);" |
| + "};" |
| + "function observer3() { ordering.push(3); };" |
|
rafaelw
2012/11/06 17:04:41
maybe a comment noting that observer3 gets deliver
|
| + "Object.observe(obj, observer1);" |
| + "Object.observe(obj, observer2);" |
| + "Object.observe(obj, observer3);" |
| + "Object.notify(obj, {type: 'a'});"); |
| + CHECK_EQ(5, CompileRun("ordering.length")->Int32Value()); |
| + CHECK_EQ(1, CompileRun("ordering[0]")->Int32Value()); |
| + CHECK_EQ(2, CompileRun("ordering[1]")->Int32Value()); |
| + CHECK_EQ(3, CompileRun("ordering[2]")->Int32Value()); |
| + CHECK_EQ(1, CompileRun("ordering[3]")->Int32Value()); |
| + CHECK_EQ(2, CompileRun("ordering[1]")->Int32Value()); |
| +} |