Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(523)

Unified Diff: runtime/vm/debugger_api_impl_test.cc

Issue 9288071: Add debugger functions to inspect objects and classes (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« runtime/vm/debugger.cc ('K') | « runtime/vm/debugger_api_impl.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/debugger_api_impl_test.cc
===================================================================
--- runtime/vm/debugger_api_impl_test.cc (revision 3575)
+++ runtime/vm/debugger_api_impl_test.cc (working copy)
@@ -24,6 +24,15 @@
EXPECT(!Dart_IsError(handle));
+static Dart_Handle Invoke(Dart_Handle lib, const char* func_name) {
+ return Dart_InvokeStatic(lib,
+ Dart_NewString(""),
+ Dart_NewString(func_name),
+ 0,
+ NULL);
+}
+
+
void TestBreakpointHandler(Dart_Breakpoint bpt, Dart_StackTrace trace) {
const char* expected_trace[] = {"A.foo", "main"};
const intptr_t expected_trace_length = 2;
@@ -73,11 +82,7 @@
EXPECT_NOT_ERROR(res);
breakpoint_hit = false;
- Dart_Handle retval = Dart_InvokeStatic(lib,
- Dart_NewString(""),
- Dart_NewString("main"),
- 0,
- NULL);
+ Dart_Handle retval = Invoke(lib, "main");
EXPECT(!Dart_IsError(retval));
EXPECT(breakpoint_hit == true);
}
@@ -144,16 +149,128 @@
// breakpoint is removed by the handler, so we expect the breakpoint
// to fire twice only.
breakpoint_hit_counter = 0;
- Dart_Handle retval = Dart_InvokeStatic(lib,
- Dart_NewString(""),
- Dart_NewString("main"),
- 0,
- NULL);
+ Dart_Handle retval = Invoke(lib, "main");
EXPECT(!Dart_IsError(retval));
EXPECT(breakpoint_hit_counter == 2);
}
+TEST_CASE(Debug_InspectObject) {
+ const char* kScriptChars =
+ " class A { \n"
+ " int a_field = 'a'; \n"
+ " static var bla = 'yada yada yada';\n"
+ " var d = 42.1; \n"
+ " } \n"
+ " class B extends A { \n"
+ " var oneDay = const Duration(hours: 24); \n"
+ " static var bla = 'blah blah'; \n"
+ " } \n"
+ " get_b() { return new B(); } \n"
+ " get_int() { return 666; } \n";
+
+ // Number of instance fields in an object of class B.
+ const intptr_t kNumObjectFields = 3;
+
+ Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+ EXPECT_NOT_ERROR(lib);
+
+ Dart_Handle script_url = Dart_NewString(TestCase::url());
+ Dart_Handle line_no = Dart_NewInteger(4); // In function 'foo'.
+
+ Dart_Handle object_b = Invoke(lib, "get_b");
+
+ EXPECT_NOT_ERROR(object_b);
+
+ Dart_Handle fields = Dart_GetInstanceFields(object_b);
+ EXPECT_NOT_ERROR(fields);
+ EXPECT(Dart_IsList(fields));
+ intptr_t list_length = 0;
+ Dart_Handle retval = Dart_ListLength(fields, &list_length);
+ EXPECT_NOT_ERROR(retval);
+ EXPECT_EQ(2 * kNumObjectFields, list_length);
+ printf("Object has %d fields:\n", list_length / 2);
+ for (int i = 0; i + 1 < list_length; i += 2) {
+ Dart_Handle name_handle = Dart_ListGetAt(fields, i);
+ EXPECT_NOT_ERROR(name_handle);
+ EXPECT(Dart_IsString(name_handle));
+ char const* name;
+ Dart_StringToCString(name_handle, &name);
+ Dart_Handle value_handle = Dart_ListGetAt(fields, i + 1);
+ EXPECT_NOT_ERROR(value_handle);
+ value_handle = Dart_ToString(value_handle);
+ EXPECT_NOT_ERROR(value_handle);
+ EXPECT(Dart_IsString(value_handle));
+ char const* value;
+ Dart_StringToCString(value_handle, &value);
+ printf(" %s: %s\n", name, value);
+ }
+
+ // Check that an integer value returns an empty list of fields.
+ Dart_Handle triple_six = Invoke(lib, "get_int");
+ EXPECT_NOT_ERROR(triple_six);
+ EXPECT(Dart_IsInteger(triple_six));
+ int64_t int_value = 0;
+ Dart_IntegerToInt64(triple_six, &int_value);
+ EXPECT_EQ(666, int_value);
+ fields = Dart_GetInstanceFields(triple_six);
+ EXPECT_NOT_ERROR(fields);
+ EXPECT(Dart_IsList(fields));
+ retval = Dart_ListLength(fields, &list_length);
+ EXPECT_EQ(0, list_length);
+
+ // Check static field of class B (one field named 'bla')
+ Dart_Handle class_B = Dart_GetObjClass(object_b);
+ EXPECT_NOT_ERROR(class_B);
+ EXPECT(!Dart_IsNull(class_B));
+ fields = Dart_GetStaticFields(class_B);
+ EXPECT_NOT_ERROR(fields);
+ EXPECT(Dart_IsList(fields));
+ list_length = 0;
+ retval = Dart_ListLength(fields, &list_length);
+ EXPECT_NOT_ERROR(retval);
+ EXPECT_EQ(2, list_length);
+ Dart_Handle name_handle = Dart_ListGetAt(fields, 0);
+ EXPECT_NOT_ERROR(name_handle);
+ EXPECT(Dart_IsString(name_handle));
+ char const* name;
+ Dart_StringToCString(name_handle, &name);
+ EXPECT_STREQ("bla", name);
+ Dart_Handle value_handle = Dart_ListGetAt(fields, 1);
+ EXPECT_NOT_ERROR(value_handle);
+ value_handle = Dart_ToString(value_handle);
+ EXPECT_NOT_ERROR(value_handle);
+ EXPECT(Dart_IsString(value_handle));
+ char const* value;
+ Dart_StringToCString(value_handle, &value);
+ EXPECT_STREQ("blah blah", value);
+
+ // Check static field of B's superclass (one field named 'bla')
+ Dart_Handle class_A = Dart_GetSuperclass(class_B);
+ EXPECT_NOT_ERROR(class_A);
+ EXPECT(!Dart_IsNull(class_A));
+ fields = Dart_GetStaticFields(class_A);
+ EXPECT_NOT_ERROR(fields);
+ EXPECT(Dart_IsList(fields));
+ list_length = 0;
+ retval = Dart_ListLength(fields, &list_length);
+ EXPECT_NOT_ERROR(retval);
+ EXPECT_EQ(2, list_length);
+ name_handle = Dart_ListGetAt(fields, 0);
+ EXPECT_NOT_ERROR(name_handle);
+ EXPECT(Dart_IsString(name_handle));
+ Dart_StringToCString(name_handle, &name);
+ EXPECT_STREQ("bla", name);
+ value_handle = Dart_ListGetAt(fields, 1);
+ EXPECT_NOT_ERROR(value_handle);
+ value_handle = Dart_ToString(value_handle);
+ EXPECT_NOT_ERROR(value_handle);
+ EXPECT(Dart_IsString(value_handle));
+ Dart_StringToCString(value_handle, &value);
+ EXPECT_STREQ("yada yada yada", value);
+}
+
+
TEST_CASE(Debug_LookupSourceLine) {
const char* kScriptChars =
/*1*/ "class A {\n"
« runtime/vm/debugger.cc ('K') | « runtime/vm/debugger_api_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698