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

Unified Diff: runtime/vm/dart_api_impl_test.cc

Issue 10687004: Implement method and variable reflection in dart:mirrors. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 5 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
« no previous file with comments | « runtime/vm/dart_api_impl.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/dart_api_impl_test.cc
===================================================================
--- runtime/vm/dart_api_impl_test.cc (revision 9490)
+++ runtime/vm/dart_api_impl_test.cc (working copy)
@@ -4,6 +4,7 @@
#include "include/dart_api.h"
#include "platform/assert.h"
+#include "platform/json.h"
#include "platform/utils.h"
#include "vm/class_finalizer.h"
#include "vm/dart_api_impl.h"
@@ -3917,6 +3918,456 @@
}
+static void BuildFunctionDescription(TextBuffer* buffer, Dart_Handle func) {
+ buffer->Clear();
+ if (Dart_IsNull(func)) {
+ WARN("Function not found");
+ return;
+ }
+ Dart_Handle name = Dart_FunctionName(func);
+ EXPECT_VALID(name);
+ const char* name_cstr = "";
+ EXPECT_VALID(Dart_StringToCString(name, &name_cstr));
+ bool is_abstract = false;
+ bool is_static = false;
+ bool is_getter = false;
+ bool is_setter = false;
+ bool is_constructor = false;
+ EXPECT_VALID(Dart_FunctionIsAbstract(func, &is_abstract));
+ EXPECT_VALID(Dart_FunctionIsStatic(func, &is_static));
+ EXPECT_VALID(Dart_FunctionIsGetter(func, &is_getter));
+ EXPECT_VALID(Dart_FunctionIsSetter(func, &is_setter));
+ EXPECT_VALID(Dart_FunctionIsConstructor(func, &is_constructor));
+ buffer->Printf("%s", name_cstr);
+ if (is_abstract) {
+ buffer->Printf(" abstract");
+ }
+ if (is_static) {
+ buffer->Printf(" static");
+ }
+ if (is_getter) {
+ buffer->Printf(" getter");
+ }
+ if (is_setter) {
+ buffer->Printf(" setter");
+ }
+ if (is_constructor) {
+ buffer->Printf(" constructor");
+ }
+}
+
+
+TEST_CASE(FunctionReflection) {
+ const char* kScriptChars =
+ "a() => 'a';\n"
+ "_b() => '_b';\n"
+ "get c() => 'bar';\n"
+ "set d(x) {}\n"
+ "get _e() => 'bar';\n"
+ "set _f(x) {}\n"
+ "class MyClass {\n"
+ " MyClass() {}\n"
+ " MyClass.named() {}\n"
+ " a() => 'a';\n"
+ " _b() => '_b';\n"
+ " get c() => 'bar';\n"
+ " set d(x) {}\n"
+ " get _e() => 'bar';\n"
+ " set _f(x) {}\n"
+ " static g() => 'g';\n"
+ " static _h() => '_h';\n"
+ " static get i() => 'i';\n"
+ " static set j(x) {}\n"
+ " static get _k() => 'k';\n"
+ " static set _l(x) {}\n"
+ " abstract m();\n"
+ " abstract _n();\n"
+ " abstract get o();\n"
+ " abstract set p(x);\n"
+ " abstract get _q();\n"
+ " abstract set _r(x);\n"
+ " operator ==(x) {}\n"
+ "}\n"
+ "class _PrivateClass {\n"
+ " _PrivateClass() {}\n"
+ " _PrivateClass.named() {}\n"
+ "}\n";
+
+ Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+ EXPECT_VALID(lib);
+ Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("MyClass"));
+ EXPECT_VALID(cls);
+ Dart_Handle private_cls = Dart_GetClass(lib, Dart_NewString("_PrivateClass"));
+ EXPECT_VALID(private_cls);
+ TextBuffer buffer(128);
+
+ // Lookup a top-level function.
+ Dart_Handle func = Dart_LookupFunction(lib, Dart_NewString("a"));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("a static", buffer.buf());
+
+ // Lookup a private top-level function.
+ func = Dart_LookupFunction(lib, Dart_NewString("_b"));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("_b static", buffer.buf());
+
+ // Lookup a top-level getter.
+ func = Dart_LookupFunction(lib, Dart_NewString("c"));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("c static getter", buffer.buf());
+
+ // Lookup a top-level setter.
+ func = Dart_LookupFunction(lib, Dart_NewString("d="));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("d= static setter", buffer.buf());
+
+ // Lookup a private top-level getter.
+ func = Dart_LookupFunction(lib, Dart_NewString("_e"));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("_e static getter", buffer.buf());
+
+ // Lookup a private top-level setter.
+ func = Dart_LookupFunction(lib, Dart_NewString("_f="));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("_f= static setter", buffer.buf());
+
+ // Lookup an unnamed constructor
+ func = Dart_LookupFunction(cls, Dart_NewString("MyClass"));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("MyClass constructor", buffer.buf());
+
+ // Lookup a named constructor
+ func = Dart_LookupFunction(cls, Dart_NewString("MyClass.named"));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("MyClass.named constructor", buffer.buf());
+
+ // Lookup an private unnamed constructor
+ func = Dart_LookupFunction(private_cls, Dart_NewString("_PrivateClass"));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("_PrivateClass constructor", buffer.buf());
+
+ // Lookup a private named constructor
+ func = Dart_LookupFunction(private_cls,
+ Dart_NewString("_PrivateClass.named"));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("_PrivateClass.named constructor", buffer.buf());
+
+ // Lookup a method.
+ func = Dart_LookupFunction(cls, Dart_NewString("a"));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("a", buffer.buf());
+
+ // Lookup a private method.
+ func = Dart_LookupFunction(cls, Dart_NewString("_b"));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("_b", buffer.buf());
+
+ // Lookup a instance getter.
+ func = Dart_LookupFunction(cls, Dart_NewString("c"));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("c getter", buffer.buf());
+
+ // Lookup a instance setter.
+ func = Dart_LookupFunction(cls, Dart_NewString("d="));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("d= setter", buffer.buf());
+
+ // Lookup a private instance getter.
+ func = Dart_LookupFunction(cls, Dart_NewString("_e"));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("_e getter", buffer.buf());
+
+ // Lookup a private instance setter.
+ func = Dart_LookupFunction(cls, Dart_NewString("_f="));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("_f= setter", buffer.buf());
+
+ // Lookup a static method.
+ func = Dart_LookupFunction(cls, Dart_NewString("g"));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("g static", buffer.buf());
+
+ // Lookup a private static method.
+ func = Dart_LookupFunction(cls, Dart_NewString("_h"));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("_h static", buffer.buf());
+
+ // Lookup a static getter.
+ func = Dart_LookupFunction(cls, Dart_NewString("i"));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("i static getter", buffer.buf());
+
+ // Lookup a static setter.
+ func = Dart_LookupFunction(cls, Dart_NewString("j="));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("j= static setter", buffer.buf());
+
+ // Lookup a private static getter.
+ func = Dart_LookupFunction(cls, Dart_NewString("_k"));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("_k static getter", buffer.buf());
+
+ // Lookup a private static setter.
+ func = Dart_LookupFunction(cls, Dart_NewString("_l="));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("_l= static setter", buffer.buf());
+
+ // Lookup an abstract method.
+ func = Dart_LookupFunction(cls, Dart_NewString("m"));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("m abstract", buffer.buf());
+
+ // Lookup a private abstract method.
+ func = Dart_LookupFunction(cls, Dart_NewString("_n"));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("_n abstract", buffer.buf());
+
+ // Lookup a abstract getter.
+ func = Dart_LookupFunction(cls, Dart_NewString("o"));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("o abstract getter", buffer.buf());
+
+ // Lookup a abstract setter.
+ func = Dart_LookupFunction(cls, Dart_NewString("p="));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("p= abstract setter", buffer.buf());
+
+ // Lookup a private abstract getter.
+ func = Dart_LookupFunction(cls, Dart_NewString("_q"));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("_q abstract getter", buffer.buf());
+
+ // Lookup a private abstract setter.
+ func = Dart_LookupFunction(cls, Dart_NewString("_r="));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("_r= abstract setter", buffer.buf());
+
+ // Lookup an operator
+ func = Dart_LookupFunction(cls, Dart_NewString("=="));
+ EXPECT_VALID(func);
+ EXPECT(Dart_IsFunction(func));
+ BuildFunctionDescription(&buffer, func);
+ EXPECT_STREQ("==", buffer.buf());
+
+ // Lookup a function that does not exist from a library.
+ func = Dart_LookupFunction(lib, Dart_NewString("DoesNotExist"));
+ EXPECT(Dart_IsNull(func));
+
+ // Lookup a function that does not exist from a class.
+ func = Dart_LookupFunction(cls, Dart_NewString("DoesNotExist"));
+ EXPECT(Dart_IsNull(func));
+
+ // Lookup a class using an error class name. The error propagates.
+ func = Dart_LookupFunction(cls, Api::NewError("myerror"));
+ EXPECT_ERROR(func, "myerror");
+
+ // Lookup a class from an error library. The error propagates.
+ func = Dart_LookupFunction(Api::NewError("myerror"), Dart_NewString("foo"));
+ EXPECT_ERROR(func, "myerror");
+}
+
+
+static void BuildVariableDescription(TextBuffer* buffer, Dart_Handle var) {
+ buffer->Clear();
+ Dart_Handle name = Dart_VariableName(var);
+ EXPECT_VALID(name);
+ const char* name_cstr = "";
+ EXPECT_VALID(Dart_StringToCString(name, &name_cstr));
+ bool is_static = false;
+ bool is_final = false;
+ EXPECT_VALID(Dart_VariableIsStatic(var, &is_static));
+ EXPECT_VALID(Dart_VariableIsFinal(var, &is_final));
+ buffer->Printf("%s", name_cstr);
+ if (is_static) {
+ buffer->Printf(" static");
+ }
+ if (is_final) {
+ buffer->Printf(" final");
+ }
+}
+
+
+TEST_CASE(VariableReflection) {
+ const char* kScriptChars =
+ "var a = 'a';\n"
+ "var _b = '_b';\n"
+ "final c = 'c';\n"
+ "final _d = '_d';\n"
+ "class MyClass {\n"
+ " var a = 'a';\n"
+ " var _b = '_b';\n"
+ " final c = 'c';\n"
+ " final _d = '_d';\n"
+ " static var e = 'e';\n"
+ " static var _f = '_f';\n"
+ " static final g = 'g';\n"
+ " static final _h = '_h';\n"
+ "}\n";
+
+ Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+ EXPECT_VALID(lib);
+ Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("MyClass"));
+ EXPECT_VALID(cls);
+ TextBuffer buffer(128);
+
+ // Lookup a top-level variable.
+ Dart_Handle var = Dart_LookupVariable(lib, Dart_NewString("a"));
+ EXPECT_VALID(var);
+ EXPECT(Dart_IsVariable(var));
+ BuildVariableDescription(&buffer, var);
+ EXPECT_STREQ("a static", buffer.buf());
+
+ // Lookup a private top-level variable.
+ var = Dart_LookupVariable(lib, Dart_NewString("_b"));
+ EXPECT_VALID(var);
+ EXPECT(Dart_IsVariable(var));
+ BuildVariableDescription(&buffer, var);
+ EXPECT_STREQ("_b static", buffer.buf());
+
+ // Lookup a final top-level variable.
+ var = Dart_LookupVariable(lib, Dart_NewString("c"));
+ EXPECT_VALID(var);
+ EXPECT(Dart_IsVariable(var));
+ BuildVariableDescription(&buffer, var);
+ EXPECT_STREQ("c static final", buffer.buf());
+
+ // Lookup a private final top-level variable.
+ var = Dart_LookupVariable(lib, Dart_NewString("_d"));
+ EXPECT_VALID(var);
+ EXPECT(Dart_IsVariable(var));
+ BuildVariableDescription(&buffer, var);
+ EXPECT_STREQ("_d static final", buffer.buf());
+
+ // Lookup a instance variable.
+ var = Dart_LookupVariable(cls, Dart_NewString("a"));
+ EXPECT_VALID(var);
+ EXPECT(Dart_IsVariable(var));
+ BuildVariableDescription(&buffer, var);
+ EXPECT_STREQ("a", buffer.buf());
+
+ // Lookup a private instance variable.
+ var = Dart_LookupVariable(cls, Dart_NewString("_b"));
+ EXPECT_VALID(var);
+ EXPECT(Dart_IsVariable(var));
+ BuildVariableDescription(&buffer, var);
+ EXPECT_STREQ("_b", buffer.buf());
+
+ // Lookup a final instance variable.
+ var = Dart_LookupVariable(cls, Dart_NewString("c"));
+ EXPECT_VALID(var);
+ EXPECT(Dart_IsVariable(var));
+ BuildVariableDescription(&buffer, var);
+ EXPECT_STREQ("c final", buffer.buf());
+
+ // Lookup a private final instance variable.
+ var = Dart_LookupVariable(cls, Dart_NewString("_d"));
+ EXPECT_VALID(var);
+ EXPECT(Dart_IsVariable(var));
+ BuildVariableDescription(&buffer, var);
+ EXPECT_STREQ("_d final", buffer.buf());
+
+ // Lookup a static variable.
+ var = Dart_LookupVariable(cls, Dart_NewString("e"));
+ EXPECT_VALID(var);
+ EXPECT(Dart_IsVariable(var));
+ BuildVariableDescription(&buffer, var);
+ EXPECT_STREQ("e static", buffer.buf());
+
+ // Lookup a private static variable.
+ var = Dart_LookupVariable(cls, Dart_NewString("_f"));
+ EXPECT_VALID(var);
+ EXPECT(Dart_IsVariable(var));
+ BuildVariableDescription(&buffer, var);
+ EXPECT_STREQ("_f static", buffer.buf());
+
+ // Lookup a final static variable.
+ var = Dart_LookupVariable(cls, Dart_NewString("g"));
+ EXPECT_VALID(var);
+ EXPECT(Dart_IsVariable(var));
+ BuildVariableDescription(&buffer, var);
+ EXPECT_STREQ("g static final", buffer.buf());
+
+ // Lookup a private final static variable.
+ var = Dart_LookupVariable(cls, Dart_NewString("_h"));
+ EXPECT_VALID(var);
+ EXPECT(Dart_IsVariable(var));
+ BuildVariableDescription(&buffer, var);
+ EXPECT_STREQ("_h static final", buffer.buf());
+
+ // Lookup a variable that does not exist from a library.
+ var = Dart_LookupVariable(lib, Dart_NewString("DoesNotExist"));
+ EXPECT(Dart_IsNull(var));
+
+ // Lookup a variable that does not exist from a class.
+ var = Dart_LookupVariable(cls, Dart_NewString("DoesNotExist"));
+ EXPECT(Dart_IsNull(var));
+
+ // Lookup a class from an error library. The error propagates.
+ var = Dart_LookupVariable(Api::NewError("myerror"), Dart_NewString("foo"));
+ EXPECT_ERROR(var, "myerror");
+
+ // Lookup a class using an error class name. The error propagates.
+ var = Dart_LookupVariable(lib, Api::NewError("myerror"));
+ EXPECT_ERROR(var, "myerror");
+}
+
+
TEST_CASE(InstanceOf) {
const char* kScriptChars =
"class OtherClass {\n"
@@ -4325,9 +4776,10 @@
"\n"
"class A {}\n"
"class B {}\n"
- "class D {}\n"
"interface C {}\n"
- "interface E {}\n"
+ "class _A {}\n"
+ "class _B {}\n"
+ "interface _C {}\n"
"\n"
"_compare(String a, String b) => a.compareTo(b);\n"
"sort(list) => list.sort(_compare);\n";
@@ -4351,10 +4803,145 @@
EXPECT_VALID(list_string);
const char* list_cstr = "";
EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr));
- EXPECT_STREQ("[A, B, C, D, E]", list_cstr);
+ EXPECT_STREQ("[A, B, C, _A, _B, _C]", list_cstr);
}
+TEST_CASE(GetFunctionNames) {
+ const char* kLibraryChars =
+ "#library('library_name');\n"
+ "\n"
+ "void A() {}\n"
+ "get B() => 11;\n"
+ "set C(x) { }\n"
+ "var D;\n"
+ "void _A() {}\n"
+ "get _B() => 11;\n"
+ "set _C(x) { }\n"
+ "var _D;\n"
+ "\n"
+ "class MyClass {\n"
+ " void A2() {}\n"
+ " get B2() => 11;\n"
+ " set C2(x) { }\n"
+ " var D2;\n"
+ " void _A2() {}\n"
+ " get _B2() => 11;\n"
+ " set _C2(x) { }\n"
+ " var _D2;\n"
+ "}\n"
+ "\n"
+ "_compare(String a, String b) => a.compareTo(b);\n"
+ "sort(list) => list.sort(_compare);\n";
+
+ // Get the functions from a library.
+ Dart_Handle url = Dart_NewString("library_url");
+ Dart_Handle source = Dart_NewString(kLibraryChars);
+ Dart_Handle lib = Dart_LoadLibrary(url, source);
+ EXPECT_VALID(lib);
+
+ Dart_Handle list = Dart_GetFunctionNames(lib);
+ EXPECT_VALID(list);
+ EXPECT(Dart_IsList(list));
+
+ // Sort the list.
+ const int kNumArgs = 1;
+ Dart_Handle args[1];
+ args[0] = list;
+ EXPECT_VALID(Dart_Invoke(lib, Dart_NewString("sort"), kNumArgs, args));
+
+ Dart_Handle list_string = Dart_ToString(list);
+ EXPECT_VALID(list_string);
+ const char* list_cstr = "";
+ EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr));
+ EXPECT_STREQ("[A, B, C=, _A, _B, _C=, _compare, sort]", list_cstr);
+
+ // Get the functions from a class.
+ Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("MyClass"));
+ EXPECT_VALID(cls);
+
+ list = Dart_GetFunctionNames(cls);
+ EXPECT_VALID(list);
+ EXPECT(Dart_IsList(list));
+
+ // Sort the list.
+ args[0] = list;
+ EXPECT_VALID(Dart_Invoke(lib, Dart_NewString("sort"), kNumArgs, args));
+
+ // Check list contents.
+ list_string = Dart_ToString(list);
+ EXPECT_VALID(list_string);
+ list_cstr = "";
+ EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr));
+ EXPECT_STREQ("[A2, B2, C2=, MyClass, _A2, _B2, _C2=]", list_cstr);
+}
+
+
+TEST_CASE(GetVariableNames) {
+ const char* kLibraryChars =
+ "#library('library_name');\n"
+ "\n"
+ "var A;\n"
+ "get B() => 12;\n"
+ "set C(x) { }\n"
+ "D(x) => (x + 1);\n"
+ "var _A;\n"
+ "get _B() => 12;\n"
+ "set _C(x) { }\n"
+ "_D(x) => (x + 1);\n"
+ "\n"
+ "class MyClass {\n"
+ " var A2;\n"
+ " var _A2;\n"
+ "}\n"
+ "\n"
+ "_compare(String a, String b) => a.compareTo(b);\n"
+ "sort(list) => list.sort(_compare);\n";
+
+ // Get the variables from a library.
+ Dart_Handle url = Dart_NewString("library_url");
+ Dart_Handle source = Dart_NewString(kLibraryChars);
+ Dart_Handle lib = Dart_LoadLibrary(url, source);
+ EXPECT_VALID(lib);
+
+ Dart_Handle list = Dart_GetVariableNames(lib);
+ EXPECT_VALID(list);
+ EXPECT(Dart_IsList(list));
+
+ // Sort the list.
+ const int kNumArgs = 1;
+ Dart_Handle args[1];
+ args[0] = list;
+ EXPECT_VALID(Dart_Invoke(lib, Dart_NewString("sort"), kNumArgs, args));
+
+ // Check list contents.
+ Dart_Handle list_string = Dart_ToString(list);
+ EXPECT_VALID(list_string);
+ const char* list_cstr = "";
+ EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr));
+ EXPECT_STREQ("[A, _A]", list_cstr);
+
+ // Get the variables from a class.
+ Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("MyClass"));
+ EXPECT_VALID(cls);
+
+ list = Dart_GetVariableNames(cls);
+ EXPECT_VALID(list);
+ EXPECT(Dart_IsList(list));
+
+ // Sort the list.
+ args[0] = list;
+ EXPECT_VALID(Dart_Invoke(lib, Dart_NewString("sort"), kNumArgs, args));
+
+ // Check list contents.
+ list_string = Dart_ToString(list);
+ EXPECT_VALID(list_string);
+ list_cstr = "";
+ EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr));
+ EXPECT_STREQ("[A2, _A2]", list_cstr);
+}
+
+
TEST_CASE(LibraryImportLibrary) {
const char* kLibrary1Chars =
"#library('library1_name');";
« no previous file with comments | « runtime/vm/dart_api_impl.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698