00001 /* 00002 The lestes compiler suite 00003 Copyright (C) 2002, 2003, 2004, 2005 Miroslav Tichy 00004 Copyright (C) 2002, 2003, 2004, 2005 Petr Zika 00005 Copyright (C) 2002, 2003, 2004, 2005 Vojtech Hala 00006 Copyright (C) 2002, 2003, 2004, 2005 Jiri Kosina 00007 Copyright (C) 2002, 2003, 2004, 2005 Pavel Sanda 00008 Copyright (C) 2002, 2003, 2004, 2005 Jan Zouhar 00009 Copyright (C) 2002, 2003, 2004, 2005 Rudolf Thomas 00010 00011 This program is free software; you can redistribute it and/or modify 00012 it under the terms of the GNU General Public License as published by 00013 the Free Software Foundation; version 2 of the License. 00014 00015 This program is distributed in the hope that it will be useful, 00016 but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00018 GNU General Public License for more details. 00019 00020 See the full text of the GNU General Public License version 2, and 00021 the limitations in the file doc/LICENSE. 00022 00023 By accepting the license the licensee waives any and all claims 00024 against the copyright holder(s) related in whole or in part to the 00025 work, its use, and/or the inability to use it. 00026 00027 */ 00028 /*! \file 00029 Unit test for ptr class. 00030 \author pt 00031 */ 00032 #include <cstddef> 00033 #include <lestes/common.hh> 00034 00035 package(lestes); 00036 package(std); 00037 00038 class a: public object { 00039 public: 00040 ~a(void) {} 00041 static ptr<a> create(void) { 00042 return ptr<a>(new a()); 00043 } 00044 bool m(void) { return true; } 00045 int f; 00046 protected: 00047 a(void) {} 00048 private: 00049 a(const a &); 00050 a &operator=(const a &); 00051 }; 00052 00053 class aa: public a { 00054 public: 00055 ~aa(void) {} 00056 static ptr<aa> create(void) { 00057 return ptr<aa>(new aa()); 00058 } 00059 protected: 00060 aa(void) {} 00061 private: 00062 aa(const aa &); 00063 a &operator=(const aa &); 00064 }; 00065 00066 class s: public object { 00067 public: 00068 ~s(void) {} 00069 static ptr<s> create(const ptr<a> &a_fa, const ptr<aa> &a_faa) { 00070 return ptr<s>(new s(a_fa,a_faa)); 00071 } 00072 srp<a> fa; 00073 srp<aa> faa; 00074 void gc_mark(void); 00075 private: 00076 s(const ptr<a> &a_fa, const ptr<aa> &a_faa): fa(a_fa), faa(a_faa) {} 00077 s(const s &); 00078 s &operator=(const s &); 00079 }; 00080 00081 void s::gc_mark(void) 00082 { 00083 fa.gc_mark(); 00084 faa.gc_mark(); 00085 object::gc_mark(); 00086 } 00087 00088 void ptr_test(void) 00089 { 00090 // constructor with NULL 00091 ptr<a> a0(NULL); 00092 lassert(!a0); 00093 lassert(!(a0)); 00094 lassert(!(a0 != a0)); 00095 lassert(a0 == a0); 00096 lassert(a0 == ptr<a>(NULL)); 00097 00098 // default constructor 00099 ptr<a> a1; 00100 lassert(!a1); 00101 lassert(!(a1)); 00102 lassert(!(a1 != a1)); 00103 lassert(a1 == a1); 00104 lassert(a1 == ptr<a>(NULL)); 00105 00106 // constructor with pointer 00107 ptr<a> a2(a::create()); 00108 ptr<a> a3(a2.pointer_get()); 00109 lassert(a3); 00110 lassert(!(!a3)); 00111 lassert(a3 != ptr<a>(NULL)); 00112 lassert(a3 != a1); 00113 lassert(a1 != a3); 00114 lassert(a3 == a3); 00115 lassert(a3 == a2.pointer_get()); 00116 00117 // constructor with pointer to descendant 00118 ptr<aa> aa1(aa::create()); 00119 lassert(aa1); 00120 lassert(aa1->m()); 00121 ptr<a> a4(aa1.pointer_get()); 00122 lassert(a4 != ptr<a>(NULL)); 00123 lassert(a4 != a2); 00124 lassert(a2 != a4); 00125 lassert(a4 == a4); 00126 lassert(a4 == aa1.pointer_get()); 00127 00128 // constructor with ptr 00129 ptr<a> a5(a4); 00130 lassert(a5 != ptr<a>(NULL)); 00131 lassert(a5 != a2); 00132 lassert(a2 != a5); 00133 lassert(a5 == a5); 00134 lassert(a5 == a4); 00135 lassert(a4 == a5); 00136 lassert(a5 == a4.pointer_get()); 00137 00138 // constructor with ptr to descendant 00139 ptr<aa> aa2(aa::create()); 00140 ptr<a> a6(aa2); 00141 lassert(a6 != ptr<a>(NULL)); 00142 lassert(a6 != a2); 00143 lassert(a2 != a6); 00144 lassert(a6 == a6); 00145 lassert(a6 == aa2); 00146 00147 // constructor with srp 00148 ptr<s> s1(s::create(a3,aa1)); 00149 ptr<a> a7(s1->fa); 00150 lassert(a7 != ptr<a>(NULL)); 00151 lassert(a7 != a4); 00152 lassert(a4 != a7); 00153 lassert(a7 == a7); 00154 lassert(a7 == s1->fa); 00155 00156 // constructor with srp to descendant 00157 ptr<a> a8(s1->faa); 00158 lassert(a8 != ptr<a>(NULL)); 00159 lassert(a8 != a6); 00160 lassert(a6 != a8); 00161 lassert(a8 == a8); 00162 lassert(a8 == s1->faa); 00163 00164 // operator ->, operator * 00165 ptr<a> a9(a2); 00166 lassert(a9->m()); 00167 lassert(&(a9->f) == &(a2->f)); 00168 lassert(a9.operator->() == a2.operator->()); 00169 lassert(&((*a9).f) == &((*a2).f)); 00170 lassert(&(a9.operator*()) == &(a2.operator*())); 00171 00172 // assignment from pointer 00173 ptr<a> a10; 00174 a10 = a2.pointer_get(); 00175 lassert(a10 != ptr<a>(NULL)); 00176 lassert(a10 != a6); 00177 lassert(a6 != a10); 00178 lassert(a10 == a2); 00179 00180 // assignment from pointer to descendant 00181 ptr<a> a11; 00182 a11 = aa1.pointer_get(); 00183 lassert(a11 != ptr<a>(NULL)); 00184 lassert(a11 != a2); 00185 lassert(a2 != a11); 00186 lassert(a11 == aa1); 00187 00188 // assignment from ptr 00189 ptr<a> a12; 00190 a12 = a2; 00191 lassert(a12 != ptr<a>(NULL)); 00192 lassert(a12 != a6); 00193 lassert(a6 != a12); 00194 lassert(a12 == a2); 00195 00196 // assignment from ptr to descendant 00197 ptr<a> a13; 00198 a13 = aa1; 00199 lassert(a13 != ptr<a>(NULL)); 00200 lassert(a13 != a6); 00201 lassert(a6 != a13); 00202 lassert(a13 == aa1); 00203 00204 // assignment from srp 00205 ptr<a> a14; 00206 a14 = s1->fa; 00207 lassert(a14 != ptr<a>(NULL)); 00208 lassert(a14 != a6); 00209 lassert(a6 != a14); 00210 lassert(a14 == s1->fa); 00211 00212 // assignment from srp to descendant 00213 ptr<a> a15; 00214 a15= s1->faa; 00215 lassert(a15 != ptr<a>(NULL)); 00216 lassert(a15 != a6); 00217 lassert(a6 != a15); 00218 lassert(a15 == s1->faa); 00219 00220 // dynamic cast to proper type 00221 ptr<a> a16(aa::create()); 00222 ptr<aa> aa3; 00223 aa3 = a16.dncast<aa>(); 00224 lassert(aa3 != ptr<a>(NULL)); 00225 00226 // dynamic cast to improper type 00227 // it crashes as there is an assertion now. commented out by Rudo. 00228 #if 0 00229 ptr<a> a17(a::create()); 00230 aa3 = a17.dncast<aa>(); 00231 lassert(aa3 == ptr<a>(NULL)); 00232 #endif 00233 } 00234 00235 end_package(std); 00236 end_package(lestes); 00237 00238 int main(void) 00239 { 00240 ::lestes::std::ptr_test(); 00241 return 0; 00242 } 00243 00244 /* vim: set ft=lestes : */
1.5.1-20070107