1 /*++
2 Copyright (c) 2006 Microsoft Corporation
3 
4 Module Name:
5 
6     tst_optional.cpp
7 
8 Abstract:
9 
10     Test optional module
11 
12 Author:
13 
14     Leonardo de Moura (leonardo) 2006-09-29.
15 
16 Revision History:
17 
18 --*/
19 #include "util/trace.h"
20 #include "util/debug.h"
21 #include "util/memory_manager.h"
22 #include "util/optional.h"
23 
tst1()24 static void tst1() {
25     optional<int> v;
26     ENSURE(!v);
27     ENSURE(v == false);
28     v = 10;
29     ENSURE(v);
30     ENSURE(*v == 10);
31     TRACE("optional", tout << sizeof(v) << "\n";);
32 }
33 
34 struct OptFoo {
35     int m_x;
36     int m_y;
37 
OptFooOptFoo38     OptFoo(int x, int y):m_x(x), m_y(y) {
39     TRACE("optional", tout << "OptFoo created: " << m_x << " : " << m_y << "\n";);
40     }
41 
~OptFooOptFoo42     ~OptFoo() {
43     TRACE("optional", tout << "OptFoo deleted: " << m_x << " : " << m_y << "\n";);
44     }
45 };
46 
tst2()47 static void tst2() {
48     optional<OptFoo> v;
49     ENSURE(!v);
50     v = OptFoo(10, 20);
51     ENSURE(v->m_x == 10);
52     ENSURE(v->m_y == 20);
53     v = OptFoo(200, 300);
54     ENSURE(v->m_x == 200);
55     ENSURE(v->m_y == 300);
56     TRACE("optional", tout << sizeof(v) << "\n";);
57 }
58 
tst3()59 static void tst3() {
60     optional<int *> v;
61     ENSURE(!v);
62     int x = 10;
63     v = &x;
64     ENSURE(v);
65     ENSURE(*v == &x);
66     TRACE("optional", tout << sizeof(v) << "\n";);
67     ENSURE(*(*v) == 10);
68 }
69 
tst_optional()70 void tst_optional() {
71     tst1();
72     tst2();
73     tst3();
74 }
75 
76