1 /*===========================================================================
2 *
3 *                            PUBLIC DOMAIN NOTICE
4 *               National Center for Biotechnology Information
5 *
6 *  This software/database is a "United States Government Work" under the
7 *  terms of the United States Copyright Act.  It was written as part of
8 *  the author's official duties as a United States Government employee and
9 *  thus cannot be copyrighted.  This software/database is freely available
10 *  to the public for use. The National Library of Medicine and the U.S.
11 *  Government have not placed any restriction on its use or reproduction.
12 *
13 *  Although all reasonable efforts have been taken to ensure the accuracy
14 *  and reliability of the software and data, the NLM and the U.S.
15 *  Government do not and cannot warrant the performance or results that
16 *  may be obtained by using this software or data. The NLM and the U.S.
17 *  Government disclaim all warranties, express or implied, including
18 *  warranties of performance, merchantability or fitness for any particular
19 *  purpose.
20 *
21 *  Please cite the author in any work or product based on this material.
22 *
23 * ===========================================================================
24 *
25 */
26 
27 /**
28 * Unit tests for SraReleaseVersion
29 */
30 
31 #include <ktst/unit_test.hpp>
32 #include <ktst/unit_test_suite.hpp> // REQUIRE_RC
33 #include <kapp/args.h>
34 #include <klib/sra-release-version.h> /* SraReleaseVersion */
35 #include <klib/text.h> /* string_size */
36 #include <string.h> /* memset */
37 using std::string;
38 TEST_SUITE(SraReleaseVersionTestSuite);
39 
40 class Test : private ncbi::NK::TestCase {
41 public:
Test(TestCase & dad,const string & s,const char * expected=NULL)42     Test(TestCase &dad, const string &s, const char *expected = NULL)
43         : TestCase(s)
44     {
45         if (expected == NULL) {
46             expected = s.c_str();
47         }
48         SraReleaseVersion v;
49         REQUIRE_RC(SraReleaseVersionInit(&v, s.c_str(), s.size()));
50         char buffer[256] = "";
51         size_t num_writ = 0;
52         REQUIRE_RC(
53             SraReleaseVersionPrint(&v, buffer, sizeof buffer, &num_writ));
54         CHECK_EQ(num_writ, string_size(expected));
55         CHECK_EQ(memcmp(expected, buffer, num_writ), 0);
56 
57         SraReleaseVersion v2;
58         REQUIRE_RC(SraReleaseVersionInit(&v2, buffer, string_size(buffer)));
59 
60         int32_t result = 0;
61         REQUIRE_RC(SraReleaseVersionCmp(&v, &v2, &result));
62         CHECK_EQ(result, 0);
63 
64         dad.ErrorCounterAdd(GetErrorCounter());
65     }
66 };
67 
TEST_CASE(SraReleaseVersionTest)68 TEST_CASE(SraReleaseVersionTest) {
69     int32_t result = 0;
70     SraReleaseVersion v;
71     SraReleaseVersion etalon;
72     memset(&etalon, 0, sizeof etalon);
73     etalon.type = SraReleaseVersion::eSraReleaseVersionTypeFinal;
74 
75     REQUIRE_RC(SraReleaseVersionInit(&v, NULL, 0));
76     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
77     CHECK_EQ(result, 0);
78 
79     REQUIRE_RC(SraReleaseVersionInit(&v, "", 0));
80     Test      (*this,                    "", "0.0.0");
81     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
82     CHECK_EQ(result, 0);
83 
84     REQUIRE_RC(SraReleaseVersionInit(&v, "0", 1));
85     Test      (*this,                    "0", "0.0.0");
86     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
87     CHECK_EQ(result, 0);
88 
89     etalon.version = 0x1000000;
90     REQUIRE_RC(SraReleaseVersionInit(&v, "1", 1));
91     Test      (*this,                    "1", "1.0.0");
92     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
93     CHECK_EQ(result, 0);
94 
95     etalon.version = 0xC000000;
96     REQUIRE_RC(SraReleaseVersionInit(&v, "12", 2));
97     Test      (*this,                    "12", "12.0.0");
98     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
99     CHECK_EQ(result, 0);
100 
101     etalon.version = 0x1000000;
102     REQUIRE_RC(SraReleaseVersionInit(&v, "1.", 2));
103     Test      (*this,                    "1.", "1.0.0");
104     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
105     CHECK_EQ(result, 0);
106 
107     etalon.version = 0;
108     REQUIRE_RC(SraReleaseVersionInit(&v, "0.", 2));
109     Test      (*this,                    "0.", "0.0.0");
110     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
111     CHECK_EQ(result, 0);
112 
113     etalon.version = 0xD000000;
114     REQUIRE_RC(SraReleaseVersionInit(&v, "13.", 3));
115     Test      (*this,                    "13", "13.0.0");
116     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
117     CHECK_EQ(result, 0);
118 
119     etalon.version = 0x2010000;
120     REQUIRE_RC(SraReleaseVersionInit(&v, "2.1", 3));
121     Test      (*this,                    "2.1", "2.1.0");
122     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
123     CHECK_EQ(result, 0);
124 
125     etalon.version = 0x2000000;
126     REQUIRE_RC(SraReleaseVersionInit(&v, "2.0", 3));
127     Test      (*this,                    "2.0", "2.0.0");
128     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
129     CHECK_EQ(result, 0);
130 
131     etalon.version = 0xE010000;
132     REQUIRE_RC(SraReleaseVersionInit(&v, "14.1", 4));
133     Test      (*this,                    "14.1", "14.1.0");
134     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
135     CHECK_EQ(result, 0);
136 
137     etalon.version = 0xE000000;
138     REQUIRE_RC(SraReleaseVersionInit(&v, "14.0", 4));
139     Test      (*this,                    "14.0", "14.0.0");
140     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
141     CHECK_EQ(result, 0);
142 
143     etalon.version = 0xF0A0000;
144     REQUIRE_RC(SraReleaseVersionInit(&v, "15.10", 5));
145     Test      (*this,                    "15.10", "15.10.0");
146     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
147     CHECK_EQ(result, 0);
148 
149     etalon.version = 0x2000000;
150     REQUIRE_RC(SraReleaseVersionInit(&v, "2.0.", 4));
151     Test      (*this,                    "2.0", "2.0.0");
152     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
153     CHECK_EQ(result, 0);
154 
155     etalon.version = 0x2010000;
156     REQUIRE_RC(SraReleaseVersionInit(&v, "2.1.", 4));
157     Test      (*this,                    "2.1.", "2.1.0");
158     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
159     CHECK_EQ(result, 0);
160 
161     etalon.version = 0xE010000;
162     REQUIRE_RC(SraReleaseVersionInit(&v, "14.1.", 5));
163     Test      (*this,                    "14.1.", "14.1.0");
164     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
165     CHECK_EQ(result, 0);
166 
167     etalon.version = 0xF0A0000;
168     REQUIRE_RC(SraReleaseVersionInit(&v, "15.10.", 6));
169     Test      (*this,                    "15.10", "15.10.0");
170     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
171     CHECK_EQ(result, 0);
172 
173     etalon.version = 0x3020001;
174     REQUIRE_RC(SraReleaseVersionInit(&v, "3.2.1", 5));
175     Test      (*this,                    "3.2.1", "3.2.1");
176     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
177     CHECK_EQ(result, 0);
178 
179     etalon.version = 0x3020000;
180     REQUIRE_RC(SraReleaseVersionInit(&v, "3.2.0", 5));
181     Test      (*this,                    "3.2.0", "3.2.0");
182     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
183     CHECK_EQ(result, 0);
184 
185     etalon.version = 0xD030002;
186     REQUIRE_RC(SraReleaseVersionInit(&v, "13.3.2", 6));
187     Test      (*this,                    "13.3.2", "13.3.2");
188     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
189     CHECK_EQ(result, 0);
190 
191     etalon.version = 0xC100001;
192     REQUIRE_RC(SraReleaseVersionInit(&v, "12.16.1", 7));
193     Test      (*this,                    "12.16.1", "12.16.1");
194     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
195     CHECK_EQ(result, 0);
196 
197     etalon.version = 0x10110012;
198     REQUIRE_RC(SraReleaseVersionInit(&v, "16.17.18", 8));
199     Test      (*this,                    "16.17.18", "16.17.18");
200     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
201     CHECK_EQ(result, 0);
202 
203     etalon.version = 0x3020001;
204     REQUIRE_RC(SraReleaseVersionInit(&v, "3.2.1-", 6));
205     Test      (*this,                    "3.2.1-", "3.2.1");
206     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
207     CHECK_EQ(result, 0);
208 
209     etalon.version = 0x10110012;
210     REQUIRE_RC(SraReleaseVersionInit(&v, "16.17.18-", 9));
211     Test      (*this,                    "16.17.18-", "16.17.18");
212     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
213     CHECK_EQ(result, 0);
214 
215     etalon.version = 0x4030002;
216     etalon.revision = 5;
217     REQUIRE_RC(SraReleaseVersionInit(&v, "4.3.2-5", 7));
218     Test      (*this,                    "4.3.2-5");
219     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
220     CHECK_EQ(result, 0);
221 
222     etalon.version = 0x4030002;
223     etalon.revision = 0;
224     REQUIRE_RC(SraReleaseVersionInit(&v, "4.3.2-0", 7));
225     Test      (*this,                    "4.3.2-0", "4.3.2");
226     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
227     CHECK_EQ(result, 0);
228 
229     etalon.version = 0x13110012;
230     etalon.revision = 20;
231     REQUIRE_RC(SraReleaseVersionInit(&v, "19.17.18-20", 11));
232     Test      (*this,                    "19.17.18-20");
233     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
234     CHECK_EQ(result, 0);
235 
236     etalon.version = 0x4030002;
237     etalon.revision = 0;
238     etalon.type = SraReleaseVersion::eSraReleaseVersionTypeAlpha;
239     REQUIRE_RC(SraReleaseVersionInit(&v, "4.3.2-a", 7));
240     Test      (*this,                    "4.3.2-a");
241     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
242     CHECK_EQ(result, 0);
243 
244     etalon.version = 0x13110012;
245     REQUIRE_RC(SraReleaseVersionInit(&v, "19.17.18-a", 10));
246     Test      (*this,                    "19.17.18-a");
247     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
248     CHECK_EQ(result, 0);
249 
250     etalon.version = 0x4030002;
251     REQUIRE_RC(SraReleaseVersionInit(&v, "4.3.2-a0", 8));
252     Test      (*this,                    "4.3.2-a0", "4.3.2-a");
253     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
254     CHECK_EQ(result, 0);
255 
256     etalon.version = 0x13110012;
257     etalon.revision = 21;
258     REQUIRE_RC(SraReleaseVersionInit(&v, "19.17.18-a21", 12));
259     Test      (*this,                    "19.17.18-a21");
260     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
261     CHECK_EQ(result, 0);
262 
263     etalon.version = 0x4030002;
264     etalon.revision = 1;
265     etalon.type = SraReleaseVersion::eSraReleaseVersionTypeBeta;
266     REQUIRE_RC(SraReleaseVersionInit(&v, "4.3.2-b1", 8));
267     Test      (*this,                    "4.3.2-b1");
268     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
269     CHECK_EQ(result, 0);
270 
271     etalon.version = 0x4030002;
272     etalon.revision = 0;
273     etalon.type = SraReleaseVersion::eSraReleaseVersionTypeRC;
274     REQUIRE_RC(SraReleaseVersionInit(&v, "4.3.2-rc", 8));
275     Test      (*this,                    "4.3.2-rc");
276     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
277     CHECK_EQ(result, 0);
278 
279     etalon.version = 0x13110012;
280     REQUIRE_RC(SraReleaseVersionInit(&v, "19.17.18-rc", 11));
281     Test      (*this,                    "19.17.18-rc");
282     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
283     CHECK_EQ(result, 0);
284 
285     etalon.version = 0x4030002;
286     REQUIRE_RC(SraReleaseVersionInit(&v, "4.3.2-rc0", 9));
287     Test      (*this,                    "4.3.2-rc0", "4.3.2-rc");
288     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
289     CHECK_EQ(result, 0);
290 
291     etalon.version = 0x4030002;
292     etalon.revision = 1;
293     REQUIRE_RC(SraReleaseVersionInit(&v, "4.3.2-rc1", 9));
294     Test      (*this,                    "4.3.2-rc1");
295     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
296     CHECK_EQ(result, 0);
297 
298     etalon.version = 0x13110012;
299     etalon.revision = 21;
300     REQUIRE_RC(SraReleaseVersionInit(&v, "19.17.18-rc21", 13));
301     Test      (*this,                    "19.17.18-rc21");
302     REQUIRE_RC(SraReleaseVersionCmp(&v, &etalon, &result));
303     CHECK_EQ(result, 0);
304 }
305 
306 //////////////////////////////////////////////////// Main
307 extern "C" {
KAppVersion(void)308     ver_t CC KAppVersion(void) { return 0; }
Usage(const Args * args)309     rc_t CC Usage(const Args *args) { return 0; }
310     const char UsageDefaultName[] = "test-SraReleaseVersion";
UsageSummary(const char * progname)311     rc_t CC UsageSummary(const char *progname) { return 0; }
312 
KMain(int argc,char * argv[])313     rc_t CC KMain(int argc, char *argv[]) {
314         return SraReleaseVersionTestSuite(argc, argv);
315     }
316 }
317