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