ptr.test.cc

Go to the documentation of this file.
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 : */

Generated on Mon Feb 12 18:23:11 2007 for lestes by doxygen 1.5.1-20070107