summaryrefslogtreecommitdiff
path: root/test/test.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2012-07-21 03:46:49 +0100
committerCarl Hetherington <cth@carlh.net>2012-07-21 03:46:49 +0100
commit7183198c4db92a634245ff91ccd49f4bed875b73 (patch)
treeb9c56c62a741e6cb3c488d7d2ecba20e20490c74 /test/test.cc
parent138aada1a50c6b6e17864f705ce9f18bcd647808 (diff)
Remove long tests in favour of full test corpus.
Diffstat (limited to 'test/test.cc')
-rw-r--r--test/test.cc220
1 files changed, 220 insertions, 0 deletions
diff --git a/test/test.cc b/test/test.cc
new file mode 100644
index 000000000..3f010379c
--- /dev/null
+++ b/test/test.cc
@@ -0,0 +1,220 @@
+/*
+ Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <fstream>
+#include <iostream>
+#include <boost/filesystem.hpp>
+#include <boost/algorithm/string/predicate.hpp>
+#include "format.h"
+#include "film.h"
+#include "filter.h"
+#include "job_manager.h"
+#include "util.h"
+#include "exceptions.h"
+#include "dvd.h"
+#include "delay_line.h"
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_MODULE dvdomatic_test
+#include <boost/test/unit_test.hpp>
+
+using namespace std;
+using namespace boost;
+
+BOOST_AUTO_TEST_CASE (film_metadata_test)
+{
+ dvdomatic_setup ();
+
+ string const test_film = "build/test/film";
+
+ if (boost::filesystem::exists (test_film)) {
+ boost::filesystem::remove_all (test_film);
+ }
+
+ BOOST_CHECK_THROW (new Film ("build/test/film", true), OpenFileError);
+
+ Film f (test_film, false);
+ BOOST_CHECK (f.format() == 0);
+ BOOST_CHECK (f.dcp_content_type() == 0);
+ BOOST_CHECK (f.filters ().empty());
+
+ f.set_name ("fred");
+ BOOST_CHECK_THROW (f.set_content ("jim"), OpenFileError);
+ f.set_dcp_content_type (DCPContentType::from_pretty_name ("Short"));
+ f.set_format (Format::from_nickname ("Flat"));
+ f.set_left_crop (1);
+ f.set_right_crop (2);
+ f.set_top_crop (3);
+ f.set_bottom_crop (4);
+ vector<Filter const *> f_filters;
+ f_filters.push_back (Filter::from_id ("pphb"));
+ f_filters.push_back (Filter::from_id ("unsharp"));
+ f.set_filters (f_filters);
+ f.set_dcp_frames (42);
+ f.set_dcp_ab (true);
+ f.write_metadata ();
+
+ stringstream s;
+ s << "diff -u test/metadata.ref " << test_film << "/metadata";
+ BOOST_CHECK_EQUAL (::system (s.str().c_str ()), 0);
+
+ Film g (test_film, true);
+
+ BOOST_CHECK_EQUAL (g.name(), "fred");
+ BOOST_CHECK_EQUAL (g.dcp_content_type(), DCPContentType::from_pretty_name ("Short"));
+ BOOST_CHECK_EQUAL (g.format(), Format::from_nickname ("Flat"));
+ BOOST_CHECK_EQUAL (g.left_crop(), 1);
+ BOOST_CHECK_EQUAL (g.right_crop(), 2);
+ BOOST_CHECK_EQUAL (g.top_crop(), 3);
+ BOOST_CHECK_EQUAL (g.bottom_crop(), 4);
+ vector<Filter const *> g_filters = g.filters ();
+ BOOST_CHECK_EQUAL (g_filters.size(), 2);
+ BOOST_CHECK_EQUAL (g_filters.front(), Filter::from_id ("pphb"));
+ BOOST_CHECK_EQUAL (g_filters.back(), Filter::from_id ("unsharp"));
+ BOOST_CHECK_EQUAL (g.dcp_frames(), 42);
+ BOOST_CHECK_EQUAL (g.dcp_ab(), true);
+
+ g.write_metadata ();
+ BOOST_CHECK_EQUAL (::system (s.str().c_str ()), 0);
+}
+
+BOOST_AUTO_TEST_CASE (format_test)
+{
+ Format::setup_formats ();
+
+ Format const * f = Format::from_nickname ("Flat");
+ BOOST_CHECK (f);
+ BOOST_CHECK_EQUAL (f->ratio_as_integer(), 185);
+
+ f = Format::from_nickname ("Scope");
+ BOOST_CHECK (f);
+ BOOST_CHECK_EQUAL (f->ratio_as_integer(), 239);
+}
+
+BOOST_AUTO_TEST_CASE (util_test)
+{
+ string t = "Hello this is a string \"with quotes\" and indeed without them";
+ vector<string> b = split_at_spaces_considering_quotes (t);
+ vector<string>::iterator i = b.begin ();
+ BOOST_CHECK_EQUAL (*i++, "Hello");
+ BOOST_CHECK_EQUAL (*i++, "this");
+ BOOST_CHECK_EQUAL (*i++, "is");
+ BOOST_CHECK_EQUAL (*i++, "a");
+ BOOST_CHECK_EQUAL (*i++, "string");
+ BOOST_CHECK_EQUAL (*i++, "with quotes");
+ BOOST_CHECK_EQUAL (*i++, "and");
+ BOOST_CHECK_EQUAL (*i++, "indeed");
+ BOOST_CHECK_EQUAL (*i++, "without");
+ BOOST_CHECK_EQUAL (*i++, "them");
+}
+
+BOOST_AUTO_TEST_CASE (dvd_test)
+{
+ vector<uint64_t> const t = dvd_titles ("test/dvd");
+ BOOST_CHECK_EQUAL (t.size(), 4);
+ BOOST_CHECK_EQUAL (t[1], 0);
+ BOOST_CHECK_EQUAL (t[2], 14);
+ BOOST_CHECK_EQUAL (t[3], 7);
+}
+
+void
+do_positive_delay_line_test (int delay_length, int block_length)
+{
+ DelayLine d (delay_length);
+ uint8_t data[block_length];
+
+ int in = 0;
+ int out = 0;
+ int returned = 0;
+ int zeros = 0;
+
+ for (int i = 0; i < 64; ++i) {
+ for (int j = 0; j < block_length; ++j) {
+ data[j] = in;
+ ++in;
+ }
+
+ int const a = d.feed (data, block_length);
+ returned += a;
+
+ for (int j = 0; j < a; ++j) {
+ if (zeros < delay_length) {
+ BOOST_CHECK_EQUAL (data[j], 0);
+ ++zeros;
+ } else {
+ BOOST_CHECK_EQUAL (data[j], out & 0xff);
+ ++out;
+ }
+ }
+ }
+
+ BOOST_CHECK_EQUAL (returned, 64 * block_length);
+}
+
+void
+do_negative_delay_line_test (int delay_length, int block_length)
+{
+ DelayLine d (delay_length);
+ uint8_t data[block_length];
+
+ int in = 0;
+ int out = -delay_length;
+ int returned = 0;
+
+ for (int i = 0; i < 256; ++i) {
+ for (int j = 0; j < block_length; ++j) {
+ data[j] = in;
+ ++in;
+ }
+
+ int const a = d.feed (data, block_length);
+ returned += a;
+
+ for (int j = 0; j < a; ++j) {
+ BOOST_CHECK_EQUAL (data[j], out & 0xff);
+ ++out;
+ }
+ }
+
+ uint8_t remainder[-delay_length];
+ d.get_remaining (remainder);
+ returned += -delay_length;
+
+ for (int i = 0; i < -delay_length; ++i) {
+ BOOST_CHECK_EQUAL (remainder[i], 0);
+ ++out;
+ }
+
+ BOOST_CHECK_EQUAL (returned, 256 * block_length);
+
+}
+
+BOOST_AUTO_TEST_CASE (delay_line_test)
+{
+ do_positive_delay_line_test (64, 128);
+ do_positive_delay_line_test (128, 64);
+ do_positive_delay_line_test (3, 512);
+ do_positive_delay_line_test (512, 3);
+
+ do_positive_delay_line_test (0, 64);
+
+ do_negative_delay_line_test (-64, 128);
+ do_negative_delay_line_test (-128, 64);
+ do_negative_delay_line_test (-3, 512);
+ do_negative_delay_line_test (-512, 3);
+}