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