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