1 /*
2  * ====================================================================
3  *    Licensed to the Apache Software Foundation (ASF) under one
4  *    or more contributor license agreements.  See the NOTICE file
5  *    distributed with this work for additional information
6  *    regarding copyright ownership.  The ASF licenses this file
7  *    to you under the Apache License, Version 2.0 (the
8  *    "License"); you may not use this file except in compliance
9  *    with the License.  You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  *    Unless required by applicable law or agreed to in writing,
14  *    software distributed under the License is distributed on an
15  *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  *    KIND, either express or implied.  See the License for the
17  *    specific language governing permissions and limitations
18  *    under the License.
19  * ====================================================================
20  */
21 
22 #include <boost/test/unit_test.hpp>
23 
24 #include <array>
25 
26 #include "../src/private/revision_private.hpp"
27 
28 namespace svn = ::apache::subversion::svnxx;
29 namespace impl = ::apache::subversion::svnxx::impl;
30 
31 BOOST_AUTO_TEST_SUITE(revision);
32 
BOOST_AUTO_TEST_CASE(convert_to_kind)33 BOOST_AUTO_TEST_CASE(convert_to_kind)
34 {
35   using kind = svn::revision::kind;
36   BOOST_TEST((impl::convert(kind::unspecified) == svn_opt_revision_unspecified));
37   BOOST_TEST((impl::convert(kind::number)      == svn_opt_revision_number));
38   BOOST_TEST((impl::convert(kind::date)        == svn_opt_revision_date));
39   BOOST_TEST((impl::convert(kind::committed)   == svn_opt_revision_committed));
40   BOOST_TEST((impl::convert(kind::previous)    == svn_opt_revision_previous));
41   BOOST_TEST((impl::convert(kind::base)        == svn_opt_revision_base));
42   BOOST_TEST((impl::convert(kind::working)     == svn_opt_revision_working));
43   BOOST_TEST((impl::convert(kind::head)        == svn_opt_revision_head));
44 }
45 
BOOST_AUTO_TEST_CASE(convert_from_kind)46 BOOST_AUTO_TEST_CASE(convert_from_kind)
47 {
48   using kind = svn::revision::kind;
49   BOOST_TEST((impl::convert(svn_opt_revision_unspecified) == kind::unspecified));
50   BOOST_TEST((impl::convert(svn_opt_revision_number)      == kind::number));
51   BOOST_TEST((impl::convert(svn_opt_revision_date)        == kind::date));
52   BOOST_TEST((impl::convert(svn_opt_revision_committed)   == kind::committed));
53   BOOST_TEST((impl::convert(svn_opt_revision_previous)    == kind::previous));
54   BOOST_TEST((impl::convert(svn_opt_revision_base)        == kind::base));
55   BOOST_TEST((impl::convert(svn_opt_revision_working)     == kind::working));
56   BOOST_TEST((impl::convert(svn_opt_revision_head)        == kind::head));
57 }
58 
BOOST_AUTO_TEST_CASE(roundtrip_conversions)59 BOOST_AUTO_TEST_CASE(roundtrip_conversions)
60 {
61   using kind = svn::revision::kind;
62   using usec = svn::revision::usec;
63 
64   std::array<svn::revision, 11> data = {
65     svn::revision(),
66     svn::revision(kind::unspecified),
67     svn::revision(kind::committed),
68     svn::revision(kind::previous),
69     svn::revision(kind::base),
70     svn::revision(kind::working),
71     svn::revision(kind::head),
72     svn::revision(svn::revnum::invalid),
73     svn::revision(svn::revnum(7)),
74     svn::revision(svn::revision::time<usec>()),
75     svn::revision(svn::revision::time<usec>(usec{11})),
76   };
77 
78   for (const auto& r : data)
79     BOOST_TEST((impl::convert(impl::convert(r)) == r));
80 }
81 
BOOST_AUTO_TEST_CASE(preconditions)82 BOOST_AUTO_TEST_CASE(preconditions)
83 {
84   using kind = svn::revision::kind;
85   BOOST_CHECK_THROW(svn::revision{kind::number}, std::invalid_argument);
86   BOOST_CHECK_THROW(svn::revision{kind::date}, std::invalid_argument);
87 }
88 
BOOST_AUTO_TEST_CASE(postconditions_kind)89 BOOST_AUTO_TEST_CASE(postconditions_kind)
90 {
91   using kind = svn::revision::kind;
92   BOOST_TEST((svn::revision(kind::unspecified).get_kind() == kind::unspecified));
93   BOOST_TEST((svn::revision(kind::committed)  .get_kind() == kind::committed));
94   BOOST_TEST((svn::revision(kind::previous)   .get_kind() == kind::previous));
95   BOOST_TEST((svn::revision(kind::base)       .get_kind() == kind::base));
96   BOOST_TEST((svn::revision(kind::working)    .get_kind() == kind::working));
97   BOOST_TEST((svn::revision(kind::head)       .get_kind() == kind::head));
98 }
99 
BOOST_AUTO_TEST_CASE(postconditions_default)100 BOOST_AUTO_TEST_CASE(postconditions_default)
101 {
102   using kind = svn::revision::kind;
103   using usec = svn::revision::usec;
104 
105   const auto r = svn::revision();
106   BOOST_TEST((r.get_kind() == kind::unspecified));
107   BOOST_CHECK_THROW(r.get_number(), std::logic_error);
108   BOOST_CHECK_THROW(r.get_date<usec>(), std::logic_error);
109 }
110 
BOOST_AUTO_TEST_CASE(postconditions_number)111 BOOST_AUTO_TEST_CASE(postconditions_number)
112 {
113   using kind = svn::revision::kind;
114   using usec = svn::revision::usec;
115 
116   const auto r = svn::revision(svn::revnum::invalid);
117   BOOST_TEST((r.get_kind() == kind::number));
118   BOOST_TEST((r.get_number() == svn::revnum::invalid));
119   BOOST_CHECK_THROW(r.get_date<usec>(), std::logic_error);
120 }
121 
BOOST_AUTO_TEST_CASE(postconditions_date)122 BOOST_AUTO_TEST_CASE(postconditions_date)
123 {
124   using kind = svn::revision::kind;
125   using usec = svn::revision::usec;
126 
127   const auto r = svn::revision(svn::revision::time<usec>());
128   BOOST_TEST((r.get_kind() == kind::date));
129   BOOST_TEST((r.get_date<usec>() == svn::revision::time<usec>()));
130   BOOST_CHECK_THROW(r.get_number(), std::logic_error);
131 }
132 
BOOST_AUTO_TEST_CASE(assignment)133 BOOST_AUTO_TEST_CASE(assignment)
134 {
135   using namespace std::chrono;
136   using kind = svn::revision::kind;
137   const auto timestamp = time_point_cast<seconds>(system_clock::now());
138 
139   svn::revision r;
140   BOOST_TEST((r.get_kind() == kind::unspecified));
141 
142   r = svn::revision(kind::previous);
143   BOOST_TEST((r.get_kind() == kind::previous));
144 
145   r = svn::revision(svn::revnum(0));
146   BOOST_TEST((r.get_kind() == kind::number));
147   BOOST_TEST((r.get_number() == svn::revnum(0)));
148 
149   r = svn::revision(timestamp);
150   BOOST_TEST((r.get_kind() == kind::date));
151   BOOST_TEST((r.get_date<system_clock::duration>() == timestamp));
152   BOOST_TEST((r.get_date<svn::revision::usec>() == timestamp));
153 }
154 
155 // TODO: Add tests for !=, <, >, <= and >=
156 
157 BOOST_AUTO_TEST_SUITE_END();
158