RTBKit  0.9
Open-source framework to create real-time ad bidding systems.
soa/types/testing/date_test.cc
00001 /* date_test.cc
00002    Copyright (c) 2010 Datacratic.  All rights reserved.
00003 */
00004 
00005 #define BOOST_TEST_MAIN
00006 #define BOOST_TEST_DYN_LINK
00007 #include "soa/types/date.h"
00008 #include <boost/test/unit_test.hpp>
00009 #include "soa/jsoncpp/json.h"
00010 #include "jml/arch/format.h"
00011 #include "jml/utils/parse_context.h"
00012 #include "ace/Time_Value.h"
00013 
00014 using namespace std;
00015 using namespace ML;
00016 using namespace Datacratic;
00017 
00018 #if 0
00019 BOOST_AUTO_TEST_CASE(test_date_parse_iso8601)
00020 {
00021     // Issue PLAT-151 should fix this test
00022     BOOST_CHECK_NO_THROW(Date::parseIso8601("2012-12-20T14:57:57.187775+00:00")) ;
00023 }
00024 #endif
00025 BOOST_AUTO_TEST_CASE( test_microsecond_date )
00026 {
00027     Date d = Date::now();
00028     double x;
00029     BOOST_CHECK_GT(modf(d.secondsSinceEpoch(), &x), 0.000001);
00030 }
00031 
00032 BOOST_AUTO_TEST_CASE( test_quantize )
00033 {
00034     Date d = Date::fromSecondsSinceEpoch(0.1);
00035     BOOST_CHECK_EQUAL(d.quantized(1.0), Date::fromSecondsSinceEpoch(0.0));
00036     BOOST_CHECK_EQUAL(d.quantized(0.5), Date::fromSecondsSinceEpoch(0.0));
00037     BOOST_CHECK_EQUAL(d.quantized(0.2), Date::fromSecondsSinceEpoch(0.2));
00038     BOOST_CHECK_EQUAL(d.quantized(0.1), Date::fromSecondsSinceEpoch(0.1));
00039     BOOST_CHECK_EQUAL(d.quantized(0.05), Date::fromSecondsSinceEpoch(0.1));
00040     BOOST_CHECK_EQUAL(d.quantized(0.01), Date::fromSecondsSinceEpoch(0.1));
00041 
00042     d = Date::fromSecondsSinceEpoch(0.11);
00043     BOOST_CHECK_EQUAL(d.quantized(1.0), Date::fromSecondsSinceEpoch(0.0));
00044     BOOST_CHECK_EQUAL(d.quantized(0.5), Date::fromSecondsSinceEpoch(0.0));
00045     BOOST_CHECK_EQUAL(d.quantized(0.2), Date::fromSecondsSinceEpoch(0.2));
00046     BOOST_CHECK_EQUAL(d.quantized(0.1), Date::fromSecondsSinceEpoch(0.1));
00047     BOOST_CHECK_EQUAL(d.quantized(0.05), Date::fromSecondsSinceEpoch(0.1));
00048     BOOST_CHECK_EQUAL(d.quantized(0.01), Date::fromSecondsSinceEpoch(0.11));
00049 }
00050 
00051 BOOST_AUTO_TEST_CASE( test_fractional_date_print )
00052 {
00053     Date d1 = Date::fromSecondsSinceEpoch(0);
00054     Date d2 = d1.plusSeconds(0.33336);
00055 
00056     BOOST_CHECK_EQUAL(d1.print(), d2.print());
00057     BOOST_CHECK_EQUAL(d1.print() + ".3", d2.print(1));
00058     BOOST_CHECK_EQUAL(d1.print() + ".33", d2.print(2));
00059     BOOST_CHECK_EQUAL(d1.print() + ".333", d2.print(3));
00060     BOOST_CHECK_EQUAL(d1.print() + ".3334", d2.print(4));
00061     BOOST_CHECK_EQUAL(d1.print() + ".33336", d2.print(5));
00062 }
00063 
00064 
00065 BOOST_AUTO_TEST_CASE( test_date_parse_roundtrip )
00066 {
00067     Date d1 = Date::now().quantized(0.01);
00068 
00069     string s = d1.print(6);
00070 
00071     Date d2(s);
00072 
00073     cerr << "s = " << d1.print(9) << " s2 = " << d2.print(9) << endl;
00074 
00075     BOOST_CHECK_EQUAL(d1.quantized(0.000001), d2.quantized(0.000001));
00076 
00077     for (unsigned i = 0;  i < 1000;  ++i) {
00078         double sec = random();
00079         double frac = random() / 1000000000.0;
00080 
00081         Date d1 = Date::fromSecondsSinceEpoch(sec + frac);
00082         Date d2(d1.print(6));
00083 
00084         if (d1.print(6) != d2.print(6)) {
00085             cerr << "d1:6: " << d1.print(6) << endl;
00086             cerr << "d2:6: " << d2.print(6) << endl;
00087             cerr << "d1:9: " << d1.print(9) << endl;
00088             cerr << "d2:9: " << d2.print(9) << endl;
00089             cerr << "sec: " << ML::format("%32.10f", sec + frac) << endl;
00090         }
00091 
00092         BOOST_CHECK_EQUAL(d1.print(6), d2.print(6));
00093     }
00094 }
00095 
00096 BOOST_AUTO_TEST_CASE( test_stream_print_equality )
00097 {
00098     Date d = Date::fromSecondsSinceEpoch(4516978241);
00099 
00100     std::stringstream ss;
00101     ss << d;
00102 
00103     BOOST_CHECK_EQUAL(ss.str(), "2113-Feb-19 20:10:41");
00104 }
00105 
00106 BOOST_AUTO_TEST_CASE( test_ace )
00107 {
00108     ACE_Time_Value ace(1, 0);
00109 
00110     BOOST_CHECK_EQUAL(Date(ace).secondsSinceEpoch(), 1.0);
00111     BOOST_CHECK_EQUAL(Date(ace).toAce(),  ace);
00112 }
00113 
00114 BOOST_AUTO_TEST_CASE( test_print_format )
00115 {
00116     BOOST_CHECK_EQUAL(Date(ACE_Time_Value(0)).print("%c"), "Thu Jan  1 00:00:00 1970");
00117     BOOST_CHECK_EQUAL(Date(ACE_Time_Value(1)).print("%c"), "Thu Jan  1 00:00:01 1970");
00118 }
00119 
00120 BOOST_AUTO_TEST_CASE( test_utc_parse )
00121 {
00122     Date d(2012, 06, 06, 15, 15, 38.380);
00123     string s = "2012-Jun-06 15:15:38.380";
00124     Date d2 = Date::parseDefaultUtc(s);
00125     BOOST_CHECK_EQUAL(d2.print(3), s);
00126 }
00127 
00128 BOOST_AUTO_TEST_CASE( test_now )
00129 {
00130     cerr << "new: " << Date::now().print(6) << endl;
00131     cerr << "old: " << Date::nowOld().print(6) << endl;
00132 }
00133 
00134 BOOST_AUTO_TEST_CASE( test_date_equality )
00135 {
00136     BOOST_CHECK_EQUAL(Date(), Date());
00137 }
00138 
00139 BOOST_AUTO_TEST_CASE( test_date_parse_no_delimiter )
00140 {
00141     const char * s = "20120624";
00142     Parse_Context context(s, s, s + strlen(s));
00143     Date date = Date::expect_date(context, "%y%m%d");
00144 
00145     BOOST_CHECK_EQUAL(date, Date(2012, 06, 24));
00146 }
00147 
00148 BOOST_AUTO_TEST_CASE( test_date_hour_of_week )
00149 {
00150     BOOST_CHECK_EQUAL(Date(2012, 06, 24, 0, 0, 0).hourOfWeek(), 0);
00151     BOOST_CHECK_EQUAL(Date(2012, 06, 24, 1, 0, 0).hourOfWeek(), 1);
00152     BOOST_CHECK_EQUAL(Date(2012, 06, 25, 0, 0, 0).hourOfWeek(), 24);
00153     BOOST_CHECK_EQUAL(Date(2012, 06, 25, 23, 59, 59).hourOfWeek(), 47);
00154     BOOST_CHECK_EQUAL(Date(2012, 06, 26, 0, 0, 0).hourOfWeek(), 48);
00155     BOOST_CHECK_EQUAL(Date(2012, 06, 30, 23, 59, 59).hourOfWeek(), 167);
00156     BOOST_CHECK_EQUAL(Date(2012, 07, 1, 0, 0, 0).hourOfWeek(), 0);
00157 }
00158 
00159 BOOST_AUTO_TEST_CASE( test_date_difference )
00160 {
00161     BOOST_CHECK_EQUAL(Date(2012, 06, 24, 0, 0, 0) -
00162                       Date(2012, 06, 24, 0, 0, 10), -10);
00163     BOOST_CHECK_EQUAL(Date(2012, 06, 24, 0, 1, 0) -
00164                       Date(2012, 06, 24, 0, 0, 0), 60);
00165 }
00166 
00167 BOOST_AUTO_TEST_CASE( test_rfc_2616 )
00168 {
00169     BOOST_CHECK_EQUAL(Date(1994, 11, 6, 8, 49, 37).printRfc2616(),
00170                       "Sun, 06 Nov 1994 08:49:37 GMT");
00171 }
00172 
00173 BOOST_AUTO_TEST_CASE( test_addFromString )
00174 {
00175     Date d(2013, 1, 1, 0, 0, 0);
00176     d.addFromString("1d");
00177     BOOST_CHECK_EQUAL(d, Date(2013, 1, 2, 0, 0, 0));
00178     d.addFromString("2S");
00179     BOOST_CHECK_EQUAL(d, Date(2013, 1, 2, 0, 0, 2));
00180     d.addFromString("3M");
00181     BOOST_CHECK_EQUAL(d, Date(2013, 1, 2, 0, 3, 2));
00182     d.addFromString("4H");
00183     BOOST_CHECK_EQUAL(d, Date(2013, 1, 2, 4, 3, 2));
00184     if(false){
00185         //this test leaks, skip it
00186         bool failureFailed = false;
00187         try{
00188             d.addFromString("pwel");
00189         }catch(const ML::Exception& e){
00190             failureFailed = true;
00191         }
00192         if(!failureFailed){
00193             throw ML::Exception("Invalid string should fail with a ML exception");
00194         }
00195     }
00196 }
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator