~ubuntu-branches/ubuntu/lucid/pgadmin3/lucid-proposed

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
//////////////////////////////////////////////////////////////////////////
//
// pgScript - PostgreSQL Tools
// RCS-ID:      $Id: pgsTestGeneratorDateTime.cpp 8187 2010-02-25 21:54:35Z dpage $
// Copyright (C) 2002 - 2010, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////


#include "pgsTestSuite.h"

#include "pgscript/generators/pgsDateTimeGen.h"

void pgsTestSuite::test_generator_date_time(void)
{
	const int nb_iterations = 500;

	// Generate datetimes between 2008-01-01 01:00:00 and 2008-01-01 01:00:01
	{
		wxDateTime min, max;
		min.ParseDateTime(wxT("2008-01-01 01:00:00"));
		max.ParseDateTime(wxT("2008-01-01 01:00:01"));
		pgsDateTimeGen gen(min, max, false);
		TS_ASSERT(!gen.is_sequence());
		wxString result;
		for (int i = 0; i < nb_iterations; i++)
		{
			result = gen.random(); // Output is ISO formatted
			TS_ASSERT(result == wxT("2008-01-01 01:00:00")
					|| result == wxT("2008-01-01 01:00:01"));
		}
	}

	// Generate *unique* times
	{
		wxDateTime min, max;
		min.ParseDateTime(wxT("2008-03-01 05:00:00"));
		max.ParseDateTime(wxT("2008-03-01 05:30:00"));
		pgsDateTimeGen gen(min, max, true);
		TS_ASSERT(gen.is_sequence());
		wxString result;
		wxArrayString sav;
		for (long i = 0; i < max.Subtract(min).GetSeconds().ToLong() + 1; i++)
		{
			result = gen.random(); // Output is ISO formatted
			TS_ASSERT(sav.Index(result) == wxNOT_FOUND);
			sav.push_back(result);
		}
		TS_ASSERT(gen.random() == sav.Item(0));
	}
	
	// Generate times but min > max
	{
		wxDateTime min, max;
		min.ParseDateTime(wxT("2007-12-01 12:00:00"));
		max.ParseDateTime(wxT("2007-11-15 11:00:00"));
		pgsDateTimeGen gen(min, max, false);
		TS_ASSERT(!gen.is_sequence());
		for (int i = 0; i < nb_iterations; i++)
		{
			gen.random();
		}
	}

	// Test that two generators with same seed generate same values
	{
		wxDateTime min, max;
		min.ParseDateTime(wxT("2007-12-01 12:00:00"));
		max.ParseDateTime(wxT("2007-12-01 14:00:00"));
		pgsDateTimeGen gen(min, max, false, 123456789L);
		pgsDateTimeGen comparator(min, max, false, 123456789L);
		TS_ASSERT(!gen.is_sequence() && !comparator.is_sequence());
		for (int i = 0; i < nb_iterations; i++)
		{
			TS_ASSERT(gen.random() == comparator.random());
		}
	}

	// Same thing as previous with min > max and seed == 0
	// min and max must be swapped
	// seed must be set to one otherwise we would have zeros only
	{
		wxDateTime min, max;
		max.ParseDateTime(wxT("2007-12-01 14:00:00"));
		min.ParseDateTime(wxT("2007-12-01 12:00:00"));
		pgsDateTimeGen gen(min, max, true, 0);
		pgsDateTimeGen comparator(min, max, true, 0);
		TS_ASSERT(gen.is_sequence() && comparator.is_sequence());
		wxString result;
		wxArrayString sav;
		for (int i = 0; i < 120 * 60 + 1; i++)
		{
			result = gen.random();
			TS_ASSERT(result == comparator.random());
			TS_ASSERT(sav.Index(result) == wxNOT_FOUND);
			sav.push_back(result);
		}
	}

	// Test copy constructor
	{
		// Create a generator and generate values
		wxDateTime min, max;
		min.ParseDateTime(wxT("1970-12-01 12:00:00"));
		max.ParseDateTime(wxT("1970-12-01 15:00:00"));
		pgsDateTimeGen gen(min, max, false);
		TS_ASSERT(!gen.is_sequence());
		wxString result, res_cmp;
		for (int i = 0; i < nb_iterations / 2; i++)
		{
			result = gen.random();
		}
		
		// Copy this generator to a new one
		// Both generators must generate the same values
		pgsDateTimeGen comparator(gen);
		TS_ASSERT(!gen.is_sequence() && !comparator.is_sequence());
		for (int i = nb_iterations / 2; i < nb_iterations; i++)
		{
			result = gen.random();
			res_cmp = comparator.random();
			TS_ASSERT(result == res_cmp);
		}
	}

	// Test assignment operator
	{
		// Create two different generators and generate values
		wxDateTime min1, max1;
		min1.ParseDateTime(wxT("2007-12-01 12:00:00"));
		max1.ParseDateTime(wxT("2007-12-01 15:00:00"));
		pgsDateTimeGen gen(min1, max1, false);
		wxDateTime min2, max2;
		min2.ParseDateTime(wxT("1970-12-01 02:00:00"));
		max2.ParseDateTime(wxT("1970-12-01 22:00:00"));
		pgsDateTimeGen comparator(min2, max2, true);
		wxString result, res_cmp;
		for (int i = 0; i < nb_iterations / 2; i++)
		{
			result = gen.random();
			res_cmp = comparator.random();
		}
		
		// Copy one of the generators to the other one
		// Both generators must generate the same values
		comparator = gen;
		TS_ASSERT(!gen.is_sequence() && !comparator.is_sequence());
		for (int i = nb_iterations / 2; i < nb_iterations; i++)
		{
			result = gen.random();
			res_cmp = comparator.random();
			TS_ASSERT(result == res_cmp);
		}
	}
}