1 //  Copyright 2011 Vicente J. Botet Escriba
2 //  Distributed under the Boost Software License, Version 1.0.
3 //  See http://www.boost.org/LICENSE_1_0.txt
4 
5 #include <boost/chrono/chrono_io.hpp>
6 #include <sstream>
7 #include <boost/detail/lightweight_test.hpp>
8 
9 template<typename D>
test_good_prefix(const char * str,D d)10 void test_good_prefix(const char* str, D d)
11 {
12   std::ostringstream out;
13   out << d;
14   BOOST_TEST(out.good());
15 
16   BOOST_TEST(out.str() == str);
17 }
18 
19 template<typename D>
test_good_symbol(const char * str,D d)20 void test_good_symbol(const char* str, D d)
21 {
22   std::ostringstream out;
23 #if BOOST_CHRONO_VERSION==2
24   out << boost::chrono::duration_fmt(boost::chrono::duration_style::symbol) << d;
25 #else
26   out << boost::chrono::duration_short  << d;
27 #endif
28   BOOST_TEST(out.good());
29   BOOST_TEST_EQ(out.str(), str);
30 }
31 #if BOOST_CHRONO_VERSION==2
32 
33 template<typename D>
test_good(const char * str,D d,boost::chrono::duration_style style)34 void test_good(const char* str, D d, boost::chrono::duration_style style)
35 {
36   std::ostringstream out;
37 
38   out << boost::chrono::duration_fmt(style) << d;
39   BOOST_TEST(out.good());
40   BOOST_TEST(out.str() == str);
41 }
42 
43 template<typename D>
test_state_saver(const char * str,const char * str2,D d,boost::chrono::duration_style style)44 void test_state_saver(const char* str, const char* str2, D d, boost::chrono::duration_style style)
45 {
46   std::ostringstream out;
47   {
48     boost::chrono::duration_style_io_saver ios(out);
49     out << boost::chrono::duration_fmt(style) << d;
50     BOOST_TEST(out.good());
51     BOOST_TEST(out.str() == str);
52   }
53   out << " " <<  d;
54   BOOST_TEST(out.good());
55   BOOST_TEST(out.str() == str2);
56 }
57 
58 template<typename D>
test_state_saver2(const char * str,const char * str2,D d,boost::chrono::duration_style style)59 void test_state_saver2(const char* str, const char* str2, D d, boost::chrono::duration_style style)
60 {
61   std::ostringstream out;
62   {
63     boost::chrono::duration_style_io_saver ios(out, style);
64     out << d;
65     BOOST_TEST(out.good());
66     BOOST_TEST(out.str() == str);
67   }
68   out << " " <<  d;
69   BOOST_TEST(out.good());
70   BOOST_TEST(out.str() == str2);
71 }
72 
73 #endif
74 
main()75 int main()
76 {
77   using namespace boost::chrono;
78   using namespace boost;
79 
80   test_good_prefix("5000 hours", hours(5000));
81   test_good_prefix("5000 minutes", minutes(5000));
82   test_good_prefix("5000 seconds", seconds(5000));
83   test_good_prefix("0 seconds", seconds(0));
84   test_good_prefix("1 second", seconds(1));
85   test_good_prefix("-1 second", seconds(-1));
86   test_good_prefix("5000 milliseconds", milliseconds(5000));
87   test_good_prefix("5000 microseconds", microseconds(5000));
88   test_good_prefix("5000 nanoseconds", nanoseconds(5000));
89   test_good_prefix("5000 deciseconds", duration<boost::int_least64_t, deci> (5000));
90   test_good_prefix("5000 [1/30]seconds", duration<boost::int_least64_t, ratio<1, 30> > (5000));
91 
92   test_good_symbol("5000 h", hours(5000));
93 #if BOOST_CHRONO_VERSION==2
94   test_good_symbol("5000 min", minutes(5000));
95 #else
96   test_good_symbol("5000 m", minutes(5000));
97 #endif
98   test_good_symbol("5000 s", seconds(5000));
99   test_good_symbol("5000 ms", milliseconds(5000));
100   test_good_symbol("5000 ns", nanoseconds(5000));
101   test_good_symbol("5000 ds", duration<boost::int_least64_t, deci> (5000));
102   test_good_symbol("5000 [1/30]s", duration<boost::int_least64_t, ratio<1, 30> > (5000));
103 
104 #if BOOST_CHRONO_VERSION==2
105   test_good("5000 hours", hours(5000), duration_style::prefix);
106   test_good("5000 h", hours(5000), duration_style::symbol);
107   test_state_saver("5000 h", "5000 h 5000 hours", hours(5000), duration_style::symbol);
108   test_state_saver2("5000 h", "5000 h 5000 hours", hours(5000), duration_style::symbol);
109 #endif
110 
111   return boost::report_errors();
112 
113 }
114 
115