23c310a5bc28236d413f3f64e4f23f871c6fb7d5
[zcpointer.git] / test.cc
1 // Copyright 2016 Google Inc. All rights reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include <iostream>
16
17 #include "zcpointer.h"
18
19 class C {
20 public:
21 ~C() {
22 std::cout << "~C" << std::endl;
23 }
24
25 void DoThing() {
26 std::cout << "DoThing" << std::endl;
27 }
28 };
29
30 void TestReset() {
31 zc::owned<C> c(new C());
32 zc::ref<C> owned = c.get();
33 zc::ref<C> owned2 = owned;
34 c.reset();
35 owned2->DoThing();
36 }
37
38 template <typename T>
39 void TestUnwrap() {
40 zc::owned<T> t(new T());
41 //T* unwrap = t.get();
42
43 zc::ref<T> ref = t.get();
44 T* unwrap2 = ref;
45 }
46
47 void TestMove() {
48 zc::owned<C> c(new C());
49 zc::ref<C> owned = c.get();
50
51 zc::owned<C> c2(std::move(c));
52 owned->DoThing();
53
54 c2.reset();
55 owned->DoThing();
56 }
57
58 void PtrHelper(zc::ref<C>* out) {
59 zc::owned<C> c(new C());
60 *out = c.get();
61 }
62
63 void TestPtr() {
64 zc::ref<C> ref;
65 PtrHelper(&ref);
66 ref->DoThing();
67 }
68
69 #define TEST_FUNC(fn) { #fn , Test##fn }
70
71 int main() {
72 struct {
73 const char* name;
74 void (*test)();
75 } kTests[] = {
76 TEST_FUNC(Reset),
77 TEST_FUNC(Move),
78 TEST_FUNC(Ptr),
79 };
80
81 for (const auto& test : kTests) {
82 std::cout << "=== BEGIN " << test.name << " ===" << std::endl;
83 try {
84 test.test();
85 std::cout << "=== FAIL " << test.name
86 << ": Did not receive UseAfterFreeException ===" << std::endl;
87 } catch (zc::UseAfterFreeError) {
88 std::cout << "=== PASS " << test.name << " ===" << std::endl;
89 }
90 }
91 }