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