Chromium Code Reviews| Index: runtime/vm/dart_api_impl_test.cc |
| =================================================================== |
| --- runtime/vm/dart_api_impl_test.cc (revision 9071) |
| +++ 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" |
| @@ -3904,6 +3905,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" |
| @@ -4312,9 +4763,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"; |
| @@ -4338,10 +4790,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" |
|
cshapiro
2012/06/28 23:57:47
Make functions and variables lowercase?
|
| + "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" |
|
cshapiro
2012/06/28 23:57:47
Same?
|
| + "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]; |
|
cshapiro
2012/06/28 23:57:47
Dart_Handle args[] = { list };
|
| + 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');"; |