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