diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2016-02-29 10:57:40 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2016-02-29 10:57:40 +0200 |
commit | 3cf3b73ffc6881d5428a735736a347f6e143b366 (patch) | |
tree | 3559fa9d2d44cc11e07987752027f7c2a9e3e23e /tests | |
parent | 2a4f52c46f2081aaeb2664e8026d3d067142e3d5 (diff) |
Implement auxiliary dependency database (.d files), use in cxx.compile
This is part of the "High Fidelity Build" work.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/depdb/buildfile | 8 | ||||
-rw-r--r-- | tests/depdb/driver.cxx | 166 |
2 files changed, 174 insertions, 0 deletions
diff --git a/tests/depdb/buildfile b/tests/depdb/buildfile new file mode 100644 index 0000000..53e9cd3 --- /dev/null +++ b/tests/depdb/buildfile @@ -0,0 +1,8 @@ +# file : tests/depdb/buildfile +# copyright : Copyright (c) 2014-2016 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +import libs = libbutl%lib{butl} + +exe{driver}: cxx{driver ../../build2/{depdb}} $libs +exe{driver}: test.arguments = $out_base/test.d diff --git a/tests/depdb/driver.cxx b/tests/depdb/driver.cxx new file mode 100644 index 0000000..f156991 --- /dev/null +++ b/tests/depdb/driver.cxx @@ -0,0 +1,166 @@ +// file : tests/depdb/driver.cxx -*- C++ -*- +// copyright : Copyright (c) 2014-2016 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#include <iostream> + +#include <butl/filesystem> + +#include <build2/types> +#include <build2/utility> + +#include <build2/depdb> + +using namespace std; +using namespace build2; + +int +main (int argc, char* argv[]) +{ + if (argc != 2) + { + cerr << "usage: " << argv[0] << " <db-file>" << endl; + return 1; + } + + path p (argv[1]); + auto rm = [&p] () {try_rmfile (p);}; + + // Create empty database. + // + { + rm (); + + { + depdb d (p); + assert (d.writing ()); + d.close (); + } + + { + depdb d (p); + assert (d.reading ()); + assert (!d.more ()); + assert (d.read () == nullptr); + d.close (); + } + } + + // No close/end marker. + // + { + rm (); + + { + depdb d (p); + assert (d.writing ()); + // No close. + } + + { + depdb d (p); + assert (d.writing ()); + d.close (); + } + + { + depdb d (p); + assert (d.reading ()); + } + } + + // Overwrite/append/truncate. + // + { + rm (); + + { + depdb d (p); + d.write ("foo"); + d.close (); + } + + { + depdb d (p); + assert (*d.read () == "foo"); + assert (!d.more ()); + d.close (); + } + + { + depdb d (p); + assert (*d.read () == "foo"); + assert (!d.more ()); + d.write ("FOO"); + d.close (); + } + + { + depdb d (p); + assert (*d.read () == "FOO"); + assert (!d.more ()); + assert (d.read () == nullptr); + assert (d.read () == nullptr); + d.write ("BAR"); + d.close (); + } + + { + depdb d (p); + assert (*d.read () == "FOO"); + assert (d.more ()); + d.write ("foo"); + d.close (); // Truncate. + } + + { + depdb d (p); + assert (*d.read () == "foo"); + assert (!d.more ()); + } + + // Stray end marker. + // + { + depdb d (p); + assert (*d.read () == "foo"); + d.write ("fox"); + // No close. + } + + { + depdb d (p); + assert (d.more ()); + assert (*d.read () == "fox"); + assert (!d.more ()); + } + } + + // Read/truncate. + // + { + rm (); + + { + depdb d (p); + d.write ("foo"); + d.write ("bar"); + d.close (); + } + + { + depdb d (p); + assert (*d.read () == "foo"); + assert (d.more ()); + d.close (); // Truncate bar. + } + + { + depdb d (p); + assert (*d.read () == "foo"); + assert (!d.more ()); + } + } + + rm (); +} |