OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "include/dart_api.h" | 5 #include "include/dart_api.h" |
6 #include "platform/assert.h" | 6 #include "platform/assert.h" |
| 7 #include "platform/json.h" |
7 #include "platform/utils.h" | 8 #include "platform/utils.h" |
8 #include "vm/class_finalizer.h" | 9 #include "vm/class_finalizer.h" |
9 #include "vm/dart_api_impl.h" | 10 #include "vm/dart_api_impl.h" |
10 #include "vm/dart_api_state.h" | 11 #include "vm/dart_api_state.h" |
11 #include "vm/thread.h" | 12 #include "vm/thread.h" |
12 #include "vm/unit_test.h" | 13 #include "vm/unit_test.h" |
13 #include "vm/verifier.h" | 14 #include "vm/verifier.h" |
14 | 15 |
15 namespace dart { | 16 namespace dart { |
16 | 17 |
(...skipping 3893 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3910 EXPECT(Dart_IsError(cls)); | 3911 EXPECT(Dart_IsError(cls)); |
3911 EXPECT_STREQ("myerror", Dart_GetError(cls)); | 3912 EXPECT_STREQ("myerror", Dart_GetError(cls)); |
3912 | 3913 |
3913 // Lookup a class using an error class name. The error propagates. | 3914 // Lookup a class using an error class name. The error propagates. |
3914 cls = Dart_GetClass(lib, Api::NewError("myerror")); | 3915 cls = Dart_GetClass(lib, Api::NewError("myerror")); |
3915 EXPECT(Dart_IsError(cls)); | 3916 EXPECT(Dart_IsError(cls)); |
3916 EXPECT_STREQ("myerror", Dart_GetError(cls)); | 3917 EXPECT_STREQ("myerror", Dart_GetError(cls)); |
3917 } | 3918 } |
3918 | 3919 |
3919 | 3920 |
| 3921 static void BuildFunctionDescription(TextBuffer* buffer, Dart_Handle func) { |
| 3922 buffer->Clear(); |
| 3923 if (Dart_IsNull(func)) { |
| 3924 WARN("Function not found"); |
| 3925 return; |
| 3926 } |
| 3927 Dart_Handle name = Dart_FunctionName(func); |
| 3928 EXPECT_VALID(name); |
| 3929 const char* name_cstr = ""; |
| 3930 EXPECT_VALID(Dart_StringToCString(name, &name_cstr)); |
| 3931 bool is_abstract = false; |
| 3932 bool is_static = false; |
| 3933 bool is_getter = false; |
| 3934 bool is_setter = false; |
| 3935 bool is_constructor = false; |
| 3936 EXPECT_VALID(Dart_FunctionIsAbstract(func, &is_abstract)); |
| 3937 EXPECT_VALID(Dart_FunctionIsStatic(func, &is_static)); |
| 3938 EXPECT_VALID(Dart_FunctionIsGetter(func, &is_getter)); |
| 3939 EXPECT_VALID(Dart_FunctionIsSetter(func, &is_setter)); |
| 3940 EXPECT_VALID(Dart_FunctionIsConstructor(func, &is_constructor)); |
| 3941 buffer->Printf("%s", name_cstr); |
| 3942 if (is_abstract) { |
| 3943 buffer->Printf(" abstract"); |
| 3944 } |
| 3945 if (is_static) { |
| 3946 buffer->Printf(" static"); |
| 3947 } |
| 3948 if (is_getter) { |
| 3949 buffer->Printf(" getter"); |
| 3950 } |
| 3951 if (is_setter) { |
| 3952 buffer->Printf(" setter"); |
| 3953 } |
| 3954 if (is_constructor) { |
| 3955 buffer->Printf(" constructor"); |
| 3956 } |
| 3957 } |
| 3958 |
| 3959 |
| 3960 TEST_CASE(FunctionReflection) { |
| 3961 const char* kScriptChars = |
| 3962 "a() => 'a';\n" |
| 3963 "_b() => '_b';\n" |
| 3964 "get c() => 'bar';\n" |
| 3965 "set d(x) {}\n" |
| 3966 "get _e() => 'bar';\n" |
| 3967 "set _f(x) {}\n" |
| 3968 "class MyClass {\n" |
| 3969 " MyClass() {}\n" |
| 3970 " MyClass.named() {}\n" |
| 3971 " a() => 'a';\n" |
| 3972 " _b() => '_b';\n" |
| 3973 " get c() => 'bar';\n" |
| 3974 " set d(x) {}\n" |
| 3975 " get _e() => 'bar';\n" |
| 3976 " set _f(x) {}\n" |
| 3977 " static g() => 'g';\n" |
| 3978 " static _h() => '_h';\n" |
| 3979 " static get i() => 'i';\n" |
| 3980 " static set j(x) {}\n" |
| 3981 " static get _k() => 'k';\n" |
| 3982 " static set _l(x) {}\n" |
| 3983 " abstract m();\n" |
| 3984 " abstract _n();\n" |
| 3985 " abstract get o();\n" |
| 3986 " abstract set p(x);\n" |
| 3987 " abstract get _q();\n" |
| 3988 " abstract set _r(x);\n" |
| 3989 " operator ==(x) {}\n" |
| 3990 "}\n" |
| 3991 "class _PrivateClass {\n" |
| 3992 " _PrivateClass() {}\n" |
| 3993 " _PrivateClass.named() {}\n" |
| 3994 "}\n"; |
| 3995 |
| 3996 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| 3997 EXPECT_VALID(lib); |
| 3998 Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("MyClass")); |
| 3999 EXPECT_VALID(cls); |
| 4000 Dart_Handle private_cls = Dart_GetClass(lib, Dart_NewString("_PrivateClass")); |
| 4001 EXPECT_VALID(private_cls); |
| 4002 TextBuffer buffer(128); |
| 4003 |
| 4004 // Lookup a top-level function. |
| 4005 Dart_Handle func = Dart_LookupFunction(lib, Dart_NewString("a")); |
| 4006 EXPECT_VALID(func); |
| 4007 EXPECT(Dart_IsFunction(func)); |
| 4008 BuildFunctionDescription(&buffer, func); |
| 4009 EXPECT_STREQ("a static", buffer.buf()); |
| 4010 |
| 4011 // Lookup a private top-level function. |
| 4012 func = Dart_LookupFunction(lib, Dart_NewString("_b")); |
| 4013 EXPECT_VALID(func); |
| 4014 EXPECT(Dart_IsFunction(func)); |
| 4015 BuildFunctionDescription(&buffer, func); |
| 4016 EXPECT_STREQ("_b static", buffer.buf()); |
| 4017 |
| 4018 // Lookup a top-level getter. |
| 4019 func = Dart_LookupFunction(lib, Dart_NewString("c")); |
| 4020 EXPECT_VALID(func); |
| 4021 EXPECT(Dart_IsFunction(func)); |
| 4022 BuildFunctionDescription(&buffer, func); |
| 4023 EXPECT_STREQ("c static getter", buffer.buf()); |
| 4024 |
| 4025 // Lookup a top-level setter. |
| 4026 func = Dart_LookupFunction(lib, Dart_NewString("d=")); |
| 4027 EXPECT_VALID(func); |
| 4028 EXPECT(Dart_IsFunction(func)); |
| 4029 BuildFunctionDescription(&buffer, func); |
| 4030 EXPECT_STREQ("d= static setter", buffer.buf()); |
| 4031 |
| 4032 // Lookup a private top-level getter. |
| 4033 func = Dart_LookupFunction(lib, Dart_NewString("_e")); |
| 4034 EXPECT_VALID(func); |
| 4035 EXPECT(Dart_IsFunction(func)); |
| 4036 BuildFunctionDescription(&buffer, func); |
| 4037 EXPECT_STREQ("_e static getter", buffer.buf()); |
| 4038 |
| 4039 // Lookup a private top-level setter. |
| 4040 func = Dart_LookupFunction(lib, Dart_NewString("_f=")); |
| 4041 EXPECT_VALID(func); |
| 4042 EXPECT(Dart_IsFunction(func)); |
| 4043 BuildFunctionDescription(&buffer, func); |
| 4044 EXPECT_STREQ("_f= static setter", buffer.buf()); |
| 4045 |
| 4046 // Lookup an unnamed constructor |
| 4047 func = Dart_LookupFunction(cls, Dart_NewString("MyClass")); |
| 4048 EXPECT_VALID(func); |
| 4049 EXPECT(Dart_IsFunction(func)); |
| 4050 BuildFunctionDescription(&buffer, func); |
| 4051 EXPECT_STREQ("MyClass constructor", buffer.buf()); |
| 4052 |
| 4053 // Lookup a named constructor |
| 4054 func = Dart_LookupFunction(cls, Dart_NewString("MyClass.named")); |
| 4055 EXPECT_VALID(func); |
| 4056 EXPECT(Dart_IsFunction(func)); |
| 4057 BuildFunctionDescription(&buffer, func); |
| 4058 EXPECT_STREQ("MyClass.named constructor", buffer.buf()); |
| 4059 |
| 4060 // Lookup an private unnamed constructor |
| 4061 func = Dart_LookupFunction(private_cls, Dart_NewString("_PrivateClass")); |
| 4062 EXPECT_VALID(func); |
| 4063 EXPECT(Dart_IsFunction(func)); |
| 4064 BuildFunctionDescription(&buffer, func); |
| 4065 EXPECT_STREQ("_PrivateClass constructor", buffer.buf()); |
| 4066 |
| 4067 // Lookup a private named constructor |
| 4068 func = Dart_LookupFunction(private_cls, |
| 4069 Dart_NewString("_PrivateClass.named")); |
| 4070 EXPECT_VALID(func); |
| 4071 EXPECT(Dart_IsFunction(func)); |
| 4072 BuildFunctionDescription(&buffer, func); |
| 4073 EXPECT_STREQ("_PrivateClass.named constructor", buffer.buf()); |
| 4074 |
| 4075 // Lookup a method. |
| 4076 func = Dart_LookupFunction(cls, Dart_NewString("a")); |
| 4077 EXPECT_VALID(func); |
| 4078 EXPECT(Dart_IsFunction(func)); |
| 4079 BuildFunctionDescription(&buffer, func); |
| 4080 EXPECT_STREQ("a", buffer.buf()); |
| 4081 |
| 4082 // Lookup a private method. |
| 4083 func = Dart_LookupFunction(cls, Dart_NewString("_b")); |
| 4084 EXPECT_VALID(func); |
| 4085 EXPECT(Dart_IsFunction(func)); |
| 4086 BuildFunctionDescription(&buffer, func); |
| 4087 EXPECT_STREQ("_b", buffer.buf()); |
| 4088 |
| 4089 // Lookup a instance getter. |
| 4090 func = Dart_LookupFunction(cls, Dart_NewString("c")); |
| 4091 EXPECT_VALID(func); |
| 4092 EXPECT(Dart_IsFunction(func)); |
| 4093 BuildFunctionDescription(&buffer, func); |
| 4094 EXPECT_STREQ("c getter", buffer.buf()); |
| 4095 |
| 4096 // Lookup a instance setter. |
| 4097 func = Dart_LookupFunction(cls, Dart_NewString("d=")); |
| 4098 EXPECT_VALID(func); |
| 4099 EXPECT(Dart_IsFunction(func)); |
| 4100 BuildFunctionDescription(&buffer, func); |
| 4101 EXPECT_STREQ("d= setter", buffer.buf()); |
| 4102 |
| 4103 // Lookup a private instance getter. |
| 4104 func = Dart_LookupFunction(cls, Dart_NewString("_e")); |
| 4105 EXPECT_VALID(func); |
| 4106 EXPECT(Dart_IsFunction(func)); |
| 4107 BuildFunctionDescription(&buffer, func); |
| 4108 EXPECT_STREQ("_e getter", buffer.buf()); |
| 4109 |
| 4110 // Lookup a private instance setter. |
| 4111 func = Dart_LookupFunction(cls, Dart_NewString("_f=")); |
| 4112 EXPECT_VALID(func); |
| 4113 EXPECT(Dart_IsFunction(func)); |
| 4114 BuildFunctionDescription(&buffer, func); |
| 4115 EXPECT_STREQ("_f= setter", buffer.buf()); |
| 4116 |
| 4117 // Lookup a static method. |
| 4118 func = Dart_LookupFunction(cls, Dart_NewString("g")); |
| 4119 EXPECT_VALID(func); |
| 4120 EXPECT(Dart_IsFunction(func)); |
| 4121 BuildFunctionDescription(&buffer, func); |
| 4122 EXPECT_STREQ("g static", buffer.buf()); |
| 4123 |
| 4124 // Lookup a private static method. |
| 4125 func = Dart_LookupFunction(cls, Dart_NewString("_h")); |
| 4126 EXPECT_VALID(func); |
| 4127 EXPECT(Dart_IsFunction(func)); |
| 4128 BuildFunctionDescription(&buffer, func); |
| 4129 EXPECT_STREQ("_h static", buffer.buf()); |
| 4130 |
| 4131 // Lookup a static getter. |
| 4132 func = Dart_LookupFunction(cls, Dart_NewString("i")); |
| 4133 EXPECT_VALID(func); |
| 4134 EXPECT(Dart_IsFunction(func)); |
| 4135 BuildFunctionDescription(&buffer, func); |
| 4136 EXPECT_STREQ("i static getter", buffer.buf()); |
| 4137 |
| 4138 // Lookup a static setter. |
| 4139 func = Dart_LookupFunction(cls, Dart_NewString("j=")); |
| 4140 EXPECT_VALID(func); |
| 4141 EXPECT(Dart_IsFunction(func)); |
| 4142 BuildFunctionDescription(&buffer, func); |
| 4143 EXPECT_STREQ("j= static setter", buffer.buf()); |
| 4144 |
| 4145 // Lookup a private static getter. |
| 4146 func = Dart_LookupFunction(cls, Dart_NewString("_k")); |
| 4147 EXPECT_VALID(func); |
| 4148 EXPECT(Dart_IsFunction(func)); |
| 4149 BuildFunctionDescription(&buffer, func); |
| 4150 EXPECT_STREQ("_k static getter", buffer.buf()); |
| 4151 |
| 4152 // Lookup a private static setter. |
| 4153 func = Dart_LookupFunction(cls, Dart_NewString("_l=")); |
| 4154 EXPECT_VALID(func); |
| 4155 EXPECT(Dart_IsFunction(func)); |
| 4156 BuildFunctionDescription(&buffer, func); |
| 4157 EXPECT_STREQ("_l= static setter", buffer.buf()); |
| 4158 |
| 4159 // Lookup an abstract method. |
| 4160 func = Dart_LookupFunction(cls, Dart_NewString("m")); |
| 4161 EXPECT_VALID(func); |
| 4162 EXPECT(Dart_IsFunction(func)); |
| 4163 BuildFunctionDescription(&buffer, func); |
| 4164 EXPECT_STREQ("m abstract", buffer.buf()); |
| 4165 |
| 4166 // Lookup a private abstract method. |
| 4167 func = Dart_LookupFunction(cls, Dart_NewString("_n")); |
| 4168 EXPECT_VALID(func); |
| 4169 EXPECT(Dart_IsFunction(func)); |
| 4170 BuildFunctionDescription(&buffer, func); |
| 4171 EXPECT_STREQ("_n abstract", buffer.buf()); |
| 4172 |
| 4173 // Lookup a abstract getter. |
| 4174 func = Dart_LookupFunction(cls, Dart_NewString("o")); |
| 4175 EXPECT_VALID(func); |
| 4176 EXPECT(Dart_IsFunction(func)); |
| 4177 BuildFunctionDescription(&buffer, func); |
| 4178 EXPECT_STREQ("o abstract getter", buffer.buf()); |
| 4179 |
| 4180 // Lookup a abstract setter. |
| 4181 func = Dart_LookupFunction(cls, Dart_NewString("p=")); |
| 4182 EXPECT_VALID(func); |
| 4183 EXPECT(Dart_IsFunction(func)); |
| 4184 BuildFunctionDescription(&buffer, func); |
| 4185 EXPECT_STREQ("p= abstract setter", buffer.buf()); |
| 4186 |
| 4187 // Lookup a private abstract getter. |
| 4188 func = Dart_LookupFunction(cls, Dart_NewString("_q")); |
| 4189 EXPECT_VALID(func); |
| 4190 EXPECT(Dart_IsFunction(func)); |
| 4191 BuildFunctionDescription(&buffer, func); |
| 4192 EXPECT_STREQ("_q abstract getter", buffer.buf()); |
| 4193 |
| 4194 // Lookup a private abstract setter. |
| 4195 func = Dart_LookupFunction(cls, Dart_NewString("_r=")); |
| 4196 EXPECT_VALID(func); |
| 4197 EXPECT(Dart_IsFunction(func)); |
| 4198 BuildFunctionDescription(&buffer, func); |
| 4199 EXPECT_STREQ("_r= abstract setter", buffer.buf()); |
| 4200 |
| 4201 // Lookup an operator |
| 4202 func = Dart_LookupFunction(cls, Dart_NewString("==")); |
| 4203 EXPECT_VALID(func); |
| 4204 EXPECT(Dart_IsFunction(func)); |
| 4205 BuildFunctionDescription(&buffer, func); |
| 4206 EXPECT_STREQ("==", buffer.buf()); |
| 4207 |
| 4208 // Lookup a function that does not exist from a library. |
| 4209 func = Dart_LookupFunction(lib, Dart_NewString("DoesNotExist")); |
| 4210 EXPECT(Dart_IsNull(func)); |
| 4211 |
| 4212 // Lookup a function that does not exist from a class. |
| 4213 func = Dart_LookupFunction(cls, Dart_NewString("DoesNotExist")); |
| 4214 EXPECT(Dart_IsNull(func)); |
| 4215 |
| 4216 // Lookup a class using an error class name. The error propagates. |
| 4217 func = Dart_LookupFunction(cls, Api::NewError("myerror")); |
| 4218 EXPECT_ERROR(func, "myerror"); |
| 4219 |
| 4220 // Lookup a class from an error library. The error propagates. |
| 4221 func = Dart_LookupFunction(Api::NewError("myerror"), Dart_NewString("foo")); |
| 4222 EXPECT_ERROR(func, "myerror"); |
| 4223 } |
| 4224 |
| 4225 |
| 4226 static void BuildVariableDescription(TextBuffer* buffer, Dart_Handle var) { |
| 4227 buffer->Clear(); |
| 4228 Dart_Handle name = Dart_VariableName(var); |
| 4229 EXPECT_VALID(name); |
| 4230 const char* name_cstr = ""; |
| 4231 EXPECT_VALID(Dart_StringToCString(name, &name_cstr)); |
| 4232 bool is_static = false; |
| 4233 bool is_final = false; |
| 4234 EXPECT_VALID(Dart_VariableIsStatic(var, &is_static)); |
| 4235 EXPECT_VALID(Dart_VariableIsFinal(var, &is_final)); |
| 4236 buffer->Printf("%s", name_cstr); |
| 4237 if (is_static) { |
| 4238 buffer->Printf(" static"); |
| 4239 } |
| 4240 if (is_final) { |
| 4241 buffer->Printf(" final"); |
| 4242 } |
| 4243 } |
| 4244 |
| 4245 |
| 4246 TEST_CASE(VariableReflection) { |
| 4247 const char* kScriptChars = |
| 4248 "var a = 'a';\n" |
| 4249 "var _b = '_b';\n" |
| 4250 "final c = 'c';\n" |
| 4251 "final _d = '_d';\n" |
| 4252 "class MyClass {\n" |
| 4253 " var a = 'a';\n" |
| 4254 " var _b = '_b';\n" |
| 4255 " final c = 'c';\n" |
| 4256 " final _d = '_d';\n" |
| 4257 " static var e = 'e';\n" |
| 4258 " static var _f = '_f';\n" |
| 4259 " static final g = 'g';\n" |
| 4260 " static final _h = '_h';\n" |
| 4261 "}\n"; |
| 4262 |
| 4263 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| 4264 EXPECT_VALID(lib); |
| 4265 Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("MyClass")); |
| 4266 EXPECT_VALID(cls); |
| 4267 TextBuffer buffer(128); |
| 4268 |
| 4269 // Lookup a top-level variable. |
| 4270 Dart_Handle var = Dart_LookupVariable(lib, Dart_NewString("a")); |
| 4271 EXPECT_VALID(var); |
| 4272 EXPECT(Dart_IsVariable(var)); |
| 4273 BuildVariableDescription(&buffer, var); |
| 4274 EXPECT_STREQ("a static", buffer.buf()); |
| 4275 |
| 4276 // Lookup a private top-level variable. |
| 4277 var = Dart_LookupVariable(lib, Dart_NewString("_b")); |
| 4278 EXPECT_VALID(var); |
| 4279 EXPECT(Dart_IsVariable(var)); |
| 4280 BuildVariableDescription(&buffer, var); |
| 4281 EXPECT_STREQ("_b static", buffer.buf()); |
| 4282 |
| 4283 // Lookup a final top-level variable. |
| 4284 var = Dart_LookupVariable(lib, Dart_NewString("c")); |
| 4285 EXPECT_VALID(var); |
| 4286 EXPECT(Dart_IsVariable(var)); |
| 4287 BuildVariableDescription(&buffer, var); |
| 4288 EXPECT_STREQ("c static final", buffer.buf()); |
| 4289 |
| 4290 // Lookup a private final top-level variable. |
| 4291 var = Dart_LookupVariable(lib, Dart_NewString("_d")); |
| 4292 EXPECT_VALID(var); |
| 4293 EXPECT(Dart_IsVariable(var)); |
| 4294 BuildVariableDescription(&buffer, var); |
| 4295 EXPECT_STREQ("_d static final", buffer.buf()); |
| 4296 |
| 4297 // Lookup a instance variable. |
| 4298 var = Dart_LookupVariable(cls, Dart_NewString("a")); |
| 4299 EXPECT_VALID(var); |
| 4300 EXPECT(Dart_IsVariable(var)); |
| 4301 BuildVariableDescription(&buffer, var); |
| 4302 EXPECT_STREQ("a", buffer.buf()); |
| 4303 |
| 4304 // Lookup a private instance variable. |
| 4305 var = Dart_LookupVariable(cls, Dart_NewString("_b")); |
| 4306 EXPECT_VALID(var); |
| 4307 EXPECT(Dart_IsVariable(var)); |
| 4308 BuildVariableDescription(&buffer, var); |
| 4309 EXPECT_STREQ("_b", buffer.buf()); |
| 4310 |
| 4311 // Lookup a final instance variable. |
| 4312 var = Dart_LookupVariable(cls, Dart_NewString("c")); |
| 4313 EXPECT_VALID(var); |
| 4314 EXPECT(Dart_IsVariable(var)); |
| 4315 BuildVariableDescription(&buffer, var); |
| 4316 EXPECT_STREQ("c final", buffer.buf()); |
| 4317 |
| 4318 // Lookup a private final instance variable. |
| 4319 var = Dart_LookupVariable(cls, Dart_NewString("_d")); |
| 4320 EXPECT_VALID(var); |
| 4321 EXPECT(Dart_IsVariable(var)); |
| 4322 BuildVariableDescription(&buffer, var); |
| 4323 EXPECT_STREQ("_d final", buffer.buf()); |
| 4324 |
| 4325 // Lookup a static variable. |
| 4326 var = Dart_LookupVariable(cls, Dart_NewString("e")); |
| 4327 EXPECT_VALID(var); |
| 4328 EXPECT(Dart_IsVariable(var)); |
| 4329 BuildVariableDescription(&buffer, var); |
| 4330 EXPECT_STREQ("e static", buffer.buf()); |
| 4331 |
| 4332 // Lookup a private static variable. |
| 4333 var = Dart_LookupVariable(cls, Dart_NewString("_f")); |
| 4334 EXPECT_VALID(var); |
| 4335 EXPECT(Dart_IsVariable(var)); |
| 4336 BuildVariableDescription(&buffer, var); |
| 4337 EXPECT_STREQ("_f static", buffer.buf()); |
| 4338 |
| 4339 // Lookup a final static variable. |
| 4340 var = Dart_LookupVariable(cls, Dart_NewString("g")); |
| 4341 EXPECT_VALID(var); |
| 4342 EXPECT(Dart_IsVariable(var)); |
| 4343 BuildVariableDescription(&buffer, var); |
| 4344 EXPECT_STREQ("g static final", buffer.buf()); |
| 4345 |
| 4346 // Lookup a private final static variable. |
| 4347 var = Dart_LookupVariable(cls, Dart_NewString("_h")); |
| 4348 EXPECT_VALID(var); |
| 4349 EXPECT(Dart_IsVariable(var)); |
| 4350 BuildVariableDescription(&buffer, var); |
| 4351 EXPECT_STREQ("_h static final", buffer.buf()); |
| 4352 |
| 4353 // Lookup a variable that does not exist from a library. |
| 4354 var = Dart_LookupVariable(lib, Dart_NewString("DoesNotExist")); |
| 4355 EXPECT(Dart_IsNull(var)); |
| 4356 |
| 4357 // Lookup a variable that does not exist from a class. |
| 4358 var = Dart_LookupVariable(cls, Dart_NewString("DoesNotExist")); |
| 4359 EXPECT(Dart_IsNull(var)); |
| 4360 |
| 4361 // Lookup a class from an error library. The error propagates. |
| 4362 var = Dart_LookupVariable(Api::NewError("myerror"), Dart_NewString("foo")); |
| 4363 EXPECT_ERROR(var, "myerror"); |
| 4364 |
| 4365 // Lookup a class using an error class name. The error propagates. |
| 4366 var = Dart_LookupVariable(lib, Api::NewError("myerror")); |
| 4367 EXPECT_ERROR(var, "myerror"); |
| 4368 } |
| 4369 |
| 4370 |
3920 TEST_CASE(InstanceOf) { | 4371 TEST_CASE(InstanceOf) { |
3921 const char* kScriptChars = | 4372 const char* kScriptChars = |
3922 "class OtherClass {\n" | 4373 "class OtherClass {\n" |
3923 " static returnNull() { return null; }\n" | 4374 " static returnNull() { return null; }\n" |
3924 "}\n" | 4375 "}\n" |
3925 "class InstanceOfTest {\n" | 4376 "class InstanceOfTest {\n" |
3926 " InstanceOfTest() {}\n" | 4377 " InstanceOfTest() {}\n" |
3927 " static InstanceOfTest testMain() {\n" | 4378 " static InstanceOfTest testMain() {\n" |
3928 " return new InstanceOfTest();\n" | 4379 " return new InstanceOfTest();\n" |
3929 " }\n" | 4380 " }\n" |
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4318 EXPECT_STREQ("library1_url", cstr); | 4769 EXPECT_STREQ("library1_url", cstr); |
4319 } | 4770 } |
4320 | 4771 |
4321 | 4772 |
4322 TEST_CASE(LibraryGetClassNames) { | 4773 TEST_CASE(LibraryGetClassNames) { |
4323 const char* kLibraryChars = | 4774 const char* kLibraryChars = |
4324 "#library('library_name');\n" | 4775 "#library('library_name');\n" |
4325 "\n" | 4776 "\n" |
4326 "class A {}\n" | 4777 "class A {}\n" |
4327 "class B {}\n" | 4778 "class B {}\n" |
4328 "class D {}\n" | |
4329 "interface C {}\n" | 4779 "interface C {}\n" |
4330 "interface E {}\n" | 4780 "class _A {}\n" |
| 4781 "class _B {}\n" |
| 4782 "interface _C {}\n" |
4331 "\n" | 4783 "\n" |
4332 "_compare(String a, String b) => a.compareTo(b);\n" | 4784 "_compare(String a, String b) => a.compareTo(b);\n" |
4333 "sort(list) => list.sort(_compare);\n"; | 4785 "sort(list) => list.sort(_compare);\n"; |
4334 | 4786 |
4335 Dart_Handle url = Dart_NewString("library_url"); | 4787 Dart_Handle url = Dart_NewString("library_url"); |
4336 Dart_Handle source = Dart_NewString(kLibraryChars); | 4788 Dart_Handle source = Dart_NewString(kLibraryChars); |
4337 Dart_Handle lib = Dart_LoadLibrary(url, source); | 4789 Dart_Handle lib = Dart_LoadLibrary(url, source); |
4338 EXPECT_VALID(lib); | 4790 EXPECT_VALID(lib); |
4339 | 4791 |
4340 Dart_Handle list = Dart_LibraryGetClassNames(lib); | 4792 Dart_Handle list = Dart_LibraryGetClassNames(lib); |
4341 EXPECT_VALID(list); | 4793 EXPECT_VALID(list); |
4342 EXPECT(Dart_IsList(list)); | 4794 EXPECT(Dart_IsList(list)); |
4343 | 4795 |
4344 // Sort the list. | 4796 // Sort the list. |
4345 const int kNumArgs = 1; | 4797 const int kNumArgs = 1; |
4346 Dart_Handle args[1]; | 4798 Dart_Handle args[1]; |
4347 args[0] = list; | 4799 args[0] = list; |
4348 EXPECT_VALID(Dart_Invoke(lib, Dart_NewString("sort"), kNumArgs, args)); | 4800 EXPECT_VALID(Dart_Invoke(lib, Dart_NewString("sort"), kNumArgs, args)); |
4349 | 4801 |
4350 Dart_Handle list_string = Dart_ToString(list); | 4802 Dart_Handle list_string = Dart_ToString(list); |
4351 EXPECT_VALID(list_string); | 4803 EXPECT_VALID(list_string); |
4352 const char* list_cstr = ""; | 4804 const char* list_cstr = ""; |
4353 EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr)); | 4805 EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr)); |
4354 EXPECT_STREQ("[A, B, C, D, E]", list_cstr); | 4806 EXPECT_STREQ("[A, B, C, _A, _B, _C]", list_cstr); |
| 4807 } |
| 4808 |
| 4809 |
| 4810 TEST_CASE(GetFunctionNames) { |
| 4811 const char* kLibraryChars = |
| 4812 "#library('library_name');\n" |
| 4813 "\n" |
| 4814 "void A() {}\n" |
| 4815 "get B() => 11;\n" |
| 4816 "set C(x) { }\n" |
| 4817 "var D;\n" |
| 4818 "void _A() {}\n" |
| 4819 "get _B() => 11;\n" |
| 4820 "set _C(x) { }\n" |
| 4821 "var _D;\n" |
| 4822 "\n" |
| 4823 "class MyClass {\n" |
| 4824 " void A2() {}\n" |
| 4825 " get B2() => 11;\n" |
| 4826 " set C2(x) { }\n" |
| 4827 " var D2;\n" |
| 4828 " void _A2() {}\n" |
| 4829 " get _B2() => 11;\n" |
| 4830 " set _C2(x) { }\n" |
| 4831 " var _D2;\n" |
| 4832 "}\n" |
| 4833 "\n" |
| 4834 "_compare(String a, String b) => a.compareTo(b);\n" |
| 4835 "sort(list) => list.sort(_compare);\n"; |
| 4836 |
| 4837 // Get the functions from a library. |
| 4838 Dart_Handle url = Dart_NewString("library_url"); |
| 4839 Dart_Handle source = Dart_NewString(kLibraryChars); |
| 4840 Dart_Handle lib = Dart_LoadLibrary(url, source); |
| 4841 EXPECT_VALID(lib); |
| 4842 |
| 4843 Dart_Handle list = Dart_GetFunctionNames(lib); |
| 4844 EXPECT_VALID(list); |
| 4845 EXPECT(Dart_IsList(list)); |
| 4846 |
| 4847 // Sort the list. |
| 4848 const int kNumArgs = 1; |
| 4849 Dart_Handle args[1]; |
| 4850 args[0] = list; |
| 4851 EXPECT_VALID(Dart_Invoke(lib, Dart_NewString("sort"), kNumArgs, args)); |
| 4852 |
| 4853 Dart_Handle list_string = Dart_ToString(list); |
| 4854 EXPECT_VALID(list_string); |
| 4855 const char* list_cstr = ""; |
| 4856 EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr)); |
| 4857 EXPECT_STREQ("[A, B, C=, _A, _B, _C=, _compare, sort]", list_cstr); |
| 4858 |
| 4859 // Get the functions from a class. |
| 4860 Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("MyClass")); |
| 4861 EXPECT_VALID(cls); |
| 4862 |
| 4863 list = Dart_GetFunctionNames(cls); |
| 4864 EXPECT_VALID(list); |
| 4865 EXPECT(Dart_IsList(list)); |
| 4866 |
| 4867 // Sort the list. |
| 4868 args[0] = list; |
| 4869 EXPECT_VALID(Dart_Invoke(lib, Dart_NewString("sort"), kNumArgs, args)); |
| 4870 |
| 4871 // Check list contents. |
| 4872 list_string = Dart_ToString(list); |
| 4873 EXPECT_VALID(list_string); |
| 4874 list_cstr = ""; |
| 4875 EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr)); |
| 4876 EXPECT_STREQ("[A2, B2, C2=, MyClass, _A2, _B2, _C2=]", list_cstr); |
| 4877 } |
| 4878 |
| 4879 |
| 4880 TEST_CASE(GetVariableNames) { |
| 4881 const char* kLibraryChars = |
| 4882 "#library('library_name');\n" |
| 4883 "\n" |
| 4884 "var A;\n" |
| 4885 "get B() => 12;\n" |
| 4886 "set C(x) { }\n" |
| 4887 "D(x) => (x + 1);\n" |
| 4888 "var _A;\n" |
| 4889 "get _B() => 12;\n" |
| 4890 "set _C(x) { }\n" |
| 4891 "_D(x) => (x + 1);\n" |
| 4892 "\n" |
| 4893 "class MyClass {\n" |
| 4894 " var A2;\n" |
| 4895 " var _A2;\n" |
| 4896 "}\n" |
| 4897 "\n" |
| 4898 "_compare(String a, String b) => a.compareTo(b);\n" |
| 4899 "sort(list) => list.sort(_compare);\n"; |
| 4900 |
| 4901 // Get the variables from a library. |
| 4902 Dart_Handle url = Dart_NewString("library_url"); |
| 4903 Dart_Handle source = Dart_NewString(kLibraryChars); |
| 4904 Dart_Handle lib = Dart_LoadLibrary(url, source); |
| 4905 EXPECT_VALID(lib); |
| 4906 |
| 4907 Dart_Handle list = Dart_GetVariableNames(lib); |
| 4908 EXPECT_VALID(list); |
| 4909 EXPECT(Dart_IsList(list)); |
| 4910 |
| 4911 // Sort the list. |
| 4912 const int kNumArgs = 1; |
| 4913 Dart_Handle args[1]; |
| 4914 args[0] = list; |
| 4915 EXPECT_VALID(Dart_Invoke(lib, Dart_NewString("sort"), kNumArgs, args)); |
| 4916 |
| 4917 // Check list contents. |
| 4918 Dart_Handle list_string = Dart_ToString(list); |
| 4919 EXPECT_VALID(list_string); |
| 4920 const char* list_cstr = ""; |
| 4921 EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr)); |
| 4922 EXPECT_STREQ("[A, _A]", list_cstr); |
| 4923 |
| 4924 // Get the variables from a class. |
| 4925 Dart_Handle cls = Dart_GetClass(lib, Dart_NewString("MyClass")); |
| 4926 EXPECT_VALID(cls); |
| 4927 |
| 4928 list = Dart_GetVariableNames(cls); |
| 4929 EXPECT_VALID(list); |
| 4930 EXPECT(Dart_IsList(list)); |
| 4931 |
| 4932 // Sort the list. |
| 4933 args[0] = list; |
| 4934 EXPECT_VALID(Dart_Invoke(lib, Dart_NewString("sort"), kNumArgs, args)); |
| 4935 |
| 4936 // Check list contents. |
| 4937 list_string = Dart_ToString(list); |
| 4938 EXPECT_VALID(list_string); |
| 4939 list_cstr = ""; |
| 4940 EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr)); |
| 4941 EXPECT_STREQ("[A2, _A2]", list_cstr); |
4355 } | 4942 } |
4356 | 4943 |
4357 | 4944 |
4358 TEST_CASE(LibraryImportLibrary) { | 4945 TEST_CASE(LibraryImportLibrary) { |
4359 const char* kLibrary1Chars = | 4946 const char* kLibrary1Chars = |
4360 "#library('library1_name');"; | 4947 "#library('library1_name');"; |
4361 const char* kLibrary2Chars = | 4948 const char* kLibrary2Chars = |
4362 "#library('library2_name');"; | 4949 "#library('library2_name');"; |
4363 Dart_Handle error = Dart_Error("incoming error"); | 4950 Dart_Handle error = Dart_Error("incoming error"); |
4364 Dart_Handle result; | 4951 Dart_Handle result; |
(...skipping 1198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5563 EXPECT_VALID(result); | 6150 EXPECT_VALID(result); |
5564 EXPECT(Dart_IsInteger(result)); | 6151 EXPECT(Dart_IsInteger(result)); |
5565 int64_t value = 0; | 6152 int64_t value = 0; |
5566 EXPECT_VALID(Dart_IntegerToInt64(result, &value)); | 6153 EXPECT_VALID(Dart_IntegerToInt64(result, &value)); |
5567 EXPECT_EQ(0, value); | 6154 EXPECT_EQ(0, value); |
5568 } | 6155 } |
5569 | 6156 |
5570 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). | 6157 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). |
5571 | 6158 |
5572 } // namespace dart | 6159 } // namespace dart |
OLD | NEW |