00001
00007 #include "Utilitarios/data.H"
00008
00009 #include <ctime>
00010
00011 using namespace std;
00012
00013
00014 string Utilitarios::nomes_dos_meses[numero_total_de_meses + 1] = {
00015 "",
00016 "Janeiro",
00017 "Fevereiro",
00018 "Março",
00019 "Abril",
00020 "Maio",
00021 "Junho",
00022 "Julho",
00023 "Agosto",
00024 "Setembro",
00025 "Outubro",
00026 "Novembro",
00027 "Dezembro"
00028 };
00029
00030
00031 string Utilitarios::nomes_dos_dias_da_semana[numero_total_de_dias_da_semana] ={
00032 "Domingo",
00033 "segunda-feira",
00034 "terça-feira",
00035 "quarta-feira",
00036 "quinta-feira",
00037 "sexta-feira",
00038 "Sábado"
00039 };
00040
00041
00042 istream& Utilitarios::operator>>(istream& entrada, Mes& mes)
00043 {
00044 string nome_do_mes;
00045 entrada >> nome_do_mes;
00046
00047 for(int i = 0; i != numero_total_de_meses; ++i)
00048 if(nomes_dos_meses[i] == nome_do_mes) {
00049 mes = Mes(i);
00050
00051 return entrada;
00052 }
00053
00054 entrada.clear(ios_base::failbit);
00055
00056 return entrada;
00057 }
00058
00059 std::istream& Utilitarios::operator>>(std::istream& entrada,
00060 DiaDaSemana& dia_da_semana)
00061 {
00062 string nome_do_dia;
00063 entrada >> nome_do_dia;
00064
00065 for(int i = 0; i != numero_total_de_dias_da_semana; ++i)
00066 if(nomes_dos_dias_da_semana[i] == nome_do_dia) {
00067 dia_da_semana = DiaDaSemana(i);
00068 return entrada;
00069 }
00070
00071 entrada.clear(ios_base::failbit);
00072
00073 return entrada;
00074 }
00075
00076 Utilitarios::Data Utilitarios::Data::actual()
00077 {
00078 if(data_actual_obtida_do_sistema) {
00079 time_t aux = time(0);
00080 tm tempo_actual = *localtime(&aux);
00081
00082 return Data(1900 + tempo_actual.tm_year,
00083 Mes(tempo_actual.tm_mon + 1),
00084 tempo_actual.tm_mday);
00085 } else
00086 while(true) {
00087 cout << "Introduza a data actual (ano mes dia): ";
00088 Data data;
00089 cin >> data;
00090 if(cin.good())
00091 return data;
00092
00093 cin >> ill;
00094 cout << "Data errada." << endl;
00095 }
00096 }
00097
00098 #ifdef _STLP_IOSTREAM
00099
00100 namespace {
00101 istream& ws(istream& entrada)
00102 {
00103 char caractere;
00104 do
00105 entrada.get(caractere);
00106 while(entrada.good() and isspace(caractere));
00107
00108 if(entrada.good())
00109 entrada.putback(caractere);
00110
00111 return entrada;
00112 }
00113 }
00114 #endif
00115
00116 std::istream& Utilitarios::operator>>(std::istream& entrada, Data& data)
00117 {
00118 Ano ano;
00119 int mes;
00120 Dia dia;
00121
00122 entrada >> ano >> ws;
00123
00124 if(ano < Data::ano_minimo) {
00125 entrada.clear(ios_base::failbit);
00126
00127 return entrada;
00128 }
00129
00130 if(entrada.peek() == '/')
00131 entrada.get();
00132
00133 entrada >> mes >> ws;
00134
00135 if(mes < 1 or numero_total_de_meses < mes) {
00136 entrada.clear(ios_base::failbit);
00137
00138 return entrada;
00139 }
00140
00141 if(entrada.peek() == '/')
00142 entrada.get();
00143
00144 entrada >> dia;
00145
00146 if(dia < 0 or dia > numeroDeDiasEm(Mes(mes), ano)) {
00147 entrada.clear(ios_base::failbit);
00148
00149 return entrada;
00150 }
00151
00152 if(entrada)
00153 data = Data(ano, Mes(mes), dia);
00154
00155 return entrada;
00156 }
00157
00158 bool Utilitarios::Data::data_actual_obtida_do_sistema = true;
00159
00160
00161 #ifdef TESTE
00162
00163 #include <fstream>
00164
00165 using namespace Utilitarios;
00166
00167 void testaMes()
00168 {
00169 Mes mes = janeiro;
00170
00171 assert(numero_total_de_meses == 12);
00172
00173 mes += 13;
00174
00175 assert(mes == fevereiro);
00176
00177 --mes;
00178
00179 assert(mes == janeiro);
00180
00181 mes--;
00182
00183 assert(mes == dezembro);
00184
00185 ++mes;
00186
00187 Mes outro_mes = mes++;
00188
00189 assert(mes == fevereiro);
00190
00191 assert(outro_mes == janeiro);
00192
00193 outro_mes -= 13;
00194
00195 assert(outro_mes == dezembro);
00196
00197 assert(outro_mes + 25 == janeiro);
00198
00199 assert(outro_mes + -25 == novembro);
00200
00201 assert(outro_mes - 25 == novembro);
00202
00203 assert(mes - outro_mes == 2);
00204
00205 ofstream saida("data.lixo");
00206 saida << mes << endl;
00207 saida.close();
00208
00209 ifstream entrada("data.lixo");
00210 entrada >> outro_mes;
00211
00212 assert(outro_mes == mes);
00213
00214 assert(numeroDeDiasEm(dezembro, 2000) == 31);
00215
00216 assert(numeroDeDiasEm(fevereiro, 2000) == 29);
00217
00218 assert(numeroDeDiasEm(fevereiro, 1900) == 28);
00219
00220 assert(numeroDeDiasEm(fevereiro, 1996) == 29);
00221 }
00222
00223 void testaDiaDaSemana()
00224 {
00225 DiaDaSemana dia = segunda_feira;
00226
00227 assert(numero_total_de_dias_da_semana == 7);
00228
00229 dia += 8;
00230
00231 assert(dia == terca_feira);
00232
00233 --dia;
00234
00235 assert(dia == segunda_feira);
00236
00237 dia--;
00238
00239 assert(dia == domingo);
00240
00241 ++dia;
00242 DiaDaSemana outro_dia = dia++;
00243
00244 assert(dia == terca_feira);
00245
00246 assert(outro_dia == segunda_feira);
00247
00248 outro_dia -= 8;
00249
00250 assert(outro_dia == domingo);
00251
00252 assert(outro_dia + 15 == segunda_feira);
00253
00254 assert(outro_dia + -15 == sabado);
00255
00256 assert(outro_dia - 15 == sabado);
00257
00258 assert(dia - outro_dia == 2);
00259
00260 ofstream saida("data.lixo");
00261 saida << dia << endl;
00262 saida.close();
00263
00264 ifstream entrada("data.lixo");
00265 entrada >> outro_dia;
00266
00267 assert(outro_dia == dia);
00268 }
00269
00270 void testaData()
00271 {
00272 Data data(1965, setembro, 14);
00273
00274 assert(data.ano() == 1965);
00275
00276 assert(data.mes() == setembro);
00277
00278 assert(data.dia() == 14);
00279
00280 assert(data == Data(1965, setembro, 14));
00281
00282 assert(not (data != Data(1965, setembro, 14)));
00283
00284 Data outra_data = data + 12983;
00285
00286 assert(outra_data == Data(2001, abril, 1));
00287
00288 ofstream saida;
00289
00290 saida.open("data.lixo");
00291 saida << data << endl;
00292 saida.close();
00293
00294 ifstream entrada;
00295
00296 entrada.open("data.lixo");
00297 entrada >> outra_data;
00298 entrada.close();
00299
00300 assert(outra_data == data);
00301
00302 outra_data = data + 12983;
00303
00304 saida.open("data.lixo");
00305 data.guardaEm(saida);
00306 outra_data.guardaEm(saida);
00307 saida.close();
00308
00309 entrada.open("data.lixo");
00310 Data data_lida(entrada);
00311
00312 assert(data_lida == data);
00313
00314 data.carregaDe(entrada);
00315 entrada.close();
00316
00317 assert(data == outra_data);
00318
00319 Data data_de_transicao(1999, dezembro, 31);
00320
00321 ++data_de_transicao;
00322
00323 assert(data_de_transicao == Data(2000, janeiro, 1));
00324
00325 --data_de_transicao;
00326
00327 assert(data_de_transicao == Data(1999, dezembro, 31));
00328
00329 Data anterior = data_de_transicao++;
00330
00331 assert(data_de_transicao == Data(2000, janeiro, 1));
00332
00333 assert(anterior == Data(1999, dezembro, 31));
00334
00335 anterior = data_de_transicao--;
00336
00337 assert(data_de_transicao == Data(1999, dezembro, 31));
00338
00339 assert(anterior == Data(2000, janeiro, 1));
00340
00341 assert(anterior.anoEBissexto());
00342
00343 assert(not data_de_transicao.anoEBissexto());
00344
00345 Data data_juliana(2452001);
00346
00347 assert(data_juliana == Data(2001, abril, 1));
00348
00349 assert(data_juliana.diaDaSemana() == domingo);
00350
00351 --data_juliana;
00352
00353 assert(data_juliana == Data(2001, marco, 31));
00354
00355 assert(data_juliana.diaDaSemana() == sabado);
00356
00357 Data para_juliana(2001, abril, 1);
00358
00359 assert(para_juliana.diaJuliano() == 2452001);
00360
00361 Data nao_bissexto(1900, fevereiro, 1);
00362
00363 assert(not nao_bissexto.anoEBissexto());
00364
00365 Data bissexto(1904, fevereiro, 1);
00366
00367 assert(bissexto.anoEBissexto());
00368
00369 assert(nao_bissexto.numeroDeDiasNoMes() == 28 or
00370 bissexto.numeroDeDiasNoMes() == 29);
00371
00372 data = Data(1965, setembro, 14);
00373 outra_data = data;
00374
00375 outra_data += 12983;
00376
00377 assert(outra_data == Data(2001, abril, 1));
00378
00379 outra_data -= 12983;
00380
00381 assert(outra_data == Data(1965, setembro, 14));
00382 }
00383
00384 int main()
00385 {
00386 testaMes();
00387 testaDiaDaSemana();
00388 testaData();
00389 }
00390
00391 #endif