📄 chk_cerr.cpp
字号:
/* Copyright is licensed under GNU LGPL. by I.J.Wang 2003 Check Wy::cerr Build: make chk_cerr Note: Test data files should exist in the working directory Files may be created in the working directory and unlinked*/#include "wyterminal.h"#include "wyregfile.h"#include "chk_data.h"#include <unistd.h>#include <iostream>#if WYBYTEFLOW_VERSION!=31#error Test code is for WYBYTEFLOW_VERSION 31#endif#if WYREGFILE_VERSION!=31#error Test code is for WYREGFILE_VERSION 31#endif#if WYCHRFILE_VERSION!=31#error Test code is for WYCHRFILE_VERSION 31#endif#if WYTERMINAL_VERSION!=31#error Test code is for WYTERMINAL_VERSION 31#endif//// Assert f1,f2 the same systerm file//static void assert_same_sysf(const WyByteFlow& f1,const WyByteFlow& f2){ if(f1.is_default()&&f2.is_default()) { return; } WyRet r; WyFileStat stt1,stt2; if((r=f1.stat(stt1))!=Ok) { WY_THROW( WyRet() ); } if((r=f2.stat(stt2))!=Ok) { WY_THROW( WyRet() ); } if(stt1.sf_ino()!=stt2.sf_ino()) { WY_THROW( WyRet() ); } if(stt1.sf_dev()!=stt2.sf_dev()) { WY_THROW( WyRet() ); }};#define CHK_SAME_SYSF(p1,p2)\ try { assert_same_sysf(p1,p2); } catch(...) { throw; }//// Setup the test //static void setup_test(void){};//// Undo setup_test//static void close_test(void){};static void t1(void){ WyRegFile TFile("chk_cerr.cpp",O_RDONLY); WyRet r; class RAID { WyByteFlow _org; public: RAID(const WyByteFlow& src) : _org(src) { if(_org.wy_is_std_fd()==true) { WY_THROW( WyRet() ); } }; ~RAID() { Wy::cout.reset(_org); }; const WyByteFlow& sysf(void) const { return _org; }; } rrid(Wy::cerr); CHK_SAME_SYSF(Wy::cerr,rrid.sysf()); // reset(const WyByteFlow&) if((r=Wy::cerr.reset(static_cast<const WyByteFlow&>(TFile)))!=Ok) { WY_THROW(r); } if(Wy::cerr.fh().fd()!=STDERR_FILENO) { WY_THROW( WyRet() ); } CHK_SAME_SYSF(Wy::cerr,TFile); if(Wy::cerr.wy_is_std_fd()==false) { WY_THROW( WyRet() ); }/* if(Wy::cerr.reset(WyFileHandle(STDERR_FILENO))!=Ok) { WY_THROW(r); } CHK_SAME_SYSF(Wy::cerr,TFile); // reset(WyFileHandle) if((r=Wy::cerr.reset(TFile.fh()))!=Ok) { WY_THROW(r); } if(Wy::cerr.fh().fd()!=STDERR_FILENO) { WY_THROW( WyRet() ); } CHK_SAME_SYSF(Wy::cerr,TFile); */ // recover Wy::cerr if(Wy::cerr.is_default()==true) { WY_THROW( WyRet() ); } if((r=Wy::cerr.reset(rrid.sysf()))!=Ok) { WY_THROW(r); } if(Wy::cerr.fh().fd()!=STDERR_FILENO) { WY_THROW( WyRet() ); } CHK_SAME_SYSF(Wy::cerr,rrid.sysf()); // _swap if((r=Wy::cerr._swap(TFile))!=Wym_EBADTYPE) { WY_THROW(r); } // _alloc if((Wy::cerr._alloc(r))!=NULL) { WY_THROW( WyRet() ); } if(r!=Wym_ENOSYS) { WY_THROW(r); }};// chk reset()//static void t_last(void){ class RAID { const WyByteFlow _org_std; public: RAID() : _org_std(Wy::cerr) {}; ~RAID() { ::dup2(_org_std.wy_fd(),STDERR_FILENO); }; } not_use_me; const WyRegFile TFile("chk_cerr.cpp",O_RDONLY); WyByteFlow& STDOBJ(Wy::cerr); WyRet r; if((r=STDOBJ.reset(TFile))!=Ok) { WY_THROW(r); } CHK_SAME_SYSF(STDOBJ,TFile); if((r=STDOBJ.reset(TFile.fh()))!=Ok) { WY_THROW(r); } CHK_SAME_SYSF(STDOBJ,TFile); // chk error if((r=STDOBJ.reset(WyFileHandle()))!=Wym_EBADF) { WY_THROW(r); } CHK_SAME_SYSF(STDOBJ,TFile); if((r=STDOBJ.reset(WyByteFlow()))!=Wym_EBADF) { WY_THROW(r); } CHK_SAME_SYSF(STDOBJ,TFile); try { STDOBJ.reset(); WY_THROW( WyRet() ); } catch(const WyByteFlow::Reply& e) { WY_THROW( WyRet(e) ); } catch(const WyRet& e) { if(e!=Wym_EBADF) { WY_THROW( WyRet(e) ); } }; CHK_SAME_SYSF(STDOBJ,TFile);};//// Write stdout as a regular file//static void t_cerr_reg(void){ // std::cerr is being testing, use std::cout for message std::cout<< "Wy::cerr is a regular file\n" << std::flush; WyRet r; WyRegFile regf; if((r=regf.reset(Wy::cerr.fh()))!=Ok) { WY_THROW(r); } // write stdout file const char buf[]="\"This string is sent to Wy::cerr(reg)\"\n"; size_t n_wr; if((r=regf.write(buf,sizeof(buf),n_wr))!=Ok) { WY_THROW(r); } if(n_wr!=sizeof(buf)) { WY_THROW( WyRet() ); } if((r=regf.fdatasync())!=Ok) { WY_THROW(r); }};//// Read stdout as a character file//static void t_cerr_chr(void){ // std::cerr is being testing, use std::cout for message std::cout << "Wy::cerr is a character file\n"; WyRet r; WyChrFile chrf; if((r=chrf.reset(Wy::cerr.fh()))!=Ok) { WY_THROW(r); } // Write const char buf[]="\"This string is sent to Wy::cerr(chr)\"\n"; size_t n_wr; if((r=chrf.write(buf,sizeof(buf),n_wr))!=Ok) { WY_THROW(r); } if(n_wr!=sizeof(buf)) { WY_THROW( WyRet() ); }};//// Check Wy::stdout//static void t_cerr(void){ WyRet r; // startup condition check if(Wy::cerr.is_default()) { WY_THROW( WyRet() ); } if(Wy::cerr.fh().fd()!=STDERR_FILENO) { WY_THROW( WyRet() ); } // stat WyFileStat stt; if((r=Wy::cerr.stat(stt))!=Ok) { WY_THROW(r); } if(stt.is_chr()) { t_cerr_chr(); return; } if(stt.is_reg()) { t_cerr_reg(); return; } WY_THROW( WyRet() ); // neither chr nor reg file};static void t_exception(void){ // // Test copy constructor exception // try { } catch(...) { throw; }; // // Test destructor exception // { }};static WyStr chdr("+---------------+\n" "| main() caught:|\n" "+---------------+\n");int main(void) throw()try { try { // std::cerr is being testing, use std::cout for message std::cout << "Checking Wy::cerr ...\n"; setup_test(); t1(); t_cerr(); t_exception(); close_test(); t_last(); // std::cerr is being testing, use std::cout for message std::cout << "Checked Ok\n"; } catch(...) { close_test(); throw; } return(0);}// Using cout for cerr may have been damaged//catch(const WyRet& e) { std::cout << chdr.c_str() << Wy::wrd(e).c_str() << std::endl; return(-1);}catch(const std::exception& e) { std::cout << chdr.c_str() << "std::exception" << std::endl; return(-1);}catch(...) { std::cout << chdr.c_str() << "unknown unwind" << std::endl; return(-1);};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -