aboutsummaryrefslogtreecommitdiff
path: root/tests/base64
diff options
context:
space:
mode:
Diffstat (limited to 'tests/base64')
-rw-r--r--tests/base64/buildfile7
-rw-r--r--tests/base64/driver.cxx106
2 files changed, 113 insertions, 0 deletions
diff --git a/tests/base64/buildfile b/tests/base64/buildfile
new file mode 100644
index 0000000..63212fa
--- /dev/null
+++ b/tests/base64/buildfile
@@ -0,0 +1,7 @@
+# file : tests/base64/buildfile
+# copyright : Copyright (c) 2014-2016 Code Synthesis Ltd
+# license : MIT; see accompanying LICENSE file
+
+exe{driver}: cxx{driver} ../../butl/lib{butl}
+
+include ../../butl/
diff --git a/tests/base64/driver.cxx b/tests/base64/driver.cxx
new file mode 100644
index 0000000..e43e04a
--- /dev/null
+++ b/tests/base64/driver.cxx
@@ -0,0 +1,106 @@
+// file : tests/base64/driver.cxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2016 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#include <string>
+#include <sstream>
+#include <cassert>
+
+#include <butl/base64>
+
+using namespace std;
+using namespace butl;
+
+static bool
+encode (const string& i, const string& o)
+{
+ // Test encoding.
+ //
+ istringstream is (i);
+ string s (base64_encode (is));
+ bool r (s == o && is.eof ());
+
+ if (r)
+ {
+ is.seekg (0);
+ ostringstream os;
+ base64_encode (os, is);
+ r = os.str () == o && is.eof ();
+ }
+
+ if (r)
+ r = base64_encode (vector<char> (i.begin (), i.end ())) == o;
+
+ // Test decoding.
+ //
+ if (r)
+ {
+ istringstream is (o);
+ ostringstream os;
+ base64_decode (os, is);
+ r = os.str () == i;
+ }
+
+ if (r)
+ {
+ ostringstream os;
+ base64_decode (os, o);
+ r = os.str () == i;
+ }
+
+ if (r)
+ {
+ vector<char> v (base64_decode (o));
+ r = string (v.begin (), v.end ()) == i;
+ }
+
+ return r;
+}
+
+int
+main ()
+{
+ assert (encode ("", ""));
+ assert (encode ("B", "Qg=="));
+ assert (encode ("BX", "Qlg="));
+ assert (encode ("BXz", "Qlh6"));
+ assert (encode ("BXzS", "Qlh6Uw=="));
+ assert (encode ("BXzS@", "Qlh6U0A="));
+ assert (encode ("BXzS@#", "Qlh6U0Aj"));
+ assert (encode ("BXzS@#/", "Qlh6U0AjLw=="));
+
+ const char* s (R"delim(
+class fdstream_base
+{
+protected:
+ fdstream_base () = default;
+ fdstream_base (int fd): buf_ (fd) {}
+
+protected:
+ fdbuf buf_;
+};
+
+class ifdstream: fdstream_base, public std::istream
+{
+public:
+ ifdstream (): std::istream (&buf_) {}
+ ifdstream (int fd): fdstream_base (fd), std::istream (&buf_) {}
+
+ void close () {buf_.close ();}
+ void open (int fd) {buf_.open (fd);}
+ bool is_open () const {return buf_.is_open ();}
+};
+)delim");
+
+ const char* r (R"delim(
+CmNsYXNzIGZkc3RyZWFtX2Jhc2UKewpwcm90ZWN0ZWQ6CiAgZmRzdHJlYW1fYmFzZSAoKSA9IGRl
+ZmF1bHQ7CiAgZmRzdHJlYW1fYmFzZSAoaW50IGZkKTogYnVmXyAoZmQpIHt9Cgpwcm90ZWN0ZWQ6
+CiAgZmRidWYgYnVmXzsKfTsKCmNsYXNzIGlmZHN0cmVhbTogZmRzdHJlYW1fYmFzZSwgcHVibGlj
+IHN0ZDo6aXN0cmVhbQp7CnB1YmxpYzoKICBpZmRzdHJlYW0gKCk6IHN0ZDo6aXN0cmVhbSAoJmJ1
+Zl8pIHt9CiAgaWZkc3RyZWFtIChpbnQgZmQpOiBmZHN0cmVhbV9iYXNlIChmZCksIHN0ZDo6aXN0
+cmVhbSAoJmJ1Zl8pIHt9CgogIHZvaWQgY2xvc2UgKCkge2J1Zl8uY2xvc2UgKCk7fQogIHZvaWQg
+b3BlbiAoaW50IGZkKSB7YnVmXy5vcGVuIChmZCk7fQogIGJvb2wgaXNfb3BlbiAoKSBjb25zdCB7
+cmV0dXJuIGJ1Zl8uaXNfb3BlbiAoKTt9Cn07Cg==)delim");
+
+ assert (encode (s, r + 1));
+}