aboutsummaryrefslogtreecommitdiff
path: root/tests/semantic-version
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2018-08-14 14:09:32 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2018-08-14 14:09:32 +0200
commit8561af5a2551ec453c9888125de273f2cc2940c0 (patch)
tree4458e955d33f9aaf7e904c8de717803a33ecc81f /tests/semantic-version
parent7c665d965c0ebb259849d5032faa0854c6ae94f2 (diff)
Add support for parsing semantic and semantic-like versions
Diffstat (limited to 'tests/semantic-version')
-rw-r--r--tests/semantic-version/buildfile8
-rw-r--r--tests/semantic-version/driver.cxx84
2 files changed, 92 insertions, 0 deletions
diff --git a/tests/semantic-version/buildfile b/tests/semantic-version/buildfile
new file mode 100644
index 0000000..1055228
--- /dev/null
+++ b/tests/semantic-version/buildfile
@@ -0,0 +1,8 @@
+# file : tests/semantic-version/buildfile
+# copyright : Copyright (c) 2014-2018 Code Synthesis Ltd
+# license : MIT; see accompanying LICENSE file
+
+import libs = libbutl%lib{butl}
+libs += $stdmod_lib
+
+exe{driver}: {hxx cxx}{*} $libs
diff --git a/tests/semantic-version/driver.cxx b/tests/semantic-version/driver.cxx
new file mode 100644
index 0000000..024e7a0
--- /dev/null
+++ b/tests/semantic-version/driver.cxx
@@ -0,0 +1,84 @@
+// file : tests/semantic-version/driver.cxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2018 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#include <cassert>
+
+#ifndef __cpp_lib_modules
+#include <iostream>
+#endif
+
+// Other includes.
+
+#ifdef __cpp_modules
+#ifdef __cpp_lib_modules
+import std.core;
+import std.io;
+#endif
+import butl.semantic_version;
+#else
+#include <libbutl/semantic-version.mxx>
+#endif
+
+using namespace std;
+using namespace butl;
+
+int
+main ()
+{
+ using semver = semantic_version;
+ using failed = invalid_argument;
+
+ // Construction.
+ //
+ {
+ semver v;
+ assert (v.major == 0 && v.minor == 0 && v.patch == 0 && v.build.empty ());
+ }
+
+ {
+ semver v (1, 2, 3);
+ assert (v.major == 1 && v.minor == 2 && v.patch == 3 && v.build.empty ());
+ assert (v.string () == "1.2.3");
+ }
+ {
+ semver v (1, 2, 3, ".4");
+ assert (v.major == 1 && v.minor == 2 && v.patch == 3 && v.build == ".4");
+ assert (v.string () == "1.2.3.4");
+ assert (v.string (true) == "1.2.3");
+ }
+
+ // Comparison.
+ //
+ assert (semver (2, 0 ,0) > semver (1, 2, 3));
+ assert (semver (1, 2, 0) > semver (1, 1, 2));
+ assert (semver (1, 1, 2) > semver (1, 1, 1, ".2"));
+ assert (semver (1, 1, 1, ".2") > semver (1, 1, 1, ".1"));
+ assert (semver (1, 1, 1, ".1").compare (semver (1, 1, 1, ".2"), true) == 0);
+
+ // String representation.
+ //
+ assert (semver ("1.2") == semver (1, 2, 0));
+ assert (semver ("1.2-3") == semver (1, 2, 0, "-3"));
+ assert (semver ("1.2.a1", "+-.") == semver (1, 2, 0, ".a1"));
+ assert (semver ("1.2.3") == semver (1, 2, 3));
+ assert (semver ("1.2.3-4") == semver (1, 2, 3, "-4"));
+ assert (semver ("1.2.3+4") == semver (1, 2, 3, "+4"));
+ assert (semver ("1.2.3.4", "+-.") == semver (1, 2, 3, ".4"));
+ assert (semver ("1.2.3a", "") == semver (1, 2, 3, "a"));
+ try {semver v ("1.2.3-4", false); assert (false);} catch (failed) {}
+ try {semver v ("1.2.3.4"); assert (false);} catch (failed) {}
+ try {semver v ("1.2.3a"); assert (false);} catch (failed) {}
+ assert (!parse_semantic_version ("1.2.3.4"));
+
+ // Numeric representation.
+ //
+ // AAABBBCCC0000
+ assert (semver ( 10020030000ULL) == semver (1, 2, 3));
+ assert (semver ( 9999999990000ULL, ".4") == semver (999, 999, 999, ".4"));
+ try { semver v ( 10020030001ULL); assert (false);} catch (failed) {}
+ try { semver v (10000020030000ULL); assert (false);} catch (failed) {}
+ assert (semver (1, 2, 3).numeric () == 10020030000ULL);
+ assert (semver (999, 999, 999, ".4").numeric () == 9999999990000ULL);
+ try { semver (9999, 0, 0).numeric (); assert (false);} catch (failed) {}
+}