1 #![allow(
2     clippy::nonminimal_bool,
3     clippy::too_many_lines,
4     clippy::wildcard_imports
5 )]
6 
7 mod util;
8 
9 use crate::util::*;
10 use semver::{BuildMetadata, Prerelease, Version};
11 
12 #[test]
test_parse()13 fn test_parse() {
14     let err = version_err("");
15     assert_to_string(err, "empty string, expected a semver version");
16 
17     let err = version_err("  ");
18     assert_to_string(
19         err,
20         "unexpected character ' ' while parsing major version number",
21     );
22 
23     let err = version_err("1");
24     assert_to_string(
25         err,
26         "unexpected end of input while parsing major version number",
27     );
28 
29     let err = version_err("1.2");
30     assert_to_string(
31         err,
32         "unexpected end of input while parsing minor version number",
33     );
34 
35     let err = version_err("1.2.3-");
36     assert_to_string(err, "empty identifier segment in pre-release identifier");
37 
38     let err = version_err("a.b.c");
39     assert_to_string(
40         err,
41         "unexpected character 'a' while parsing major version number",
42     );
43 
44     let err = version_err("1.2.3 abc");
45     assert_to_string(err, "unexpected character ' ' after patch version number");
46 
47     let err = version_err("1.2.3-01");
48     assert_to_string(err, "invalid leading zero in pre-release identifier");
49 
50     let err = version_err("1.2.3++");
51     assert_to_string(err, "empty identifier segment in build metadata");
52 
53     let err = version_err("07");
54     assert_to_string(err, "invalid leading zero in major version number");
55 
56     let err = version_err("111111111111111111111.0.0");
57     assert_to_string(err, "value of major version number exceeds u64::MAX");
58 
59     let err = version_err("8\0");
60     assert_to_string(err, "unexpected character '\\0' after major version number");
61 
62     let parsed = version("1.2.3");
63     let expected = Version::new(1, 2, 3);
64     assert_eq!(parsed, expected);
65     let expected = Version {
66         major: 1,
67         minor: 2,
68         patch: 3,
69         pre: Prerelease::EMPTY,
70         build: BuildMetadata::EMPTY,
71     };
72     assert_eq!(parsed, expected);
73 
74     let parsed = version("1.2.3-alpha1");
75     let expected = Version {
76         major: 1,
77         minor: 2,
78         patch: 3,
79         pre: prerelease("alpha1"),
80         build: BuildMetadata::EMPTY,
81     };
82     assert_eq!(parsed, expected);
83 
84     let parsed = version("1.2.3+build5");
85     let expected = Version {
86         major: 1,
87         minor: 2,
88         patch: 3,
89         pre: Prerelease::EMPTY,
90         build: build_metadata("build5"),
91     };
92     assert_eq!(parsed, expected);
93 
94     let parsed = version("1.2.3+5build");
95     let expected = Version {
96         major: 1,
97         minor: 2,
98         patch: 3,
99         pre: Prerelease::EMPTY,
100         build: build_metadata("5build"),
101     };
102     assert_eq!(parsed, expected);
103 
104     let parsed = version("1.2.3-alpha1+build5");
105     let expected = Version {
106         major: 1,
107         minor: 2,
108         patch: 3,
109         pre: prerelease("alpha1"),
110         build: build_metadata("build5"),
111     };
112     assert_eq!(parsed, expected);
113 
114     let parsed = version("1.2.3-1.alpha1.9+build5.7.3aedf");
115     let expected = Version {
116         major: 1,
117         minor: 2,
118         patch: 3,
119         pre: prerelease("1.alpha1.9"),
120         build: build_metadata("build5.7.3aedf"),
121     };
122     assert_eq!(parsed, expected);
123 
124     let parsed = version("1.2.3-0a.alpha1.9+05build.7.3aedf");
125     let expected = Version {
126         major: 1,
127         minor: 2,
128         patch: 3,
129         pre: prerelease("0a.alpha1.9"),
130         build: build_metadata("05build.7.3aedf"),
131     };
132     assert_eq!(parsed, expected);
133 
134     let parsed = version("0.4.0-beta.1+0851523");
135     let expected = Version {
136         major: 0,
137         minor: 4,
138         patch: 0,
139         pre: prerelease("beta.1"),
140         build: build_metadata("0851523"),
141     };
142     assert_eq!(parsed, expected);
143 
144     // for https://nodejs.org/dist/index.json, where some older npm versions are "1.1.0-beta-10"
145     let parsed = version("1.1.0-beta-10");
146     let expected = Version {
147         major: 1,
148         minor: 1,
149         patch: 0,
150         pre: prerelease("beta-10"),
151         build: BuildMetadata::EMPTY,
152     };
153     assert_eq!(parsed, expected);
154 }
155 
156 #[test]
test_eq()157 fn test_eq() {
158     assert_eq!(version("1.2.3"), version("1.2.3"));
159     assert_eq!(version("1.2.3-alpha1"), version("1.2.3-alpha1"));
160     assert_eq!(version("1.2.3+build.42"), version("1.2.3+build.42"));
161     assert_eq!(version("1.2.3-alpha1+42"), version("1.2.3-alpha1+42"));
162 }
163 
164 #[test]
test_ne()165 fn test_ne() {
166     assert_ne!(version("0.0.0"), version("0.0.1"));
167     assert_ne!(version("0.0.0"), version("0.1.0"));
168     assert_ne!(version("0.0.0"), version("1.0.0"));
169     assert_ne!(version("1.2.3-alpha"), version("1.2.3-beta"));
170     assert_ne!(version("1.2.3+23"), version("1.2.3+42"));
171 }
172 
173 #[test]
test_display()174 fn test_display() {
175     assert_to_string(version("1.2.3"), "1.2.3");
176     assert_to_string(version("1.2.3-alpha1"), "1.2.3-alpha1");
177     assert_to_string(version("1.2.3+build.42"), "1.2.3+build.42");
178     assert_to_string(version("1.2.3-alpha1+42"), "1.2.3-alpha1+42");
179 }
180 
181 #[test]
test_lt()182 fn test_lt() {
183     assert!(version("0.0.0") < version("1.2.3-alpha2"));
184     assert!(version("1.0.0") < version("1.2.3-alpha2"));
185     assert!(version("1.2.0") < version("1.2.3-alpha2"));
186     assert!(version("1.2.3-alpha1") < version("1.2.3"));
187     assert!(version("1.2.3-alpha1") < version("1.2.3-alpha2"));
188     assert!(!(version("1.2.3-alpha2") < version("1.2.3-alpha2")));
189     assert!(version("1.2.3+23") < version("1.2.3+42"));
190 }
191 
192 #[test]
test_le()193 fn test_le() {
194     assert!(version("0.0.0") <= version("1.2.3-alpha2"));
195     assert!(version("1.0.0") <= version("1.2.3-alpha2"));
196     assert!(version("1.2.0") <= version("1.2.3-alpha2"));
197     assert!(version("1.2.3-alpha1") <= version("1.2.3-alpha2"));
198     assert!(version("1.2.3-alpha2") <= version("1.2.3-alpha2"));
199     assert!(version("1.2.3+23") <= version("1.2.3+42"));
200 }
201 
202 #[test]
test_gt()203 fn test_gt() {
204     assert!(version("1.2.3-alpha2") > version("0.0.0"));
205     assert!(version("1.2.3-alpha2") > version("1.0.0"));
206     assert!(version("1.2.3-alpha2") > version("1.2.0"));
207     assert!(version("1.2.3-alpha2") > version("1.2.3-alpha1"));
208     assert!(version("1.2.3") > version("1.2.3-alpha2"));
209     assert!(!(version("1.2.3-alpha2") > version("1.2.3-alpha2")));
210     assert!(!(version("1.2.3+23") > version("1.2.3+42")));
211 }
212 
213 #[test]
test_ge()214 fn test_ge() {
215     assert!(version("1.2.3-alpha2") >= version("0.0.0"));
216     assert!(version("1.2.3-alpha2") >= version("1.0.0"));
217     assert!(version("1.2.3-alpha2") >= version("1.2.0"));
218     assert!(version("1.2.3-alpha2") >= version("1.2.3-alpha1"));
219     assert!(version("1.2.3-alpha2") >= version("1.2.3-alpha2"));
220     assert!(!(version("1.2.3+23") >= version("1.2.3+42")));
221 }
222 
223 #[test]
test_spec_order()224 fn test_spec_order() {
225     let vs = [
226         "1.0.0-alpha",
227         "1.0.0-alpha.1",
228         "1.0.0-alpha.beta",
229         "1.0.0-beta",
230         "1.0.0-beta.2",
231         "1.0.0-beta.11",
232         "1.0.0-rc.1",
233         "1.0.0",
234     ];
235     let mut i = 1;
236     while i < vs.len() {
237         let a = version(vs[i - 1]);
238         let b = version(vs[i]);
239         assert!(a < b, "nope {:?} < {:?}", a, b);
240         i += 1;
241     }
242 }
243 
244 #[test]
test_align()245 fn test_align() {
246     let version = version("1.2.3-rc1");
247     assert_eq!("1.2.3-rc1           ", format!("{:20}", version));
248     assert_eq!("*****1.2.3-rc1******", format!("{:*^20}", version));
249     assert_eq!("           1.2.3-rc1", format!("{:>20}", version));
250 }
251