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