From: adamk@chromium.org Date: Wed, 19 Dec 2012 17:02:12 +0000 (+0000) Subject: Object.observe: test mutating an object via the API X-Git-Tag: upstream/4.7.83~15407 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=354fc4abe58c767861e5a66e18e495ddeb5de437;p=platform%2Fupstream%2Fv8.git Object.observe: test mutating an object via the API Review URL: https://codereview.chromium.org/11598014 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13246 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/test/cctest/test-object-observe.cc b/test/cctest/test-object-observe.cc index 25e5557..abd1011 100644 --- a/test/cctest/test-object-observe.cc +++ b/test/cctest/test-object-observe.cc @@ -278,3 +278,77 @@ TEST(GlobalObjectObservation) { } CHECK_EQ(3, CompileRun("records.length")->Int32Value()); } + +struct RecordExpectation { + Handle object; + const char* type; + const char* name; + Handle old_value; +}; + +// TODO(adamk): Use this helper elsewhere in this file. +static void ExpectRecords(Handle records, + const RecordExpectation expectations[], + int num) { + CHECK(records->IsArray()); + Handle recordArray = records.As(); + CHECK_EQ(num, static_cast(recordArray->Length())); + for (int i = 0; i < num; ++i) { + Handle record = recordArray->Get(i); + CHECK(record->IsObject()); + Handle recordObj = record.As(); + CHECK(expectations[i].object->StrictEquals( + recordObj->Get(String::New("object")))); + CHECK(String::New(expectations[i].type)->Equals( + recordObj->Get(String::New("type")))); + CHECK(String::New(expectations[i].name)->Equals( + recordObj->Get(String::New("name")))); + if (!expectations[i].old_value.IsEmpty()) { + CHECK(expectations[i].old_value->Equals( + recordObj->Get(String::New("oldValue")))); + } + } +} + +TEST(APITestBasicMutation) { + HarmonyIsolate isolate; + HandleScope scope; + LocalContext context; + Handle obj = Handle::Cast(CompileRun( + "var records = [];" + "var obj = {};" + "function observer(r) { [].push.apply(records, r); };" + "Object.observe(obj, observer);" + "obj")); + obj->Set(String::New("foo"), Number::New(1)); + obj->Set(1, Number::New(2)); + // ForceSet should work just as well as Set + obj->ForceSet(String::New("foo"), Number::New(3)); + obj->ForceSet(Number::New(1), Number::New(4)); + // Setting an indexed element via the property setting method + obj->Set(Number::New(1), Number::New(5)); + // Setting with a non-String, non-uint32 key + obj->Set(Number::New(1.1), Number::New(6), DontDelete); + obj->Delete(String::New("foo")); + obj->Delete(1); + obj->ForceDelete(Number::New(1.1)); + + // Force delivery + // TODO(adamk): Should the above set methods trigger delivery themselves? + CompileRun("void 0"); + CHECK_EQ(9, CompileRun("records.length")->Int32Value()); + const RecordExpectation expected_records[] = { + { obj, "new", "foo", Handle() }, + { obj, "new", "1", Handle() }, + { obj, "updated", "foo", Number::New(1) }, + { obj, "updated", "1", Number::New(2) }, + { obj, "updated", "1", Number::New(4) }, + { obj, "new", "1.1", Handle() }, + { obj, "deleted", "foo", Number::New(3) }, + { obj, "deleted", "1", Number::New(5) }, + { obj, "deleted", "1.1", Number::New(6) } + }; + ExpectRecords(CompileRun("records"), + expected_records, + ARRAY_SIZE(expected_records)); +}