1
/* -*- mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2010 Pawel Blokus
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23
#include <boost/shared_ptr.hpp>
26
#include <gtest/gtest.h>
27
#include <drizzled/item.h>
28
#include <drizzled/session.h>
29
#include <drizzled/sql_string.h>
30
#include <drizzled/temporal_interval.h>
31
#include <drizzled/plugin/listen.h>
33
#include "temporal_generator.h"
35
using namespace drizzled;
37
class ItemStub : public Item
39
ItemStub(Session *fake_session) : Item(fake_session, this)
41
string_to_return= NULL;
46
String *string_to_return;
49
static boost::shared_ptr<ItemStub> get_item_stub(Session *fake_session)
51
boost::shared_ptr<ItemStub> result(new ItemStub(fake_session));
55
virtual enum Type type() const { return FIELD_ITEM; };
56
virtual double val_real() { return 0; };
57
virtual int64_t val_int() { return int_to_return; };
58
virtual String *val_str(String *str)
61
return string_to_return;
63
virtual my_decimal *val_decimal(my_decimal *decimal_buffer)
65
(void) decimal_buffer;
70
class TemporalIntervalTest : public ::testing::Test
73
String string_to_return;
76
boost::shared_ptr<ItemStub> item;
77
TemporalInterval interval;
78
Session *fake_session;
80
plugin::Client *fake_client;
84
fake_client= plugin::Listen::getNullClient();
85
fake_session= new Session(fake_client);
86
fake_session->thread_stack= (char*) &fake_session;
87
fake_session->initGlobals();
88
item= ItemStub::get_item_stub(fake_session);
91
/*28 for full date and time format with sign*/
92
string_to_return.alloc(28);
94
item->string_to_return= &string_to_return;
95
item->int_to_return= 0;
96
item->null_value= false;
100
TEST_F(TemporalIntervalTest, initFromItem_intervalWeek)
103
item->string_to_return->set_ascii(string, strlen(string));
104
item->int_to_return= 30;
106
interval.initFromItem(item.get(), INTERVAL_WEEK, &buffer);
108
ASSERT_EQ(210, interval.get_day());
111
TEST_F(TemporalIntervalTest, initFromItem_intervalDayMicrosecond)
113
char string[]= "7 12:45:19.777";
114
item->string_to_return->set_ascii(string, strlen(string));
116
interval.initFromItem(item.get(), INTERVAL_DAY_MICROSECOND, &buffer);
118
EXPECT_EQ(7, interval.get_day());
119
EXPECT_EQ(12, interval.get_hour());
120
EXPECT_EQ(45, interval.get_minute());
121
EXPECT_EQ(19, interval.get_second());
122
EXPECT_EQ(777000, interval.get_second_part());
125
TEST_F(TemporalIntervalTest, initFromItem_intervalDayMicrosecond_tooFewArguments_shouldOmitHighEndItems)
127
char string[]= "45:19.777";
128
item->string_to_return->set_ascii(string, strlen(string));
130
interval.initFromItem(item.get(), INTERVAL_DAY_MICROSECOND, &buffer);
132
EXPECT_EQ(0, interval.get_day());
133
EXPECT_EQ(0, interval.get_hour());
134
EXPECT_EQ(45, interval.get_minute());
135
EXPECT_EQ(19, interval.get_second());
136
EXPECT_EQ(777000, interval.get_second_part());
140
TEST(TemporalIntervalAddDateTest, addDate_positiveDayMicrosecond)
142
DRIZZLE_TIME drizzle_time= {1990, 3, 25, 15, 5, 16, 876543, false, DRIZZLE_TIMESTAMP_DATETIME};
143
TemporalInterval *interval= TemporalGenerator::TemporalIntervalGen::make_temporal_interval(
144
0, 0, 6, 13, 54, 3, 435675, false);
146
interval->addDate(&drizzle_time, INTERVAL_DAY_MICROSECOND);
148
EXPECT_EQ(1990, drizzle_time.year);
149
EXPECT_EQ(4, drizzle_time.month);
150
EXPECT_EQ(1, drizzle_time.day);
151
EXPECT_EQ(4, drizzle_time.hour);
152
EXPECT_EQ(59, drizzle_time.minute);
153
EXPECT_EQ(20, drizzle_time.second);
154
EXPECT_EQ(312218, drizzle_time.second_part);
157
TEST(TemporalIntervalAddDateTest, addDate_negativeDayMicrosecond)
159
DRIZZLE_TIME drizzle_time= {1990, 4, 1, 4, 59, 20, 312218, false, DRIZZLE_TIMESTAMP_DATETIME};
160
TemporalInterval *interval= TemporalGenerator::TemporalIntervalGen::make_temporal_interval(
161
0, 0, 6, 13, 54, 3, 435675, true);
163
interval->addDate(&drizzle_time, INTERVAL_DAY_MICROSECOND);
165
EXPECT_EQ(1990, drizzle_time.year);
166
EXPECT_EQ(3, drizzle_time.month);
167
EXPECT_EQ(25, drizzle_time.day);
168
EXPECT_EQ(15, drizzle_time.hour);
169
EXPECT_EQ(5, drizzle_time.minute);
170
EXPECT_EQ(16, drizzle_time.second);
171
EXPECT_EQ(876543, drizzle_time.second_part);
174
TEST(TemporalIntervalAddDateTest, addDate_positiveDayMicrosecond_shouldCountLeapDayToo)
176
DRIZZLE_TIME drizzle_time= {2004, 2, 25, 15, 5, 16, 876543, false, DRIZZLE_TIMESTAMP_DATETIME};
177
TemporalInterval *interval= TemporalGenerator::TemporalIntervalGen::make_temporal_interval(
178
0, 0, 6, 13, 54, 3, 435675, false);
180
interval->addDate(&drizzle_time, INTERVAL_DAY_MICROSECOND);
182
EXPECT_EQ(2004, drizzle_time.year);
183
EXPECT_EQ(3, drizzle_time.month);
184
EXPECT_EQ(3, drizzle_time.day);
185
EXPECT_EQ(4, drizzle_time.hour);
186
EXPECT_EQ(59, drizzle_time.minute);
187
EXPECT_EQ(20, drizzle_time.second);
188
EXPECT_EQ(312218, drizzle_time.second_part);
191
TEST(TemporalIntervalAddDateTest, addDate_negativeWeek)
193
DRIZZLE_TIME drizzle_time= {1998, 1, 25, 0, 0, 0, 0, false, DRIZZLE_TIMESTAMP_DATE};
194
TemporalInterval *interval= TemporalGenerator::TemporalIntervalGen::make_temporal_interval(
195
0, 0, 28, 0, 0, 0, 0, true);
197
interval->addDate(&drizzle_time, INTERVAL_WEEK);
199
EXPECT_EQ(1997, drizzle_time.year);
200
EXPECT_EQ(12, drizzle_time.month);
201
EXPECT_EQ(28, drizzle_time.day);
204
TEST(TemporalIntervalAddDateTest, addDate_addPositiveYearToLeapDay)
206
DRIZZLE_TIME drizzle_time= {2004, 2, 29, 0, 0, 0, 0, false, DRIZZLE_TIMESTAMP_DATE};
207
TemporalInterval *interval= TemporalGenerator::TemporalIntervalGen::make_temporal_interval(
208
5, 0, 0, 0, 0, 0, 0, false);
210
interval->addDate(&drizzle_time, INTERVAL_YEAR);
212
EXPECT_EQ(2009, drizzle_time.year);
213
EXPECT_EQ(2, drizzle_time.month);
214
EXPECT_EQ(28, drizzle_time.day);
217
TEST(TemporalIntervalAddDateTest, addDate_addOneMonthToLastDayInMonth_shouldChangeToProperLastDay)
219
DRIZZLE_TIME drizzle_time= {2004, 7, 31, 0, 0, 0, 0, false, DRIZZLE_TIMESTAMP_DATE};
220
TemporalInterval *interval= TemporalGenerator::TemporalIntervalGen::make_temporal_interval(
221
0, 2, 0, 0, 0, 0, 0, false);
223
interval->addDate(&drizzle_time, INTERVAL_MONTH);
225
EXPECT_EQ(2004, drizzle_time.year);
226
EXPECT_EQ(9, drizzle_time.month);
227
EXPECT_EQ(30, drizzle_time.day);