| 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');";
|
|
|