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
3// BSD-style license that can be found in the LICENSE file.
4
5#include "vm/class_finalizer.h"
6#include "platform/assert.h"
7#include "vm/symbols.h"
8#include "vm/unit_test.h"
9
10namespace dart {
11
12static ClassPtr CreateTestClass(const char* name) {
13 const String& class_name =
14 String::Handle(Symbols::New(Thread::Current(), name));
15 const Script& script = Script::Handle();
16 const Class& cls = Class::Handle(Class::New(
17 Library::Handle(), class_name, script, TokenPosition::kNoSource));
18 cls.set_interfaces(Object::empty_array());
19 cls.set_is_declaration_loaded();
20 cls.SetFunctions(Object::empty_array());
21 cls.SetFields(Object::empty_array());
22 return cls.raw();
23}
24
25ISOLATE_UNIT_TEST_CASE(ClassFinalizer) {
26 Zone* zone = thread->zone();
27 Isolate* isolate = thread->isolate();
28 ObjectStore* object_store = isolate->object_store();
29 const GrowableObjectArray& pending_classes =
30 GrowableObjectArray::Handle(zone, object_store->pending_classes());
31 GrowableArray<const Class*> classes_1;
32 classes_1.Add(&Class::Handle(CreateTestClass("BMW")));
33 pending_classes.Add(*classes_1[0]);
34 classes_1.Add(&Class::Handle(CreateTestClass("Porsche")));
35 pending_classes.Add(*classes_1[1]);
36
37 GrowableArray<const Class*> classes_2;
38 classes_2.Add(&Class::ZoneHandle(CreateTestClass("Ferrari")));
39 pending_classes.Add(*classes_2[0]);
40 classes_2.Add(&Class::ZoneHandle(CreateTestClass("Fiat")));
41 pending_classes.Add(*classes_2[1]);
42 classes_2.Add(&Class::ZoneHandle(CreateTestClass("Alfa")));
43 pending_classes.Add(*classes_2[2]);
44 EXPECT(ClassFinalizer::ProcessPendingClasses());
45 for (int i = 0; i < classes_1.length(); i++) {
46 EXPECT(classes_1[i]->is_type_finalized());
47 }
48 for (int i = 0; i < classes_2.length(); i++) {
49 EXPECT(classes_2[i]->is_type_finalized());
50 }
51 EXPECT(ClassFinalizer::AllClassesFinalized());
52 EXPECT(ClassFinalizer::ProcessPendingClasses());
53}
54
55} // namespace dart
56