1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/***********************************************************************************
2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  test_construct.h
3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1997
5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Mark of the Unicorn, Inc.
6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to use, copy, modify, distribute and sell this software
8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * and its documentation for any purpose is hereby granted without fee,
9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * provided that the above copyright notice appear in all copies and
10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * that both that copyright notice and this permission notice appear
11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * in supporting documentation.  Mark of the Unicorn makes no
12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * representations about the suitability of this software for any
13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * purpose.  It is provided "as is" without express or implied warranty.
14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott***********************************************************************************/
16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef test_construct_H_
17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#define test_construct_H_
18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "Prefix.h"
20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (EH_NEW_HEADERS)
21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <algorithm>
22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <cassert>
23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <cstdlib>
24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <algo.h>
26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <assert.h>
27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <stdlib.h>
28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick ScottUSING_CSTD_NAME(size_t)
31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class T>
33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstruct test_copy_construct {
34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  test_copy_construct() {
35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    gTestController.SetCurrentTestName("copy constructor");
36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void operator()( const T& t ) const {
39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    T aCopy( t );
40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // Prevent simulated failures during verification
41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    gTestController.CancelFailureCountdown();
42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    //EH_ASSERT( aCopy == t );
43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CheckInvariant(t);
44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class T>
48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstruct test_default_construct {
49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  test_default_construct() {
50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    gTestController.SetCurrentTestName("default constructor");
51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void operator()( int ) const {
54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    T t;
55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CheckInvariant(t);
56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class T>
60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstruct test_construct_n {
61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  test_construct_n( size_t _n ) : n(_n+1) {
62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    gTestController.SetCurrentTestName("n-size constructor");
63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void operator()( int ) const {
66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    T t(n);
67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CheckInvariant(t);
68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_t n;
71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class T>
74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstruct test_construct_n_instance {
75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  test_construct_n_instance( size_t _n ) : n(_n+1) {
76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    gTestController.SetCurrentTestName("n-size with instance constructor");
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void operator()( int ) const {
80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typedef typename T::value_type Value_type;
81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    Value_type Val = 0;
82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    T t( n, Val );
83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CheckInvariant(t);
84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_t n;
87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class T>
90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstruct test_construct_pointer_range {
91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  test_construct_pointer_range( const typename T::value_type *first,
92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                const typename T::value_type* last )
93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : fItems( first ), fEnd( last ) {
94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    gTestController.SetCurrentTestName("pointer range constructor");
95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void operator()( int ) const {
98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    T t( fItems, fEnd );
99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // Prevent simulated failures during verification
100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    gTestController.CancelFailureCountdown();
101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CheckInvariant(t);
102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  const typename T::value_type* fItems, *fEnd;
105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class T>
108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstruct test_construct_iter_range {
109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  test_construct_iter_range( const T& src ) : fItems( src ) {
111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    gTestController.SetCurrentTestName("iterator range constructor");
112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void operator()( int ) const {
115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    T t( fItems.begin(), fItems.end() );
116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // Prevent simulated failures during verification
117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    gTestController.CancelFailureCountdown();
118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    EH_ASSERT( t == fItems );
119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CheckInvariant(t);
120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  const T& fItems;
123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif // test_construct_H_
126