1package deb
2
3import (
4	. "gopkg.in/check.v1"
5)
6
7type VersionSuite struct {
8}
9
10var _ = Suite(&VersionSuite{})
11
12func (s *VersionSuite) TestParseVersion(c *C) {
13	e, u, d := parseVersion("1.3.4")
14	c.Check([]string{e, u, d}, DeepEquals, []string{"", "1.3.4", ""})
15
16	e, u, d = parseVersion("4:1.3:4")
17	c.Check([]string{e, u, d}, DeepEquals, []string{"4", "1.3:4", ""})
18
19	e, u, d = parseVersion("1.3.4-1")
20	c.Check([]string{e, u, d}, DeepEquals, []string{"", "1.3.4", "1"})
21
22	e, u, d = parseVersion("1.3-pre4-1")
23	c.Check([]string{e, u, d}, DeepEquals, []string{"", "1.3-pre4", "1"})
24
25	e, u, d = parseVersion("4:1.3-pre4-1")
26	c.Check([]string{e, u, d}, DeepEquals, []string{"4", "1.3-pre4", "1"})
27}
28
29func (s *VersionSuite) TestCompareLexicographic(c *C) {
30	c.Check(compareLexicographic("", ""), Equals, 0)
31	c.Check(compareLexicographic("pre", "pre"), Equals, 0)
32
33	c.Check(compareLexicographic("pr", "pre"), Equals, -1)
34	c.Check(compareLexicographic("pre", "pr"), Equals, 1)
35
36	c.Check(compareLexicographic("pra", "prb"), Equals, -1)
37	c.Check(compareLexicographic("prb", "pra"), Equals, 1)
38
39	c.Check(compareLexicographic("prx", "pr+"), Equals, -1)
40	c.Check(compareLexicographic("pr+", "prx"), Equals, 1)
41
42	c.Check(compareLexicographic("pr~", "pra"), Equals, -1)
43	c.Check(compareLexicographic("pra", "pr~"), Equals, 1)
44
45	c.Check(compareLexicographic("~~", "~~a"), Equals, -1)
46	c.Check(compareLexicographic("~~a", "~"), Equals, -1)
47	c.Check(compareLexicographic("~", ""), Equals, -1)
48
49	c.Check(compareLexicographic("~~a", "~~"), Equals, 1)
50	c.Check(compareLexicographic("~", "~~a"), Equals, 1)
51	c.Check(compareLexicographic("", "~"), Equals, 1)
52}
53
54func (s *VersionSuite) TestCompareVersionPart(c *C) {
55	c.Check(compareVersionPart("", ""), Equals, 0)
56	c.Check(compareVersionPart("pre", "pre"), Equals, 0)
57	c.Check(compareVersionPart("12", "12"), Equals, 0)
58	c.Check(compareVersionPart("1.3.5", "1.3.5"), Equals, 0)
59	c.Check(compareVersionPart("1.3.5-pre1", "1.3.5-pre1"), Equals, 0)
60
61	c.Check(compareVersionPart("1.0~beta1~svn1245", "1.0~beta1"), Equals, -1)
62	c.Check(compareVersionPart("1.0~beta1", "1.0"), Equals, -1)
63
64	c.Check(compareVersionPart("1.0~beta1", "1.0~beta1~svn1245"), Equals, 1)
65	c.Check(compareVersionPart("1.0", "1.0~beta1"), Equals, 1)
66
67	c.Check(compareVersionPart("1.pr", "1.pre"), Equals, -1)
68	c.Check(compareVersionPart("1.pre", "1.pr"), Equals, 1)
69
70	c.Check(compareVersionPart("1.pra", "1.prb"), Equals, -1)
71	c.Check(compareVersionPart("1.prb", "1.pra"), Equals, 1)
72
73	c.Check(compareVersionPart("3.prx", "3.pr+"), Equals, -1)
74	c.Check(compareVersionPart("3.pr+", "3.prx"), Equals, 1)
75
76	c.Check(compareVersionPart("3.pr~", "3.pra"), Equals, -1)
77	c.Check(compareVersionPart("3.pra", "3.pr~"), Equals, 1)
78
79	c.Check(compareVersionPart("2~~", "2~~a"), Equals, -1)
80	c.Check(compareVersionPart("2~~a", "2~"), Equals, -1)
81	c.Check(compareVersionPart("2~", "2"), Equals, -1)
82
83	c.Check(compareVersionPart("2~~a", "2~~"), Equals, 1)
84	c.Check(compareVersionPart("2~", "2~~a"), Equals, 1)
85	c.Check(compareVersionPart("2", "2~"), Equals, 1)
86}
87
88func (s *VersionSuite) TestCompareVersions(c *C) {
89	c.Check(CompareVersions("3:1.0~beta1~svn1245-1", "3:1.0~beta1~svn1245-1"), Equals, 0)
90
91	c.Check(CompareVersions("1:1.0~beta1~svn1245-1", "3:1.0~beta1~svn1245-1"), Equals, -1)
92	c.Check(CompareVersions("1:1.0~beta1~svn1245-1", "1.0~beta1~svn1245-1"), Equals, 1)
93	c.Check(CompareVersions("1.0~beta1~svn1245-1", "1.0~beta1~svn1245-2"), Equals, -1)
94	c.Check(CompareVersions("3:1.0~beta1~svn1245-1", "3:1.0~beta1-1"), Equals, -1)
95
96	c.Check(CompareVersions("1.0~beta1~svn1245", "1.0~beta1"), Equals, -1)
97	c.Check(CompareVersions("1.0~beta1", "1.0"), Equals, -1)
98
99	c.Check(CompareVersions("1.0-133-avc", "1.1"), Equals, -1)
100	c.Check(CompareVersions("1.0-133-avc", "1.0"), Equals, 1)
101}
102
103func (s *VersionSuite) TestParseDependency(c *C) {
104	d, e := ParseDependency("dpkg (>= 1.6)")
105	c.Check(e, IsNil)
106	c.Check(d.Pkg, Equals, "dpkg")
107	c.Check(d.Relation, Equals, VersionGreaterOrEqual)
108	c.Check(d.Version, Equals, "1.6")
109	c.Check(d.Architecture, Equals, "")
110
111	d, e = ParseDependency("dpkg(>>1.6)")
112	c.Check(e, IsNil)
113	c.Check(d.Pkg, Equals, "dpkg")
114	c.Check(d.Relation, Equals, VersionGreater)
115	c.Check(d.Version, Equals, "1.6")
116
117	d, e = ParseDependency("dpkg(1.6)")
118	c.Check(e, IsNil)
119	c.Check(d.Pkg, Equals, "dpkg")
120	c.Check(d.Relation, Equals, VersionEqual)
121	c.Check(d.Version, Equals, "1.6")
122
123	d, e = ParseDependency("dpkg ( 1.6)")
124	c.Check(e, IsNil)
125	c.Check(d.Pkg, Equals, "dpkg")
126	c.Check(d.Relation, Equals, VersionEqual)
127	c.Check(d.Version, Equals, "1.6")
128
129	d, e = ParseDependency("dpkg (> 1.6)")
130	c.Check(e, IsNil)
131	c.Check(d.Pkg, Equals, "dpkg")
132	c.Check(d.Relation, Equals, VersionGreaterOrEqual)
133	c.Check(d.Version, Equals, "1.6")
134
135	d, e = ParseDependency("dpkg (< 1.6)")
136	c.Check(e, IsNil)
137	c.Check(d.Pkg, Equals, "dpkg")
138	c.Check(d.Relation, Equals, VersionLessOrEqual)
139	c.Check(d.Version, Equals, "1.6")
140
141	d, e = ParseDependency("dpkg (= 1.6)")
142	c.Check(e, IsNil)
143	c.Check(d.Pkg, Equals, "dpkg")
144	c.Check(d.Relation, Equals, VersionEqual)
145	c.Check(d.Version, Equals, "1.6")
146
147	d, e = ParseDependency("dpkg (<< 1.6)")
148	c.Check(e, IsNil)
149	c.Check(d.Pkg, Equals, "dpkg")
150	c.Check(d.Relation, Equals, VersionLess)
151	c.Check(d.Version, Equals, "1.6")
152
153	d, e = ParseDependency("dpkg(>>1.6)")
154	c.Check(e, IsNil)
155	c.Check(d.Pkg, Equals, "dpkg")
156	c.Check(d.Relation, Equals, VersionGreater)
157	c.Check(d.Version, Equals, "1.6")
158
159	d, e = ParseDependency("dpkg (>>1.6) {i386}")
160	c.Check(e, IsNil)
161	c.Check(d.Pkg, Equals, "dpkg")
162	c.Check(d.Relation, Equals, VersionGreater)
163	c.Check(d.Version, Equals, "1.6")
164	c.Check(d.Architecture, Equals, "i386")
165
166	d, e = ParseDependency("python:any (>= 2.7~)")
167	c.Check(e, IsNil)
168	c.Check(d.Pkg, Equals, "python")
169	c.Check(d.Relation, Equals, VersionGreaterOrEqual)
170	c.Check(d.Version, Equals, "2.7~")
171	c.Check(d.Architecture, Equals, "")
172
173	d, e = ParseDependency("python:amd64 (>= 2.7~)")
174	c.Check(e, IsNil)
175	c.Check(d.Pkg, Equals, "python")
176	c.Check(d.Relation, Equals, VersionGreaterOrEqual)
177	c.Check(d.Version, Equals, "2.7~")
178	c.Check(d.Architecture, Equals, "amd64")
179
180	d, e = ParseDependency("dpkg{i386}")
181	c.Check(e, IsNil)
182	c.Check(d.Pkg, Equals, "dpkg")
183	c.Check(d.Relation, Equals, VersionDontCare)
184	c.Check(d.Version, Equals, "")
185	c.Check(d.Architecture, Equals, "i386")
186
187	d, e = ParseDependency("dpkg ")
188	c.Check(e, IsNil)
189	c.Check(d.Pkg, Equals, "dpkg")
190	c.Check(d.Relation, Equals, VersionDontCare)
191	c.Check(d.Version, Equals, "")
192
193	d, e = ParseDependency("dpkg(==1.6)")
194	c.Check(e, ErrorMatches, "relation unknown.*")
195
196	d, e = ParseDependency("dpkg==1.6)")
197	c.Check(e, ErrorMatches, "unable to parse.*")
198
199	d, e = ParseDependency("dpkg i386}")
200	c.Check(e, ErrorMatches, "unable to parse.*")
201
202	d, e = ParseDependency("dpkg ) {i386}")
203	c.Check(e, ErrorMatches, "unable to parse.*")
204}
205
206func (s *VersionSuite) TestParseDependencyVariants(c *C) {
207	l, e := ParseDependencyVariants("dpkg (>= 1.6)")
208	c.Check(e, IsNil)
209	c.Check(l, HasLen, 1)
210	c.Check(l[0].Pkg, Equals, "dpkg")
211	c.Check(l[0].Relation, Equals, VersionGreaterOrEqual)
212	c.Check(l[0].Version, Equals, "1.6")
213
214	l, e = ParseDependencyVariants("dpkg (>= 1.6) | mailer-agent")
215	c.Check(e, IsNil)
216	c.Check(l, HasLen, 2)
217	c.Check(l[0].Pkg, Equals, "dpkg")
218	c.Check(l[0].Relation, Equals, VersionGreaterOrEqual)
219	c.Check(l[0].Version, Equals, "1.6")
220	c.Check(l[1].Pkg, Equals, "mailer-agent")
221	c.Check(l[1].Relation, Equals, VersionDontCare)
222
223	_, e = ParseDependencyVariants("dpkg(==1.6)")
224	c.Check(e, ErrorMatches, "relation unknown.*")
225}
226
227func (s *VersionSuite) TestDependencyString(c *C) {
228	d, _ := ParseDependency("dpkg(>>1.6)")
229	d.Architecture = "i386"
230	c.Check(d.String(), Equals, "dpkg (>> 1.6) [i386]")
231
232	d, _ = ParseDependency("dpkg")
233	d.Architecture = "i386"
234	c.Check(d.String(), Equals, "dpkg [i386]")
235}
236