11#include " version_weaver.h"
2- #include < cstdlib>
3- #include < vector>
42#include < format>
3+ #include < vector>
4+
5+ #include < gtest/gtest.h>
6+
7+ using TestData =
8+ std::pair<std::string, std::expected<version_weaver::Version,
9+ version_weaver::ParseError>>;
10+ std::vector<TestData> parse_values = {
11+ {" 1.0.0" , version_weaver::Version{" 1" , " 0" , " 0" }},
12+ {" 1.0.0-alpha" , version_weaver::Version{" 1" , " 0" , " 0" , " alpha" }},
13+ {" 1.0.0-alpha.1" , version_weaver::Version{" 1" , " 0" , " 0" , " alpha.1" }},
14+ {" 1.0.0-0.3.7" , version_weaver::Version{" 1" , " 0" , " 0" , " 0.3.7" }},
15+ {" 1.0.0-x.7.z.92" , version_weaver::Version{" 1" , " 0" , " 0" , " x.7.z.92" }},
16+ {" 1.0.0-x-y-z.--" , version_weaver::Version{" 1" , " 0" , " 0" , " x-y-z.--" }},
17+ {" 1.0.0-alpha+001" , version_weaver::Version{" 1" , " 0" , " 0" , " alpha" , " 001" }},
18+ {" 1.0.0+20130313144700" ,
19+ version_weaver::Version{" 1" , " 0" , " 0" , std::nullopt , " 20130313144700" }},
20+ {" 1.0.0-beta+exp.sha.5114f85" ,
21+ version_weaver::Version{" 1" , " 0" , " 0" , " beta" , " exp.sha.5114f85" }},
22+ {" 1.0.0+21AF26D3----117B344092BD" ,
23+ version_weaver::Version{" 1" , " 0" , " 0" , std::nullopt ,
24+ " 21AF26D3----117B344092BD" }},
525
6- std::vector<std::pair<std::string, std::expected<version_weaver::Version,
7- version_weaver::ParseError>>>
8- test_values = {
9- {" 1.0.0" , version_weaver::Version{" 1" , " 0" , " 0" }},
10- {" 1.0.0-alpha" , version_weaver::Version{" 1" , " 0" , " 0" , " alpha" }},
11- {" 1.0.0-alpha.1" , version_weaver::Version{" 1" , " 0" , " 0" , " alpha.1" }},
12- {" 1.0.0-0.3.7" , version_weaver::Version{" 1" , " 0" , " 0" , " 0.3.7" }},
13- {" 1.0.0-x.7.z.92" , version_weaver::Version{" 1" , " 0" , " 0" , " x.7.z.92" }},
14- {" 1.0.0-x-y-z.--" , version_weaver::Version{" 1" , " 0" , " 0" , " x-y-z.--" }},
15- {" 1.0.0-alpha+001" ,
16- version_weaver::Version{" 1" , " 0" , " 0" , " alpha" , " 001" }},
17- {" 1.0.0+20130313144700" ,
18- version_weaver::Version{" 1" , " 0" , " 0" , " " , " 20130313144700" }},
19- {" 1.0.0-beta+exp.sha.5114f85" ,
20- version_weaver::Version{" 1" , " 0" , " 0" , " beta" , " exp.sha.5114f85" }},
21- {" 1.0.0+21AF26D3----117B344092BD" ,
22- version_weaver::Version{" 1" , " 0" , " 0" , " " ,
23- " 21AF26D3----117B344092BD" }},
2426};
2527
26- bool test_parse ( ) {
27- for (const auto & [input, expected] : test_values ) {
28- auto result = version_weaver::parse (input);
29- if ( bool (result) != bool ( expected)) {
30- std::printf ( " Expected %d, got %d \n " , bool (expected), bool (result));
31- return false ;
32- }
33- if ( bool (result)) {
34- if (result. value () != expected. value ()) {
35- std::printf ( " Expected \n " );
36- return false ;
37- }
28+ TEST (basictests, parse ) {
29+ for (const auto & [input, expected] : parse_values ) {
30+ auto parse_result = version_weaver::parse (input);
31+ ASSERT_EQ (parse_result. has_value (), expected. has_value ());
32+ if (parse_result. has_value ()) {
33+ ASSERT_EQ (parse_result-> major , expected-> major ) ;
34+ ASSERT_EQ (parse_result-> minor , expected-> minor );
35+ ASSERT_EQ (parse_result-> patch , expected-> patch );
36+ ASSERT_EQ (parse_result-> pre_release , expected-> pre_release );
37+ ASSERT_EQ (parse_result-> build , expected-> build );
38+ } else {
39+ ASSERT_EQ (parse_result. error (), expected. error ());
3840 }
3941 }
40- return true ;
42+
43+ SUCCEED ();
4144}
42- int main () {
43- if (!test_parse ()) {
44- std::printf (" Test failed\n " );
45- return EXIT_FAILURE;
45+
46+ // A normal version number MUST take the form X.Y.Z
47+ // where X, Y, and Z are non-negative integers, and
48+ // MUST NOT contain leading zeroes.
49+ TEST (basictests, leading_zeroes) {
50+ ASSERT_FALSE (version_weaver::parse (" 0.0.0" ).has_value ());
51+ ASSERT_FALSE (version_weaver::parse (" 01.0.0" ).has_value ());
52+ ASSERT_FALSE (version_weaver::parse (" 1.01.0" ).has_value ());
53+ ASSERT_FALSE (version_weaver::parse (" 1.0.01" ).has_value ());
54+ }
55+
56+ std::vector<TestData> clean_values = {
57+ {" 1.2.3" , version_weaver::Version{" 1" , " 2" , " 3" }},
58+ {" 1.2.3 " , version_weaver::Version{" 1" , " 2" , " 3" }},
59+ {" 1.2.3-4 " , version_weaver::Version{" 1" , " 2" , " 3" , " 4" }},
60+ {" 1.2.3-pre " , version_weaver::Version{" 1" , " 2" , " 3" , " pre" }},
61+ {" =v1.2.3 " , version_weaver::Version{" 1" , " 2" , " 3" }},
62+ {" v1.2.3" , version_weaver::Version{" 1" , " 2" , " 3" }},
63+ {" v1.2.3 " , version_weaver::Version{" 1" , " 2" , " 3" }},
64+ {" \t 1.2.3" , version_weaver::Version{" 1" , " 2" , " 3" }},
65+ {" >1.2.3" , std::unexpected (version_weaver::ParseError::INVALID_INPUT)},
66+ {" ~1.2.3" , std::unexpected (version_weaver::ParseError::INVALID_INPUT)},
67+ {" <=1.2.3" , std::unexpected (version_weaver::ParseError::INVALID_INPUT)},
68+ {" 1.2.x" , std::unexpected (version_weaver::ParseError::INVALID_INPUT)},
69+ };
70+
71+ TEST (basictests, clean) {
72+ for (const auto & [input, expected] : clean_values) {
73+ auto cleaned_result = version_weaver::clean (input);
74+ std::printf (" input: %s\n " , input.c_str ());
75+ ASSERT_EQ (cleaned_result.has_value (), expected.has_value ());
76+ if (cleaned_result.has_value ()) {
77+ ASSERT_EQ (cleaned_result->major , expected->major );
78+ ASSERT_EQ (cleaned_result->minor , expected->minor );
79+ ASSERT_EQ (cleaned_result->patch , expected->patch );
80+ ASSERT_EQ (cleaned_result->pre_release , expected->pre_release );
81+ ASSERT_EQ (cleaned_result->build , expected->build );
82+ } else {
83+ ASSERT_EQ (cleaned_result.error (), expected.error ());
84+ }
4685 }
47- std::printf (" Tests succeeded!\n " );
48- return EXIT_SUCCESS;
49- }
86+ }
0 commit comments