xref: /openbsd-src/regress/usr.sbin/pkg_add/check-name (revision d2101683cfab046247c06cf24eb15360f62a78dc)
1#! /usr/bin/perl
2# $OpenBSD: check-name,v 1.15 2021/11/23 08:27:37 espie Exp $
3# Written by Marc Espie
4# Public domain
5
6use Test::Simple tests => 25;
7use OpenBSD::Search;
8use OpenBSD::PackageName;
9
10sub check_list
11{
12	my $expected = shift;
13	@_ = sort(@_);
14	if (@$expected != @_) {
15		print STDERR "length: ", scalar(@$expected)," vs. ",
16		    scalar(@_), "\n";
17		    print STDERR join(',', @$expected), "\n";
18		    print STDERR join(',', @_), "\n";
19		return 0;
20	}
21	for my $i (0 .. @_ -1) {
22		if ($expected->[$i] ne $_[$i]) {
23			print STDERR "$expected->[$i] vs. $_[$i]\n";
24			return 0;
25		}
26	}
27	return 1;
28}
29
30sub check_pkgspec
31{
32	my ($s, @list) = @_;
33
34	my $o = OpenBSD::Search::PkgSpec->new($s);
35	return $o->filter(@list);
36}
37
38sub is_valid_spec
39{
40	my $s = shift;
41	return OpenBSD::Search::PkgSpec->new($s)->is_valid;
42}
43
44sub check_name
45{
46	my $s = shift;
47	return OpenBSD::PackageName->from_string($s)->has_issues;
48}
49
50sub check_order
51{
52	my @l = map {OpenBSD::PackageName->from_string($_)} @_;
53	while (my $a = shift @l) {
54		for my $b (@l) {
55			if ($a->compare($b) >= 0) {
56				print $a->to_string, " > ", $b->to_string, "\n";
57				return 0;
58			}
59		}
60	}
61	return 1;
62}
63
64@list = qw(py-MxDateTime-2.0.1-py2.1);
65ok(check_list(\@list,
66    check_pkgspec('py-MxDateTime->=2.0-py2.1', @list)),
67	'flavor with number');
68@list = qw(foo-1.0 foo-1.0p0 foo-1.0p25);
69ok(check_list([qw(foo-1.0)],
70    check_pkgspec('foo-<1.0p0', @list)),
71	'before 1.0p0 came 1.0');
72ok(check_list([qw(foo-1.0 foo-1.0p0)],
73    check_pkgspec('foo-<=1.0p0', @list)),
74	'1.0 and 1.0p0 both match <=1.0p0');
75ok(check_list([qw(foo-1.0 foo-1.0p0 foo-1.0p25)],
76    check_pkgspec('foo-1.0', @list)),
77	'any 1.0p* matches 1.0');
78@list = qw(foo-1.0rc2);
79ok(check_list(\@list,
80    check_pkgspec('foo-<1.0', @list)),
81       'before 1.0 came 1.0rc2');
82@list = qw(foo-1.0);
83ok(check_list(\@list,
84    check_pkgspec('foo-<1.0pl1', @list)),
85       'before 1.0pl1 came 1.0');
86
87my @pkglist=qw(foo-1.0 bar-2.0 foo-2.5 foobar-2.3-pouet hugs-noversion baz-0.0
88	baz-1.1 baz-25.3 pouet-1.0 pouet-zoinx-1.0 pouet-0.0-foo);
89
90my $hash = OpenBSD::PackageName::compile_stemlist(@pkglist);
91
92ok(check_list([qw(bar-2.0)],
93    $hash->find('bar')),
94	'simple stem lookup');
95ok(check_list([qw(foo-1.0 foo-2.5)],
96    $hash->find('foo')),
97	'simple stem lookup with several results');
98ok(check_list([qw(baz-0.0 baz-1.1 baz-25.3)],
99    $hash->find('baz')),
100	'stem lookup, no duplicates');
101ok(check_list([qw(foobar-2.3-pouet)],
102    $hash->find('foobar')),
103	'stem lookup with flavor');
104ok(check_list([qw(pouet-0.0-foo pouet-1.0)],
105    $hash->find('pouet')),
106    	'complicated stem matching');
107ok(check_list([],
108    $hash->find('hugs')),
109    	'bogus stem matching with no version');
110ok(check_list([qw(hugs-noversion)],
111    $hash->find('hugs-noversion')),
112    	'stem matching with no version');
113ok(OpenBSD::PackageName->from_string('foo-1.0-f2-f1')->to_string
114    eq 'foo-1.0-f1-f2',
115    	'canonical names');
116ok(!OpenBSD::Search::PkgSpec->new('foo-<>1.5')->is_valid,
117	'invalid spec');
118
119ok(check_list(["is a stem"], check_name("pkgname-without-version")),
120	"pkgname without version");
121ok(check_list(["flavor 1flavor can't start with digit"],
122	check_name("pkgname-1.0-flavor-1flavor")),
123	"numerical flavor");
124ok(check_list(["correct order is pNvM"], check_name("pkgname-1.0v0p0")),
125	"mixed up vp");
126ok(check_list([], check_name("pkgname-1.0p0v0")), "correct name");
127
128ok(check_order(qw(speex-1.2alpha3 speex-1.2beta3 speex-1.2rc1 speex-1.2
129    speex-1.2pl1 speex-1.3beta1)), 'check order');
130
131ok(is_valid_spec("rsync->=3"), 'standard spec');
132ok(!is_valid_spec("rsync->=*"), 'invalid spec stem->=*');
133ok(!is_valid_spec("rsync-*.3"), 'invalid spec stem-*.3');
134#ok(!is_valid_spec("rsync->=3-"), "empty flavor spec");
135ok(!is_valid_spec("-3.5"), "empty stem");
136ok(!is_valid_spec("autoconf-*%2.59"), "branch specifier not okay in specs");
137