/* * vdr-vodcatcher - A plugin for the Linux Video Disk Recorder * Copyright (c) 2007 - 2009 Tobias Grimm * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ #include #include "RefPtr.h" #include "StringMessageMock.h" using namespace std; class Foo : public StringMessageMock { public: Foo() { } Foo(StringMessageMock& parent, string messagePrefix = "") : StringMessageMock(parent, messagePrefix) { } ~Foo() { AddMethod("dtor"); } int Bar(int arg) { return arg; } }; class RefPtrTest : public CxxTest::TestSuite { public: void TestEmptyPtr() { RefPtr ptr; } void TestSingleReference() { StringMessageMock mock; Foo* foo = new Foo(mock); mock.ExpectMethod("dtor"); RefPtr* ref = new RefPtr(foo); delete ref; mock.Verify(); } void TestGet() { Foo* foo = new Foo(); RefPtr ref(foo); TS_ASSERT_EQUALS(foo, ref.get()); } void TestPointerOperator() { Foo* foo = new Foo(); RefPtr ref(foo); TS_ASSERT_EQUALS(10, ref->Bar(10)); } void TestAstersikOperator() { Foo* foo = new Foo(); RefPtr ref(foo); TS_ASSERT_EQUALS(10, (*ref).Bar(10)); } void TestMultipleReferences() { StringMessageMock mock; Foo* foo = new Foo(mock); RefPtr* ref1 = new RefPtr(foo); RefPtr* ref2 = new RefPtr(*ref1); RefPtr* ref3 = new RefPtr(*ref2); delete ref1; mock.Verify(); delete ref3; mock.Verify(); mock.ExpectMethod("dtor"); delete ref2; mock.Verify(); } void TestAssignmentOperator() { StringMessageMock mock; Foo* foo1 = new Foo(mock, "foo1"); Foo* foo2 = new Foo(mock, "foo2"); RefPtr* ref1 = new RefPtr(foo1); RefPtr* ref2 = new RefPtr(foo2); mock.ExpectMethod("foo2:dtor"); *ref2 = *ref1; mock.Verify(); TS_ASSERT_EQUALS(foo1, ref2->get()); mock.ResetMock(); mock.ExpectMethod("foo1:dtor"); delete ref1; delete ref2; mock.Verify(); } void TestConstAssignment() { StringMessageMock mock; Foo* foo1 = new Foo(mock, "foo1"); Foo* foo2 = new Foo(mock, "foo2"); const RefPtr* ref1 = new RefPtr(foo1); RefPtr* ref2 = new RefPtr(foo2); mock.ExpectMethod("foo2:dtor"); *ref2 = *ref1; mock.Verify(); TS_ASSERT_EQUALS(foo1, ref2->get()); mock.ResetMock(); mock.ExpectMethod("foo1:dtor"); delete ref1; delete ref2; mock.Verify(); } void TestSelfAssignment() { StringMessageMock mock; RefPtr ref1(new Foo(mock)); ref1 = ref1; mock.Verify(); } void TestPointerAssignment() { StringMessageMock mock; Foo* foo1 = new Foo(mock, "foo1"); RefPtr ref(foo1); mock.ExpectMethod("foo1:dtor"); Foo* foo2 = new Foo(mock, "foo2"); ref = foo2; mock.Verify(); TS_ASSERT_EQUALS(foo2, ref.get()); } void TestPointerselfAssignment() { StringMessageMock mock; Foo* foo = new Foo(mock); RefPtr ref(foo); ref = foo; mock.Verify(); } void TestIncompletType() { // To some extend, imcomplete types can be handled as Alan Griffiths // dscribes in: http://www.octopull.demon.co.uk/arglib/TheGrin.html // // Unfortunately, I have absolutely no idea, how to write a test // case for this. So just watch the compiler warnings about // not beeing able to delete an incomplete type! } void TestConversionToConst() { RefPtr nonConstContent(new int(99)); RefPtr constContent(nonConstContent); TS_ASSERT_EQUALS(*nonConstContent, *constContent); } void TestIsAssigned() { RefPtr ptr; TS_ASSERT(!ptr.IsAssigned()); ptr = new int(3); TS_ASSERT(ptr.IsAssigned()); } };