diff options
Diffstat (limited to 'test/libapt')
-rw-r--r-- | test/libapt/assert.h | 35 | ||||
-rw-r--r-- | test/libapt/compareversion_test.cc | 7 | ||||
-rw-r--r-- | test/libapt/configuration_test.cc | 78 | ||||
-rw-r--r-- | test/libapt/getarchitectures_test.cc | 7 | ||||
-rw-r--r-- | test/libapt/getlanguages_test.cc | 19 | ||||
-rw-r--r-- | test/libapt/getlistoffilesindir_test.cc | 9 | ||||
-rw-r--r-- | test/libapt/globalerror_test.cc | 2 | ||||
-rw-r--r-- | test/libapt/hashsums_test.cc | 2 | ||||
-rw-r--r-- | test/libapt/makefile | 16 | ||||
-rw-r--r-- | test/libapt/parsedepends_test.cc | 4 | ||||
-rwxr-xr-x | test/libapt/run-tests | 29 | ||||
-rw-r--r-- | test/libapt/strutil_test.cc | 2 | ||||
-rw-r--r-- | test/libapt/uri_test.cc | 112 | ||||
-rw-r--r-- | test/libapt/versions.lst | 106 |
14 files changed, 388 insertions, 40 deletions
diff --git a/test/libapt/assert.h b/test/libapt/assert.h index 92b662dfa..a07be4b57 100644 --- a/test/libapt/assert.h +++ b/test/libapt/assert.h @@ -26,6 +26,18 @@ void assertEquals(int const &expect, unsigned int const &get, unsigned long cons assertEquals<unsigned int const&, unsigned int const&>(expect, get, line); } +void assertEquals(unsigned long const &expect, int const &get, unsigned long const &line) { + if (get < 0) + OutputAssertEqual(expect, "==", get, line); + assertEquals<unsigned long const&, unsigned long const&>(expect, get, line); +} + +void assertEquals(int const &expect, unsigned long const &get, unsigned long const &line) { + if (expect < 0) + OutputAssertEqual(expect, "==", get, line); + assertEquals<unsigned long const&, unsigned long const&>(expect, get, line); +} + #define equalsOr2(x,y,z) assertEqualsOr2(y, z, x, __LINE__) @@ -53,3 +65,26 @@ void assertEqualsOr2(int const &expect1, int const &expect2, unsigned int const assertEqualsOr2<unsigned int const&, unsigned int const&>(expect1, expect2, get, line); } + +#define equalsOr3(w,x,y,z) assertEqualsOr3(x, y, z, w, __LINE__) + +template < typename X, typename Y > +void OutputAssertEqualOr3(X expect1, X expect2, X expect3, char const* compare, Y get, unsigned long const &line) { + std::cerr << "Test FAILED: »" << expect1 << "« or »" << expect2 << "« or »" << expect3 << "« " << compare << " »" << get << "« at line " << line << std::endl; +} + +template < typename X, typename Y > +void assertEqualsOr3(X expect1, X expect2, X expect3, Y get, unsigned long const &line) { + if (expect1 == get || expect2 == get || expect3 == get) + return; + OutputAssertEqualOr3(expect1, expect2, expect3, "==", get, line); +} + + +// simple helper to quickly output a vectors +template < typename X > +void dumpVector(X vec) { + for (typename X::const_iterator v = vec.begin(); + v != vec.end(); ++v) + std::cout << *v << std::endl; +} diff --git a/test/libapt/compareversion_test.cc b/test/libapt/compareversion_test.cc index b6213e84c..fdb1d5674 100644 --- a/test/libapt/compareversion_test.cc +++ b/test/libapt/compareversion_test.cc @@ -63,6 +63,9 @@ void assertVersion(int const &CurLine, string const &A, string const &B, int con bool RunTest(const char *File) { + if (FileExists(File) == false) + return _error->Error("Versiontestfile %s doesn't exist!", File); + ifstream F(File,ios::in); if (!F != 0) return false; @@ -112,8 +115,8 @@ bool RunTest(const char *File) int main(int argc, char *argv[]) { - if (argc <= 1) - RunTest("../versions.lst"); + if (argc != 2) + return 1; else RunTest(argv[1]); diff --git a/test/libapt/configuration_test.cc b/test/libapt/configuration_test.cc new file mode 100644 index 000000000..5b23d17fb --- /dev/null +++ b/test/libapt/configuration_test.cc @@ -0,0 +1,78 @@ +#include <apt-pkg/configuration.h> + +#include <string> +#include <vector> + +#include "assert.h" + +int main(int argc,const char *argv[]) { + Configuration Cnf; + std::vector<std::string> fds; + + Cnf.Set("APT::Keep-Fds::",28); + Cnf.Set("APT::Keep-Fds::",17); + Cnf.Set("APT::Keep-Fds::2",47); + Cnf.Set("APT::Keep-Fds::","broken"); + fds = Cnf.FindVector("APT::Keep-Fds"); + equals(fds[0], "28"); + equals(fds[1], "17"); + equals(fds[2], "47"); + equals(fds[3], "broken"); + equals(fds.size(), 4); + equals(Cnf.Exists("APT::Keep-Fds::2"), true); + equals(Cnf.Find("APT::Keep-Fds::2"), "47"); + equals(Cnf.FindI("APT::Keep-Fds::2"), 47); + equals(Cnf.Exists("APT::Keep-Fds::3"), false); + equals(Cnf.Find("APT::Keep-Fds::3"), ""); + equals(Cnf.FindI("APT::Keep-Fds::3", 56), 56); + equals(Cnf.Find("APT::Keep-Fds::3", "not-set"), "not-set"); + + Cnf.Clear("APT::Keep-Fds::2"); + fds = Cnf.FindVector("APT::Keep-Fds"); + equals(fds[0], "28"); + equals(fds[1], "17"); + equals(fds[2], ""); + equals(fds[3], "broken"); + equals(fds.size(), 4); + equals(Cnf.Exists("APT::Keep-Fds::2"), true); + + Cnf.Clear("APT::Keep-Fds",28); + fds = Cnf.FindVector("APT::Keep-Fds"); + equals(fds[0], "17"); + equals(fds[1], ""); + equals(fds[2], "broken"); + equals(fds.size(), 3); + + Cnf.Clear("APT::Keep-Fds",""); + equals(Cnf.Exists("APT::Keep-Fds::2"), false); + + Cnf.Clear("APT::Keep-Fds",17); + Cnf.Clear("APT::Keep-Fds","broken"); + fds = Cnf.FindVector("APT::Keep-Fds"); + equals(fds.empty(), true); + + Cnf.Set("APT::Keep-Fds::",21); + Cnf.Set("APT::Keep-Fds::",42); + fds = Cnf.FindVector("APT::Keep-Fds"); + equals(fds[0], "21"); + equals(fds[1], "42"); + equals(fds.size(), 2); + + Cnf.Clear("APT::Keep-Fds"); + fds = Cnf.FindVector("APT::Keep-Fds"); + equals(fds.empty(), true); + + Cnf.CndSet("APT::Version", 42); + Cnf.CndSet("APT::Version", "66"); + equals(Cnf.Find("APT::Version"), "42"); + equals(Cnf.FindI("APT::Version"), 42); + equals(Cnf.Find("APT::Version", "33"), "42"); + equals(Cnf.FindI("APT::Version", 33), 42); + equals(Cnf.Find("APT2::Version", "33"), "33"); + equals(Cnf.FindI("APT2::Version", 33), 33); + + //FIXME: Test for configuration file parsing; + // currently only integration/ tests test them implicitly + + return 0; +} diff --git a/test/libapt/getarchitectures_test.cc b/test/libapt/getarchitectures_test.cc index e3ca7bbc2..807469263 100644 --- a/test/libapt/getarchitectures_test.cc +++ b/test/libapt/getarchitectures_test.cc @@ -7,13 +7,6 @@ #include <iostream> -// simple helper to quickly output a vector of strings -void dumpVector(std::vector<std::string> vec) { - for (std::vector<std::string>::const_iterator v = vec.begin(); - v != vec.end(); v++) - std::cout << *v << std::endl; -} - int main(int argc,char *argv[]) { std::vector<std::string> vec; diff --git a/test/libapt/getlanguages_test.cc b/test/libapt/getlanguages_test.cc index 3d63e0e74..a1c801ea2 100644 --- a/test/libapt/getlanguages_test.cc +++ b/test/libapt/getlanguages_test.cc @@ -7,13 +7,6 @@ #include <iostream> -// simple helper to quickly output a vector of strings -void dumpVector(std::vector<std::string> vec) { - for (std::vector<std::string>::const_iterator v = vec.begin(); - v != vec.end(); v++) - std::cout << *v << std::endl; -} - int main(int argc,char *argv[]) { if (argc != 2) { @@ -133,13 +126,19 @@ int main(int argc,char *argv[]) _config->Set("Dir::State::lists", argv[1]); vec = APT::Configuration::getLanguages(true, false, env); - equals(vec.size(), 6); + equals(vec.size(), 7); equals(vec[0], "de_DE"); equals(vec[1], "de"); equals(vec[2], "en"); equals(vec[3], "none"); - equalsOr2(vec[4], "pt", "tr"); - equalsOr2(vec[5], "tr", "pt"); + equalsOr3(vec[4], "pt", "tr", "ast_DE"); + equalsOr3(vec[5], "tr", "pt", "ast_DE"); + equalsOr3(vec[6], "tr", "pt", "ast_DE"); + + _config->Set("Acquire::Languages", "none"); + vec = APT::Configuration::getLanguages(true, false, env); + equals(vec.size(), 0); + _config->Set("Acquire::Languages", ""); _config->Set("Dir::State::lists", "/non-existing-dir"); _config->Set("Acquire::Languages::1", "none"); diff --git a/test/libapt/getlistoffilesindir_test.cc b/test/libapt/getlistoffilesindir_test.cc index ed8d2dad6..b2c95e840 100644 --- a/test/libapt/getlistoffilesindir_test.cc +++ b/test/libapt/getlistoffilesindir_test.cc @@ -7,14 +7,7 @@ #include <stdio.h> #include <iostream> -// simple helper to quickly output a vector of strings -void dumpVector(std::vector<std::string> vec) { - for (std::vector<std::string>::const_iterator v = vec.begin(); - v != vec.end(); v++) - std::cout << *v << std::endl; -} - -#define P(x) string(argv[1]).append("/").append(x) +#define P(x) std::string(argv[1]).append("/").append(x) int main(int argc,char *argv[]) { diff --git a/test/libapt/globalerror_test.cc b/test/libapt/globalerror_test.cc index 7d933f5a8..5d27414f9 100644 --- a/test/libapt/globalerror_test.cc +++ b/test/libapt/globalerror_test.cc @@ -101,7 +101,7 @@ int main(int argc,char *argv[]) longText.clear(); for (size_t i = 0; i < 50; ++i) longText.append("РезийбёбAZ"); - equals(_error->Warning(longText.c_str()), false); + equals(_error->Warning("%s", longText.c_str()), false); equals(_error->PopMessage(text), false); equals(text, longText); diff --git a/test/libapt/hashsums_test.cc b/test/libapt/hashsums_test.cc index 2cb71cc38..396e4cf6b 100644 --- a/test/libapt/hashsums_test.cc +++ b/test/libapt/hashsums_test.cc @@ -146,7 +146,7 @@ int main(int argc, char** argv) equals(sha2.VerifyFile(argv[1]), true); } { - HashString sha2("SHA256:"+string(argv[4])); + HashString sha2("SHA256:" + std::string(argv[4])); equals(sha2.VerifyFile(argv[1]), true); } diff --git a/test/libapt/makefile b/test/libapt/makefile index a8acabd8e..d3dddaeed 100644 --- a/test/libapt/makefile +++ b/test/libapt/makefile @@ -6,6 +6,10 @@ BASENAME=_libapt_test # Bring in the default rules include ../../buildlib/defaults.mak +.PHONY: test +test: + ./run-tests + # Program for testing getLanguageCode PROGRAM = getLanguages${BASENAME} SLIBS = -lapt-pkg @@ -58,3 +62,15 @@ PROGRAM = StrUtil${BASENAME} SLIBS = -lapt-pkg SOURCE = strutil_test.cc include $(PROGRAM_H) + +# test the URI parsing stuff +PROGRAM = URI${BASENAME} +SLIBS = -lapt-pkg +SOURCE = uri_test.cc +include $(PROGRAM_H) + +# test the Configuration class +PROGRAM = Configuration${BASENAME} +SLIBS = -lapt-pkg +SOURCE = configuration_test.cc +include $(PROGRAM_H) diff --git a/test/libapt/parsedepends_test.cc b/test/libapt/parsedepends_test.cc index 7b496878d..b5d92d9d2 100644 --- a/test/libapt/parsedepends_test.cc +++ b/test/libapt/parsedepends_test.cc @@ -4,8 +4,8 @@ #include "assert.h" int main(int argc,char *argv[]) { - string Package; - string Version; + std::string Package; + std::string Version; unsigned int Op = 5; unsigned int Null = 0; bool StripMultiArch = true; diff --git a/test/libapt/run-tests b/test/libapt/run-tests index 0eea6d4f8..ada2dc38b 100755 --- a/test/libapt/run-tests +++ b/test/libapt/run-tests @@ -3,19 +3,32 @@ set -e DIR=$(readlink -f $(dirname $0)) echo "Compiling the tests …" -test -d "$DIR/../../build/obj/test/libapt/" || mkdir -p "$DIR/../../build/obj/test/libapt/" (cd $DIR && make) echo "Running all testcases …" LDPATH="$DIR/../../build/bin" EXT="_libapt_test" + +# detect if output is on a terminal (colorful) or better not +if expr match "$(readlink -f /proc/$$/fd/1)" '/dev/pts/[0-9]\+' > /dev/null; then + COLHIGH='\033[1;35m' + COLRESET='\033[0m' + TESTOKAY='\033[1;32mOKAY\033[0m' + TESTFAIL='\033[1;31mFAILED\033[0m' +else + COLHIGH='' + COLRESET='' + TESTOKAY='OK' + TESTFAIL='###FAILED###' +fi + for testapp in $(ls ${LDPATH}/*$EXT) do name=$(basename ${testapp}) + NAME="${COLHIGH}${name}${COLRESET}" tmppath="" if [ $name = "GetListOfFilesInDir${EXT}" ]; then # TODO: very-low: move env creation to the actual test-app - echo "Prepare Testarea for \033[1;35m$name\033[0m ..." tmppath=$(mktemp -d) touch "${tmppath}/anormalfile" \ "${tmppath}/01yet-anothernormalfile" \ @@ -47,12 +60,12 @@ do ln -s "${tmppath}/anormalfile" "${tmppath}/linkedfile.list" ln -s "${tmppath}/non-existing-file" "${tmppath}/brokenlink.list" elif [ $name = "getLanguages${EXT}" ]; then - echo "Prepare Testarea for \033[1;35m$name\033[0m ..." tmppath=$(mktemp -d) touch "${tmppath}/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-tr" \ "${tmppath}/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-pt" \ "${tmppath}/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-se~" \ - "${tmppath}/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-st.bak" + "${tmppath}/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-st.bak" \ + "${tmppath}/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-ast_DE" elif [ $name = "HashSums${EXT}" ]; then TMP="$(mktemp)" dmesg > $TMP @@ -60,14 +73,14 @@ do LD_LIBRARY_PATH=${LDPATH} ${testapp} $TMP $(md5sum $TMP | cut -d' ' -f 1) $(sha1sum $TMP | cut -d' ' -f 1) $(sha256sum $TMP | cut -d' ' -f 1) $(sha512sum $TMP | cut -d' ' -f 1) && echo "\033[1;32mOKAY\033[0m" || echo "\033[1;31mFAILED\033[0m" rm $TMP continue + elif [ $name = "CompareVersion${EXT}" ]; then + tmppath="${DIR}/versions.lst" fi - echo -n "Testing with \033[1;35m${name}\033[0m ... " - LD_LIBRARY_PATH=${LDPATH} ${testapp} ${tmppath} && echo "\033[1;32mOKAY\033[0m" || echo "\033[1;31mFAILED\033[0m" + echo -n "Testing with ${NAME} " + LD_LIBRARY_PATH=${LDPATH} ${testapp} ${tmppath} && echo "$TESTOKAY" || echo "$TESTFAIL" if [ -n "$tmppath" -a -d "$tmppath" ]; then - echo "Cleanup Testarea after \033[1;35m$name\033[0m ..." rm -rf "$tmppath" fi - done diff --git a/test/libapt/strutil_test.cc b/test/libapt/strutil_test.cc index af6eb2cc6..bfe0d7222 100644 --- a/test/libapt/strutil_test.cc +++ b/test/libapt/strutil_test.cc @@ -4,7 +4,7 @@ int main(int argc,char *argv[]) { - string input, output, expected; + std::string input, output, expected; // no input input = "foobar"; diff --git a/test/libapt/uri_test.cc b/test/libapt/uri_test.cc new file mode 100644 index 000000000..99bb3067e --- /dev/null +++ b/test/libapt/uri_test.cc @@ -0,0 +1,112 @@ +#include <apt-pkg/strutl.h> + +#include "assert.h" + +int main() { + // Basic stuff + { + URI U("http://www.debian.org:90/temp/test"); + equals("http", U.Access); + equals("", U.User); + equals("", U.Password); + equals(90, U.Port); + equals("www.debian.org", U.Host); + equals("/temp/test", U.Path); + } { + URI U("http://jgg:foo@ualberta.ca/blah"); + equals("http", U.Access); + equals("jgg", U.User); + equals("foo", U.Password); + equals(0, U.Port); + equals("ualberta.ca", U.Host); + equals("/blah", U.Path); + } { + URI U("file:/usr/bin/foo"); + equals("file", U.Access); + equals("", U.User); + equals("", U.Password); + equals(0, U.Port); + equals("", U.Host); + equals("/usr/bin/foo", U.Path); + } { + URI U("cdrom:Moo Cow Rom:/debian"); + equals("cdrom", U.Access); + equals("", U.User); + equals("", U.Password); + equals(0, U.Port); + equals("Moo Cow Rom", U.Host); + equals("/debian", U.Path); + } { + URI U("gzip:./bar/cow"); + equals("gzip", U.Access); + equals("", U.User); + equals("", U.Password); + equals(0, U.Port); + equals(".", U.Host); + equals("/bar/cow", U.Path); + } { + URI U("ftp:ftp.fr.debian.org/debian/pool/main/x/xtel/xtel_3.2.1-15_i386.deb"); + equals("ftp", U.Access); + equals("", U.User); + equals("", U.Password); + equals(0, U.Port); + equals("ftp.fr.debian.org", U.Host); + equals("/debian/pool/main/x/xtel/xtel_3.2.1-15_i386.deb", U.Path); + } + + // RFC 2732 stuff + { + URI U("http://[1080::8:800:200C:417A]/foo"); + equals("http", U.Access); + equals("", U.User); + equals("", U.Password); + equals(0, U.Port); + equals("1080::8:800:200C:417A", U.Host); + equals("/foo", U.Path); + } { + URI U("http://[::FFFF:129.144.52.38]:80/index.html"); + equals("http", U.Access); + equals("", U.User); + equals("", U.Password); + equals(80, U.Port); + equals("::FFFF:129.144.52.38", U.Host); + equals("/index.html", U.Path); + } { + URI U("http://[::FFFF:129.144.52.38:]:80/index.html"); + equals("http", U.Access); + equals("", U.User); + equals("", U.Password); + equals(80, U.Port); + equals("::FFFF:129.144.52.38:", U.Host); + equals("/index.html", U.Path); + } { + URI U("http://[::FFFF:129.144.52.38:]/index.html"); + equals("http", U.Access); + equals("", U.User); + equals("", U.Password); + equals(0, U.Port); + equals("::FFFF:129.144.52.38:", U.Host); + equals("/index.html", U.Path); + } + /* My Evil Corruption of RFC 2732 to handle CDROM names! Fun for + the whole family! */ + { + URI U("cdrom:[The Debian 1.2 disk, 1/2 R1:6]/debian/"); + equals("cdrom", U.Access); + equals("", U.User); + equals("", U.Password); + equals(0, U.Port); + equals("The Debian 1.2 disk, 1/2 R1:6", U.Host); + equals("/debian/", U.Path); + } { + URI U("cdrom:Foo Bar Cow/debian/"); + equals("cdrom", U.Access); + equals("", U.User); + equals("", U.Password); + equals(0, U.Port); + equals("Foo Bar Cow", U.Host); + equals("/debian/", U.Path); + } + + return 0; +} diff --git a/test/libapt/versions.lst b/test/libapt/versions.lst new file mode 100644 index 000000000..8dd8ebdc9 --- /dev/null +++ b/test/libapt/versions.lst @@ -0,0 +1,106 @@ +# List of +# ver1 ver2 ret +# Of versions worth testing +# 1 means that ver1 > ver2 +# -1 means that ver1 < ver2 +# 0 means that ver1 = ver2 +7.6p2-4 7.6-0 1 +1.0.3-3 1.0-1 1 +1.3 1.2.2-2 1 +1.3 1.2.2 1 + +# Important attributes +# disabled as dpkg --compare-versions doesn't like them… (versions have to start with a number) +#- . -1 +#p - -1 +#a - -1 +#z - -1 +#a . -1 +#z . -1 + +# disabled as dpkg --compare-versions doesn't like them… (versions have to start with a number) +#III-alpha9.8 III-alpha9.8-1.5 -1 + +# Epochs +1:0.4 10.3 1 +1:1.25-4 1:1.25-8 -1 +0:1.18.36 1.18.36 0 + +# native version +1.18.36 1.18.35 1 +0:1.18.36 1.18.35 1 + +# Funky, but allowed, characters in upstream version +9:1.18.36:5.4-20 10:0.5.1-22 -1 +9:1.18.36:5.4-20 9:1.18.36:5.5-1 -1 +9:1.18.36:5.4-20 9:1.18.37:4.3-22 -1 +1.18.36-0.17.35-18 1.18.36-19 1 + +# Junk +1:1.2.13-3 1:1.2.13-3.1 -1 +2.0.7pre1-4 2.0.7r-1 -1 + +# Test some properties of text strings +0-pre 0-pre 0 +0-pre 0-pree -1 + +1.1.6r2-2 1.1.6r-1 1 +2.6b2-1 2.6b-2 1 + +98.1p5-1 98.1-pre2-b6-2 -1 +0.4a6-2 0.4-1 1 + +1:3.0.5-2 1:3.0.5.1 -1 + +# #205960 +3.0~rc1-1 3.0-1 -1 + +# #573592 - debian policy 5.6.12 +1.0 1.0-0 0 +0.2 1.0-0 -1 +1.0 1.0-0+b1 -1 +1.0 1.0-0~ 1 + +# if a version includes a dash +# it should be the debrev dash - policy says so… +0:0-0-0 0-0 1 + +# do we like strange versions? Yes we like strange versions… +0 0 0 +0 00 0 + +# "steal" the testcases from cupt +1.2.3 1.2.3 0 # identical +4.4.3-2 4.4.3-2 0 # identical +1:2ab:5 1:2ab:5 0 # this is correct... +7:1-a:b-5 7:1-a:b-5 0 # and this +57:1.2.3abYZ+~-4-5 57:1.2.3abYZ+~-4-5 0 # and those too +1.2.3 0:1.2.3 0 # zero epoch +1.2.3 1.2.3-0 0 # zero revision +009 9 0 # zeroes... +009ab5 9ab5 0 # there as well +1.2.3 1.2.3-1 -1 # added non-zero revision +1.2.3 1.2.4 -1 # just bigger +1.2.4 1.2.3 1 # order doesn't matter +1.2.24 1.2.3 1 # bigger, eh? +0.10.0 0.8.7 1 # bigger, eh? +3.2 2.3 1 # major number rocks +1.3.2a 1.3.2 1 # letters rock +0.5.0~git 0.5.0~git2 -1 # numbers rock +2a 21 -1 # but not in all places +1.3.2a 1.3.2b -1 # but there is another letter +1:1.2.3 1.2.4 1 # epoch rocks +1:1.2.3 1:1.2.4 -1 # bigger anyway +1.2a+~bCd3 1.2a++ -1 # tilde doesn't rock +1.2a+~bCd3 1.2a+~ 1 # but first is longer! +5:2 304-2 1 # epoch rocks +5:2 304:2 -1 # so big epoch? +25:2 3:2 1 # 25 > 3, obviously +1:2:123 1:12:3 -1 # 12 > 2 +1.2-5 1.2-3-5 -1 # 1.2 < 1.2-3 +5.10.0 5.005 1 # preceding zeroes don't matters +3a9.8 3.10.2 -1 # letters are before all letter symbols +3a9.8 3~10 1 # but after the tilde +1.4+OOo3.0.0~ 1.4+OOo3.0.0-4 -1 # another tilde check +2.4.7-1 2.4.7-z -1 # revision comparing +1.002-1+b2 1.00 1 # whatever... |