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