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