1/***********************************************************************************
2  test_deque.cpp
3
4 * Copyright (c) 1997
5 * Mark of the Unicorn, Inc.
6 *
7 * Permission to use, copy, modify, distribute and sell this software
8 * and its documentation for any purpose is hereby granted without fee,
9 * provided that the above copyright notice appear in all copies and
10 * that both that copyright notice and this permission notice appear
11 * in supporting documentation.  Mark of the Unicorn makes no
12 * representations about the suitability of this software for any
13 * purpose.  It is provided "as is" without express or implied warranty.
14
15***********************************************************************************/
16
17#include "Tests.h"
18# if defined (EH_NEW_HEADERS)
19#  ifdef __SUNPRO_CC
20#   include <stdio.h>
21#  else
22#   include <cstdio>
23#  endif
24#  include <deque>
25# else
26#  include <stdio.h>
27#  include <deque.h>
28# endif
29#include "TestClass.h"
30#include "LeakCheck.h"
31#include "test_construct.h"
32#include "test_assign_op.h"
33#include "test_push_back.h"
34#include "test_insert.h"
35#include "test_push_front.h"
36
37typedef TestClass DQTestClass;
38
39typedef EH_STD::deque<DQTestClass, eh_allocator(DQTestClass) > TestDeque;
40
41inline sequence_container_tag
42container_category(const TestDeque&)
43{
44  return sequence_container_tag();
45}
46
47void test_deque()
48{
49    size_t dequeSize = random_number(random_base);
50    TestDeque emptyDeque;
51    TestDeque testDeque, testDeque2;
52    while ( testDeque.size() < dequeSize )
53    {
54        DQTestClass x;
55        testDeque.push_back( x );
56        testDeque2.push_back( DQTestClass() );
57    }
58
59    ConstCheck( testDeque, test_copy_construct<TestDeque>() );
60    WeakCheck( testDeque, test_insert_one<TestDeque>(testDeque) );
61    StrongCheck( testDeque, test_insert_one<TestDeque>(testDeque, 0) );
62    StrongCheck( testDeque, test_insert_one<TestDeque>(testDeque, (int)testDeque.size()) );
63
64    WeakCheck( testDeque, test_insert_n<TestDeque>(testDeque, random_number(random_base) ) );
65    StrongCheck( testDeque, test_insert_n<TestDeque>(testDeque, random_number(random_base), 0 ) );
66    StrongCheck( testDeque, test_insert_n<TestDeque>(testDeque, random_number(random_base), (int)testDeque.size() ) );
67
68    size_t insCnt = random_number(random_base);
69    DQTestClass *insFirst = new TestDeque::value_type[insCnt + 1];
70
71    WeakCheck( testDeque, insert_range_tester(testDeque, insFirst, insFirst + insCnt) );
72    StrongCheck( testDeque, insert_range_at_begin_tester(testDeque, insFirst, insFirst + insCnt) );
73    StrongCheck( testDeque, insert_range_at_end_tester(testDeque, insFirst, insFirst + insCnt) );
74
75    ConstCheck( 0, test_construct_pointer_range<TestDeque>(insFirst, insFirst + insCnt) );
76    delete[] insFirst;
77
78    WeakCheck( testDeque, insert_range_tester(testDeque, testDeque2.begin(), testDeque2.end() ) );
79
80    StrongCheck( testDeque, test_push_back<TestDeque>(testDeque) );
81    StrongCheck( emptyDeque, test_push_back<TestDeque>(emptyDeque) );
82    StrongCheck( testDeque, test_push_front<TestDeque>(testDeque) );
83    StrongCheck( emptyDeque, test_push_front<TestDeque>(emptyDeque) );
84
85
86    ConstCheck( 0, test_default_construct<TestDeque>() );
87    ConstCheck( 0, test_construct_n<TestDeque>( random_number(random_base) ) );
88    ConstCheck( 0, test_construct_n_instance<TestDeque>( random_number(random_base) ) );
89    ConstCheck( 0, test_construct_iter_range<TestDeque>( testDeque2 ) );
90
91    testDeque2.resize( testDeque.size() * 3 / 2 );
92    WeakCheck( testDeque, test_assign_op<TestDeque>( testDeque2 ) );
93    testDeque2.resize( testDeque.size() * 2 / 3 );
94    WeakCheck( testDeque, test_assign_op<TestDeque>( testDeque2 ) );
95}
96