📄 ck_timespec.cpp
字号:
/* Copyright is licensed under GNU LGPL. by I.J.Wang 2003*/#include "wytimespec.h"#include "wystr.h"#include <iostream>#include <limits>#include <unistd.h>#include <sys/types.h>#if WYTIMESPEC_VERSION!=31#error Test code is for WYTIMESPEC_VERSION 31#endif#define TEST_SLEEP_TILL// Constant limits use for test//static const long LongMax=std::numeric_limits<long>::max();static const long LongMin=std::numeric_limits<long>::min();static const Wy_Second MaxSecond=std::numeric_limits<Wy_Second>::max();static const Wy_Second MinSecond=std::numeric_limits<Wy_Second>::min();static const Wy_Second MaxL2=MaxSecond/2;static const Wy_Second MaxNano=std::numeric_limits<Wy_Nano>::max();static const Wy_Second MinNano=std::numeric_limits<Wy_Nano>::min();// note: this is zero-terminated stringstatic const WyCSeg IAMsg=" secs (supposedly 1.0 second, may be Ok)\n\0";static bool chk_default(const WyTimeSpec& tm){const static WyTimeSpec T0; if(tm.is_default()==false) { return(false); } if((tm.second()!=0)||(tm.nano()!=0)) { return(false); } if(tm==T0) { } else { return(false); } if(tm!=T0) { return(false); } return(true);};static bool chk_not_default(const WyTimeSpec& tm){const static WyTimeSpec T0; if(tm.is_default()) { return(false); } if((tm.second()==0)&&(tm.nano()==0)) { return(false); } if(tm!=T0) { } else { return(false); } if(tm==T0) { return(false); } return(true);};static bool chk_equ(const WyTimeSpec& tm1,const WyTimeSpec& tm2){ if(tm1==tm2) { if(tm1.second()!=tm2.second()) { WY_THROW( WyRet() ); } if(tm1.nano()!=tm2.nano()) { WY_THROW( WyRet() ); } } else { return(false); } if(tm1!=tm2) { return(false); } if(tm1.second()!=tm2.second()) { return(false); } if(tm1.nano()!=tm2.nano()) { return(false); } return(true);};#define CHK_EQU(expr1,expr2) if(chk_equ(expr1,expr2)==false) { WY_THROW( WyRet() ); };#define CHK_NOT_EQU(expr1,expr2) if(chk_not_equ(expr1,expr2)==false) { WY_THROW( WyRet() ); };#define CHK_DEFAULT(expr) if(chk_default(expr)==false) { WY_THROW( WyRet() ); };#define CHK_NOT_DEFAULT(expr) if(chk_not_default(expr)==false) { WY_THROW( WyRet() ); };static void dump_tm(const struct tm* tsp){ std::cout << "tm_year=" << tsp->tm_year << ", tm_mon=" << tsp->tm_mon << ", tm_mday=" << tsp->tm_mday << ", tm_hour=" << tsp->tm_hour << ", tm_min=" << tsp->tm_min << ", tm_sec=" << tsp->tm_sec << ", tm_wday=" << tsp->tm_wday << ", tm_yday=" << tsp->tm_yday << ", tm_isdst=" << tsp->tm_isdst << "\n";};/* Check WyTimeSpec public interface (set_systime is not tested)*/static void t1(void){ WyRet r; // Check WyTimeSpec()/WyTimeSpec(const WyTimeSpec&) // { WyTimeSpec a0,a1(a0); CHK_DEFAULT(a0); CHK_DEFAULT(a1); CHK_EQU(a0,a1); } // WyTimeSpec(Wy_Second,Wy_Nano)/WyTimeSpec(Wy_Second) { WyTimeSpec a1(100,100); WyTimeSpec a2(a1); WyTimeSpec a3(99,1000000100L); CHK_NOT_DEFAULT(a1); CHK_NOT_DEFAULT(a2); CHK_NOT_DEFAULT(a3); CHK_EQU(a1,a2); CHK_EQU(a1,a3); if((a1.second()!=100)||(a1.nano()!=100)) { WY_THROW( WyRet() ); } WyTimeSpec a4(-100,-100); if((a4.second()!=-100)||(a4.nano()!=-100)) { WY_THROW( WyRet() ); } WyTimeSpec a5(-100, 100); if((a5.second()!=-99)||(a5.nano()!=-WyTimeSpec::_Giga+100)) { std::cout << " second()=" << a5.second() << " nano()=" << a5.nano() << std::endl; WY_THROW( WyRet() ); } WyTimeSpec a6( 100,-100); if((a6.second()!=99)||(a6.nano()!=WyTimeSpec::_Giga-100)) { std::cout << " second()=" << a6.second() << " nano()=" << a6.nano() << std::endl; WY_THROW( WyRet() ); } WyTimeSpec a7(100,0); if((a7.second()!=100)||(a7.nano()!=0)) { WY_THROW( WyRet() ); } WyTimeSpec a8(-100,0); if((a8.second()!=-100)||(a8.nano()!=0)) { WY_THROW( WyRet() ); } } // WyTimeSpec(const char*) { WyTimeSpec t1("234"); CHK_NOT_DEFAULT(t1); if(t1.second()!=234) { WY_THROW( WyRet() ); } if(t1.nano()!=0) { WY_THROW( WyRet() ); } WyTimeSpec t2("-2345."); CHK_NOT_DEFAULT(t2); if(t2.second()!=-2345) { WY_THROW( WyRet() ); } if(t2.nano()!=0) { WY_THROW( WyRet() ); } WyTimeSpec t3("-.123456789"); CHK_NOT_DEFAULT(t3); if(t3.second()!=0) { WY_THROW( WyRet() ); } if(t3.nano()!=-123456789L) { WY_THROW( WyRet() ); } WyTimeSpec t4("12.34000000000000000"); CHK_NOT_DEFAULT(t4); if(t4.second()!=12) { WY_THROW( WyRet() ); } if(t4.nano()!=340000000L) { WY_THROW( WyRet() ); } WyTimeSpec t5("-2.345e1"); CHK_NOT_DEFAULT(t5); if(t5.second()!=-23) { WY_THROW( WyRet() ); } if(t5.nano()!=-450000000) { WY_THROW( WyRet() ); } } // chk WyTimeSpec(const WyCSeg&) { WyTimeSpec t5(WyCSeg("-2.345e1x",8)); CHK_NOT_DEFAULT(t5); if(t5.second()!=-23) { WY_THROW( WyRet() ); } if(t5.nano()!=-450000000) { WY_THROW( WyRet() ); } } // chk WyTimeSpec(double) { WyTimeSpec tmp( double(123.456) ); CHK_NOT_DEFAULT(tmp); if(tmp.second()!=123) { WY_THROW( WyRet() ); } if(tmp.nano()!=456000000) { WY_THROW( WyRet() ); } WyTimeSpec tmp2( double(-123.456) ); CHK_NOT_DEFAULT(tmp2); if(tmp2.second()!=-123) { WY_THROW( WyRet() ); } if(tmp2.nano()!=-456000000) { WY_THROW( WyRet() ); } WyTimeSpec tmp3( double(0.456) ); CHK_NOT_DEFAULT(tmp3); if(tmp3.second()!=0) { WY_THROW( WyRet() ); } if(tmp3.nano()!=456000000) { WY_THROW( WyRet() ); } } // reset // { const WyTimeSpec a0; const WyTimeSpec a1(200,200); WyTimeSpec tmp(a1); CHK_DEFAULT(a0); CHK_NOT_DEFAULT(a1); CHK_NOT_DEFAULT(tmp); tmp.reset(); CHK_DEFAULT(tmp); tmp.reset(a1); CHK_EQU(tmp,a1); tmp.reset(a0); CHK_EQU(tmp,a0); if((r=tmp.reset(a1.second(),a1.nano()))!=Ok) { WY_THROW(r); } CHK_EQU(tmp,a1); tmp.reset(Wy_Second(),0); if(tmp.second()!=0) { WY_THROW( WyRet() ); } if((r=tmp.reset(300,LongMax))!=Ok) { WY_THROW( WyRet() ); } if((tmp.second()!=300+LongMax/WyTimeSpec::_Giga)|| (tmp.nano()!=LongMax%WyTimeSpec::_Giga)) { WY_THROW( WyRet() ); // not rounded-up } if((r=tmp.reset(300,LongMin))!=Ok) { WY_THROW( WyRet() ); } WyTimeSpec tmp1(300+LongMin/WyTimeSpec::_Giga,LongMin%WyTimeSpec::_Giga); CHK_EQU(tmp,tmp1); tmp.reset(20,0); if((tmp.second()!=20)||(tmp.nano()!=0)) { WY_THROW( WyRet() ); } } // reset(const char*) { const WyTimeSpec NDefault(1,1); WyTimeSpec t1; CHK_DEFAULT(t1); t1.reset(NDefault); if((r=t1.reset("0"))!=Ok) { WY_THROW(r); } CHK_DEFAULT(t1); t1.reset(NDefault); if((r=t1.reset("0."))!=Ok) { WY_THROW(r); } CHK_DEFAULT(t1); t1.reset(NDefault); if((r=t1.reset(".0"))!=Ok) { WY_THROW(r); } CHK_DEFAULT(t1); t1.reset(NDefault); if((r=t1.reset("0.0"))!=Ok) { WY_THROW(r); } CHK_DEFAULT(t1); t1.reset(NDefault); if((r=t1.reset("-0.0"))!=Ok) { WY_THROW(r); } CHK_DEFAULT(t1); if((r=t1.reset("1.000000002"))!=Ok) { WY_THROW(r); } if(t1.second()!=1) { WY_THROW( WyRet() ); } if(t1.nano()!=2) { WY_THROW( WyRet() ); } if((r=t1.reset("-123.400000000000000000"))!=Ok) { WY_THROW(r); } if(t1.second()!=-123) { WY_THROW( WyRet() ); } if(t1.nano()!=-400000000L) { WY_THROW( WyRet() ); } } // swap { const WyTimeSpec Nobj(1,2); WyTimeSpec tmp0(Nobj),tmp1,tmp2; CHK_NOT_DEFAULT(tmp0); CHK_DEFAULT(tmp1); CHK_DEFAULT(tmp2); CHK_NOT_DEFAULT(Nobj); tmp1.swap(tmp2); CHK_DEFAULT(tmp1); CHK_DEFAULT(tmp2); tmp1.swap(tmp0); CHK_DEFAULT(tmp0); CHK_NOT_DEFAULT(tmp1); CHK_EQU(tmp1,Nobj); tmp0.swap(tmp1); CHK_DEFAULT(tmp1); CHK_NOT_DEFAULT(tmp0); CHK_EQU(tmp0,Nobj); } // operator = // { WyTimeSpec a2(-100,-100),a3(100,100),a4; CHK_DEFAULT(a4); a4=a3; CHK_EQU(a4,a3); a4=a2; CHK_EQU(a4,a2); } // operator =(const char*) { WyTimeSpec t1; CHK_DEFAULT(t1); if(&(t1="0")!=&t1) { WY_THROW( WyRet() ); } t1="2.5e0"; if(t1.second()!=2) { WY_THROW( WyRet() ); } if(t1.nano()!=500000000L) { WY_THROW( WyRet() ); } t1="-2.5"; if(t1.second()!=-2) { WY_THROW( WyRet() ); } if(t1.nano()!=-500000000L) { WY_THROW( WyRet() ); } } // operator -() // { WyTimeSpec a1,a2; CHK_DEFAULT(a1); CHK_EQU(-a1,WyTimeSpec(Wy_Second(),Wy_Nano())); a1.reset(-111,-111); a2.reset(a1); CHK_EQU(-a2,WyTimeSpec(111,111)); CHK_EQU(a1,a2); a1.reset(-111,-LongMax); a2.reset(a1); CHK_EQU(-a2,WyTimeSpec(111,LongMax)); CHK_EQU(a1,a2); } // operator ++() --() { WyTimeSpec a1; CHK_DEFAULT(a1); if(++a1!=WyTimeSpec(1,Wy_Nano())) { WY_THROW( WyRet() ); } if(++a1!=WyTimeSpec(2,Wy_Nano())) { WY_THROW( WyRet() ); } if(--a1!=WyTimeSpec(1,Wy_Nano())) { WY_THROW( WyRet() ); } if(--a1!=WyTimeSpec(Wy_Second(),Wy_Nano())) { WY_THROW( WyRet() ); } } // operator ++(int) --(int) { WyTimeSpec a1; CHK_DEFAULT(a1); if(a1++!=WyTimeSpec()) { WY_THROW( WyRet() ); } if(a1++!=WyTimeSpec(1,Wy_Nano())) { WY_THROW( WyRet() ); } if(a1--!=WyTimeSpec(2,Wy_Nano())) { WY_THROW( WyRet() ); } if(a1--!=WyTimeSpec(Wy_Second(1),Wy_Nano())) { WY_THROW( WyRet() ); } } // operator +/-, += // { WyTimeSpec a2,a3,a4; a2.reset(100,100); a3.reset(200,200); a4=a2+a3; if((a4.second()!=300)||(a4.nano()!=300)) { WY_THROW( WyRet() ); } a4=a2-a3; CHK_EQU(a4,WyTimeSpec(-100,-100)); a4+=a3; CHK_EQU(a4,a2); } // operator <,<=, >,>= // { WyTimeSpec a2,a3,a4; a2.reset(100,100); a3.reset(200,200); a4=a2+a3; if((a4<a2)||(a4<a3)) { WY_THROW( WyRet() ); } if((a4<=a2)||(a4<=a3)) { WY_THROW( WyRet() ); } a2.reset(-100,-100); a3.reset(-200,-200); a4=a2+a3; if((a4>a2)||(a4>a3)) { WY_THROW( WyRet() ); } if((a4>=a2)||(a4>=a3)) { WY_THROW( WyRet() ); } } // abs { WyTimeSpec a2(1,2),a3(-3,-4); if(a2.abs()!=a2) { WY_THROW( WyRet() ); } if(a3.abs()!=WyTimeSpec(3,4)) { WY_THROW( WyRet() ); } if(a2!=WyTimeSpec(1,2)) { WY_THROW( WyRet() ); } if(a3!=WyTimeSpec(-3,-4)) { WY_THROW( WyRet() ); } } // add // { WyTimeSpec a2,a3; if((r=a2.reset(-400,-400))!=Ok) { WY_THROW(r); } a3.reset(a2); if((r=a2.add(500,500))!=Ok) { WY_THROW(r); } if((r=a3.add(WyTimeSpec(500,500)))!=Ok) { WY_THROW(r);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -